|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/4] xen/arm: Add PSCI system_off and system_reset support
From: Suravee Suthikulpanit <Suravee.Suthikulpanit@xxxxxxx>
This patch adds SMC calls to suport PSCI-0.2 system_off and system_reset,
It also adds a call to platform_power_off in machine_halt(). This would
allow platform, which implements PSCI-0.2 to properly handle system off
and reset.
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@xxxxxxx>
---
xen/arch/arm/psci.c | 10 ++++++++++
xen/arch/arm/shutdown.c | 16 ++++++++++------
xen/include/asm-arm/psci.h | 2 ++
3 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/xen/arch/arm/psci.c b/xen/arch/arm/psci.c
index b6360d5..b0d94a8 100644
--- a/xen/arch/arm/psci.c
+++ b/xen/arch/arm/psci.c
@@ -58,6 +58,16 @@ int call_psci_cpu_on(int cpu)
cpu_logical_map(cpu), __pa(init_secondary), 0);
}
+void call_psci_system_off(void)
+{
+ __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
+}
+
+void call_psci_system_reset(void)
+{
+ __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
+}
+
int __init psci_init(void)
{
const struct dt_device_node *psci;
diff --git a/xen/arch/arm/shutdown.c b/xen/arch/arm/shutdown.c
index adc0529..2f63674 100644
--- a/xen/arch/arm/shutdown.c
+++ b/xen/arch/arm/shutdown.c
@@ -6,11 +6,6 @@
#include <xen/smp.h>
#include <asm/platform.h>
-static void raw_machine_reset(void)
-{
- platform_reset();
-}
-
static void noreturn halt_this_cpu(void *arg)
{
stop_cpu();
@@ -18,10 +13,19 @@ static void noreturn halt_this_cpu(void *arg)
void machine_halt(void)
{
+ int timeout = 10;
+
watchdog_disable();
console_start_sync();
local_irq_enable();
smp_call_function(halt_this_cpu, NULL, 0);
+ local_irq_disable();
+
+ /* Wait at most another 10ms for all other CPUs to go offline. */
+ while ( (num_online_cpus() > 1) && (timeout-- > 0) )
+ mdelay(1);
+
+ platform_poweroff();
halt_this_cpu(NULL);
}
@@ -41,7 +45,7 @@ void machine_restart(unsigned int delay_millisecs)
while ( 1 )
{
- raw_machine_reset();
+ platform_reset();
mdelay(100);
}
}
diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h
index 9777c03..de00ee2 100644
--- a/xen/include/asm-arm/psci.h
+++ b/xen/include/asm-arm/psci.h
@@ -17,6 +17,8 @@ extern bool_t psci_available;
int psci_init(void);
int call_psci_cpu_on(int cpu);
+void call_psci_system_off(void);
+void call_psci_system_reset(void);
/* functions to handle guest PSCI requests */
int32_t do_psci_cpu_on(uint32_t vcpuid, register_t entry_point);
--
1.9.3
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |