From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: Re: [PATCH 3/4] xen/arm: Add PSCI system_off and system_reset support Date: Wed, 1 Oct 2014 11:07:03 +0100 Message-ID: References: <1412150877-4090-1-git-send-email-suravee.suthikulpanit@amd.com> <1412150877-4090-4-git-send-email-suravee.suthikulpanit@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1412150877-4090-4-git-send-email-suravee.suthikulpanit@amd.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Suravee Suthikulpanit Cc: julien.grall@linaro.org, xen-devel@lists.xen.org, ian.campbell@citrix.com, stefano.stabellini@eu.citrix.com List-Id: xen-devel@lists.xenproject.org On Wed, 1 Oct 2014, suravee.suthikulpanit@amd.com wrote: > From: Suravee Suthikulpanit > > 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 > --- > 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); > +} This assumes PSCI 0.2 but actually the cpu_on function is still reading the id from device tree. Could you please change that too for uniformity? > 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 > #include > > -static void raw_machine_reset(void) > -{ > - platform_reset(); > -} Please mention this change in the commit message. > 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 >