All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv3 00/12] arm/arm64: Unify PSCI client support
@ 2015-05-26 13:52 Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 01/12] arm/arm64: kvm: add missing PSCI include Mark Rutland
                   ` (12 more replies)
  0 siblings, 13 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

This series unifies the 32-bit and 64-bit PSCI client code, moving the bulk of
the FW invocation and probing out to a common location in drivers/firmware.
As part of this, the remaining edge cases for PSCI 0.2 (Trusted OSs rejecting
CPU_OFF) are accounted for, making both 32-bit adn 64-bit clients more robust.

This results in a reasonable saving in terms of lines of code, and will allow
for PSCI 1.0 support to be unified form the beginning, avoiding further
duplication.

The series is based on the arm64 for-next/cpu-init branch [3] due to conflicts
with that series.

Since v1 [1]:
* Fix build when PSCI isn't selected
* Don't indirect migrate_info_up_cpu
* Fix ver to u32 in psci_get_version

Since v2: [2]:
* Rebase atop of Lorenzo's cpu init cleanup series [3]
* Use the correct native function IDs
* Fix cpu_disable return values
* Report invalid MIGRATE_INFO_UP_CPU return values

Many thanks to those who have reviewed and tested so far! Unfortunately, due to
the volume of changes in the rebase I've dropped all Tested-by tags. I've
locally tested 32-bit and 64-bit kernels with DT.

Russell, are you happy with the penultimate patch? If so, would you be happy for
that to go via arm-soc (which I guess should take the series)?

Thanks,
Mark.

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-May/341770.html
[2] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-May/344309.html
[3] git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/cpu-init

Mark Rutland (12):
  arm/arm64: kvm: add missing PSCI include
  arm64: smp_plat: add get_logical_index
  arm64: smp: consistently use error codes
  arm64: psci: remove unnecessary id indirection
  arm64: psci: support unsigned return values
  arm64: psci: account for Trusted OS instances
  arm64: psci: kill psci_power_state
  arm64: psci: remove ACPI coupling
  arm64: psci: factor invocation code to drivers
  drivers: psci: support native SMC{32,64} calls
  ARM: migrate to common PSCI client code
  MAINTAINERS: add PSCI entry

 MAINTAINERS                                    |   9 +
 arch/arm/Kconfig                               |   1 +
 arch/arm/include/asm/psci.h                    |  23 --
 arch/arm/kernel/Makefile                       |   2 +-
 arch/arm/kernel/psci.c                         | 299 -------------------
 arch/arm/kernel/psci_smp.c                     |  29 +-
 arch/arm/kernel/setup.c                        |   3 +-
 arch/arm/kvm/psci.c                            |   2 +
 arch/arm/mach-highbank/highbank.c              |   2 +-
 arch/arm/mach-highbank/pm.c                    |   8 +-
 arch/arm64/Kconfig                             |   1 +
 arch/arm64/include/asm/acpi.h                  |  17 +-
 arch/arm64/include/asm/psci.h                  |  20 --
 arch/arm64/include/asm/smp_plat.h              |  16 +
 arch/arm64/kernel/acpi.c                       |  11 +
 arch/arm64/kernel/psci.c                       | 398 ++-----------------------
 arch/arm64/kernel/setup.c                      |   2 +-
 arch/arm64/kernel/smp.c                        |  10 +-
 drivers/cpuidle/cpuidle-calxeda.c              |   7 +-
 drivers/firmware/Kconfig                       |   3 +
 drivers/firmware/Makefile                      |   1 +
 drivers/firmware/psci.c                        | 383 ++++++++++++++++++++++++
 {arch/arm/include/asm => include/linux}/psci.h |  40 +--
 23 files changed, 523 insertions(+), 764 deletions(-)
 delete mode 100644 arch/arm/kernel/psci.c
 delete mode 100644 arch/arm64/include/asm/psci.h
 create mode 100644 drivers/firmware/psci.c
 copy {arch/arm/include/asm => include/linux}/psci.h (55%)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 01/12] arm/arm64: kvm: add missing PSCI include
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 02/12] arm64: smp_plat: add get_logical_index Mark Rutland
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

We make use of the PSCI function IDs, but don't explicitly include the
header which defines them. Relying on transitive header includes is
fragile and will be broken as headers are refactored.

This patch includes the relevant header file directly so as to avoid
future breakage.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm/kvm/psci.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c
index 02fa8ef..7e9398c 100644
--- a/arch/arm/kvm/psci.c
+++ b/arch/arm/kvm/psci.c
@@ -24,6 +24,8 @@
 #include <asm/kvm_psci.h>
 #include <asm/kvm_host.h>
 
+#include <uapi/linux/psci.h>
+
 /*
  * This is an implementation of the Power State Coordination Interface
  * as described in ARM document number ARM DEN 0022A.
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 02/12] arm64: smp_plat: add get_logical_index
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 01/12] arm/arm64: kvm: add missing PSCI include Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 03/12] arm64: smp: consistently use error codes Mark Rutland
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

The PSCI MIGRATE_INFO_UP_CPU call returns a physical ID, which we will
need to map back to a Linux logical ID.

Implement a reusable get_logical_index to map from a physical ID to a
logical ID.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/include/asm/smp_plat.h | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/arch/arm64/include/asm/smp_plat.h b/arch/arm64/include/asm/smp_plat.h
index 8dcd61e..7abf757 100644
--- a/arch/arm64/include/asm/smp_plat.h
+++ b/arch/arm64/include/asm/smp_plat.h
@@ -19,6 +19,8 @@
 #ifndef __ASM_SMP_PLAT_H
 #define __ASM_SMP_PLAT_H
 
+#include <linux/cpumask.h>
+
 #include <asm/types.h>
 
 struct mpidr_hash {
@@ -39,6 +41,20 @@ static inline u32 mpidr_hash_size(void)
  */
 extern u64 __cpu_logical_map[NR_CPUS];
 #define cpu_logical_map(cpu)    __cpu_logical_map[cpu]
+/*
+ * Retrieve logical cpu index corresponding to a given MPIDR.Aff*
+ *  - mpidr: MPIDR.Aff* bits to be used for the look-up
+ *
+ * Returns the cpu logical index or -EINVAL on look-up error
+ */
+static inline int get_logical_index(u64 mpidr)
+{
+	int cpu;
+	for (cpu = 0; cpu < nr_cpu_ids; cpu++)
+		if (cpu_logical_map(cpu) == mpidr)
+			return cpu;
+	return -EINVAL;
+}
 
 void __init do_post_cpus_up_work(void);
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 03/12] arm64: smp: consistently use error codes
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 01/12] arm/arm64: kvm: add missing PSCI include Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 02/12] arm64: smp_plat: add get_logical_index Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 04/12] arm64: psci: remove unnecessary id indirection Mark Rutland
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

cpu_kill currently returns one for success and zero for failure, which
is unlike all the other cpu_operations, which return zero for success
and an error code upon failure. This difference is unnecessarily
confusing.

Make cpu_kill consistent with the other cpu_operations.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/kernel/psci.c |  7 +++----
 arch/arm64/kernel/smp.c  | 10 +++++++---
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index efe3480..17e717c 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -501,7 +501,7 @@ static int cpu_psci_cpu_kill(unsigned int cpu)
 	int err, i;
 
 	if (!psci_ops.affinity_info)
-		return 1;
+		return 0;
 	/*
 	 * cpu_kill could race with cpu_die and we can
 	 * potentially end up declaring this cpu undead
@@ -512,7 +512,7 @@ static int cpu_psci_cpu_kill(unsigned int cpu)
 		err = psci_ops.affinity_info(cpu_logical_map(cpu), 0);
 		if (err == PSCI_0_2_AFFINITY_LEVEL_OFF) {
 			pr_info("CPU%d killed.\n", cpu);
-			return 1;
+			return 0;
 		}
 
 		msleep(10);
@@ -521,8 +521,7 @@ static int cpu_psci_cpu_kill(unsigned int cpu)
 
 	pr_warn("CPU%d may not have shut down cleanly (AFFINITY_INFO reports %d)\n",
 			cpu, err);
-	/* Make op_cpu_kill() fail. */
-	return 0;
+	return -ETIMEDOUT;
 }
 #endif
 #endif
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index b698208..2b503a3 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -249,7 +249,7 @@ static int op_cpu_kill(unsigned int cpu)
 	 * time and hope that it's dead, so let's skip the wait and just hope.
 	 */
 	if (!cpu_ops[cpu]->cpu_kill)
-		return 1;
+		return 0;
 
 	return cpu_ops[cpu]->cpu_kill(cpu);
 }
@@ -262,6 +262,8 @@ static DECLARE_COMPLETION(cpu_died);
  */
 void __cpu_die(unsigned int cpu)
 {
+	int err;
+
 	if (!wait_for_completion_timeout(&cpu_died, msecs_to_jiffies(5000))) {
 		pr_crit("CPU%u: cpu didn't die\n", cpu);
 		return;
@@ -274,8 +276,10 @@ void __cpu_die(unsigned int cpu)
 	 * verify that it has really left the kernel before we consider
 	 * clobbering anything it might still be using.
 	 */
-	if (!op_cpu_kill(cpu))
-		pr_warn("CPU%d may not have shut down cleanly\n", cpu);
+	err = op_cpu_kill(cpu);
+	if (err)
+		pr_warn("CPU%d may not have shut down cleanly: %d\n",
+			cpu, err);
 }
 
 /*
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 04/12] arm64: psci: remove unnecessary id indirection
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (2 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 03/12] arm64: smp: consistently use error codes Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 05/12] arm64: psci: support unsigned return values Mark Rutland
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

PSCI 0.1 did not define canonical IDs for CPU_ON, CPU_OFF, CPU_SUSPEND,
or MIGRATE, and so these need to be provided when using firmware
compliant to PSCI 0.1.

However, functions introduced in 0.2 or later have canonical IDs, and
these cannot be provided via DT. There's no need to indirect the IDs via
a table; they can be used directly at callsites (and already are for
SYSTEM_OFF and SYSTEM_RESET).

This patch removes the unnecessary function ID indirection for
AFFINITY_INFO and MIGRATE_INFO_TYPE.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/kernel/psci.c | 20 +++-----------------
 1 file changed, 3 insertions(+), 17 deletions(-)

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 17e717c..0c1efb6 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -67,8 +67,6 @@ enum psci_function {
 	PSCI_FN_CPU_ON,
 	PSCI_FN_CPU_OFF,
 	PSCI_FN_MIGRATE,
-	PSCI_FN_AFFINITY_INFO,
-	PSCI_FN_MIGRATE_INFO_TYPE,
 	PSCI_FN_MAX,
 };
 
@@ -168,22 +166,13 @@ static int psci_migrate(unsigned long cpuid)
 static int psci_affinity_info(unsigned long target_affinity,
 		unsigned long lowest_affinity_level)
 {
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_AFFINITY_INFO];
-	err = invoke_psci_fn(fn, target_affinity, lowest_affinity_level, 0);
-	return err;
+	return invoke_psci_fn(PSCI_0_2_FN64_AFFINITY_INFO, target_affinity,
+			      lowest_affinity_level, 0);
 }
 
 static int psci_migrate_info_type(void)
 {
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_MIGRATE_INFO_TYPE];
-	err = invoke_psci_fn(fn, 0, 0, 0);
-	return err;
+	return invoke_psci_fn(PSCI_0_2_FN_MIGRATE_INFO_TYPE, 0, 0, 0);
 }
 
 static int __maybe_unused cpu_psci_cpu_init_idle(unsigned int cpu)
@@ -293,11 +282,8 @@ static void __init psci_0_2_set_functions(void)
 	psci_function_id[PSCI_FN_MIGRATE] = PSCI_0_2_FN64_MIGRATE;
 	psci_ops.migrate = psci_migrate;
 
-	psci_function_id[PSCI_FN_AFFINITY_INFO] = PSCI_0_2_FN64_AFFINITY_INFO;
 	psci_ops.affinity_info = psci_affinity_info;
 
-	psci_function_id[PSCI_FN_MIGRATE_INFO_TYPE] =
-		PSCI_0_2_FN_MIGRATE_INFO_TYPE;
 	psci_ops.migrate_info_type = psci_migrate_info_type;
 
 	arm_pm_restart = psci_sys_reset;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 05/12] arm64: psci: support unsigned return values
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (3 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 04/12] arm64: psci: remove unnecessary id indirection Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 06/12] arm64: psci: account for Trusted OS instances Mark Rutland
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

PSCI_VERSION and MIGRATE_INFO_TYPE_UP_CPU return unsigned values, with
the latter returning a 64-bit value. However, the PSCI invocation
functions have prototypes returning int.

This patch upgrades the invocation functions to return unsigned long,
with a new typedef to keep things legible. As PSCI_VERSION cannot return
a negative value, the erroneous check against PSCI_RET_NOT_SUPPORTED is
also removed. The unrelated psci_initcall_t typedef is moved closer to
its first user, to avoid confusion with the invocation functions.

In preparation for sharing the code with ARM, unsigned long is used in
preference of u64. In the SMC32 calling convention, the relevant fields
will be 32 bits wide.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/kernel/psci.c | 47 ++++++++++++++++++-----------------------------
 1 file changed, 18 insertions(+), 29 deletions(-)

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 0c1efb6..7d441b3 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -56,11 +56,11 @@ struct psci_operations {
 
 static struct psci_operations psci_ops;
 
-static int (*invoke_psci_fn)(u64, u64, u64, u64);
-typedef int (*psci_initcall_t)(const struct device_node *);
-
-asmlinkage int __invoke_psci_fn_hvc(u64, u64, u64, u64);
-asmlinkage int __invoke_psci_fn_smc(u64, u64, u64, u64);
+typedef unsigned long (psci_fn)(unsigned long, unsigned long,
+				unsigned long, unsigned long);
+asmlinkage psci_fn __invoke_psci_fn_hvc;
+asmlinkage psci_fn __invoke_psci_fn_smc;
+static psci_fn *invoke_psci_fn;
 
 enum psci_function {
 	PSCI_FN_CPU_SUSPEND,
@@ -112,12 +112,9 @@ static void psci_power_state_unpack(u32 power_state,
 			PSCI_0_2_POWER_STATE_AFFL_SHIFT;
 }
 
-static int psci_get_version(void)
+static u32 psci_get_version(void)
 {
-	int err;
-
-	err = invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
-	return err;
+	return invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
 }
 
 static int psci_cpu_suspend(struct psci_power_state state,
@@ -296,25 +293,15 @@ static void __init psci_0_2_set_functions(void)
  */
 static int __init psci_probe(void)
 {
-	int ver = psci_get_version();
-
-	if (ver == PSCI_RET_NOT_SUPPORTED) {
-		/*
-		 * PSCI versions >=0.2 mandates implementation of
-		 * PSCI_VERSION.
-		 */
-		pr_err("PSCI firmware does not comply with the v0.2 spec.\n");
-		return -EOPNOTSUPP;
-	} else {
-		pr_info("PSCIv%d.%d detected in firmware.\n",
-				PSCI_VERSION_MAJOR(ver),
-				PSCI_VERSION_MINOR(ver));
-
-		if (PSCI_VERSION_MAJOR(ver) == 0 &&
-				PSCI_VERSION_MINOR(ver) < 2) {
-			pr_err("Conflicting PSCI version detected.\n");
-			return -EINVAL;
-		}
+	u32 ver = psci_get_version();
+
+	pr_info("PSCIv%d.%d detected in firmware.\n",
+			PSCI_VERSION_MAJOR(ver),
+			PSCI_VERSION_MINOR(ver));
+
+	if (PSCI_VERSION_MAJOR(ver) == 0 && PSCI_VERSION_MINOR(ver) < 2) {
+		pr_err("Conflicting PSCI version detected.\n");
+		return -EINVAL;
 	}
 
 	psci_0_2_set_functions();
@@ -322,6 +309,8 @@ static int __init psci_probe(void)
 	return 0;
 }
 
+typedef int (*psci_initcall_t)(const struct device_node *);
+
 /*
  * PSCI init function for PSCI versions >=0.2
  *
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 06/12] arm64: psci: account for Trusted OS instances
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (4 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 05/12] arm64: psci: support unsigned return values Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 07/12] arm64: psci: kill psci_power_state Mark Rutland
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

Software resident in the secure world (a "Trusted OS") may cause CPU_OFF
calls for the CPU it is resident on to be denied. Such a denial would be
fatal for the kernel, and so we must detect when this can happen before
the point of no return.

This patch implements Trusted OS detection for PSCI 0.2+ systems, using
MIGRATE_INFO_TYPE and MIGRATE_INFO_UP_CPU. When a trusted OS is detected
as resident on a particular CPU, attempts to hot unplug that CPU will be
denied early, before they can prove fatal.

Trusted OS migration is not implemented by this patch. Implementation of
migratable UP trusted OSs seems unlikely, and the right policy for
migration is unclear (and will likely differ across implementations). As
such, it is likely that migration will require cooperation with Trusted
OS drivers.

PSCI implementations prior to 0.1 do not provide the facility to detect
the presence of a Trusted OS, nor the CPU any such OS is resident on, so
without additional information it is not possible to handle Trusted OSs
with PSCI 0.1.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/kernel/psci.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 7d441b3..ffa17d1 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -27,6 +27,7 @@
 
 #include <asm/acpi.h>
 #include <asm/compiler.h>
+#include <asm/cputype.h>
 #include <asm/cpu_ops.h>
 #include <asm/errno.h>
 #include <asm/psci.h>
@@ -43,6 +44,19 @@ struct psci_power_state {
 	u8	affinity_level;
 };
 
+/*
+ * The CPU any Trusted OS is resident on. The trusted OS may reject CPU_OFF
+ * calls to its resident CPU, so we must avoid issuing those. We never migrate
+ * a Trusted OS even if it claims to be capable of migration -- doing so will
+ * require cooperation with a Trusted OS driver.
+ */
+static int resident_cpu = -1;
+
+static bool psci_tos_resident_on(int cpu)
+{
+	return cpu == resident_cpu;
+}
+
 struct psci_operations {
 	int (*cpu_suspend)(struct psci_power_state state,
 			   unsigned long entry_point);
@@ -172,6 +186,11 @@ static int psci_migrate_info_type(void)
 	return invoke_psci_fn(PSCI_0_2_FN_MIGRATE_INFO_TYPE, 0, 0, 0);
 }
 
+static unsigned long psci_migrate_info_up_cpu(void)
+{
+	return invoke_psci_fn(PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU, 0, 0, 0);
+}
+
 static int __maybe_unused cpu_psci_cpu_init_idle(unsigned int cpu)
 {
 	int i, ret, count = 0;
@@ -264,6 +283,46 @@ static void psci_sys_poweroff(void)
 	invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
 }
 
+/*
+ * Detect the presence of a resident Trusted OS which may cause CPU_OFF to
+ * return DENIED (which would be fatal).
+ */
+static void __init psci_init_migrate(void)
+{
+	unsigned long cpuid;
+	int type, cpu;
+
+	type = psci_ops.migrate_info_type();
+
+	if (type == PSCI_0_2_TOS_MP) {
+		pr_info("Trusted OS migration not required\n");
+		return;
+	}
+
+	if (type == PSCI_RET_NOT_SUPPORTED) {
+		pr_info("MIGRATE_INFO_TYPE not supported.\n");
+		return;
+	}
+
+	if (type != PSCI_0_2_TOS_UP_MIGRATE &&
+	    type != PSCI_0_2_TOS_UP_NO_MIGRATE) {
+		pr_err("MIGRATE_INFO_TYPE returned unknown type (%d)\n", type);
+		return;
+	}
+
+	cpuid = psci_migrate_info_up_cpu();
+	if (cpuid & ~MPIDR_HWID_BITMASK) {
+		pr_warn("MIGRATE_INFO_UP_CPU reported invalid physical ID (0x%lx)\n",
+			cpuid);
+		return;
+	}
+
+	cpu = get_logical_index(cpuid);
+	resident_cpu = cpu >= 0 ? cpu : -1;
+
+	pr_info("Trusted OS resident on physical CPU 0x%lx\n", cpuid);
+}
+
 static void __init psci_0_2_set_functions(void)
 {
 	pr_info("Using standard PSCI v0.2 function IDs\n");
@@ -306,6 +365,8 @@ static int __init psci_probe(void)
 
 	psci_0_2_set_functions();
 
+	psci_init_migrate();
+
 	return 0;
 }
 
@@ -452,6 +513,11 @@ static int cpu_psci_cpu_disable(unsigned int cpu)
 	/* Fail early if we don't have CPU_OFF support */
 	if (!psci_ops.cpu_off)
 		return -EOPNOTSUPP;
+
+	/* Trusted OS will deny CPU_OFF */
+	if (psci_tos_resident_on(cpu))
+		return -EPERM;
+
 	return 0;
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 07/12] arm64: psci: kill psci_power_state
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (5 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 06/12] arm64: psci: account for Trusted OS instances Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 08/12] arm64: psci: remove ACPI coupling Mark Rutland
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

A PSCI 1.0 implementation may choose to use the new extended StateID
format, the presence of which may be queried via the PSCI_FEATURES call.
The layout of this new StateID format is incompatible with the existing
format, and so to handle both we must abstract attempts to parse the
fields.

In preparation for PSCI 1.0 support, this patch introduces
psci_power_state_loses_context and psci_power_state_is_valid functions
to query information from a PSCI power state, which is no longer
decomposed (and hence the pack/unpack functions are removed). As it is
no longer decomposed, it is now passed round as an opaque u32 token.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/kernel/psci.c | 89 ++++++++++++++++++++----------------------------
 1 file changed, 37 insertions(+), 52 deletions(-)

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index ffa17d1..0e2a440 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -38,11 +38,19 @@
 #define PSCI_POWER_STATE_TYPE_STANDBY		0
 #define PSCI_POWER_STATE_TYPE_POWER_DOWN	1
 
-struct psci_power_state {
-	u16	id;
-	u8	type;
-	u8	affinity_level;
-};
+static bool psci_power_state_loses_context(u32 state)
+{
+	return state & PSCI_0_2_POWER_STATE_TYPE_MASK;
+}
+
+static bool psci_power_state_is_valid(u32 state)
+{
+	const u32 valid_mask = PSCI_0_2_POWER_STATE_ID_MASK |
+			       PSCI_0_2_POWER_STATE_TYPE_MASK |
+			       PSCI_0_2_POWER_STATE_AFFL_MASK;
+
+	return !(state & ~valid_mask);
+}
 
 /*
  * The CPU any Trusted OS is resident on. The trusted OS may reject CPU_OFF
@@ -58,9 +66,8 @@ static bool psci_tos_resident_on(int cpu)
 }
 
 struct psci_operations {
-	int (*cpu_suspend)(struct psci_power_state state,
-			   unsigned long entry_point);
-	int (*cpu_off)(struct psci_power_state state);
+	int (*cpu_suspend)(u32 state, unsigned long entry_point);
+	int (*cpu_off)(u32 state);
 	int (*cpu_on)(unsigned long cpuid, unsigned long entry_point);
 	int (*migrate)(unsigned long cpuid);
 	int (*affinity_info)(unsigned long target_affinity,
@@ -84,7 +91,7 @@ enum psci_function {
 	PSCI_FN_MAX,
 };
 
-static DEFINE_PER_CPU_READ_MOSTLY(struct psci_power_state *, psci_power_state);
+static DEFINE_PER_CPU_READ_MOSTLY(u32 *, psci_power_state);
 
 static u32 psci_function_id[PSCI_FN_MAX];
 
@@ -104,53 +111,28 @@ static int psci_to_linux_errno(int errno)
 	return -EINVAL;
 }
 
-static u32 psci_power_state_pack(struct psci_power_state state)
-{
-	return ((state.id << PSCI_0_2_POWER_STATE_ID_SHIFT)
-			& PSCI_0_2_POWER_STATE_ID_MASK) |
-		((state.type << PSCI_0_2_POWER_STATE_TYPE_SHIFT)
-		 & PSCI_0_2_POWER_STATE_TYPE_MASK) |
-		((state.affinity_level << PSCI_0_2_POWER_STATE_AFFL_SHIFT)
-		 & PSCI_0_2_POWER_STATE_AFFL_MASK);
-}
-
-static void psci_power_state_unpack(u32 power_state,
-				    struct psci_power_state *state)
-{
-	state->id = (power_state & PSCI_0_2_POWER_STATE_ID_MASK) >>
-			PSCI_0_2_POWER_STATE_ID_SHIFT;
-	state->type = (power_state & PSCI_0_2_POWER_STATE_TYPE_MASK) >>
-			PSCI_0_2_POWER_STATE_TYPE_SHIFT;
-	state->affinity_level =
-			(power_state & PSCI_0_2_POWER_STATE_AFFL_MASK) >>
-			PSCI_0_2_POWER_STATE_AFFL_SHIFT;
-}
-
 static u32 psci_get_version(void)
 {
 	return invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
 }
 
-static int psci_cpu_suspend(struct psci_power_state state,
-			    unsigned long entry_point)
+static int psci_cpu_suspend(u32 state, unsigned long entry_point)
 {
 	int err;
-	u32 fn, power_state;
+	u32 fn;
 
 	fn = psci_function_id[PSCI_FN_CPU_SUSPEND];
-	power_state = psci_power_state_pack(state);
-	err = invoke_psci_fn(fn, power_state, entry_point, 0);
+	err = invoke_psci_fn(fn, state, entry_point, 0);
 	return psci_to_linux_errno(err);
 }
 
-static int psci_cpu_off(struct psci_power_state state)
+static int psci_cpu_off(u32 state)
 {
 	int err;
-	u32 fn, power_state;
+	u32 fn;
 
 	fn = psci_function_id[PSCI_FN_CPU_OFF];
-	power_state = psci_power_state_pack(state);
-	err = invoke_psci_fn(fn, power_state, 0, 0);
+	err = invoke_psci_fn(fn, state, 0, 0);
 	return psci_to_linux_errno(err);
 }
 
@@ -194,7 +176,7 @@ static unsigned long psci_migrate_info_up_cpu(void)
 static int __maybe_unused cpu_psci_cpu_init_idle(unsigned int cpu)
 {
 	int i, ret, count = 0;
-	struct psci_power_state *psci_states;
+	u32 *psci_states;
 	struct device_node *state_node, *cpu_node;
 
 	cpu_node = of_get_cpu_node(cpu, NULL);
@@ -223,13 +205,13 @@ static int __maybe_unused cpu_psci_cpu_init_idle(unsigned int cpu)
 		return -ENOMEM;
 
 	for (i = 0; i < count; i++) {
-		u32 psci_power_state;
+		u32 state;
 
 		state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i);
 
 		ret = of_property_read_u32(state_node,
 					   "arm,psci-suspend-param",
-					   &psci_power_state);
+					   &state);
 		if (ret) {
 			pr_warn(" * %s missing arm,psci-suspend-param property\n",
 				state_node->full_name);
@@ -238,9 +220,13 @@ static int __maybe_unused cpu_psci_cpu_init_idle(unsigned int cpu)
 		}
 
 		of_node_put(state_node);
-		pr_debug("psci-power-state %#x index %d\n", psci_power_state,
-							    i);
-		psci_power_state_unpack(psci_power_state, &psci_states[i]);
+		pr_debug("psci-power-state %#x index %d\n", state, i);
+		if (!psci_power_state_is_valid(state)) {
+			pr_warn("Invalid PSCI power state %#x\n", state);
+			ret = -EINVAL;
+			goto free_mem;
+		}
+		psci_states[i] = state;
 	}
 	/* Idle states parsed correctly, initialize per-cpu pointer */
 	per_cpu(psci_power_state, cpu) = psci_states;
@@ -528,9 +514,8 @@ static void cpu_psci_cpu_die(unsigned int cpu)
 	 * There are no known implementations of PSCI actually using the
 	 * power state field, pass a sensible default for now.
 	 */
-	struct psci_power_state state = {
-		.type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
-	};
+	u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
+		    PSCI_0_2_POWER_STATE_TYPE_SHIFT;
 
 	ret = psci_ops.cpu_off(state);
 
@@ -569,7 +554,7 @@ static int cpu_psci_cpu_kill(unsigned int cpu)
 
 static int psci_suspend_finisher(unsigned long index)
 {
-	struct psci_power_state *state = __this_cpu_read(psci_power_state);
+	u32 *state = __this_cpu_read(psci_power_state);
 
 	return psci_ops.cpu_suspend(state[index - 1],
 				    virt_to_phys(cpu_resume));
@@ -578,7 +563,7 @@ static int psci_suspend_finisher(unsigned long index)
 static int __maybe_unused cpu_psci_cpu_suspend(unsigned long index)
 {
 	int ret;
-	struct psci_power_state *state = __this_cpu_read(psci_power_state);
+	u32 *state = __this_cpu_read(psci_power_state);
 	/*
 	 * idle state index 0 corresponds to wfi, should never be called
 	 * from the cpu_suspend operations
@@ -586,7 +571,7 @@ static int __maybe_unused cpu_psci_cpu_suspend(unsigned long index)
 	if (WARN_ON_ONCE(!index))
 		return -EINVAL;
 
-	if (state[index - 1].type == PSCI_POWER_STATE_TYPE_STANDBY)
+	if (!psci_power_state_loses_context(state[index - 1]))
 		ret = psci_ops.cpu_suspend(state[index - 1], 0);
 	else
 		ret = __cpu_suspend(index, psci_suspend_finisher);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 08/12] arm64: psci: remove ACPI coupling
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (6 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 07/12] arm64: psci: kill psci_power_state Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 20:18   ` Al Stone
  2015-05-26 13:52 ` [PATCHv3 09/12] arm64: psci: factor invocation code to drivers Mark Rutland
                   ` (4 subsequent siblings)
  12 siblings, 1 reply; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

The 32-bit ARM port doesn't have ACPI headers, and conditionally
including them is going to look horrendous. In preparation for sharing
the PSCI invocation code with 32-bit, move the acpi_psci_* function
declarations and definitions such that the PSCI client code need not
include ACPI headers.

While it would seem like we could simply hide the ACPI includes in
psci.h, the ACPI headers have hilarious circular dependencies which make
this infeasible without reorganising most of ACPICA. So rather than
doing that, move the acpi_psci_* prototypes into psci.h.

The psci_acpi_init function is made dependent on CONFIG_ACPI (with a
stub implementation in asm/psci.h) such that it need not be built for
32-bit ARM or kernels without ACPI support. The currently missing __init
annotations are added to the prototypes in the header.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Hanjun Guo <hanjun.guo@linaro.org>
Reviewed-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
Cc: Al Stone <al.stone@linaro.org>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/include/asm/acpi.h | 15 +--------------
 arch/arm64/include/asm/psci.h | 12 ++++++++++--
 arch/arm64/kernel/acpi.c      | 11 +++++++++++
 arch/arm64/kernel/psci.c      |  4 ++--
 4 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
index 1240b86..39248d3 100644
--- a/arch/arm64/include/asm/acpi.h
+++ b/arch/arm64/include/asm/acpi.h
@@ -16,6 +16,7 @@
 #include <linux/irqchip/arm-gic-acpi.h>
 
 #include <asm/cputype.h>
+#include <asm/psci.h>
 #include <asm/smp_plat.h>
 
 /* Basic configuration for ACPI */
@@ -39,18 +40,6 @@ extern int acpi_disabled;
 extern int acpi_noirq;
 extern int acpi_pci_disabled;
 
-/* 1 to indicate PSCI 0.2+ is implemented */
-static inline bool acpi_psci_present(void)
-{
-	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_COMPLIANT;
-}
-
-/* 1 to indicate HVC must be used instead of SMC as the PSCI conduit */
-static inline bool acpi_psci_use_hvc(void)
-{
-	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
-}
-
 static inline void disable_acpi(void)
 {
 	acpi_disabled = 1;
@@ -88,8 +77,6 @@ static inline void arch_fix_phys_package_id(int num, u32 slot) { }
 void __init acpi_init_cpus(void);
 
 #else
-static inline bool acpi_psci_present(void) { return false; }
-static inline bool acpi_psci_use_hvc(void) { return false; }
 static inline void acpi_init_cpus(void) { }
 #endif /* CONFIG_ACPI */
 
diff --git a/arch/arm64/include/asm/psci.h b/arch/arm64/include/asm/psci.h
index 2454bc5..49d7e1a 100644
--- a/arch/arm64/include/asm/psci.h
+++ b/arch/arm64/include/asm/psci.h
@@ -14,7 +14,15 @@
 #ifndef __ASM_PSCI_H
 #define __ASM_PSCI_H
 
-int psci_dt_init(void);
-int psci_acpi_init(void);
+int __init psci_dt_init(void);
+
+#ifdef CONFIG_ACPI
+int __init psci_acpi_init(void);
+bool __init acpi_psci_present(void);
+bool __init acpi_psci_use_hvc(void);
+#else
+static inline int psci_acpi_init(void) { return 0; }
+static inline bool acpi_psci_present(void) { return false; }
+#endif
 
 #endif /* __ASM_PSCI_H */
diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
index 732f57b..19de753 100644
--- a/arch/arm64/kernel/acpi.c
+++ b/arch/arm64/kernel/acpi.c
@@ -89,6 +89,17 @@ void __init __acpi_unmap_table(char *map, unsigned long size)
 	early_memunmap(map, size);
 }
 
+bool __init acpi_psci_present(void)
+{
+	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_COMPLIANT;
+}
+
+/* Whether HVC must be used instead of SMC as the PSCI conduit */
+bool __init acpi_psci_use_hvc(void)
+{
+	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
+}
+
 /*
  * acpi_fadt_sanity_check() - Check FADT presence and carry out sanity
  *			      checks on it
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 0e2a440..cba05d9 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -15,7 +15,6 @@
 
 #define pr_fmt(fmt) "psci: " fmt
 
-#include <linux/acpi.h>
 #include <linux/init.h>
 #include <linux/of.h>
 #include <linux/smp.h>
@@ -25,7 +24,6 @@
 #include <linux/slab.h>
 #include <uapi/linux/psci.h>
 
-#include <asm/acpi.h>
 #include <asm/compiler.h>
 #include <asm/cputype.h>
 #include <asm/cpu_ops.h>
@@ -446,6 +444,7 @@ int __init psci_dt_init(void)
 	return init_fn(np);
 }
 
+#ifdef CONFIG_ACPI
 /*
  * We use PSCI 0.2+ when ACPI is deployed on ARM64 and it's
  * explicitly clarified in SBBR
@@ -466,6 +465,7 @@ int __init psci_acpi_init(void)
 
 	return psci_probe();
 }
+#endif
 
 #ifdef CONFIG_SMP
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 09/12] arm64: psci: factor invocation code to drivers
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (7 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 08/12] arm64: psci: remove ACPI coupling Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 10/12] drivers: psci: support native SMC{32,64} calls Mark Rutland
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

To enable sharing with arm, move the core PSCI framework code to
drivers/firmware. This results in a minor gain in lines of code, but
this will quickly be amortised by the removal of code currently
duplicated in arch/arm.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/Kconfig                             |   1 +
 arch/arm64/include/asm/acpi.h                  |   4 +-
 arch/arm64/include/asm/psci.h                  |  28 --
 arch/arm64/kernel/psci.c                       | 361 +------------------------
 arch/arm64/kernel/setup.c                      |   2 +-
 drivers/firmware/Kconfig                       |   3 +
 drivers/firmware/Makefile                      |   1 +
 {arch/arm64/kernel => drivers/firmware}/psci.c | 251 +----------------
 {arch/arm/include/asm => include/linux}/psci.h |  40 +--
 9 files changed, 43 insertions(+), 648 deletions(-)
 delete mode 100644 arch/arm64/include/asm/psci.h
 copy {arch/arm64/kernel => drivers/firmware}/psci.c (59%)
 copy {arch/arm/include/asm => include/linux}/psci.h (55%)

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 7796af4..d43ba0d 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -19,6 +19,7 @@ config ARM64
 	select ARM_GIC_V2M if PCI_MSI
 	select ARM_GIC_V3
 	select ARM_GIC_V3_ITS if PCI_MSI
+	select ARM_PSCI_FW
 	select BUILDTIME_EXTABLE_SORT
 	select CLONE_BACKWARDS
 	select COMMON_CLK
diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
index 39248d3..ed7e212 100644
--- a/arch/arm64/include/asm/acpi.h
+++ b/arch/arm64/include/asm/acpi.h
@@ -12,11 +12,11 @@
 #ifndef _ASM_ACPI_H
 #define _ASM_ACPI_H
 
-#include <linux/mm.h>
 #include <linux/irqchip/arm-gic-acpi.h>
+#include <linux/mm.h>
+#include <linux/psci.h>
 
 #include <asm/cputype.h>
-#include <asm/psci.h>
 #include <asm/smp_plat.h>
 
 /* Basic configuration for ACPI */
diff --git a/arch/arm64/include/asm/psci.h b/arch/arm64/include/asm/psci.h
deleted file mode 100644
index 49d7e1a..0000000
--- a/arch/arm64/include/asm/psci.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * Copyright (C) 2013 ARM Limited
- */
-
-#ifndef __ASM_PSCI_H
-#define __ASM_PSCI_H
-
-int __init psci_dt_init(void);
-
-#ifdef CONFIG_ACPI
-int __init psci_acpi_init(void);
-bool __init acpi_psci_present(void);
-bool __init acpi_psci_use_hvc(void);
-#else
-static inline int psci_acpi_init(void) { return 0; }
-static inline bool acpi_psci_present(void) { return false; }
-#endif
-
-#endif /* __ASM_PSCI_H */
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index cba05d9..8063891 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -18,23 +18,17 @@
 #include <linux/init.h>
 #include <linux/of.h>
 #include <linux/smp.h>
-#include <linux/reboot.h>
-#include <linux/pm.h>
 #include <linux/delay.h>
+#include <linux/psci.h>
 #include <linux/slab.h>
+
 #include <uapi/linux/psci.h>
 
 #include <asm/compiler.h>
-#include <asm/cputype.h>
 #include <asm/cpu_ops.h>
 #include <asm/errno.h>
-#include <asm/psci.h>
 #include <asm/smp_plat.h>
 #include <asm/suspend.h>
-#include <asm/system_misc.h>
-
-#define PSCI_POWER_STATE_TYPE_STANDBY		0
-#define PSCI_POWER_STATE_TYPE_POWER_DOWN	1
 
 static bool psci_power_state_loses_context(u32 state)
 {
@@ -50,127 +44,8 @@ static bool psci_power_state_is_valid(u32 state)
 	return !(state & ~valid_mask);
 }
 
-/*
- * The CPU any Trusted OS is resident on. The trusted OS may reject CPU_OFF
- * calls to its resident CPU, so we must avoid issuing those. We never migrate
- * a Trusted OS even if it claims to be capable of migration -- doing so will
- * require cooperation with a Trusted OS driver.
- */
-static int resident_cpu = -1;
-
-static bool psci_tos_resident_on(int cpu)
-{
-	return cpu == resident_cpu;
-}
-
-struct psci_operations {
-	int (*cpu_suspend)(u32 state, unsigned long entry_point);
-	int (*cpu_off)(u32 state);
-	int (*cpu_on)(unsigned long cpuid, unsigned long entry_point);
-	int (*migrate)(unsigned long cpuid);
-	int (*affinity_info)(unsigned long target_affinity,
-			unsigned long lowest_affinity_level);
-	int (*migrate_info_type)(void);
-};
-
-static struct psci_operations psci_ops;
-
-typedef unsigned long (psci_fn)(unsigned long, unsigned long,
-				unsigned long, unsigned long);
-asmlinkage psci_fn __invoke_psci_fn_hvc;
-asmlinkage psci_fn __invoke_psci_fn_smc;
-static psci_fn *invoke_psci_fn;
-
-enum psci_function {
-	PSCI_FN_CPU_SUSPEND,
-	PSCI_FN_CPU_ON,
-	PSCI_FN_CPU_OFF,
-	PSCI_FN_MIGRATE,
-	PSCI_FN_MAX,
-};
-
 static DEFINE_PER_CPU_READ_MOSTLY(u32 *, psci_power_state);
 
-static u32 psci_function_id[PSCI_FN_MAX];
-
-static int psci_to_linux_errno(int errno)
-{
-	switch (errno) {
-	case PSCI_RET_SUCCESS:
-		return 0;
-	case PSCI_RET_NOT_SUPPORTED:
-		return -EOPNOTSUPP;
-	case PSCI_RET_INVALID_PARAMS:
-		return -EINVAL;
-	case PSCI_RET_DENIED:
-		return -EPERM;
-	};
-
-	return -EINVAL;
-}
-
-static u32 psci_get_version(void)
-{
-	return invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
-}
-
-static int psci_cpu_suspend(u32 state, unsigned long entry_point)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_CPU_SUSPEND];
-	err = invoke_psci_fn(fn, state, entry_point, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_cpu_off(u32 state)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_CPU_OFF];
-	err = invoke_psci_fn(fn, state, 0, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_cpu_on(unsigned long cpuid, unsigned long entry_point)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_CPU_ON];
-	err = invoke_psci_fn(fn, cpuid, entry_point, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_migrate(unsigned long cpuid)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_MIGRATE];
-	err = invoke_psci_fn(fn, cpuid, 0, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_affinity_info(unsigned long target_affinity,
-		unsigned long lowest_affinity_level)
-{
-	return invoke_psci_fn(PSCI_0_2_FN64_AFFINITY_INFO, target_affinity,
-			      lowest_affinity_level, 0);
-}
-
-static int psci_migrate_info_type(void)
-{
-	return invoke_psci_fn(PSCI_0_2_FN_MIGRATE_INFO_TYPE, 0, 0, 0);
-}
-
-static unsigned long psci_migrate_info_up_cpu(void)
-{
-	return invoke_psci_fn(PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU, 0, 0, 0);
-}
-
 static int __maybe_unused cpu_psci_cpu_init_idle(unsigned int cpu)
 {
 	int i, ret, count = 0;
@@ -235,238 +110,6 @@ free_mem:
 	return ret;
 }
 
-static int get_set_conduit_method(struct device_node *np)
-{
-	const char *method;
-
-	pr_info("probing for conduit method from DT.\n");
-
-	if (of_property_read_string(np, "method", &method)) {
-		pr_warn("missing \"method\" property\n");
-		return -ENXIO;
-	}
-
-	if (!strcmp("hvc", method)) {
-		invoke_psci_fn = __invoke_psci_fn_hvc;
-	} else if (!strcmp("smc", method)) {
-		invoke_psci_fn = __invoke_psci_fn_smc;
-	} else {
-		pr_warn("invalid \"method\" property: %s\n", method);
-		return -EINVAL;
-	}
-	return 0;
-}
-
-static void psci_sys_reset(enum reboot_mode reboot_mode, const char *cmd)
-{
-	invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
-}
-
-static void psci_sys_poweroff(void)
-{
-	invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
-}
-
-/*
- * Detect the presence of a resident Trusted OS which may cause CPU_OFF to
- * return DENIED (which would be fatal).
- */
-static void __init psci_init_migrate(void)
-{
-	unsigned long cpuid;
-	int type, cpu;
-
-	type = psci_ops.migrate_info_type();
-
-	if (type == PSCI_0_2_TOS_MP) {
-		pr_info("Trusted OS migration not required\n");
-		return;
-	}
-
-	if (type == PSCI_RET_NOT_SUPPORTED) {
-		pr_info("MIGRATE_INFO_TYPE not supported.\n");
-		return;
-	}
-
-	if (type != PSCI_0_2_TOS_UP_MIGRATE &&
-	    type != PSCI_0_2_TOS_UP_NO_MIGRATE) {
-		pr_err("MIGRATE_INFO_TYPE returned unknown type (%d)\n", type);
-		return;
-	}
-
-	cpuid = psci_migrate_info_up_cpu();
-	if (cpuid & ~MPIDR_HWID_BITMASK) {
-		pr_warn("MIGRATE_INFO_UP_CPU reported invalid physical ID (0x%lx)\n",
-			cpuid);
-		return;
-	}
-
-	cpu = get_logical_index(cpuid);
-	resident_cpu = cpu >= 0 ? cpu : -1;
-
-	pr_info("Trusted OS resident on physical CPU 0x%lx\n", cpuid);
-}
-
-static void __init psci_0_2_set_functions(void)
-{
-	pr_info("Using standard PSCI v0.2 function IDs\n");
-	psci_function_id[PSCI_FN_CPU_SUSPEND] = PSCI_0_2_FN64_CPU_SUSPEND;
-	psci_ops.cpu_suspend = psci_cpu_suspend;
-
-	psci_function_id[PSCI_FN_CPU_OFF] = PSCI_0_2_FN_CPU_OFF;
-	psci_ops.cpu_off = psci_cpu_off;
-
-	psci_function_id[PSCI_FN_CPU_ON] = PSCI_0_2_FN64_CPU_ON;
-	psci_ops.cpu_on = psci_cpu_on;
-
-	psci_function_id[PSCI_FN_MIGRATE] = PSCI_0_2_FN64_MIGRATE;
-	psci_ops.migrate = psci_migrate;
-
-	psci_ops.affinity_info = psci_affinity_info;
-
-	psci_ops.migrate_info_type = psci_migrate_info_type;
-
-	arm_pm_restart = psci_sys_reset;
-
-	pm_power_off = psci_sys_poweroff;
-}
-
-/*
- * Probe function for PSCI firmware versions >= 0.2
- */
-static int __init psci_probe(void)
-{
-	u32 ver = psci_get_version();
-
-	pr_info("PSCIv%d.%d detected in firmware.\n",
-			PSCI_VERSION_MAJOR(ver),
-			PSCI_VERSION_MINOR(ver));
-
-	if (PSCI_VERSION_MAJOR(ver) == 0 && PSCI_VERSION_MINOR(ver) < 2) {
-		pr_err("Conflicting PSCI version detected.\n");
-		return -EINVAL;
-	}
-
-	psci_0_2_set_functions();
-
-	psci_init_migrate();
-
-	return 0;
-}
-
-typedef int (*psci_initcall_t)(const struct device_node *);
-
-/*
- * PSCI init function for PSCI versions >=0.2
- *
- * Probe based on PSCI PSCI_VERSION function
- */
-static int __init psci_0_2_init(struct device_node *np)
-{
-	int err;
-
-	err = get_set_conduit_method(np);
-
-	if (err)
-		goto out_put_node;
-	/*
-	 * Starting with v0.2, the PSCI specification introduced a call
-	 * (PSCI_VERSION) that allows probing the firmware version, so
-	 * that PSCI function IDs and version specific initialization
-	 * can be carried out according to the specific version reported
-	 * by firmware
-	 */
-	err = psci_probe();
-
-out_put_node:
-	of_node_put(np);
-	return err;
-}
-
-/*
- * PSCI < v0.2 get PSCI Function IDs via DT.
- */
-static int __init psci_0_1_init(struct device_node *np)
-{
-	u32 id;
-	int err;
-
-	err = get_set_conduit_method(np);
-
-	if (err)
-		goto out_put_node;
-
-	pr_info("Using PSCI v0.1 Function IDs from DT\n");
-
-	if (!of_property_read_u32(np, "cpu_suspend", &id)) {
-		psci_function_id[PSCI_FN_CPU_SUSPEND] = id;
-		psci_ops.cpu_suspend = psci_cpu_suspend;
-	}
-
-	if (!of_property_read_u32(np, "cpu_off", &id)) {
-		psci_function_id[PSCI_FN_CPU_OFF] = id;
-		psci_ops.cpu_off = psci_cpu_off;
-	}
-
-	if (!of_property_read_u32(np, "cpu_on", &id)) {
-		psci_function_id[PSCI_FN_CPU_ON] = id;
-		psci_ops.cpu_on = psci_cpu_on;
-	}
-
-	if (!of_property_read_u32(np, "migrate", &id)) {
-		psci_function_id[PSCI_FN_MIGRATE] = id;
-		psci_ops.migrate = psci_migrate;
-	}
-
-out_put_node:
-	of_node_put(np);
-	return err;
-}
-
-static const struct of_device_id psci_of_match[] __initconst = {
-	{ .compatible = "arm,psci",	.data = psci_0_1_init},
-	{ .compatible = "arm,psci-0.2",	.data = psci_0_2_init},
-	{},
-};
-
-int __init psci_dt_init(void)
-{
-	struct device_node *np;
-	const struct of_device_id *matched_np;
-	psci_initcall_t init_fn;
-
-	np = of_find_matching_node_and_match(NULL, psci_of_match, &matched_np);
-
-	if (!np)
-		return -ENODEV;
-
-	init_fn = (psci_initcall_t)matched_np->data;
-	return init_fn(np);
-}
-
-#ifdef CONFIG_ACPI
-/*
- * We use PSCI 0.2+ when ACPI is deployed on ARM64 and it's
- * explicitly clarified in SBBR
- */
-int __init psci_acpi_init(void)
-{
-	if (!acpi_psci_present()) {
-		pr_info("is not implemented in ACPI.\n");
-		return -EOPNOTSUPP;
-	}
-
-	pr_info("probing for conduit method from ACPI.\n");
-
-	if (acpi_psci_use_hvc())
-		invoke_psci_fn = __invoke_psci_fn_hvc;
-	else
-		invoke_psci_fn = __invoke_psci_fn_smc;
-
-	return psci_probe();
-}
-#endif
-
 #ifdef CONFIG_SMP
 
 static int __init cpu_psci_cpu_init(unsigned int cpu)
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index 508cca1..d6a5922 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -46,6 +46,7 @@
 #include <linux/of_platform.h>
 #include <linux/efi.h>
 #include <linux/personality.h>
+#include <linux/psci.h>
 
 #include <asm/acpi.h>
 #include <asm/fixmap.h>
@@ -61,7 +62,6 @@
 #include <asm/tlbflush.h>
 #include <asm/traps.h>
 #include <asm/memblock.h>
-#include <asm/psci.h>
 #include <asm/efi.h>
 #include <asm/virt.h>
 
diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
index 6517132..24be7a3 100644
--- a/drivers/firmware/Kconfig
+++ b/drivers/firmware/Kconfig
@@ -5,6 +5,9 @@
 
 menu "Firmware Drivers"
 
+config ARM_PSCI_FW
+	bool
+
 config EDD
 	tristate "BIOS Enhanced Disk Drive calls determine boot disk"
 	depends on X86
diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile
index 3fdd391..6b05129 100644
--- a/drivers/firmware/Makefile
+++ b/drivers/firmware/Makefile
@@ -1,6 +1,7 @@
 #
 # Makefile for the linux kernel.
 #
+obj-$(CONFIG_ARM_PSCI_FW)	+= psci.o
 obj-$(CONFIG_DMI)		+= dmi_scan.o
 obj-$(CONFIG_DMI_SYSFS)		+= dmi-sysfs.o
 obj-$(CONFIG_EDD)		+= edd.o
diff --git a/arch/arm64/kernel/psci.c b/drivers/firmware/psci.c
similarity index 59%
copy from arch/arm64/kernel/psci.c
copy to drivers/firmware/psci.c
index cba05d9..07b2daa 100644
--- a/arch/arm64/kernel/psci.c
+++ b/drivers/firmware/psci.c
@@ -8,47 +8,24 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * Copyright (C) 2013 ARM Limited
- *
- * Author: Will Deacon <will.deacon@arm.com>
+ * Copyright (C) 2015 ARM Limited
  */
 
 #define pr_fmt(fmt) "psci: " fmt
 
-#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/linkage.h>
 #include <linux/of.h>
-#include <linux/smp.h>
-#include <linux/reboot.h>
 #include <linux/pm.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
+#include <linux/printk.h>
+#include <linux/psci.h>
+#include <linux/reboot.h>
+
 #include <uapi/linux/psci.h>
 
-#include <asm/compiler.h>
 #include <asm/cputype.h>
-#include <asm/cpu_ops.h>
-#include <asm/errno.h>
-#include <asm/psci.h>
-#include <asm/smp_plat.h>
-#include <asm/suspend.h>
 #include <asm/system_misc.h>
-
-#define PSCI_POWER_STATE_TYPE_STANDBY		0
-#define PSCI_POWER_STATE_TYPE_POWER_DOWN	1
-
-static bool psci_power_state_loses_context(u32 state)
-{
-	return state & PSCI_0_2_POWER_STATE_TYPE_MASK;
-}
-
-static bool psci_power_state_is_valid(u32 state)
-{
-	const u32 valid_mask = PSCI_0_2_POWER_STATE_ID_MASK |
-			       PSCI_0_2_POWER_STATE_TYPE_MASK |
-			       PSCI_0_2_POWER_STATE_AFFL_MASK;
-
-	return !(state & ~valid_mask);
-}
+#include <asm/smp_plat.h>
 
 /*
  * The CPU any Trusted OS is resident on. The trusted OS may reject CPU_OFF
@@ -58,22 +35,12 @@ static bool psci_power_state_is_valid(u32 state)
  */
 static int resident_cpu = -1;
 
-static bool psci_tos_resident_on(int cpu)
+bool psci_tos_resident_on(int cpu)
 {
 	return cpu == resident_cpu;
 }
 
-struct psci_operations {
-	int (*cpu_suspend)(u32 state, unsigned long entry_point);
-	int (*cpu_off)(u32 state);
-	int (*cpu_on)(unsigned long cpuid, unsigned long entry_point);
-	int (*migrate)(unsigned long cpuid);
-	int (*affinity_info)(unsigned long target_affinity,
-			unsigned long lowest_affinity_level);
-	int (*migrate_info_type)(void);
-};
-
-static struct psci_operations psci_ops;
+struct psci_operations psci_ops;
 
 typedef unsigned long (psci_fn)(unsigned long, unsigned long,
 				unsigned long, unsigned long);
@@ -89,8 +56,6 @@ enum psci_function {
 	PSCI_FN_MAX,
 };
 
-static DEFINE_PER_CPU_READ_MOSTLY(u32 *, psci_power_state);
-
 static u32 psci_function_id[PSCI_FN_MAX];
 
 static int psci_to_linux_errno(int errno)
@@ -171,70 +136,6 @@ static unsigned long psci_migrate_info_up_cpu(void)
 	return invoke_psci_fn(PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU, 0, 0, 0);
 }
 
-static int __maybe_unused cpu_psci_cpu_init_idle(unsigned int cpu)
-{
-	int i, ret, count = 0;
-	u32 *psci_states;
-	struct device_node *state_node, *cpu_node;
-
-	cpu_node = of_get_cpu_node(cpu, NULL);
-	if (!cpu_node)
-		return -ENODEV;
-
-	/*
-	 * If the PSCI cpu_suspend function hook has not been initialized
-	 * idle states must not be enabled, so bail out
-	 */
-	if (!psci_ops.cpu_suspend)
-		return -EOPNOTSUPP;
-
-	/* Count idle states */
-	while ((state_node = of_parse_phandle(cpu_node, "cpu-idle-states",
-					      count))) {
-		count++;
-		of_node_put(state_node);
-	}
-
-	if (!count)
-		return -ENODEV;
-
-	psci_states = kcalloc(count, sizeof(*psci_states), GFP_KERNEL);
-	if (!psci_states)
-		return -ENOMEM;
-
-	for (i = 0; i < count; i++) {
-		u32 state;
-
-		state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i);
-
-		ret = of_property_read_u32(state_node,
-					   "arm,psci-suspend-param",
-					   &state);
-		if (ret) {
-			pr_warn(" * %s missing arm,psci-suspend-param property\n",
-				state_node->full_name);
-			of_node_put(state_node);
-			goto free_mem;
-		}
-
-		of_node_put(state_node);
-		pr_debug("psci-power-state %#x index %d\n", state, i);
-		if (!psci_power_state_is_valid(state)) {
-			pr_warn("Invalid PSCI power state %#x\n", state);
-			ret = -EINVAL;
-			goto free_mem;
-		}
-		psci_states[i] = state;
-	}
-	/* Idle states parsed correctly, initialize per-cpu pointer */
-	per_cpu(psci_power_state, cpu) = psci_states;
-	return 0;
-
-free_mem:
-	kfree(psci_states);
-	return ret;
-}
-
 static int get_set_conduit_method(struct device_node *np)
 {
 	const char *method;
@@ -274,7 +175,7 @@ static void psci_sys_poweroff(void)
 static void __init psci_init_migrate(void)
 {
 	unsigned long cpuid;
-	int type, cpu;
+	int type, cpu = -1;
 
 	type = psci_ops.migrate_info_type();
 
@@ -467,133 +368,3 @@ int __init psci_acpi_init(void)
 }
 #endif
 
-#ifdef CONFIG_SMP
-
-static int __init cpu_psci_cpu_init(unsigned int cpu)
-{
-	return 0;
-}
-
-static int __init cpu_psci_cpu_prepare(unsigned int cpu)
-{
-	if (!psci_ops.cpu_on) {
-		pr_err("no cpu_on method, not booting CPU%d\n", cpu);
-		return -ENODEV;
-	}
-
-	return 0;
-}
-
-static int cpu_psci_cpu_boot(unsigned int cpu)
-{
-	int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_entry));
-	if (err)
-		pr_err("failed to boot CPU%d (%d)\n", cpu, err);
-
-	return err;
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-static int cpu_psci_cpu_disable(unsigned int cpu)
-{
-	/* Fail early if we don't have CPU_OFF support */
-	if (!psci_ops.cpu_off)
-		return -EOPNOTSUPP;
-
-	/* Trusted OS will deny CPU_OFF */
-	if (psci_tos_resident_on(cpu))
-		return -EPERM;
-
-	return 0;
-}
-
-static void cpu_psci_cpu_die(unsigned int cpu)
-{
-	int ret;
-	/*
-	 * There are no known implementations of PSCI actually using the
-	 * power state field, pass a sensible default for now.
-	 */
-	u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
-		    PSCI_0_2_POWER_STATE_TYPE_SHIFT;
-
-	ret = psci_ops.cpu_off(state);
-
-	pr_crit("unable to power off CPU%u (%d)\n", cpu, ret);
-}
-
-static int cpu_psci_cpu_kill(unsigned int cpu)
-{
-	int err, i;
-
-	if (!psci_ops.affinity_info)
-		return 0;
-	/*
-	 * cpu_kill could race with cpu_die and we can
-	 * potentially end up declaring this cpu undead
-	 * while it is dying. So, try again a few times.
-	 */
-
-	for (i = 0; i < 10; i++) {
-		err = psci_ops.affinity_info(cpu_logical_map(cpu), 0);
-		if (err == PSCI_0_2_AFFINITY_LEVEL_OFF) {
-			pr_info("CPU%d killed.\n", cpu);
-			return 0;
-		}
-
-		msleep(10);
-		pr_info("Retrying again to check for CPU kill\n");
-	}
-
-	pr_warn("CPU%d may not have shut down cleanly (AFFINITY_INFO reports %d)\n",
-			cpu, err);
-	return -ETIMEDOUT;
-}
-#endif
-#endif
-
-static int psci_suspend_finisher(unsigned long index)
-{
-	u32 *state = __this_cpu_read(psci_power_state);
-
-	return psci_ops.cpu_suspend(state[index - 1],
-				    virt_to_phys(cpu_resume));
-}
-
-static int __maybe_unused cpu_psci_cpu_suspend(unsigned long index)
-{
-	int ret;
-	u32 *state = __this_cpu_read(psci_power_state);
-	/*
-	 * idle state index 0 corresponds to wfi, should never be called
-	 * from the cpu_suspend operations
-	 */
-	if (WARN_ON_ONCE(!index))
-		return -EINVAL;
-
-	if (!psci_power_state_loses_context(state[index - 1]))
-		ret = psci_ops.cpu_suspend(state[index - 1], 0);
-	else
-		ret = __cpu_suspend(index, psci_suspend_finisher);
-
-	return ret;
-}
-
-const struct cpu_operations cpu_psci_ops = {
-	.name		= "psci",
-#ifdef CONFIG_CPU_IDLE
-	.cpu_init_idle	= cpu_psci_cpu_init_idle,
-	.cpu_suspend	= cpu_psci_cpu_suspend,
-#endif
-#ifdef CONFIG_SMP
-	.cpu_init	= cpu_psci_cpu_init,
-	.cpu_prepare	= cpu_psci_cpu_prepare,
-	.cpu_boot	= cpu_psci_cpu_boot,
-#ifdef CONFIG_HOTPLUG_CPU
-	.cpu_disable	= cpu_psci_cpu_disable,
-	.cpu_die	= cpu_psci_cpu_die,
-	.cpu_kill	= cpu_psci_cpu_kill,
-#endif
-#endif
-};
-
diff --git a/arch/arm/include/asm/psci.h b/include/linux/psci.h
similarity index 55%
copy from arch/arm/include/asm/psci.h
copy to include/linux/psci.h
index c25ef3e..a682fcc 100644
--- a/arch/arm/include/asm/psci.h
+++ b/include/linux/psci.h
@@ -8,25 +8,23 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * Copyright (C) 2012 ARM Limited
+ * Copyright (C) 2015 ARM Limited
  */
 
-#ifndef __ASM_ARM_PSCI_H
-#define __ASM_ARM_PSCI_H
+#ifndef __LINUX_PSCI_H
+#define __LINUX_PSCI_H
+
+#include <linux/init.h>
+#include <linux/types.h>
 
 #define PSCI_POWER_STATE_TYPE_STANDBY		0
 #define PSCI_POWER_STATE_TYPE_POWER_DOWN	1
 
-struct psci_power_state {
-	u16	id;
-	u8	type;
-	u8	affinity_level;
-};
+bool psci_tos_resident_on(int cpu);
 
 struct psci_operations {
-	int (*cpu_suspend)(struct psci_power_state state,
-			   unsigned long entry_point);
-	int (*cpu_off)(struct psci_power_state state);
+	int (*cpu_suspend)(u32 state, unsigned long entry_point);
+	int (*cpu_off)(u32 state);
 	int (*cpu_on)(unsigned long cpuid, unsigned long entry_point);
 	int (*migrate)(unsigned long cpuid);
 	int (*affinity_info)(unsigned long target_affinity,
@@ -35,14 +33,20 @@ struct psci_operations {
 };
 
 extern struct psci_operations psci_ops;
-extern struct smp_operations psci_smp_ops;
 
-#ifdef CONFIG_ARM_PSCI
-int psci_init(void);
-bool psci_smp_available(void);
+#if defined(CONFIG_ARM_PSCI_FW)
+int __init psci_dt_init(void);
+#else
+static inline int psci_dt_init(void) { return 0; }
+#endif
+
+#if defined(CONFIG_ARM_PSCI_FW) && defined(CONFIG_ACPI)
+int __init psci_acpi_init(void);
+bool __init acpi_psci_present(void);
+bool __init acpi_psci_use_hvc(void);
 #else
-static inline int psci_init(void) { return 0; }
-static inline bool psci_smp_available(void) { return false; }
+static inline int psci_acpi_init(void) { return 0; }
+static inline bool acpi_psci_present(void) { return false; }
 #endif
 
-#endif /* __ASM_ARM_PSCI_H */
+#endif /* __LINUX_PSCI_H */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 10/12] drivers: psci: support native SMC{32,64} calls
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (8 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 09/12] arm64: psci: factor invocation code to drivers Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-26 13:52 ` [PATCHv3 11/12] ARM: migrate to common PSCI client code Mark Rutland
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

A 32-bit OS cannot make calls with SMC64 IDs, while a 64-bit OS must
invoke some PSCI functions with SMC64 IDs.

This patch introduces and makes use of a new macro to choose the
appropriate IDs based on the register width of the OS, which will allow
32-bit callers to use the PSCI client code.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
---
 drivers/firmware/psci.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c
index 07b2daa..81b70da 100644
--- a/drivers/firmware/psci.c
+++ b/drivers/firmware/psci.c
@@ -28,6 +28,18 @@
 #include <asm/smp_plat.h>
 
 /*
+ * While a 64-bit OS can make calls with SMC32 calling conventions, for some
+ * calls it is necessary to use SMC64 to pass or return 64-bit values. For such
+ * calls PSCI_0_2_FN_NATIVE(x) will choose the appropriate (native-width)
+ * function ID.
+ */
+#ifdef CONFIG_64BIT
+#define PSCI_0_2_FN_NATIVE(name)	PSCI_0_2_FN64_##name
+#else
+#define PSCI_0_2_FN_NATIVE(name)	PSCI_0_2_FN_##name
+#endif
+
+/*
  * The CPU any Trusted OS is resident on. The trusted OS may reject CPU_OFF
  * calls to its resident CPU, so we must avoid issuing those. We never migrate
  * a Trusted OS even if it claims to be capable of migration -- doing so will
@@ -122,8 +134,8 @@ static int psci_migrate(unsigned long cpuid)
 static int psci_affinity_info(unsigned long target_affinity,
 		unsigned long lowest_affinity_level)
 {
-	return invoke_psci_fn(PSCI_0_2_FN64_AFFINITY_INFO, target_affinity,
-			      lowest_affinity_level, 0);
+	return invoke_psci_fn(PSCI_0_2_FN_NATIVE(AFFINITY_INFO),
+			      target_affinity, lowest_affinity_level, 0);
 }
 
 static int psci_migrate_info_type(void)
@@ -133,7 +145,8 @@ static int psci_migrate_info_type(void)
 
 static unsigned long psci_migrate_info_up_cpu(void)
 {
-	return invoke_psci_fn(PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU, 0, 0, 0);
+	return invoke_psci_fn(PSCI_0_2_FN_NATIVE(MIGRATE_INFO_UP_CPU),
+			      0, 0, 0);
 }
 
 static int get_set_conduit_method(struct device_node *np)
@@ -211,16 +224,16 @@ static void __init psci_init_migrate(void)
 static void __init psci_0_2_set_functions(void)
 {
 	pr_info("Using standard PSCI v0.2 function IDs\n");
-	psci_function_id[PSCI_FN_CPU_SUSPEND] = PSCI_0_2_FN64_CPU_SUSPEND;
+	psci_function_id[PSCI_FN_CPU_SUSPEND] = PSCI_0_2_FN_NATIVE(CPU_SUSPEND);
 	psci_ops.cpu_suspend = psci_cpu_suspend;
 
 	psci_function_id[PSCI_FN_CPU_OFF] = PSCI_0_2_FN_CPU_OFF;
 	psci_ops.cpu_off = psci_cpu_off;
 
-	psci_function_id[PSCI_FN_CPU_ON] = PSCI_0_2_FN64_CPU_ON;
+	psci_function_id[PSCI_FN_CPU_ON] = PSCI_0_2_FN_NATIVE(CPU_ON);
 	psci_ops.cpu_on = psci_cpu_on;
 
-	psci_function_id[PSCI_FN_MIGRATE] = PSCI_0_2_FN64_MIGRATE;
+	psci_function_id[PSCI_FN_MIGRATE] = PSCI_0_2_FN_NATIVE(MIGRATE);
 	psci_ops.migrate = psci_migrate;
 
 	psci_ops.affinity_info = psci_affinity_info;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (9 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 10/12] drivers: psci: support native SMC{32,64} calls Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-27 12:01   ` Ashwin Chaugule
                     ` (2 more replies)
  2015-05-26 13:52 ` [PATCHv3 12/12] MAINTAINERS: add PSCI entry Mark Rutland
  2015-05-27  8:08 ` [PATCHv3 00/12] arm/arm64: Unify PSCI client support Hanjun Guo
  12 siblings, 3 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

Now that the common PSCI client code has been factored out to
drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
over to it. This results in a moderate reduction of duplicated lines,
and will prevent further duplication as the PSCI client code is updated
for PSCI 1.0 and beyond.

The two legacy platform users of the PSCI invocation code are updated to
account for interface changes. In both cases the power state parameter
is changed to an opaque u32 token in preparation for PSCI 1.0 power
state changes.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Will Deacon <will.deacon@arm.com>
---
 arch/arm/Kconfig                  |   1 +
 arch/arm/include/asm/psci.h       |  23 ---
 arch/arm/kernel/Makefile          |   2 +-
 arch/arm/kernel/psci.c            | 299 --------------------------------------
 arch/arm/kernel/psci_smp.c        |  29 +++-
 arch/arm/kernel/setup.c           |   3 +-
 arch/arm/mach-highbank/highbank.c |   2 +-
 arch/arm/mach-highbank/pm.c       |   8 +-
 drivers/cpuidle/cpuidle-calxeda.c |   7 +-
 9 files changed, 32 insertions(+), 342 deletions(-)
 delete mode 100644 arch/arm/kernel/psci.c

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 45df48b..191291f 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1465,6 +1465,7 @@ config HOTPLUG_CPU
 config ARM_PSCI
 	bool "Support for the ARM Power State Coordination Interface (PSCI)"
 	depends on CPU_V7
+	select ARM_PSCI_FW
 	help
 	  Say Y here if you want Linux to communicate with system firmware
 	  implementing the PSCI specification for CPU-centric power
diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h
index c25ef3e..68ee3ce 100644
--- a/arch/arm/include/asm/psci.h
+++ b/arch/arm/include/asm/psci.h
@@ -14,34 +14,11 @@
 #ifndef __ASM_ARM_PSCI_H
 #define __ASM_ARM_PSCI_H
 
-#define PSCI_POWER_STATE_TYPE_STANDBY		0
-#define PSCI_POWER_STATE_TYPE_POWER_DOWN	1
-
-struct psci_power_state {
-	u16	id;
-	u8	type;
-	u8	affinity_level;
-};
-
-struct psci_operations {
-	int (*cpu_suspend)(struct psci_power_state state,
-			   unsigned long entry_point);
-	int (*cpu_off)(struct psci_power_state state);
-	int (*cpu_on)(unsigned long cpuid, unsigned long entry_point);
-	int (*migrate)(unsigned long cpuid);
-	int (*affinity_info)(unsigned long target_affinity,
-			unsigned long lowest_affinity_level);
-	int (*migrate_info_type)(void);
-};
-
-extern struct psci_operations psci_ops;
 extern struct smp_operations psci_smp_ops;
 
 #ifdef CONFIG_ARM_PSCI
-int psci_init(void);
 bool psci_smp_available(void);
 #else
-static inline int psci_init(void) { return 0; }
 static inline bool psci_smp_available(void) { return false; }
 #endif
 
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 752725d..2c06383 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -86,7 +86,7 @@ obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
 
 obj-$(CONFIG_ARM_VIRT_EXT)	+= hyp-stub.o
 ifeq ($(CONFIG_ARM_PSCI),y)
-obj-y				+= psci.o psci-call.o
+obj-y				+= psci-call.o
 obj-$(CONFIG_SMP)		+= psci_smp.o
 endif
 
diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c
deleted file mode 100644
index f90fdf4..0000000
--- a/arch/arm/kernel/psci.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * Copyright (C) 2012 ARM Limited
- *
- * Author: Will Deacon <will.deacon@arm.com>
- */
-
-#define pr_fmt(fmt) "psci: " fmt
-
-#include <linux/init.h>
-#include <linux/of.h>
-#include <linux/reboot.h>
-#include <linux/pm.h>
-#include <uapi/linux/psci.h>
-
-#include <asm/compiler.h>
-#include <asm/errno.h>
-#include <asm/psci.h>
-#include <asm/system_misc.h>
-
-struct psci_operations psci_ops;
-
-static int (*invoke_psci_fn)(u32, u32, u32, u32);
-typedef int (*psci_initcall_t)(const struct device_node *);
-
-asmlinkage int __invoke_psci_fn_hvc(u32, u32, u32, u32);
-asmlinkage int __invoke_psci_fn_smc(u32, u32, u32, u32);
-
-enum psci_function {
-	PSCI_FN_CPU_SUSPEND,
-	PSCI_FN_CPU_ON,
-	PSCI_FN_CPU_OFF,
-	PSCI_FN_MIGRATE,
-	PSCI_FN_AFFINITY_INFO,
-	PSCI_FN_MIGRATE_INFO_TYPE,
-	PSCI_FN_MAX,
-};
-
-static u32 psci_function_id[PSCI_FN_MAX];
-
-static int psci_to_linux_errno(int errno)
-{
-	switch (errno) {
-	case PSCI_RET_SUCCESS:
-		return 0;
-	case PSCI_RET_NOT_SUPPORTED:
-		return -EOPNOTSUPP;
-	case PSCI_RET_INVALID_PARAMS:
-		return -EINVAL;
-	case PSCI_RET_DENIED:
-		return -EPERM;
-	};
-
-	return -EINVAL;
-}
-
-static u32 psci_power_state_pack(struct psci_power_state state)
-{
-	return ((state.id << PSCI_0_2_POWER_STATE_ID_SHIFT)
-			& PSCI_0_2_POWER_STATE_ID_MASK) |
-		((state.type << PSCI_0_2_POWER_STATE_TYPE_SHIFT)
-		 & PSCI_0_2_POWER_STATE_TYPE_MASK) |
-		((state.affinity_level << PSCI_0_2_POWER_STATE_AFFL_SHIFT)
-		 & PSCI_0_2_POWER_STATE_AFFL_MASK);
-}
-
-static int psci_get_version(void)
-{
-	int err;
-
-	err = invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
-	return err;
-}
-
-static int psci_cpu_suspend(struct psci_power_state state,
-			    unsigned long entry_point)
-{
-	int err;
-	u32 fn, power_state;
-
-	fn = psci_function_id[PSCI_FN_CPU_SUSPEND];
-	power_state = psci_power_state_pack(state);
-	err = invoke_psci_fn(fn, power_state, entry_point, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_cpu_off(struct psci_power_state state)
-{
-	int err;
-	u32 fn, power_state;
-
-	fn = psci_function_id[PSCI_FN_CPU_OFF];
-	power_state = psci_power_state_pack(state);
-	err = invoke_psci_fn(fn, power_state, 0, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_cpu_on(unsigned long cpuid, unsigned long entry_point)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_CPU_ON];
-	err = invoke_psci_fn(fn, cpuid, entry_point, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_migrate(unsigned long cpuid)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_MIGRATE];
-	err = invoke_psci_fn(fn, cpuid, 0, 0);
-	return psci_to_linux_errno(err);
-}
-
-static int psci_affinity_info(unsigned long target_affinity,
-		unsigned long lowest_affinity_level)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_AFFINITY_INFO];
-	err = invoke_psci_fn(fn, target_affinity, lowest_affinity_level, 0);
-	return err;
-}
-
-static int psci_migrate_info_type(void)
-{
-	int err;
-	u32 fn;
-
-	fn = psci_function_id[PSCI_FN_MIGRATE_INFO_TYPE];
-	err = invoke_psci_fn(fn, 0, 0, 0);
-	return err;
-}
-
-static int get_set_conduit_method(struct device_node *np)
-{
-	const char *method;
-
-	pr_info("probing for conduit method from DT.\n");
-
-	if (of_property_read_string(np, "method", &method)) {
-		pr_warn("missing \"method\" property\n");
-		return -ENXIO;
-	}
-
-	if (!strcmp("hvc", method)) {
-		invoke_psci_fn = __invoke_psci_fn_hvc;
-	} else if (!strcmp("smc", method)) {
-		invoke_psci_fn = __invoke_psci_fn_smc;
-	} else {
-		pr_warn("invalid \"method\" property: %s\n", method);
-		return -EINVAL;
-	}
-	return 0;
-}
-
-static void psci_sys_reset(enum reboot_mode reboot_mode, const char *cmd)
-{
-	invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
-}
-
-static void psci_sys_poweroff(void)
-{
-	invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
-}
-
-/*
- * PSCI Function IDs for v0.2+ are well defined so use
- * standard values.
- */
-static int psci_0_2_init(struct device_node *np)
-{
-	int err, ver;
-
-	err = get_set_conduit_method(np);
-
-	if (err)
-		goto out_put_node;
-
-	ver = psci_get_version();
-
-	if (ver == PSCI_RET_NOT_SUPPORTED) {
-		/* PSCI v0.2 mandates implementation of PSCI_ID_VERSION. */
-		pr_err("PSCI firmware does not comply with the v0.2 spec.\n");
-		err = -EOPNOTSUPP;
-		goto out_put_node;
-	} else {
-		pr_info("PSCIv%d.%d detected in firmware.\n",
-				PSCI_VERSION_MAJOR(ver),
-				PSCI_VERSION_MINOR(ver));
-
-		if (PSCI_VERSION_MAJOR(ver) == 0 &&
-				PSCI_VERSION_MINOR(ver) < 2) {
-			err = -EINVAL;
-			pr_err("Conflicting PSCI version detected.\n");
-			goto out_put_node;
-		}
-	}
-
-	pr_info("Using standard PSCI v0.2 function IDs\n");
-	psci_function_id[PSCI_FN_CPU_SUSPEND] = PSCI_0_2_FN_CPU_SUSPEND;
-	psci_ops.cpu_suspend = psci_cpu_suspend;
-
-	psci_function_id[PSCI_FN_CPU_OFF] = PSCI_0_2_FN_CPU_OFF;
-	psci_ops.cpu_off = psci_cpu_off;
-
-	psci_function_id[PSCI_FN_CPU_ON] = PSCI_0_2_FN_CPU_ON;
-	psci_ops.cpu_on = psci_cpu_on;
-
-	psci_function_id[PSCI_FN_MIGRATE] = PSCI_0_2_FN_MIGRATE;
-	psci_ops.migrate = psci_migrate;
-
-	psci_function_id[PSCI_FN_AFFINITY_INFO] = PSCI_0_2_FN_AFFINITY_INFO;
-	psci_ops.affinity_info = psci_affinity_info;
-
-	psci_function_id[PSCI_FN_MIGRATE_INFO_TYPE] =
-		PSCI_0_2_FN_MIGRATE_INFO_TYPE;
-	psci_ops.migrate_info_type = psci_migrate_info_type;
-
-	arm_pm_restart = psci_sys_reset;
-
-	pm_power_off = psci_sys_poweroff;
-
-out_put_node:
-	of_node_put(np);
-	return err;
-}
-
-/*
- * PSCI < v0.2 get PSCI Function IDs via DT.
- */
-static int psci_0_1_init(struct device_node *np)
-{
-	u32 id;
-	int err;
-
-	err = get_set_conduit_method(np);
-
-	if (err)
-		goto out_put_node;
-
-	pr_info("Using PSCI v0.1 Function IDs from DT\n");
-
-	if (!of_property_read_u32(np, "cpu_suspend", &id)) {
-		psci_function_id[PSCI_FN_CPU_SUSPEND] = id;
-		psci_ops.cpu_suspend = psci_cpu_suspend;
-	}
-
-	if (!of_property_read_u32(np, "cpu_off", &id)) {
-		psci_function_id[PSCI_FN_CPU_OFF] = id;
-		psci_ops.cpu_off = psci_cpu_off;
-	}
-
-	if (!of_property_read_u32(np, "cpu_on", &id)) {
-		psci_function_id[PSCI_FN_CPU_ON] = id;
-		psci_ops.cpu_on = psci_cpu_on;
-	}
-
-	if (!of_property_read_u32(np, "migrate", &id)) {
-		psci_function_id[PSCI_FN_MIGRATE] = id;
-		psci_ops.migrate = psci_migrate;
-	}
-
-out_put_node:
-	of_node_put(np);
-	return err;
-}
-
-static const struct of_device_id psci_of_match[] __initconst = {
-	{ .compatible = "arm,psci", .data = psci_0_1_init},
-	{ .compatible = "arm,psci-0.2", .data = psci_0_2_init},
-	{},
-};
-
-int __init psci_init(void)
-{
-	struct device_node *np;
-	const struct of_device_id *matched_np;
-	psci_initcall_t init_fn;
-
-	np = of_find_matching_node_and_match(NULL, psci_of_match, &matched_np);
-	if (!np)
-		return -ENODEV;
-
-	init_fn = (psci_initcall_t)matched_np->data;
-	return init_fn(np);
-}
diff --git a/arch/arm/kernel/psci_smp.c b/arch/arm/kernel/psci_smp.c
index 28a1db4..c390615 100644
--- a/arch/arm/kernel/psci_smp.c
+++ b/arch/arm/kernel/psci_smp.c
@@ -17,6 +17,8 @@
 #include <linux/smp.h>
 #include <linux/of.h>
 #include <linux/delay.h>
+#include <linux/psci.h>
+
 #include <uapi/linux/psci.h>
 
 #include <asm/psci.h>
@@ -56,17 +58,29 @@ static int psci_boot_secondary(unsigned int cpu, struct task_struct *idle)
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
+int psci_cpu_disable(unsigned int cpu)
+{
+	/* Fail early if we don't have CPU_OFF support */
+	if (!psci_ops.cpu_off)
+		return -EOPNOTSUPP;
+
+	/* Trusted OS will deny CPU_OFF */
+	if (psci_tos_resident_on(cpu))
+		return -EPERM;
+
+	return 0;
+}
+
 void __ref psci_cpu_die(unsigned int cpu)
 {
-       const struct psci_power_state ps = {
-               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
-       };
+	u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
+		    PSCI_0_2_POWER_STATE_TYPE_SHIFT;
 
-       if (psci_ops.cpu_off)
-               psci_ops.cpu_off(ps);
+	if (psci_ops.cpu_off)
+		psci_ops.cpu_off(state);
 
-       /* We should never return */
-       panic("psci: cpu %d failed to shutdown\n", cpu);
+	/* We should never return */
+	panic("psci: cpu %d failed to shutdown\n", cpu);
 }
 
 int __ref psci_cpu_kill(unsigned int cpu)
@@ -109,6 +123,7 @@ bool __init psci_smp_available(void)
 struct smp_operations __initdata psci_smp_ops = {
 	.smp_boot_secondary	= psci_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
+	.cpu_disable		= psci_cpu_disable,
 	.cpu_die		= psci_cpu_die,
 	.cpu_kill		= psci_cpu_kill,
 #endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 6c777e9..3224680 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -31,6 +31,7 @@
 #include <linux/bug.h>
 #include <linux/compiler.h>
 #include <linux/sort.h>
+#include <linux/psci.h>
 
 #include <asm/unified.h>
 #include <asm/cp15.h>
@@ -950,7 +951,7 @@ void __init setup_arch(char **cmdline_p)
 	unflatten_device_tree();
 
 	arm_dt_init_cpu_maps();
-	psci_init();
+	psci_dt_init();
 #ifdef CONFIG_SMP
 	if (is_smp()) {
 		if (!mdesc->smp_init || !mdesc->smp_init()) {
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
index 231fba0..6050a14 100644
--- a/arch/arm/mach-highbank/highbank.c
+++ b/arch/arm/mach-highbank/highbank.c
@@ -28,8 +28,8 @@
 #include <linux/reboot.h>
 #include <linux/amba/bus.h>
 #include <linux/platform_device.h>
+#include <linux/psci.h>
 
-#include <asm/psci.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c
index 7f2bd85..014e96d 100644
--- a/arch/arm/mach-highbank/pm.c
+++ b/arch/arm/mach-highbank/pm.c
@@ -16,18 +16,14 @@
 
 #include <linux/cpu_pm.h>
 #include <linux/init.h>
+#include <linux/psci.h>
 #include <linux/suspend.h>
 
 #include <asm/suspend.h>
-#include <asm/psci.h>
 
 static int highbank_suspend_finish(unsigned long val)
 {
-	const struct psci_power_state ps = {
-		.type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
-		.affinity_level = 1,
-	};
-
+	u32 ps = 0x01010000; /* Aff1 power down */
 	return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
 }
 
diff --git a/drivers/cpuidle/cpuidle-calxeda.c b/drivers/cpuidle/cpuidle-calxeda.c
index 9445e6c..d010da8f 100644
--- a/drivers/cpuidle/cpuidle-calxeda.c
+++ b/drivers/cpuidle/cpuidle-calxeda.c
@@ -25,15 +25,14 @@
 #include <linux/init.h>
 #include <linux/mm.h>
 #include <linux/platform_device.h>
+#include <linux/psci.h>
+
 #include <asm/cpuidle.h>
 #include <asm/suspend.h>
-#include <asm/psci.h>
 
 static int calxeda_idle_finish(unsigned long val)
 {
-	const struct psci_power_state ps = {
-		.type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
-	};
+	u32 ps = 0x00010000; /* Aff0 power down */
 	return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 12/12] MAINTAINERS: add PSCI entry
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (10 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 11/12] ARM: migrate to common PSCI client code Mark Rutland
@ 2015-05-26 13:52 ` Mark Rutland
  2015-05-27  8:08 ` [PATCHv3 00/12] arm/arm64: Unify PSCI client support Hanjun Guo
  12 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-26 13:52 UTC (permalink / raw)
  To: linux-arm-kernel

Add myself and Lorenzo as maintainers of the PSCI client code.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
---
 MAINTAINERS | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index f8e0afb..ae3e1c2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7789,6 +7789,15 @@ S:	Maintained
 F:	include/linux/power_supply.h
 F:	drivers/power/
 
+POWER STATE COORDINATION INTERFACE (PSCI)
+M:	Mark Rutland <mark.rutland@arm.com>
+M:	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+L:	linux-arm-kernel at lists.infradead.org
+S:	Maintained
+F:	drivers/firmware/psci.c
+F:	include/linux/psci.h
+F:	include/uapi/linux/psci.h
+
 PNP SUPPORT
 M:	Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 S:	Maintained
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCHv3 08/12] arm64: psci: remove ACPI coupling
  2015-05-26 13:52 ` [PATCHv3 08/12] arm64: psci: remove ACPI coupling Mark Rutland
@ 2015-05-26 20:18   ` Al Stone
  0 siblings, 0 replies; 26+ messages in thread
From: Al Stone @ 2015-05-26 20:18 UTC (permalink / raw)
  To: linux-arm-kernel

On 05/26/2015 07:52 AM, Mark Rutland wrote:
> The 32-bit ARM port doesn't have ACPI headers, and conditionally
> including them is going to look horrendous. In preparation for sharing
> the PSCI invocation code with 32-bit, move the acpi_psci_* function
> declarations and definitions such that the PSCI client code need not
> include ACPI headers.
> 
> While it would seem like we could simply hide the ACPI includes in
> psci.h, the ACPI headers have hilarious circular dependencies which make
> this infeasible without reorganising most of ACPICA. So rather than
> doing that, move the acpi_psci_* prototypes into psci.h.

I really doubt "hilarious" was the first word that came to mind in trying
to figure out those dependencies :-).  It was not the first word I used,
I assure you.

Patch LGTM: Reviewed-by: Al Stone <al.stone@linaro.org>

> The psci_acpi_init function is made dependent on CONFIG_ACPI (with a
> stub implementation in asm/psci.h) such that it need not be built for
> 32-bit ARM or kernels without ACPI support. The currently missing __init
> annotations are added to the prototypes in the header.
> 
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> Acked-by: Hanjun Guo <hanjun.guo@linaro.org>
> Reviewed-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> Cc: Al Stone <al.stone@linaro.org>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Will Deacon <will.deacon@arm.com>
> ---
>  arch/arm64/include/asm/acpi.h | 15 +--------------
>  arch/arm64/include/asm/psci.h | 12 ++++++++++--
>  arch/arm64/kernel/acpi.c      | 11 +++++++++++
>  arch/arm64/kernel/psci.c      |  4 ++--
>  4 files changed, 24 insertions(+), 18 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
> index 1240b86..39248d3 100644
> --- a/arch/arm64/include/asm/acpi.h
> +++ b/arch/arm64/include/asm/acpi.h
> @@ -16,6 +16,7 @@
>  #include <linux/irqchip/arm-gic-acpi.h>
>  
>  #include <asm/cputype.h>
> +#include <asm/psci.h>
>  #include <asm/smp_plat.h>
>  
>  /* Basic configuration for ACPI */
> @@ -39,18 +40,6 @@ extern int acpi_disabled;
>  extern int acpi_noirq;
>  extern int acpi_pci_disabled;
>  
> -/* 1 to indicate PSCI 0.2+ is implemented */
> -static inline bool acpi_psci_present(void)
> -{
> -	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_COMPLIANT;
> -}
> -
> -/* 1 to indicate HVC must be used instead of SMC as the PSCI conduit */
> -static inline bool acpi_psci_use_hvc(void)
> -{
> -	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
> -}
> -
>  static inline void disable_acpi(void)
>  {
>  	acpi_disabled = 1;
> @@ -88,8 +77,6 @@ static inline void arch_fix_phys_package_id(int num, u32 slot) { }
>  void __init acpi_init_cpus(void);
>  
>  #else
> -static inline bool acpi_psci_present(void) { return false; }
> -static inline bool acpi_psci_use_hvc(void) { return false; }
>  static inline void acpi_init_cpus(void) { }
>  #endif /* CONFIG_ACPI */
>  
> diff --git a/arch/arm64/include/asm/psci.h b/arch/arm64/include/asm/psci.h
> index 2454bc5..49d7e1a 100644
> --- a/arch/arm64/include/asm/psci.h
> +++ b/arch/arm64/include/asm/psci.h
> @@ -14,7 +14,15 @@
>  #ifndef __ASM_PSCI_H
>  #define __ASM_PSCI_H
>  
> -int psci_dt_init(void);
> -int psci_acpi_init(void);
> +int __init psci_dt_init(void);
> +
> +#ifdef CONFIG_ACPI
> +int __init psci_acpi_init(void);
> +bool __init acpi_psci_present(void);
> +bool __init acpi_psci_use_hvc(void);
> +#else
> +static inline int psci_acpi_init(void) { return 0; }
> +static inline bool acpi_psci_present(void) { return false; }
> +#endif
>  
>  #endif /* __ASM_PSCI_H */
> diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
> index 732f57b..19de753 100644
> --- a/arch/arm64/kernel/acpi.c
> +++ b/arch/arm64/kernel/acpi.c
> @@ -89,6 +89,17 @@ void __init __acpi_unmap_table(char *map, unsigned long size)
>  	early_memunmap(map, size);
>  }
>  
> +bool __init acpi_psci_present(void)
> +{
> +	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_COMPLIANT;
> +}
> +
> +/* Whether HVC must be used instead of SMC as the PSCI conduit */
> +bool __init acpi_psci_use_hvc(void)
> +{
> +	return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
> +}
> +
>  /*
>   * acpi_fadt_sanity_check() - Check FADT presence and carry out sanity
>   *			      checks on it
> diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
> index 0e2a440..cba05d9 100644
> --- a/arch/arm64/kernel/psci.c
> +++ b/arch/arm64/kernel/psci.c
> @@ -15,7 +15,6 @@
>  
>  #define pr_fmt(fmt) "psci: " fmt
>  
> -#include <linux/acpi.h>
>  #include <linux/init.h>
>  #include <linux/of.h>
>  #include <linux/smp.h>
> @@ -25,7 +24,6 @@
>  #include <linux/slab.h>
>  #include <uapi/linux/psci.h>
>  
> -#include <asm/acpi.h>
>  #include <asm/compiler.h>
>  #include <asm/cputype.h>
>  #include <asm/cpu_ops.h>
> @@ -446,6 +444,7 @@ int __init psci_dt_init(void)
>  	return init_fn(np);
>  }
>  
> +#ifdef CONFIG_ACPI
>  /*
>   * We use PSCI 0.2+ when ACPI is deployed on ARM64 and it's
>   * explicitly clarified in SBBR
> @@ -466,6 +465,7 @@ int __init psci_acpi_init(void)
>  
>  	return psci_probe();
>  }
> +#endif
>  
>  #ifdef CONFIG_SMP
>  
> 


-- 
ciao,
al
-----------------------------------
Al Stone
Software Engineer
Linaro Enterprise Group
al.stone at linaro.org
-----------------------------------

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 00/12] arm/arm64: Unify PSCI client support
  2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
                   ` (11 preceding siblings ...)
  2015-05-26 13:52 ` [PATCHv3 12/12] MAINTAINERS: add PSCI entry Mark Rutland
@ 2015-05-27  8:08 ` Hanjun Guo
  2015-05-27 12:23   ` Mark Rutland
  12 siblings, 1 reply; 26+ messages in thread
From: Hanjun Guo @ 2015-05-27  8:08 UTC (permalink / raw)
  To: linux-arm-kernel

On 2015?05?26? 21:52, Mark Rutland wrote:
> This series unifies the 32-bit and 64-bit PSCI client code, moving the bulk of
> the FW invocation and probing out to a common location in drivers/firmware.
> As part of this, the remaining edge cases for PSCI 0.2 (Trusted OSs rejecting
> CPU_OFF) are accounted for, making both 32-bit adn 64-bit clients more robust.
>
> This results in a reasonable saving in terms of lines of code, and will allow
> for PSCI 1.0 support to be unified form the beginning, avoiding further
> duplication.
>
> The series is based on the arm64 for-next/cpu-init branch [3] due to conflicts
> with that series.
>
> Since v1 [1]:
> * Fix build when PSCI isn't selected
> * Don't indirect migrate_info_up_cpu
> * Fix ver to u32 in psci_get_version
>
> Since v2: [2]:
> * Rebase atop of Lorenzo's cpu init cleanup series [3]
> * Use the correct native function IDs
> * Fix cpu_disable return values
> * Report invalid MIGRATE_INFO_UP_CPU return values
>
> Many thanks to those who have reviewed and tested so far! Unfortunately, due to
> the volume of changes in the rebase I've dropped all Tested-by tags. I've
> locally tested 32-bit and 64-bit kernels with DT.

I tested this patch set on ARM64 kernel with ACPI as I did in previous
version, compile this patch set ok with CONFIG_ACPI=y/n, and CPU
hotplug works with PSCI (CPU_ON/OFF),

Tested-by: Hanjun Guo <hanjun.guo@linaro.org>

Thanks
Hanjun

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-05-26 13:52 ` [PATCHv3 11/12] ARM: migrate to common PSCI client code Mark Rutland
@ 2015-05-27 12:01   ` Ashwin Chaugule
  2015-05-27 12:41     ` Mark Rutland
  2015-05-27 16:46   ` Rob Herring
  2015-06-03 15:16   ` Mark Rutland
  2 siblings, 1 reply; 26+ messages in thread
From: Ashwin Chaugule @ 2015-05-27 12:01 UTC (permalink / raw)
  To: linux-arm-kernel

On 26 May 2015 at 09:52, Mark Rutland <mark.rutland@arm.com> wrote:
> Now that the common PSCI client code has been factored out to
> drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> over to it. This results in a moderate reduction of duplicated lines,
> and will prevent further duplication as the PSCI client code is updated
> for PSCI 1.0 and beyond.
>
> The two legacy platform users of the PSCI invocation code are updated to
> account for interface changes. In both cases the power state parameter
> is changed to an opaque u32 token in preparation for PSCI 1.0 power
> state changes.
>
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Rob Herring <robh@kernel.org>
> Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Will Deacon <will.deacon@arm.com>
> ---
>  arch/arm/Kconfig                  |   1 +
>  arch/arm/include/asm/psci.h       |  23 ---
>  arch/arm/kernel/Makefile          |   2 +-
>  arch/arm/kernel/psci.c            | 299 --------------------------------------
>  arch/arm/kernel/psci_smp.c        |  29 +++-
>  arch/arm/kernel/setup.c           |   3 +-
>  arch/arm/mach-highbank/highbank.c |   2 +-
>  arch/arm/mach-highbank/pm.c       |   8 +-
>  drivers/cpuidle/cpuidle-calxeda.c |   7 +-
>  9 files changed, 32 insertions(+), 342 deletions(-)
>  delete mode 100644 arch/arm/kernel/psci.c

Reviewed-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 00/12] arm/arm64: Unify PSCI client support
  2015-05-27  8:08 ` [PATCHv3 00/12] arm/arm64: Unify PSCI client support Hanjun Guo
@ 2015-05-27 12:23   ` Mark Rutland
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-27 12:23 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, May 27, 2015 at 09:08:59AM +0100, Hanjun Guo wrote:
> On 2015?05?26? 21:52, Mark Rutland wrote:
> > This series unifies the 32-bit and 64-bit PSCI client code, moving the bulk of
> > the FW invocation and probing out to a common location in drivers/firmware.
> > As part of this, the remaining edge cases for PSCI 0.2 (Trusted OSs rejecting
> > CPU_OFF) are accounted for, making both 32-bit adn 64-bit clients more robust.
> >
> > This results in a reasonable saving in terms of lines of code, and will allow
> > for PSCI 1.0 support to be unified form the beginning, avoiding further
> > duplication.
> >
> > The series is based on the arm64 for-next/cpu-init branch [3] due to conflicts
> > with that series.
> >
> > Since v1 [1]:
> > * Fix build when PSCI isn't selected
> > * Don't indirect migrate_info_up_cpu
> > * Fix ver to u32 in psci_get_version
> >
> > Since v2: [2]:
> > * Rebase atop of Lorenzo's cpu init cleanup series [3]
> > * Use the correct native function IDs
> > * Fix cpu_disable return values
> > * Report invalid MIGRATE_INFO_UP_CPU return values
> >
> > Many thanks to those who have reviewed and tested so far! Unfortunately, due to
> > the volume of changes in the rebase I've dropped all Tested-by tags. I've
> > locally tested 32-bit and 64-bit kernels with DT.
> 
> I tested this patch set on ARM64 kernel with ACPI as I did in previous
> version, compile this patch set ok with CONFIG_ACPI=y/n, and CPU
> hotplug works with PSCI (CPU_ON/OFF),
> 
> Tested-by: Hanjun Guo <hanjun.guo@linaro.org>

Thanks!

I've applied that to the first 10 patches, but not to the patch
affecting 32-bit ARM nor the patch updating MAINTAINERS.

Mark.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-05-27 12:01   ` Ashwin Chaugule
@ 2015-05-27 12:41     ` Mark Rutland
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-05-27 12:41 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, May 27, 2015 at 01:01:23PM +0100, Ashwin Chaugule wrote:
> On 26 May 2015 at 09:52, Mark Rutland <mark.rutland@arm.com> wrote:
> > Now that the common PSCI client code has been factored out to
> > drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> > over to it. This results in a moderate reduction of duplicated lines,
> > and will prevent further duplication as the PSCI client code is updated
> > for PSCI 1.0 and beyond.
> >
> > The two legacy platform users of the PSCI invocation code are updated to
> > account for interface changes. In both cases the power state parameter
> > is changed to an opaque u32 token in preparation for PSCI 1.0 power
> > state changes.
> >
> > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> > Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Cc: Rob Herring <robh@kernel.org>
> > Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> > Cc: Will Deacon <will.deacon@arm.com>
> > ---
> >  arch/arm/Kconfig                  |   1 +
> >  arch/arm/include/asm/psci.h       |  23 ---
> >  arch/arm/kernel/Makefile          |   2 +-
> >  arch/arm/kernel/psci.c            | 299 --------------------------------------
> >  arch/arm/kernel/psci_smp.c        |  29 +++-
> >  arch/arm/kernel/setup.c           |   3 +-
> >  arch/arm/mach-highbank/highbank.c |   2 +-
> >  arch/arm/mach-highbank/pm.c       |   8 +-
> >  drivers/cpuidle/cpuidle-calxeda.c |   7 +-
> >  9 files changed, 32 insertions(+), 342 deletions(-)
> >  delete mode 100644 arch/arm/kernel/psci.c
> 
> Reviewed-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>

Cheers!

Mark.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-05-26 13:52 ` [PATCHv3 11/12] ARM: migrate to common PSCI client code Mark Rutland
  2015-05-27 12:01   ` Ashwin Chaugule
@ 2015-05-27 16:46   ` Rob Herring
  2015-05-27 17:17     ` Mark Rutland
  2015-06-03 15:16   ` Mark Rutland
  2 siblings, 1 reply; 26+ messages in thread
From: Rob Herring @ 2015-05-27 16:46 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, May 26, 2015 at 8:52 AM, Mark Rutland <mark.rutland@arm.com> wrote:
> Now that the common PSCI client code has been factored out to
> drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> over to it. This results in a moderate reduction of duplicated lines,
> and will prevent further duplication as the PSCI client code is updated
> for PSCI 1.0 and beyond.
>
> The two legacy platform users of the PSCI invocation code are updated to
> account for interface changes. In both cases the power state parameter
> is changed to an opaque u32 token in preparation for PSCI 1.0 power
> state changes.

[...]

> diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
> index 231fba0..6050a14 100644
> --- a/arch/arm/mach-highbank/highbank.c
> +++ b/arch/arm/mach-highbank/highbank.c
> @@ -28,8 +28,8 @@
>  #include <linux/reboot.h>
>  #include <linux/amba/bus.h>
>  #include <linux/platform_device.h>
> +#include <linux/psci.h>
>
> -#include <asm/psci.h>
>  #include <asm/hardware/cache-l2x0.h>
>  #include <asm/mach/arch.h>
>  #include <asm/mach/map.h>
> diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c
> index 7f2bd85..014e96d 100644
> --- a/arch/arm/mach-highbank/pm.c
> +++ b/arch/arm/mach-highbank/pm.c
> @@ -16,18 +16,14 @@
>
>  #include <linux/cpu_pm.h>
>  #include <linux/init.h>
> +#include <linux/psci.h>
>  #include <linux/suspend.h>
>
>  #include <asm/suspend.h>
> -#include <asm/psci.h>
>
>  static int highbank_suspend_finish(unsigned long val)
>  {
> -       const struct psci_power_state ps = {
> -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> -               .affinity_level = 1,
> -       };
> -
> +       u32 ps = 0x01010000; /* Aff1 power down */

Why not just pass directly instead of sticking in a variable first.

>         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
>  }
>
> diff --git a/drivers/cpuidle/cpuidle-calxeda.c b/drivers/cpuidle/cpuidle-calxeda.c
> index 9445e6c..d010da8f 100644
> --- a/drivers/cpuidle/cpuidle-calxeda.c
> +++ b/drivers/cpuidle/cpuidle-calxeda.c
> @@ -25,15 +25,14 @@
>  #include <linux/init.h>
>  #include <linux/mm.h>
>  #include <linux/platform_device.h>
> +#include <linux/psci.h>
> +
>  #include <asm/cpuidle.h>
>  #include <asm/suspend.h>
> -#include <asm/psci.h>
>
>  static int calxeda_idle_finish(unsigned long val)
>  {
> -       const struct psci_power_state ps = {
> -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> -       };
> +       u32 ps = 0x00010000; /* Aff0 power down */

ditto.

>         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
>  }
>
> --
> 1.9.1
>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-05-27 16:46   ` Rob Herring
@ 2015-05-27 17:17     ` Mark Rutland
  2015-06-03 15:19       ` Mark Rutland
  0 siblings, 1 reply; 26+ messages in thread
From: Mark Rutland @ 2015-05-27 17:17 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, May 27, 2015 at 05:46:47PM +0100, Rob Herring wrote:
> On Tue, May 26, 2015 at 8:52 AM, Mark Rutland <mark.rutland@arm.com> wrote:
> > Now that the common PSCI client code has been factored out to
> > drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> > over to it. This results in a moderate reduction of duplicated lines,
> > and will prevent further duplication as the PSCI client code is updated
> > for PSCI 1.0 and beyond.
> >
> > The two legacy platform users of the PSCI invocation code are updated to
> > account for interface changes. In both cases the power state parameter
> > is changed to an opaque u32 token in preparation for PSCI 1.0 power
> > state changes.
> 
> [...]
> 
> > diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
> > index 231fba0..6050a14 100644
> > --- a/arch/arm/mach-highbank/highbank.c
> > +++ b/arch/arm/mach-highbank/highbank.c
> > @@ -28,8 +28,8 @@
> >  #include <linux/reboot.h>
> >  #include <linux/amba/bus.h>
> >  #include <linux/platform_device.h>
> > +#include <linux/psci.h>
> >
> > -#include <asm/psci.h>
> >  #include <asm/hardware/cache-l2x0.h>
> >  #include <asm/mach/arch.h>
> >  #include <asm/mach/map.h>
> > diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c
> > index 7f2bd85..014e96d 100644
> > --- a/arch/arm/mach-highbank/pm.c
> > +++ b/arch/arm/mach-highbank/pm.c
> > @@ -16,18 +16,14 @@
> >
> >  #include <linux/cpu_pm.h>
> >  #include <linux/init.h>
> > +#include <linux/psci.h>
> >  #include <linux/suspend.h>
> >
> >  #include <asm/suspend.h>
> > -#include <asm/psci.h>
> >
> >  static int highbank_suspend_finish(unsigned long val)
> >  {
> > -       const struct psci_power_state ps = {
> > -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> > -               .affinity_level = 1,
> > -       };
> > -
> > +       u32 ps = 0x01010000; /* Aff1 power down */
> 
> Why not just pass directly instead of sticking in a variable first.

No particular reason. I'll fold it in.
 
> >         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
> >  }
> >
> > diff --git a/drivers/cpuidle/cpuidle-calxeda.c b/drivers/cpuidle/cpuidle-calxeda.c
> > index 9445e6c..d010da8f 100644
> > --- a/drivers/cpuidle/cpuidle-calxeda.c
> > +++ b/drivers/cpuidle/cpuidle-calxeda.c
> > @@ -25,15 +25,14 @@
> >  #include <linux/init.h>
> >  #include <linux/mm.h>
> >  #include <linux/platform_device.h>
> > +#include <linux/psci.h>
> > +
> >  #include <asm/cpuidle.h>
> >  #include <asm/suspend.h>
> > -#include <asm/psci.h>
> >
> >  static int calxeda_idle_finish(unsigned long val)
> >  {
> > -       const struct psci_power_state ps = {
> > -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> > -       };
> > +       u32 ps = 0x00010000; /* Aff0 power down */
> 
> ditto.

Likewise.

Thanks,
Mark.

> 
> >         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
> >  }
> >
> > --
> > 1.9.1
> >
> 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-05-26 13:52 ` [PATCHv3 11/12] ARM: migrate to common PSCI client code Mark Rutland
  2015-05-27 12:01   ` Ashwin Chaugule
  2015-05-27 16:46   ` Rob Herring
@ 2015-06-03 15:16   ` Mark Rutland
  2015-06-04  9:45     ` Catalin Marinas
  2015-06-04  9:49     ` Russell King - ARM Linux
  2 siblings, 2 replies; 26+ messages in thread
From: Mark Rutland @ 2015-06-03 15:16 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Russell,

On Tue, May 26, 2015 at 02:52:29PM +0100, Mark Rutland wrote:
> Now that the common PSCI client code has been factored out to
> drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> over to it. This results in a moderate reduction of duplicated lines,
> and will prevent further duplication as the PSCI client code is updated
> for PSCI 1.0 and beyond.
> 
> The two legacy platform users of the PSCI invocation code are updated to
> account for interface changes. In both cases the power state parameter
> is changed to an opaque u32 token in preparation for PSCI 1.0 power
> state changes.
> 
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Rob Herring <robh@kernel.org>
> Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Will Deacon <will.deacon@arm.com>
> ---
>  arch/arm/Kconfig                  |   1 +
>  arch/arm/include/asm/psci.h       |  23 ---
>  arch/arm/kernel/Makefile          |   2 +-
>  arch/arm/kernel/psci.c            | 299 --------------------------------------
>  arch/arm/kernel/psci_smp.c        |  29 +++-
>  arch/arm/kernel/setup.c           |   3 +-
>  arch/arm/mach-highbank/highbank.c |   2 +-
>  arch/arm/mach-highbank/pm.c       |   8 +-
>  drivers/cpuidle/cpuidle-calxeda.c |   7 +-
>  9 files changed, 32 insertions(+), 342 deletions(-)
>  delete mode 100644 arch/arm/kernel/psci.c

Do you have any objections to the arch/arm changes in this patch?

If not, could I please have your ack?

As there are arm, arm64, and drivers changes in the series I was hoping
this could all go via arm-soc.

Thanks,
Mark.

> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 45df48b..191291f 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1465,6 +1465,7 @@ config HOTPLUG_CPU
>  config ARM_PSCI
>         bool "Support for the ARM Power State Coordination Interface (PSCI)"
>         depends on CPU_V7
> +       select ARM_PSCI_FW
>         help
>           Say Y here if you want Linux to communicate with system firmware
>           implementing the PSCI specification for CPU-centric power
> diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h
> index c25ef3e..68ee3ce 100644
> --- a/arch/arm/include/asm/psci.h
> +++ b/arch/arm/include/asm/psci.h
> @@ -14,34 +14,11 @@
>  #ifndef __ASM_ARM_PSCI_H
>  #define __ASM_ARM_PSCI_H
> 
> -#define PSCI_POWER_STATE_TYPE_STANDBY          0
> -#define PSCI_POWER_STATE_TYPE_POWER_DOWN       1
> -
> -struct psci_power_state {
> -       u16     id;
> -       u8      type;
> -       u8      affinity_level;
> -};
> -
> -struct psci_operations {
> -       int (*cpu_suspend)(struct psci_power_state state,
> -                          unsigned long entry_point);
> -       int (*cpu_off)(struct psci_power_state state);
> -       int (*cpu_on)(unsigned long cpuid, unsigned long entry_point);
> -       int (*migrate)(unsigned long cpuid);
> -       int (*affinity_info)(unsigned long target_affinity,
> -                       unsigned long lowest_affinity_level);
> -       int (*migrate_info_type)(void);
> -};
> -
> -extern struct psci_operations psci_ops;
>  extern struct smp_operations psci_smp_ops;
> 
>  #ifdef CONFIG_ARM_PSCI
> -int psci_init(void);
>  bool psci_smp_available(void);
>  #else
> -static inline int psci_init(void) { return 0; }
>  static inline bool psci_smp_available(void) { return false; }
>  #endif
> 
> diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
> index 752725d..2c06383 100644
> --- a/arch/arm/kernel/Makefile
> +++ b/arch/arm/kernel/Makefile
> @@ -86,7 +86,7 @@ obj-$(CONFIG_EARLY_PRINTK)    += early_printk.o
> 
>  obj-$(CONFIG_ARM_VIRT_EXT)     += hyp-stub.o
>  ifeq ($(CONFIG_ARM_PSCI),y)
> -obj-y                          += psci.o psci-call.o
> +obj-y                          += psci-call.o
>  obj-$(CONFIG_SMP)              += psci_smp.o
>  endif
> 
> diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c
> deleted file mode 100644
> index f90fdf4..0000000
> --- a/arch/arm/kernel/psci.c
> +++ /dev/null
> @@ -1,299 +0,0 @@
> -/*
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * Copyright (C) 2012 ARM Limited
> - *
> - * Author: Will Deacon <will.deacon@arm.com>
> - */
> -
> -#define pr_fmt(fmt) "psci: " fmt
> -
> -#include <linux/init.h>
> -#include <linux/of.h>
> -#include <linux/reboot.h>
> -#include <linux/pm.h>
> -#include <uapi/linux/psci.h>
> -
> -#include <asm/compiler.h>
> -#include <asm/errno.h>
> -#include <asm/psci.h>
> -#include <asm/system_misc.h>
> -
> -struct psci_operations psci_ops;
> -
> -static int (*invoke_psci_fn)(u32, u32, u32, u32);
> -typedef int (*psci_initcall_t)(const struct device_node *);
> -
> -asmlinkage int __invoke_psci_fn_hvc(u32, u32, u32, u32);
> -asmlinkage int __invoke_psci_fn_smc(u32, u32, u32, u32);
> -
> -enum psci_function {
> -       PSCI_FN_CPU_SUSPEND,
> -       PSCI_FN_CPU_ON,
> -       PSCI_FN_CPU_OFF,
> -       PSCI_FN_MIGRATE,
> -       PSCI_FN_AFFINITY_INFO,
> -       PSCI_FN_MIGRATE_INFO_TYPE,
> -       PSCI_FN_MAX,
> -};
> -
> -static u32 psci_function_id[PSCI_FN_MAX];
> -
> -static int psci_to_linux_errno(int errno)
> -{
> -       switch (errno) {
> -       case PSCI_RET_SUCCESS:
> -               return 0;
> -       case PSCI_RET_NOT_SUPPORTED:
> -               return -EOPNOTSUPP;
> -       case PSCI_RET_INVALID_PARAMS:
> -               return -EINVAL;
> -       case PSCI_RET_DENIED:
> -               return -EPERM;
> -       };
> -
> -       return -EINVAL;
> -}
> -
> -static u32 psci_power_state_pack(struct psci_power_state state)
> -{
> -       return ((state.id << PSCI_0_2_POWER_STATE_ID_SHIFT)
> -                       & PSCI_0_2_POWER_STATE_ID_MASK) |
> -               ((state.type << PSCI_0_2_POWER_STATE_TYPE_SHIFT)
> -                & PSCI_0_2_POWER_STATE_TYPE_MASK) |
> -               ((state.affinity_level << PSCI_0_2_POWER_STATE_AFFL_SHIFT)
> -                & PSCI_0_2_POWER_STATE_AFFL_MASK);
> -}
> -
> -static int psci_get_version(void)
> -{
> -       int err;
> -
> -       err = invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
> -       return err;
> -}
> -
> -static int psci_cpu_suspend(struct psci_power_state state,
> -                           unsigned long entry_point)
> -{
> -       int err;
> -       u32 fn, power_state;
> -
> -       fn = psci_function_id[PSCI_FN_CPU_SUSPEND];
> -       power_state = psci_power_state_pack(state);
> -       err = invoke_psci_fn(fn, power_state, entry_point, 0);
> -       return psci_to_linux_errno(err);
> -}
> -
> -static int psci_cpu_off(struct psci_power_state state)
> -{
> -       int err;
> -       u32 fn, power_state;
> -
> -       fn = psci_function_id[PSCI_FN_CPU_OFF];
> -       power_state = psci_power_state_pack(state);
> -       err = invoke_psci_fn(fn, power_state, 0, 0);
> -       return psci_to_linux_errno(err);
> -}
> -
> -static int psci_cpu_on(unsigned long cpuid, unsigned long entry_point)
> -{
> -       int err;
> -       u32 fn;
> -
> -       fn = psci_function_id[PSCI_FN_CPU_ON];
> -       err = invoke_psci_fn(fn, cpuid, entry_point, 0);
> -       return psci_to_linux_errno(err);
> -}
> -
> -static int psci_migrate(unsigned long cpuid)
> -{
> -       int err;
> -       u32 fn;
> -
> -       fn = psci_function_id[PSCI_FN_MIGRATE];
> -       err = invoke_psci_fn(fn, cpuid, 0, 0);
> -       return psci_to_linux_errno(err);
> -}
> -
> -static int psci_affinity_info(unsigned long target_affinity,
> -               unsigned long lowest_affinity_level)
> -{
> -       int err;
> -       u32 fn;
> -
> -       fn = psci_function_id[PSCI_FN_AFFINITY_INFO];
> -       err = invoke_psci_fn(fn, target_affinity, lowest_affinity_level, 0);
> -       return err;
> -}
> -
> -static int psci_migrate_info_type(void)
> -{
> -       int err;
> -       u32 fn;
> -
> -       fn = psci_function_id[PSCI_FN_MIGRATE_INFO_TYPE];
> -       err = invoke_psci_fn(fn, 0, 0, 0);
> -       return err;
> -}
> -
> -static int get_set_conduit_method(struct device_node *np)
> -{
> -       const char *method;
> -
> -       pr_info("probing for conduit method from DT.\n");
> -
> -       if (of_property_read_string(np, "method", &method)) {
> -               pr_warn("missing \"method\" property\n");
> -               return -ENXIO;
> -       }
> -
> -       if (!strcmp("hvc", method)) {
> -               invoke_psci_fn = __invoke_psci_fn_hvc;
> -       } else if (!strcmp("smc", method)) {
> -               invoke_psci_fn = __invoke_psci_fn_smc;
> -       } else {
> -               pr_warn("invalid \"method\" property: %s\n", method);
> -               return -EINVAL;
> -       }
> -       return 0;
> -}
> -
> -static void psci_sys_reset(enum reboot_mode reboot_mode, const char *cmd)
> -{
> -       invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
> -}
> -
> -static void psci_sys_poweroff(void)
> -{
> -       invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
> -}
> -
> -/*
> - * PSCI Function IDs for v0.2+ are well defined so use
> - * standard values.
> - */
> -static int psci_0_2_init(struct device_node *np)
> -{
> -       int err, ver;
> -
> -       err = get_set_conduit_method(np);
> -
> -       if (err)
> -               goto out_put_node;
> -
> -       ver = psci_get_version();
> -
> -       if (ver == PSCI_RET_NOT_SUPPORTED) {
> -               /* PSCI v0.2 mandates implementation of PSCI_ID_VERSION. */
> -               pr_err("PSCI firmware does not comply with the v0.2 spec.\n");
> -               err = -EOPNOTSUPP;
> -               goto out_put_node;
> -       } else {
> -               pr_info("PSCIv%d.%d detected in firmware.\n",
> -                               PSCI_VERSION_MAJOR(ver),
> -                               PSCI_VERSION_MINOR(ver));
> -
> -               if (PSCI_VERSION_MAJOR(ver) == 0 &&
> -                               PSCI_VERSION_MINOR(ver) < 2) {
> -                       err = -EINVAL;
> -                       pr_err("Conflicting PSCI version detected.\n");
> -                       goto out_put_node;
> -               }
> -       }
> -
> -       pr_info("Using standard PSCI v0.2 function IDs\n");
> -       psci_function_id[PSCI_FN_CPU_SUSPEND] = PSCI_0_2_FN_CPU_SUSPEND;
> -       psci_ops.cpu_suspend = psci_cpu_suspend;
> -
> -       psci_function_id[PSCI_FN_CPU_OFF] = PSCI_0_2_FN_CPU_OFF;
> -       psci_ops.cpu_off = psci_cpu_off;
> -
> -       psci_function_id[PSCI_FN_CPU_ON] = PSCI_0_2_FN_CPU_ON;
> -       psci_ops.cpu_on = psci_cpu_on;
> -
> -       psci_function_id[PSCI_FN_MIGRATE] = PSCI_0_2_FN_MIGRATE;
> -       psci_ops.migrate = psci_migrate;
> -
> -       psci_function_id[PSCI_FN_AFFINITY_INFO] = PSCI_0_2_FN_AFFINITY_INFO;
> -       psci_ops.affinity_info = psci_affinity_info;
> -
> -       psci_function_id[PSCI_FN_MIGRATE_INFO_TYPE] =
> -               PSCI_0_2_FN_MIGRATE_INFO_TYPE;
> -       psci_ops.migrate_info_type = psci_migrate_info_type;
> -
> -       arm_pm_restart = psci_sys_reset;
> -
> -       pm_power_off = psci_sys_poweroff;
> -
> -out_put_node:
> -       of_node_put(np);
> -       return err;
> -}
> -
> -/*
> - * PSCI < v0.2 get PSCI Function IDs via DT.
> - */
> -static int psci_0_1_init(struct device_node *np)
> -{
> -       u32 id;
> -       int err;
> -
> -       err = get_set_conduit_method(np);
> -
> -       if (err)
> -               goto out_put_node;
> -
> -       pr_info("Using PSCI v0.1 Function IDs from DT\n");
> -
> -       if (!of_property_read_u32(np, "cpu_suspend", &id)) {
> -               psci_function_id[PSCI_FN_CPU_SUSPEND] = id;
> -               psci_ops.cpu_suspend = psci_cpu_suspend;
> -       }
> -
> -       if (!of_property_read_u32(np, "cpu_off", &id)) {
> -               psci_function_id[PSCI_FN_CPU_OFF] = id;
> -               psci_ops.cpu_off = psci_cpu_off;
> -       }
> -
> -       if (!of_property_read_u32(np, "cpu_on", &id)) {
> -               psci_function_id[PSCI_FN_CPU_ON] = id;
> -               psci_ops.cpu_on = psci_cpu_on;
> -       }
> -
> -       if (!of_property_read_u32(np, "migrate", &id)) {
> -               psci_function_id[PSCI_FN_MIGRATE] = id;
> -               psci_ops.migrate = psci_migrate;
> -       }
> -
> -out_put_node:
> -       of_node_put(np);
> -       return err;
> -}
> -
> -static const struct of_device_id psci_of_match[] __initconst = {
> -       { .compatible = "arm,psci", .data = psci_0_1_init},
> -       { .compatible = "arm,psci-0.2", .data = psci_0_2_init},
> -       {},
> -};
> -
> -int __init psci_init(void)
> -{
> -       struct device_node *np;
> -       const struct of_device_id *matched_np;
> -       psci_initcall_t init_fn;
> -
> -       np = of_find_matching_node_and_match(NULL, psci_of_match, &matched_np);
> -       if (!np)
> -               return -ENODEV;
> -
> -       init_fn = (psci_initcall_t)matched_np->data;
> -       return init_fn(np);
> -}
> diff --git a/arch/arm/kernel/psci_smp.c b/arch/arm/kernel/psci_smp.c
> index 28a1db4..c390615 100644
> --- a/arch/arm/kernel/psci_smp.c
> +++ b/arch/arm/kernel/psci_smp.c
> @@ -17,6 +17,8 @@
>  #include <linux/smp.h>
>  #include <linux/of.h>
>  #include <linux/delay.h>
> +#include <linux/psci.h>
> +
>  #include <uapi/linux/psci.h>
> 
>  #include <asm/psci.h>
> @@ -56,17 +58,29 @@ static int psci_boot_secondary(unsigned int cpu, struct task_struct *idle)
>  }
> 
>  #ifdef CONFIG_HOTPLUG_CPU
> +int psci_cpu_disable(unsigned int cpu)
> +{
> +       /* Fail early if we don't have CPU_OFF support */
> +       if (!psci_ops.cpu_off)
> +               return -EOPNOTSUPP;
> +
> +       /* Trusted OS will deny CPU_OFF */
> +       if (psci_tos_resident_on(cpu))
> +               return -EPERM;
> +
> +       return 0;
> +}
> +
>  void __ref psci_cpu_die(unsigned int cpu)
>  {
> -       const struct psci_power_state ps = {
> -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> -       };
> +       u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
> +                   PSCI_0_2_POWER_STATE_TYPE_SHIFT;
> 
> -       if (psci_ops.cpu_off)
> -               psci_ops.cpu_off(ps);
> +       if (psci_ops.cpu_off)
> +               psci_ops.cpu_off(state);
> 
> -       /* We should never return */
> -       panic("psci: cpu %d failed to shutdown\n", cpu);
> +       /* We should never return */
> +       panic("psci: cpu %d failed to shutdown\n", cpu);
>  }
> 
>  int __ref psci_cpu_kill(unsigned int cpu)
> @@ -109,6 +123,7 @@ bool __init psci_smp_available(void)
>  struct smp_operations __initdata psci_smp_ops = {
>         .smp_boot_secondary     = psci_boot_secondary,
>  #ifdef CONFIG_HOTPLUG_CPU
> +       .cpu_disable            = psci_cpu_disable,
>         .cpu_die                = psci_cpu_die,
>         .cpu_kill               = psci_cpu_kill,
>  #endif
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 6c777e9..3224680 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -31,6 +31,7 @@
>  #include <linux/bug.h>
>  #include <linux/compiler.h>
>  #include <linux/sort.h>
> +#include <linux/psci.h>
> 
>  #include <asm/unified.h>
>  #include <asm/cp15.h>
> @@ -950,7 +951,7 @@ void __init setup_arch(char **cmdline_p)
>         unflatten_device_tree();
> 
>         arm_dt_init_cpu_maps();
> -       psci_init();
> +       psci_dt_init();
>  #ifdef CONFIG_SMP
>         if (is_smp()) {
>                 if (!mdesc->smp_init || !mdesc->smp_init()) {
> diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
> index 231fba0..6050a14 100644
> --- a/arch/arm/mach-highbank/highbank.c
> +++ b/arch/arm/mach-highbank/highbank.c
> @@ -28,8 +28,8 @@
>  #include <linux/reboot.h>
>  #include <linux/amba/bus.h>
>  #include <linux/platform_device.h>
> +#include <linux/psci.h>
> 
> -#include <asm/psci.h>
>  #include <asm/hardware/cache-l2x0.h>
>  #include <asm/mach/arch.h>
>  #include <asm/mach/map.h>
> diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c
> index 7f2bd85..014e96d 100644
> --- a/arch/arm/mach-highbank/pm.c
> +++ b/arch/arm/mach-highbank/pm.c
> @@ -16,18 +16,14 @@
> 
>  #include <linux/cpu_pm.h>
>  #include <linux/init.h>
> +#include <linux/psci.h>
>  #include <linux/suspend.h>
> 
>  #include <asm/suspend.h>
> -#include <asm/psci.h>
> 
>  static int highbank_suspend_finish(unsigned long val)
>  {
> -       const struct psci_power_state ps = {
> -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> -               .affinity_level = 1,
> -       };
> -
> +       u32 ps = 0x01010000; /* Aff1 power down */
>         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
>  }
> 
> diff --git a/drivers/cpuidle/cpuidle-calxeda.c b/drivers/cpuidle/cpuidle-calxeda.c
> index 9445e6c..d010da8f 100644
> --- a/drivers/cpuidle/cpuidle-calxeda.c
> +++ b/drivers/cpuidle/cpuidle-calxeda.c
> @@ -25,15 +25,14 @@
>  #include <linux/init.h>
>  #include <linux/mm.h>
>  #include <linux/platform_device.h>
> +#include <linux/psci.h>
> +
>  #include <asm/cpuidle.h>
>  #include <asm/suspend.h>
> -#include <asm/psci.h>
> 
>  static int calxeda_idle_finish(unsigned long val)
>  {
> -       const struct psci_power_state ps = {
> -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> -       };
> +       u32 ps = 0x00010000; /* Aff0 power down */
>         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
>  }
> 
> --
> 1.9.1
> 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-05-27 17:17     ` Mark Rutland
@ 2015-06-03 15:19       ` Mark Rutland
  0 siblings, 0 replies; 26+ messages in thread
From: Mark Rutland @ 2015-06-03 15:19 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Rob,

On Wed, May 27, 2015 at 06:17:47PM +0100, Mark Rutland wrote:
> On Wed, May 27, 2015 at 05:46:47PM +0100, Rob Herring wrote:
> > On Tue, May 26, 2015 at 8:52 AM, Mark Rutland <mark.rutland@arm.com> wrote:
> > > Now that the common PSCI client code has been factored out to
> > > drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> > > over to it. This results in a moderate reduction of duplicated lines,
> > > and will prevent further duplication as the PSCI client code is updated
> > > for PSCI 1.0 and beyond.
> > >
> > > The two legacy platform users of the PSCI invocation code are updated to
> > > account for interface changes. In both cases the power state parameter
> > > is changed to an opaque u32 token in preparation for PSCI 1.0 power
> > > state changes.

Other than the changes you requested below, are you happy with the
patch?

Are you happy to ack the patch with those changes folded in?

Mark.

> > >  static int highbank_suspend_finish(unsigned long val)
> > >  {
> > > -       const struct psci_power_state ps = {
> > > -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> > > -               .affinity_level = 1,
> > > -       };
> > > -
> > > +       u32 ps = 0x01010000; /* Aff1 power down */
> > 
> > Why not just pass directly instead of sticking in a variable first.
> 
> No particular reason. I'll fold it in.
>  
> > >         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
> > >  }
> > >
> > > diff --git a/drivers/cpuidle/cpuidle-calxeda.c b/drivers/cpuidle/cpuidle-calxeda.c
> > > index 9445e6c..d010da8f 100644
> > > --- a/drivers/cpuidle/cpuidle-calxeda.c
> > > +++ b/drivers/cpuidle/cpuidle-calxeda.c
> > > @@ -25,15 +25,14 @@
> > >  #include <linux/init.h>
> > >  #include <linux/mm.h>
> > >  #include <linux/platform_device.h>
> > > +#include <linux/psci.h>
> > > +
> > >  #include <asm/cpuidle.h>
> > >  #include <asm/suspend.h>
> > > -#include <asm/psci.h>
> > >
> > >  static int calxeda_idle_finish(unsigned long val)
> > >  {
> > > -       const struct psci_power_state ps = {
> > > -               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
> > > -       };
> > > +       u32 ps = 0x00010000; /* Aff0 power down */
> > 
> > ditto.
> 
> Likewise.
> 
> Thanks,
> Mark.
> 
> > 
> > >         return psci_ops.cpu_suspend(ps, __pa(cpu_resume));
> > >  }
> > >
> > > --
> > > 1.9.1
> > >
> > 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-06-03 15:16   ` Mark Rutland
@ 2015-06-04  9:45     ` Catalin Marinas
  2015-06-05 10:04       ` Mark Rutland
  2015-06-04  9:49     ` Russell King - ARM Linux
  1 sibling, 1 reply; 26+ messages in thread
From: Catalin Marinas @ 2015-06-04  9:45 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Mark,

On Wed, Jun 03, 2015 at 04:16:39PM +0100, Mark Rutland wrote:
> On Tue, May 26, 2015 at 02:52:29PM +0100, Mark Rutland wrote:
> > Now that the common PSCI client code has been factored out to
> > drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> > over to it. This results in a moderate reduction of duplicated lines,
> > and will prevent further duplication as the PSCI client code is updated
> > for PSCI 1.0 and beyond.
> > 
> > The two legacy platform users of the PSCI invocation code are updated to
> > account for interface changes. In both cases the power state parameter
> > is changed to an opaque u32 token in preparation for PSCI 1.0 power
> > state changes.
> > 
> > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> > Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Cc: Rob Herring <robh@kernel.org>
> > Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> > Cc: Will Deacon <will.deacon@arm.com>
> > ---
> >  arch/arm/Kconfig                  |   1 +
> >  arch/arm/include/asm/psci.h       |  23 ---
> >  arch/arm/kernel/Makefile          |   2 +-
> >  arch/arm/kernel/psci.c            | 299 --------------------------------------
> >  arch/arm/kernel/psci_smp.c        |  29 +++-
> >  arch/arm/kernel/setup.c           |   3 +-
> >  arch/arm/mach-highbank/highbank.c |   2 +-
> >  arch/arm/mach-highbank/pm.c       |   8 +-
> >  drivers/cpuidle/cpuidle-calxeda.c |   7 +-
> >  9 files changed, 32 insertions(+), 342 deletions(-)
> >  delete mode 100644 arch/arm/kernel/psci.c
> 
> Do you have any objections to the arch/arm changes in this patch?
> 
> If not, could I please have your ack?
> 
> As there are arm, arm64, and drivers changes in the series I was hoping
> this could all go via arm-soc.

If we don't hear from Russell by the end of today, I propose that we
merge patches 1-8 in the arm64 tree (mostly fixes for PSCI). This series
is blocking other developments like PSCI 1.0, so I really want to get
parts of it merged in 4.2.

BTW, can we skip patch 11 in this series and still allow
drivers/firmware/psci.c only for arm64, with the aim of moving the arm32
code later?

Thanks.

-- 
Catalin

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-06-03 15:16   ` Mark Rutland
  2015-06-04  9:45     ` Catalin Marinas
@ 2015-06-04  9:49     ` Russell King - ARM Linux
  1 sibling, 0 replies; 26+ messages in thread
From: Russell King - ARM Linux @ 2015-06-04  9:49 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Jun 03, 2015 at 04:16:39PM +0100, Mark Rutland wrote:
> Hi Russell,
> 
> On Tue, May 26, 2015 at 02:52:29PM +0100, Mark Rutland wrote:
> > Now that the common PSCI client code has been factored out to
> > drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> > over to it. This results in a moderate reduction of duplicated lines,
> > and will prevent further duplication as the PSCI client code is updated
> > for PSCI 1.0 and beyond.
> > 
> > The two legacy platform users of the PSCI invocation code are updated to
> > account for interface changes. In both cases the power state parameter
> > is changed to an opaque u32 token in preparation for PSCI 1.0 power
> > state changes.
> > 
> > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> > Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Cc: Rob Herring <robh@kernel.org>
> > Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> > Cc: Will Deacon <will.deacon@arm.com>
> > ---
> >  arch/arm/Kconfig                  |   1 +
> >  arch/arm/include/asm/psci.h       |  23 ---
> >  arch/arm/kernel/Makefile          |   2 +-
> >  arch/arm/kernel/psci.c            | 299 --------------------------------------
> >  arch/arm/kernel/psci_smp.c        |  29 +++-
> >  arch/arm/kernel/setup.c           |   3 +-
> >  arch/arm/mach-highbank/highbank.c |   2 +-
> >  arch/arm/mach-highbank/pm.c       |   8 +-
> >  drivers/cpuidle/cpuidle-calxeda.c |   7 +-
> >  9 files changed, 32 insertions(+), 342 deletions(-)
> >  delete mode 100644 arch/arm/kernel/psci.c
> 
> Do you have any objections to the arch/arm changes in this patch?
> 
> If not, could I please have your ack?
> 
> As there are arm, arm64, and drivers changes in the series I was hoping
> this could all go via arm-soc.

If you want me to do something, please ensure that you send stuff _To:_
me, not _Cc:_ me... I can't say when I'll be able to look at them today,
but hopefully tomorrow.

-- 
FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up
according to speedtest.net.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-06-04  9:45     ` Catalin Marinas
@ 2015-06-05 10:04       ` Mark Rutland
  2015-06-05 10:35         ` Catalin Marinas
  0 siblings, 1 reply; 26+ messages in thread
From: Mark Rutland @ 2015-06-05 10:04 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Jun 04, 2015 at 10:45:30AM +0100, Catalin Marinas wrote:
> Hi Mark,
> 
> On Wed, Jun 03, 2015 at 04:16:39PM +0100, Mark Rutland wrote:
> > On Tue, May 26, 2015 at 02:52:29PM +0100, Mark Rutland wrote:
> > > Now that the common PSCI client code has been factored out to
> > > drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> > > over to it. This results in a moderate reduction of duplicated lines,
> > > and will prevent further duplication as the PSCI client code is updated
> > > for PSCI 1.0 and beyond.
> > > 
> > > The two legacy platform users of the PSCI invocation code are updated to
> > > account for interface changes. In both cases the power state parameter
> > > is changed to an opaque u32 token in preparation for PSCI 1.0 power
> > > state changes.
> > > 
> > > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > > Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> > > Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> > > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > > Cc: Rob Herring <robh@kernel.org>
> > > Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> > > Cc: Will Deacon <will.deacon@arm.com>
> > > ---
> > >  arch/arm/Kconfig                  |   1 +
> > >  arch/arm/include/asm/psci.h       |  23 ---
> > >  arch/arm/kernel/Makefile          |   2 +-
> > >  arch/arm/kernel/psci.c            | 299 --------------------------------------
> > >  arch/arm/kernel/psci_smp.c        |  29 +++-
> > >  arch/arm/kernel/setup.c           |   3 +-
> > >  arch/arm/mach-highbank/highbank.c |   2 +-
> > >  arch/arm/mach-highbank/pm.c       |   8 +-
> > >  drivers/cpuidle/cpuidle-calxeda.c |   7 +-
> > >  9 files changed, 32 insertions(+), 342 deletions(-)
> > >  delete mode 100644 arch/arm/kernel/psci.c
> > 
> > Do you have any objections to the arch/arm changes in this patch?
> > 
> > If not, could I please have your ack?
> > 
> > As there are arm, arm64, and drivers changes in the series I was hoping
> > this could all go via arm-soc.
> 
> If we don't hear from Russell by the end of today, I propose that we
> merge patches 1-8 in the arm64 tree (mostly fixes for PSCI). This series
> is blocking other developments like PSCI 1.0, so I really want to get
> parts of it merged in 4.2.

I've pushed the first 8 patches to my arm64/psci-rework branch [1]. I've
pushed the whole series with the tags provided today to psci/rework [2].

I tried a merge with the arm64 for-next/core branch locally, and got a
trivial conflict in smp.c against the changes in "arm64: Use common
outgoing-CPU-notification code". Hopefully that's easy to fix up
locally.

> BTW, can we skip patch 11 in this series and still allow
> drivers/firmware/psci.c only for arm64, with the aim of moving the arm32
> code later?

We could, though I would prefer to have the two unified from the
beginning.

Thanks,
Mark.

[1] git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git arm64/psci-rework
[2] git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git psci/rework

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCHv3 11/12] ARM: migrate to common PSCI client code
  2015-06-05 10:04       ` Mark Rutland
@ 2015-06-05 10:35         ` Catalin Marinas
  0 siblings, 0 replies; 26+ messages in thread
From: Catalin Marinas @ 2015-06-05 10:35 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jun 05, 2015 at 11:04:58AM +0100, Mark Rutland wrote:
> On Thu, Jun 04, 2015 at 10:45:30AM +0100, Catalin Marinas wrote:
> > On Wed, Jun 03, 2015 at 04:16:39PM +0100, Mark Rutland wrote:
> > > On Tue, May 26, 2015 at 02:52:29PM +0100, Mark Rutland wrote:
> > > > Now that the common PSCI client code has been factored out to
> > > > drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code
> > > > over to it. This results in a moderate reduction of duplicated lines,
> > > > and will prevent further duplication as the PSCI client code is updated
> > > > for PSCI 1.0 and beyond.
> > > > 
> > > > The two legacy platform users of the PSCI invocation code are updated to
> > > > account for interface changes. In both cases the power state parameter
> > > > is changed to an opaque u32 token in preparation for PSCI 1.0 power
> > > > state changes.
> > > > 
> > > > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > > > Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> > > > Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> > > > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > > > Cc: Rob Herring <robh@kernel.org>
> > > > Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> > > > Cc: Will Deacon <will.deacon@arm.com>
> > > > ---
> > > >  arch/arm/Kconfig                  |   1 +
> > > >  arch/arm/include/asm/psci.h       |  23 ---
> > > >  arch/arm/kernel/Makefile          |   2 +-
> > > >  arch/arm/kernel/psci.c            | 299 --------------------------------------
> > > >  arch/arm/kernel/psci_smp.c        |  29 +++-
> > > >  arch/arm/kernel/setup.c           |   3 +-
> > > >  arch/arm/mach-highbank/highbank.c |   2 +-
> > > >  arch/arm/mach-highbank/pm.c       |   8 +-
> > > >  drivers/cpuidle/cpuidle-calxeda.c |   7 +-
> > > >  9 files changed, 32 insertions(+), 342 deletions(-)
> > > >  delete mode 100644 arch/arm/kernel/psci.c
> > > 
> > > Do you have any objections to the arch/arm changes in this patch?
> > > 
> > > If not, could I please have your ack?
> > > 
> > > As there are arm, arm64, and drivers changes in the series I was hoping
> > > this could all go via arm-soc.
> > 
> > If we don't hear from Russell by the end of today, I propose that we
> > merge patches 1-8 in the arm64 tree (mostly fixes for PSCI). This series
> > is blocking other developments like PSCI 1.0, so I really want to get
> > parts of it merged in 4.2.
> 
> I've pushed the first 8 patches to my arm64/psci-rework branch [1].
...
> [1] git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git arm64/psci-rework

Thanks. I pulled this into the arm64 for-next/core branch.

> I've pushed the whole series with the tags provided today to
> psci/rework [2].
...
> [2] git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git psci/rework

As long as you don't rebase arm64/psci-rework, you can send this branch
to arm-soc once Russell acks the arm part.

Thanks.

-- 
Catalin

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2015-06-05 10:35 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-26 13:52 [PATCHv3 00/12] arm/arm64: Unify PSCI client support Mark Rutland
2015-05-26 13:52 ` [PATCHv3 01/12] arm/arm64: kvm: add missing PSCI include Mark Rutland
2015-05-26 13:52 ` [PATCHv3 02/12] arm64: smp_plat: add get_logical_index Mark Rutland
2015-05-26 13:52 ` [PATCHv3 03/12] arm64: smp: consistently use error codes Mark Rutland
2015-05-26 13:52 ` [PATCHv3 04/12] arm64: psci: remove unnecessary id indirection Mark Rutland
2015-05-26 13:52 ` [PATCHv3 05/12] arm64: psci: support unsigned return values Mark Rutland
2015-05-26 13:52 ` [PATCHv3 06/12] arm64: psci: account for Trusted OS instances Mark Rutland
2015-05-26 13:52 ` [PATCHv3 07/12] arm64: psci: kill psci_power_state Mark Rutland
2015-05-26 13:52 ` [PATCHv3 08/12] arm64: psci: remove ACPI coupling Mark Rutland
2015-05-26 20:18   ` Al Stone
2015-05-26 13:52 ` [PATCHv3 09/12] arm64: psci: factor invocation code to drivers Mark Rutland
2015-05-26 13:52 ` [PATCHv3 10/12] drivers: psci: support native SMC{32,64} calls Mark Rutland
2015-05-26 13:52 ` [PATCHv3 11/12] ARM: migrate to common PSCI client code Mark Rutland
2015-05-27 12:01   ` Ashwin Chaugule
2015-05-27 12:41     ` Mark Rutland
2015-05-27 16:46   ` Rob Herring
2015-05-27 17:17     ` Mark Rutland
2015-06-03 15:19       ` Mark Rutland
2015-06-03 15:16   ` Mark Rutland
2015-06-04  9:45     ` Catalin Marinas
2015-06-05 10:04       ` Mark Rutland
2015-06-05 10:35         ` Catalin Marinas
2015-06-04  9:49     ` Russell King - ARM Linux
2015-05-26 13:52 ` [PATCHv3 12/12] MAINTAINERS: add PSCI entry Mark Rutland
2015-05-27  8:08 ` [PATCHv3 00/12] arm/arm64: Unify PSCI client support Hanjun Guo
2015-05-27 12:23   ` Mark Rutland

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.