linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Hanjun Guo <hanjun.guo@linaro.org>
To: Catalin Marinas <catalin.marinas@arm.com>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Will Deacon <will.deacon@arm.com>,
	Olof Johansson <olof@lixom.net>,
	Grant Likely <grant.likely@linaro.org>
Cc: Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Mark Rutland <mark.rutland@arm.com>,
	Graeme Gregory <graeme.gregory@linaro.org>,
	Sudeep Holla <Sudeep.Holla@arm.com>, Jon Masters <jcm@redhat.com>,
	Marc Zyngier <marc.zyngier@arm.com>,
	Mark Brown <broonie@kernel.org>, Robert Richter <rric@kernel.org>,
	Timur Tabi <timur@codeaurora.org>,
	Ashwin Chaugule <ashwinc@codeaurora.org>,
	suravee.suthikulpanit@amd.com, linux-acpi@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linaro-acpi@lists.linaro.org,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Tomasz Nowicki <tomasz.nowicki@linaro.org>,
	Hanjun Guo <hanjun.guo@linaro.org>
Subject: [PATCH v9 11/21] ARM64 / ACPI: Get PSCI flags in FADT for PSCI init
Date: Wed, 25 Feb 2015 16:39:51 +0800	[thread overview]
Message-ID: <1424853601-6675-12-git-send-email-hanjun.guo@linaro.org> (raw)
In-Reply-To: <1424853601-6675-1-git-send-email-hanjun.guo@linaro.org>

From: Graeme Gregory <graeme.gregory@linaro.org>

There are two flags: PSCI_COMPLIANT and PSCI_USE_HVC. When set,
the former signals to the OS that the firmware is PSCI compliant.
The latter selects the appropriate conduit for PSCI calls by
toggling between Hypervisor Calls (HVC) and Secure Monitor Calls
(SMC).

FADT table contains such information in ACPI 5.1, FADT table was
parsed in ACPI table init and copy to struct acpi_gbl_FADT, so
use the flags in struct acpi_gbl_FADT for PSCI init.

Since ACPI 5.1 doesn't support self defined PSCI function IDs,
which means that only PSCI 0.2+ is supported in ACPI.

CC: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
CC: Catalin Marinas <catalin.marinas@arm.com>
CC: Will Deacon <will.deacon@arm.com>
Tested-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Tested-by: Yijing Wang <wangyijing@huawei.com>
Tested-by: Mark Langsdorf <mlangsdo@redhat.com>
Tested-by: Jon Masters <jcm@redhat.com>
Tested-by: Timur Tabi <timur@codeaurora.org>
Tested-by: Robert Richter <rrichter@cavium.com>
Acked-by: Robert Richter <rrichter@cavium.com>
Signed-off-by: Graeme Gregory <graeme.gregory@linaro.org>
Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
---
 arch/arm64/include/asm/acpi.h | 15 +++++++++
 arch/arm64/include/asm/psci.h |  3 +-
 arch/arm64/kernel/psci.c      | 78 ++++++++++++++++++++++++++++++-------------
 arch/arm64/kernel/setup.c     |  8 +++--
 4 files changed, 76 insertions(+), 28 deletions(-)

diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
index c5a9b97..9ea650c 100644
--- a/arch/arm64/include/asm/acpi.h
+++ b/arch/arm64/include/asm/acpi.h
@@ -32,6 +32,18 @@ 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;
@@ -60,6 +72,9 @@ static inline bool acpi_has_cpu_in_madt(void)
 
 static inline void arch_fix_phys_package_id(int num, u32 slot) { }
 
+#else
+static inline bool acpi_psci_present(void) { return false; }
+static inline bool acpi_psci_use_hvc(void) { return false; }
 #endif /* CONFIG_ACPI */
 
 #endif /*_ASM_ACPI_H*/
diff --git a/arch/arm64/include/asm/psci.h b/arch/arm64/include/asm/psci.h
index e5312ea..2454bc5 100644
--- a/arch/arm64/include/asm/psci.h
+++ b/arch/arm64/include/asm/psci.h
@@ -14,6 +14,7 @@
 #ifndef __ASM_PSCI_H
 #define __ASM_PSCI_H
 
-int psci_init(void);
+int psci_dt_init(void);
+int psci_acpi_init(void);
 
 #endif /* __ASM_PSCI_H */
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 3425f31..bab2bea 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -15,6 +15,7 @@
 
 #define pr_fmt(fmt) "psci: " fmt
 
+#include <linux/acpi.h>
 #include <linux/init.h>
 #include <linux/of.h>
 #include <linux/smp.h>
@@ -24,6 +25,7 @@
 #include <linux/slab.h>
 #include <uapi/linux/psci.h>
 
+#include <asm/acpi.h>
 #include <asm/compiler.h>
 #include <asm/cpu_ops.h>
 #include <asm/errno.h>
@@ -304,6 +306,33 @@ static void psci_sys_poweroff(void)
 	invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
 }
 
+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_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;
+
+	pm_power_off = psci_sys_poweroff;
+}
+
 /*
  * PSCI Function IDs for v0.2+ are well defined so use
  * standard values.
@@ -337,29 +366,7 @@ static int __init psci_0_2_init(struct device_node *np)
 		}
 	}
 
-	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_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;
-
-	pm_power_off = psci_sys_poweroff;
+	psci_0_2_set_functions();
 
 out_put_node:
 	of_node_put(np);
@@ -412,7 +419,7 @@ static const struct of_device_id psci_of_match[] __initconst = {
 	{},
 };
 
-int __init psci_init(void)
+int __init psci_dt_init(void)
 {
 	struct device_node *np;
 	const struct of_device_id *matched_np;
@@ -427,6 +434,29 @@ int __init psci_init(void)
 	return init_fn(np);
 }
 
+/*
+ * 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;
+
+	psci_0_2_set_functions();
+
+	return 0;
+}
+
 #ifdef CONFIG_SMP
 
 static int __init cpu_psci_cpu_init(struct device_node *dn, unsigned int cpu)
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index e8c7000..97fa7f3 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -390,10 +390,12 @@ void __init setup_arch(char **cmdline_p)
 
 	early_ioremap_reset();
 
-	if (acpi_disabled)
+	if (acpi_disabled) {
 		unflatten_device_tree();
-
-	psci_init();
+		psci_dt_init();
+	} else {
+		psci_acpi_init();
+	}
 
 	cpu_read_bootcpu_ops();
 #ifdef CONFIG_SMP
-- 
1.9.1


  parent reply	other threads:[~2015-02-25  8:42 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-25  8:39 [PATCH v9 00/21] Introduce ACPI for ARM64 based on ACPI 5.1 Hanjun Guo
2015-02-25  8:39 ` [PATCH v9 01/21] ACPI / table: Use pr_debug() instead of pr_info() for MADT table scanning Hanjun Guo
2015-03-04 22:33   ` Rafael J. Wysocki
2015-03-05 17:55   ` Olof Johansson
2015-03-06 20:17   ` Grant Likely
2015-03-06 20:31     ` Joe Perches
2015-03-10  2:35       ` Hanjun Guo
2015-02-25  8:39 ` [PATCH v9 02/21] ACPI / processor: Introduce phys_cpuid_t for CPU hardware ID Hanjun Guo
2015-03-04 22:29   ` Rafael J. Wysocki
2015-03-05  7:44     ` Hanjun Guo
2015-03-05 13:23       ` Rafael J. Wysocki
2015-03-06  6:48         ` Hanjun Guo
2015-03-06 20:19   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 03/21] ACPI: add arm64 to the platforms that use ioremap Hanjun Guo
2015-03-04 22:33   ` Rafael J. Wysocki
2015-03-06 20:20   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 04/21] ARM64: allow late use of early_ioremap Hanjun Guo
2015-03-06 20:24   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 05/21] ARM64 / ACPI: Get RSDP and ACPI boot-time tables Hanjun Guo
2015-03-05 18:10   ` Olof Johansson
2015-03-05 18:51   ` Lorenzo Pieralisi
2015-03-10  8:01     ` Hanjun Guo
2015-03-10  9:32       ` Lorenzo Pieralisi
2015-03-10 11:19       ` Leif Lindholm
2015-03-10 11:36         ` Hanjun Guo
2015-03-06 20:28   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 06/21] ACPI: fix acpi_os_ioremap for arm64 Hanjun Guo
2015-03-04 22:36   ` Rafael J. Wysocki
2015-03-06 20:30   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 07/21] ACPI / sleep: Introduce arm64 specific acpi_sleep.c Hanjun Guo
2015-03-04 22:38   ` Rafael J. Wysocki
2015-03-04 22:49     ` G Gregory
2015-03-04 23:25       ` Rafael J. Wysocki
2015-03-05  0:16         ` Rafael J. Wysocki
2015-03-06 12:36           ` Lorenzo Pieralisi
2015-03-06 20:34   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 08/21] ARM64 / ACPI: Introduce PCI stub functions for ACPI Hanjun Guo
2015-03-06 18:31   ` Lorenzo Pieralisi
2015-03-10  9:21     ` Hanjun Guo
2015-03-06 20:36   ` Grant Likely
2015-03-09 15:01   ` Liviu Dudau
2015-03-10  9:34     ` Hanjun Guo
2015-02-25  8:39 ` [PATCH v9 09/21] ARM64 / ACPI: Introduce early_param "acpi=" to enable/disable ACPI Hanjun Guo
2015-03-05 18:11   ` Olof Johansson
2015-03-06 20:37   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 10/21] ARM64 / ACPI: If we chose to boot from acpi then disable FDT Hanjun Guo
2015-03-05 18:12   ` Olof Johansson
2015-03-06 20:38   ` Grant Likely
2015-02-25  8:39 ` Hanjun Guo [this message]
2015-03-05 18:19   ` [PATCH v9 11/21] ARM64 / ACPI: Get PSCI flags in FADT for PSCI init Olof Johansson
2015-03-06 20:40   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 12/21] ACPI / table: Print GIC information when MADT is parsed Hanjun Guo
2015-03-04 22:40   ` Rafael J. Wysocki
2015-03-06 18:06   ` Lorenzo Pieralisi
2015-03-06 20:40   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 13/21] ARM64 / ACPI: Parse MADT for SMP initialization Hanjun Guo
2015-03-05 18:49   ` Olof Johansson
2015-03-10 11:33     ` Hanjun Guo
2015-03-07 22:49   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 14/21] ACPI / processor: Make it possible to get CPU hardware ID via GICC Hanjun Guo
2015-03-04 22:46   ` Rafael J. Wysocki
2015-03-05  8:03     ` Hanjun Guo
2015-03-05 11:27       ` Catalin Marinas
2015-03-05 13:13         ` Rafael J. Wysocki
2015-03-05 15:19           ` Catalin Marinas
2015-03-06  6:51             ` Hanjun Guo
2015-03-07 22:52   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 15/21] ARM64 / ACPI: Introduce ACPI_IRQ_MODEL_GIC and register device's gsi Hanjun Guo
2015-03-04 22:47   ` Rafael J. Wysocki
2015-03-07 23:05   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 16/21] irqchip: Add GICv2 specific ACPI boot support Hanjun Guo
2015-03-04 22:50   ` Rafael J. Wysocki
2015-03-05  9:06     ` Hanjun Guo
2015-03-05 11:53     ` Catalin Marinas
2015-03-06  0:42       ` Rafael J. Wysocki
2015-03-05  8:21   ` Hanjun Guo
2015-03-07 23:14   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 17/21] clocksource / arch_timer: Parse GTDT to initialize arch timer Hanjun Guo
2015-03-07 23:16   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 18/21] ARM64 / ACPI: Select ACPI_REDUCED_HARDWARE_ONLY if ACPI is enabled on ARM64 Hanjun Guo
2015-03-06 17:47   ` Lorenzo Pieralisi
2015-03-10 12:23     ` Hanjun Guo
2015-03-10 14:16       ` Lorenzo Pieralisi
2015-03-07 23:16   ` Grant Likely
2015-02-25  8:39 ` [PATCH v9 19/21] ARM64 / ACPI: Enable ARM64 in Kconfig Hanjun Guo
2015-03-04 22:52   ` Rafael J. Wysocki
2015-03-07 23:17   ` Grant Likely
2015-02-25  8:40 ` [PATCH v9 20/21] Documentation: ACPI for ARM64 Hanjun Guo
2015-02-27 10:53   ` Shannon Zhao
2015-02-27 11:13     ` Shannon Zhao
2015-02-27 11:20   ` Shannon Zhao
2015-02-25  8:40 ` [PATCH v9 21/21] ARM64 / ACPI: additions of ACPI documentation for arm64 Hanjun Guo
2015-02-27 11:22   ` Shannon Zhao
2015-02-27 14:19     ` Hanjun Guo
2015-03-05 18:54   ` Olof Johansson
2015-02-27  3:20 ` [PATCH v9 00/21] Introduce ACPI for ARM64 based on ACPI 5.1 Timur Tabi
2015-02-27  8:37   ` Hanjun Guo
2015-02-27 10:51     ` Shannon Zhao
2015-02-27  8:50   ` Ard Biesheuvel
2015-02-27 10:36     ` Mark Rutland
2015-02-27 21:05     ` Timur Tabi
2015-03-04 23:18     ` Timur Tabi
2015-03-04 22:56 ` Rafael J. Wysocki
2015-03-05  7:03   ` Hanjun Guo
2015-03-05 18:57 ` Olof Johansson
2015-03-06  4:26   ` Hanjun Guo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1424853601-6675-12-git-send-email-hanjun.guo@linaro.org \
    --to=hanjun.guo@linaro.org \
    --cc=Lorenzo.Pieralisi@arm.com \
    --cc=Sudeep.Holla@arm.com \
    --cc=arnd@arndb.de \
    --cc=ashwinc@codeaurora.org \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=graeme.gregory@linaro.org \
    --cc=grant.likely@linaro.org \
    --cc=jcm@redhat.com \
    --cc=linaro-acpi@lists.linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=olof@lixom.net \
    --cc=rjw@rjwysocki.net \
    --cc=rric@kernel.org \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=timur@codeaurora.org \
    --cc=tomasz.nowicki@linaro.org \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).