[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/7] xen/arm/psci: Implement CPU_OFF PSCI call (physical interface)
Hi Julien, On Wed, Apr 11, 2018 at 4:46 PM, Julien Grall <julien.grall@xxxxxxx> wrote: > Hi, > > On 11/04/18 14:19, Mirela Simonovic wrote: >> >> This patch adds the PSCI CPU_OFF call to the EL3 in order to >> trigger powering down of the calling CPU when the CPU is stopped. >> If CPU_OFF call fails for some reason, e.g. EL3 does not implement >> the PSCI CPU_OFF function, the calling CPU will loop in the infinite > >> while/wfi, as it was looping before this change. > > > I am afraid that the example you give is wrong. That call should exist for > all implementation of PSCI 0.2 and above. For 0.1, this should never be call > as the ID is not reserved. Thanks. > >> >> Signed-off-by: Mirela Simonovic <mirela.simonovic@xxxxxxxxxx> >> --- >> xen/arch/arm/psci.c | 5 +++++ >> xen/arch/arm/smpboot.c | 7 +++++++ >> xen/include/asm-arm/psci.h | 1 + >> 3 files changed, 13 insertions(+) >> >> diff --git a/xen/arch/arm/psci.c b/xen/arch/arm/psci.c >> index 94b616df9b..e9e756e56b 100644 >> --- a/xen/arch/arm/psci.c >> +++ b/xen/arch/arm/psci.c >> @@ -46,6 +46,11 @@ int call_psci_cpu_on(int cpu) >> return call_smc(psci_cpu_on_nr, cpu_logical_map(cpu), >> __pa(init_secondary), 0); >> } >> +int call_psci_cpu_off(void) >> +{ > > > You have to check the PSCI version here before calling the function. > Thanks, I fixed this. >> + return call_smc(PSCI_0_2_FN32_CPU_OFF, 0, 0, 0); >> +} >> + >> void call_psci_system_off(void) >> { >> if ( psci_ver > PSCI_VERSION(0, 1) ) >> diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c >> index b2116f0d2d..5666efcd3a 100644 >> --- a/xen/arch/arm/smpboot.c >> +++ b/xen/arch/arm/smpboot.c >> @@ -390,11 +390,18 @@ void __cpu_disable(void) >> void stop_cpu(void) >> { >> + int errno; > > > newline. Got it, thanks > >> local_irq_disable(); >> cpu_is_dead = true; >> /* Make sure the write happens before we sleep forever */ >> dsb(sy); >> isb(); >> + /* PSCI cpu off call will return only in case of an error */ >> + errno = call_psci_cpu_off(); >> + printk(XENLOG_DEBUG "PSCI cpu off call failed for CPU#%d err=%d\n", >> + get_processor_id(), errno); >> + isb(); > > > What are you trying to achieve with the isb() here? > I use to have a problem that the wfi below gets executed before the call_psci_cpu_off(). Adding isb() fixed the issue. However, I tried now to reproduce the problem and it doesn't show up. I still believe isb() should be here, please let me know if you disagree (I obviously can't prove the claim now). Thanks, Mirela > Cheers, > >> + /* If CPU_OFF PSCI call failed stay in the WFI loop */ >> while ( 1 ) >> wfi(); >> } >> diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h >> index 9ac820e94a..50d668a296 100644 >> --- a/xen/include/asm-arm/psci.h >> +++ b/xen/include/asm-arm/psci.h >> @@ -20,6 +20,7 @@ extern uint32_t psci_ver; >> int psci_init(void); >> int call_psci_cpu_on(int cpu); >> +int call_psci_cpu_off(void); >> void call_psci_system_off(void); >> void call_psci_system_reset(void); >> > > > Cheers, > > -- > Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |