* [PATCH 0/2] Introduce PSCI-0.2 supports @ 2014-10-01 20:02 suravee.suthikulpanit 2014-10-01 20:02 ` [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 suravee.suthikulpanit 2014-10-01 20:02 ` [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default suravee.suthikulpanit 0 siblings, 2 replies; 14+ messages in thread From: suravee.suthikulpanit @ 2014-10-01 20:02 UTC (permalink / raw) To: stefano.stabellini, julien.grall, ian.campbell Cc: Suravee Suthikulpanit, xen-devel From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> This patch series introduce PSCI-0.2 supports for: * PSCI_VERSION * CPU_ON * SYSTEM_OFF * SYSTEM_RESET Then, it modifies the shutdown/restart logic to use PSCI-0.2 interface by default when available. Suravee Suthikulpanit (2): xen/arm: Initial support for PSCI-0.2 (cpu_on, system_off, system_reset) xen/arm: Use PSCI-0.2 for machine_halt/restart by default xen/arch/arm/arm64/smpboot.c | 2 +- xen/arch/arm/platform.c | 2 +- xen/arch/arm/psci.c | 72 +++++++++++++++++++++++++++++++++++++++----- xen/arch/arm/shutdown.c | 23 ++++++++++---- xen/include/asm-arm/psci.h | 4 ++- 5 files changed, 86 insertions(+), 17 deletions(-) -- 1.9.3 ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 2014-10-01 20:02 [PATCH 0/2] Introduce PSCI-0.2 supports suravee.suthikulpanit @ 2014-10-01 20:02 ` suravee.suthikulpanit 2014-10-02 9:07 ` Stefano Stabellini ` (2 more replies) 2014-10-01 20:02 ` [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default suravee.suthikulpanit 1 sibling, 3 replies; 14+ messages in thread From: suravee.suthikulpanit @ 2014-10-01 20:02 UTC (permalink / raw) To: stefano.stabellini, julien.grall, ian.campbell Cc: Suravee Suthikulpanit, xen-devel From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> This patch adds support for PSCI-0.2 PSCI_VERSION, CPU_ON, SYSTEM_OFF, and SYSTEM_RESET functions. For PSCI-0.2, the new DT binding "arm,psci-0.2" is used for matching. The psci_init() is now refactored to handle both PSCI-0.1 and PSCI-0.2. Also, to add support for PSCI_VERSION, this patch replaces the "bool_t psci_available" variable with "int psci_ver", which contains the PSCI_VERSION as described in the PSCI-0.2 spec. For v0.1, this psci_ver is 1. Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> --- xen/arch/arm/arm64/smpboot.c | 2 +- xen/arch/arm/platform.c | 2 +- xen/arch/arm/psci.c | 72 +++++++++++++++++++++++++++++++++++++++----- xen/include/asm-arm/psci.h | 4 ++- 4 files changed, 69 insertions(+), 11 deletions(-) diff --git a/xen/arch/arm/arm64/smpboot.c b/xen/arch/arm/arm64/smpboot.c index 9146476..341cc77 100644 --- a/xen/arch/arm/arm64/smpboot.c +++ b/xen/arch/arm/arm64/smpboot.c @@ -54,7 +54,7 @@ static void __init smp_spin_table_init(int cpu, struct dt_device_node *dn) static int __init smp_psci_init(int cpu) { - if ( !psci_available ) + if ( !psci_ver ) { printk("CPU%d asks for PSCI, but DTB has no PSCI node\n", cpu); return -ENODEV; diff --git a/xen/arch/arm/platform.c b/xen/arch/arm/platform.c index 74c3328..cb4cda8 100644 --- a/xen/arch/arm/platform.c +++ b/xen/arch/arm/platform.c @@ -110,7 +110,7 @@ int __init platform_specific_mapping(struct domain *d) #ifdef CONFIG_ARM_32 int __init platform_cpu_up(int cpu) { - if ( psci_available ) + if ( psci_ver ) return call_psci_cpu_on(cpu); if ( platform && platform->cpu_up ) diff --git a/xen/arch/arm/psci.c b/xen/arch/arm/psci.c index b6360d5..874917e 100644 --- a/xen/arch/arm/psci.c +++ b/xen/arch/arm/psci.c @@ -23,7 +23,7 @@ #include <xen/smp.h> #include <asm/psci.h> -bool_t psci_available; +int psci_ver; #ifdef CONFIG_ARM_32 #define REG_PREFIX "r" @@ -58,16 +58,23 @@ int call_psci_cpu_on(int cpu) cpu_logical_map(cpu), __pa(init_secondary), 0); } -int __init psci_init(void) +void call_psci_system_off(void) +{ + if ( psci_ver > 2 ) + __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); +} + +void call_psci_system_reset(void) +{ + if ( psci_ver > 2 ) + __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0); +} + +int __init psci_is_smc_method(const struct dt_device_node *psci) { - const struct dt_device_node *psci; int ret; const char *prop_str; - psci = dt_find_compatible_node(NULL, NULL, "arm,psci"); - if ( !psci ) - return -ENODEV; - ret = dt_property_read_string(psci, "method", &prop_str); if ( ret ) { @@ -85,19 +92,68 @@ int __init psci_init(void) return -EINVAL; } + return 0; +} + +int __init psci_init_0_1(const struct dt_device_node *psci) +{ + int ret; + + ret = psci_is_smc_method(psci); + if ( ret ) + return -EINVAL; + if ( !dt_property_read_u32(psci, "cpu_on", &psci_cpu_on_nr) ) { printk("/psci node is missing the \"cpu_on\" property\n"); return -ENOENT; } - psci_available = 1; + psci_ver = 1; printk(XENLOG_INFO "Using PSCI for SMP bringup\n"); return 0; } +int __init psci_init_0_2(const struct dt_device_node *psci) +{ + int ret; + + ret = psci_is_smc_method(psci); + if ( ret ) + return -EINVAL; + + psci_ver = __invoke_psci_fn_smc(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0); + + if ( psci_ver != 2 ) + { + printk("Error: The retrieved PSCI version (%#x) does not support.\n", psci_ver); + return -EOPNOTSUPP; + } + + psci_cpu_on_nr = PSCI_0_2_FN_CPU_ON; + + printk(XENLOG_INFO "Using PSCI-0.2 for SMP bringup\n"); + + return 0; +} + +int __init psci_init(void) +{ + const struct dt_device_node *psci; + + psci = dt_find_compatible_node(NULL, NULL, "arm,psci"); + if ( psci ) + return psci_init_0_1(psci); + + psci = dt_find_compatible_node(NULL, NULL, "arm,psci-0.2"); + if ( psci ) + return psci_init_0_2(psci); + + return -ENODEV; +} + /* * Local variables: * mode: C diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h index 9777c03..ab37984 100644 --- a/xen/include/asm-arm/psci.h +++ b/xen/include/asm-arm/psci.h @@ -13,10 +13,12 @@ #define PSCI_DISABLED -8 /* availability of PSCI on the host for SMP bringup */ -extern bool_t psci_available; +extern int psci_ver; 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 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 2014-10-01 20:02 ` [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 suravee.suthikulpanit @ 2014-10-02 9:07 ` Stefano Stabellini 2014-10-02 10:51 ` Julien Grall 2014-10-02 14:21 ` Ian Campbell 2 siblings, 0 replies; 14+ messages in thread From: Stefano Stabellini @ 2014-10-02 9:07 UTC (permalink / raw) To: Suravee Suthikulpanit Cc: julien.grall, xen-devel, ian.campbell, stefano.stabellini On Wed, 1 Oct 2014, suravee.suthikulpanit@amd.com wrote: > From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> > > This patch adds support for PSCI-0.2 PSCI_VERSION, CPU_ON, > SYSTEM_OFF, and SYSTEM_RESET functions. > > For PSCI-0.2, the new DT binding "arm,psci-0.2" is used for matching. > The psci_init() is now refactored to handle both PSCI-0.1 and PSCI-0.2. > > Also, to add support for PSCI_VERSION, this patch replaces the "bool_t psci_available" > variable with "int psci_ver", which contains the PSCI_VERSION as described in the > PSCI-0.2 spec. For v0.1, this psci_ver is 1. > > Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> The support to PSCI 0.2 added by this patch is a bit incomplete, but on the other hand the patch is very simple so it might just be the only thing we can actually accept for this release. Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > xen/arch/arm/arm64/smpboot.c | 2 +- > xen/arch/arm/platform.c | 2 +- > xen/arch/arm/psci.c | 72 +++++++++++++++++++++++++++++++++++++++----- > xen/include/asm-arm/psci.h | 4 ++- > 4 files changed, 69 insertions(+), 11 deletions(-) > > diff --git a/xen/arch/arm/arm64/smpboot.c b/xen/arch/arm/arm64/smpboot.c > index 9146476..341cc77 100644 > --- a/xen/arch/arm/arm64/smpboot.c > +++ b/xen/arch/arm/arm64/smpboot.c > @@ -54,7 +54,7 @@ static void __init smp_spin_table_init(int cpu, struct dt_device_node *dn) > > static int __init smp_psci_init(int cpu) > { > - if ( !psci_available ) > + if ( !psci_ver ) > { > printk("CPU%d asks for PSCI, but DTB has no PSCI node\n", cpu); > return -ENODEV; > diff --git a/xen/arch/arm/platform.c b/xen/arch/arm/platform.c > index 74c3328..cb4cda8 100644 > --- a/xen/arch/arm/platform.c > +++ b/xen/arch/arm/platform.c > @@ -110,7 +110,7 @@ int __init platform_specific_mapping(struct domain *d) > #ifdef CONFIG_ARM_32 > int __init platform_cpu_up(int cpu) > { > - if ( psci_available ) > + if ( psci_ver ) > return call_psci_cpu_on(cpu); > > if ( platform && platform->cpu_up ) > diff --git a/xen/arch/arm/psci.c b/xen/arch/arm/psci.c > index b6360d5..874917e 100644 > --- a/xen/arch/arm/psci.c > +++ b/xen/arch/arm/psci.c > @@ -23,7 +23,7 @@ > #include <xen/smp.h> > #include <asm/psci.h> > > -bool_t psci_available; > +int psci_ver; > > #ifdef CONFIG_ARM_32 > #define REG_PREFIX "r" > @@ -58,16 +58,23 @@ int call_psci_cpu_on(int cpu) > cpu_logical_map(cpu), __pa(init_secondary), 0); > } > > -int __init psci_init(void) > +void call_psci_system_off(void) > +{ > + if ( psci_ver > 2 ) > + __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); > +} > + > +void call_psci_system_reset(void) > +{ > + if ( psci_ver > 2 ) > + __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0); > +} > + > +int __init psci_is_smc_method(const struct dt_device_node *psci) > { > - const struct dt_device_node *psci; > int ret; > const char *prop_str; > > - psci = dt_find_compatible_node(NULL, NULL, "arm,psci"); > - if ( !psci ) > - return -ENODEV; > - > ret = dt_property_read_string(psci, "method", &prop_str); > if ( ret ) > { > @@ -85,19 +92,68 @@ int __init psci_init(void) > return -EINVAL; > } > > + return 0; > +} > + > +int __init psci_init_0_1(const struct dt_device_node *psci) > +{ > + int ret; > + > + ret = psci_is_smc_method(psci); > + if ( ret ) > + return -EINVAL; > + > if ( !dt_property_read_u32(psci, "cpu_on", &psci_cpu_on_nr) ) > { > printk("/psci node is missing the \"cpu_on\" property\n"); > return -ENOENT; > } > > - psci_available = 1; > + psci_ver = 1; > > printk(XENLOG_INFO "Using PSCI for SMP bringup\n"); > > return 0; > } > > +int __init psci_init_0_2(const struct dt_device_node *psci) > +{ > + int ret; > + > + ret = psci_is_smc_method(psci); > + if ( ret ) > + return -EINVAL; > + > + psci_ver = __invoke_psci_fn_smc(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0); > + > + if ( psci_ver != 2 ) > + { > + printk("Error: The retrieved PSCI version (%#x) does not support.\n", psci_ver); > + return -EOPNOTSUPP; > + } > + > + psci_cpu_on_nr = PSCI_0_2_FN_CPU_ON; > + > + printk(XENLOG_INFO "Using PSCI-0.2 for SMP bringup\n"); > + > + return 0; > +} > + > +int __init psci_init(void) > +{ > + const struct dt_device_node *psci; > + > + psci = dt_find_compatible_node(NULL, NULL, "arm,psci"); > + if ( psci ) > + return psci_init_0_1(psci); > + > + psci = dt_find_compatible_node(NULL, NULL, "arm,psci-0.2"); > + if ( psci ) > + return psci_init_0_2(psci); > + > + return -ENODEV; > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h > index 9777c03..ab37984 100644 > --- a/xen/include/asm-arm/psci.h > +++ b/xen/include/asm-arm/psci.h > @@ -13,10 +13,12 @@ > #define PSCI_DISABLED -8 > > /* availability of PSCI on the host for SMP bringup */ > -extern bool_t psci_available; > +extern int psci_ver; > > 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 > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 2014-10-01 20:02 ` [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 suravee.suthikulpanit 2014-10-02 9:07 ` Stefano Stabellini @ 2014-10-02 10:51 ` Julien Grall 2014-10-02 14:19 ` Ian Campbell 2014-10-02 14:21 ` Ian Campbell 2 siblings, 1 reply; 14+ messages in thread From: Julien Grall @ 2014-10-02 10:51 UTC (permalink / raw) To: suravee.suthikulpanit, stefano.stabellini, ian.campbell; +Cc: xen-devel Hi Suravee, On 10/01/2014 09:02 PM, suravee.suthikulpanit@amd.com wrote: > +int __init psci_init_0_1(const struct dt_device_node *psci) > +{ > + int ret; > + > + ret = psci_is_smc_method(psci); > + if ( ret ) > + return -EINVAL; > + > if ( !dt_property_read_u32(psci, "cpu_on", &psci_cpu_on_nr) ) > { > printk("/psci node is missing the \"cpu_on\" property\n"); > return -ENOENT; > } > > - psci_available = 1; > + psci_ver = 1; > > printk(XENLOG_INFO "Using PSCI for SMP bringup\n"); I would modify this printk into "Using PSCI 0.1...". > > return 0; > } > > +int __init psci_init_0_2(const struct dt_device_node *psci) > +{ > + int ret; > + > + ret = psci_is_smc_method(psci); > + if ( ret ) > + return -EINVAL; > + > + psci_ver = __invoke_psci_fn_smc(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0); > + > + if ( psci_ver != 2 ) > + { > + printk("Error: The retrieved PSCI version (%#x) does not support.\n", psci_ver); NIT: s/does/is/ ? > + return -EOPNOTSUPP; > + } > + > + psci_cpu_on_nr = PSCI_0_2_FN_CPU_ON; > + > + printk(XENLOG_INFO "Using PSCI-0.2 for SMP bringup\n"); > + > + return 0; > +} > + > +int __init psci_init(void) > +{ > + const struct dt_device_node *psci; > + > + psci = dt_find_compatible_node(NULL, NULL, "arm,psci"); > + if ( psci ) > + return psci_init_0_1(psci); > + > + psci = dt_find_compatible_node(NULL, NULL, "arm,psci-0.2"); > + if ( psci ) > + return psci_init_0_2(psci); > + I think we need to prefer PSCI 0.2 if the platform supports the both version of PSCI. > + return -ENODEV; > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h > index 9777c03..ab37984 100644 > --- a/xen/include/asm-arm/psci.h > +++ b/xen/include/asm-arm/psci.h > @@ -13,10 +13,12 @@ > #define PSCI_DISABLED -8 > > /* availability of PSCI on the host for SMP bringup */ > -extern bool_t psci_available; > +extern int psci_ver; I would use unsigned int here, or even better an enum to describe the different version of PSCI. Regards, -- Julien Grall ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 2014-10-02 10:51 ` Julien Grall @ 2014-10-02 14:19 ` Ian Campbell 2014-10-02 20:17 ` Suravee Suthikulpanit 0 siblings, 1 reply; 14+ messages in thread From: Ian Campbell @ 2014-10-02 14:19 UTC (permalink / raw) To: Julien Grall; +Cc: xen-devel, suravee.suthikulpanit, stefano.stabellini On Thu, 2014-10-02 at 11:51 +0100, Julien Grall wrote: > > + if ( psci_ver != 2 ) > > + { > > + printk("Error: The retrieved PSCI version (%#x) does not support.\n", psci_ver); > > NIT: s/does/is/ ? along with "supported", yes. I'd probably simplify it to "PSCI version % #x is not supported". > > > + return -EOPNOTSUPP; > > + } > > + > > + psci_cpu_on_nr = PSCI_0_2_FN_CPU_ON; > > + > > + printk(XENLOG_INFO "Using PSCI-0.2 for SMP bringup\n"); > > + > > + return 0; > > +} > > + > > +int __init psci_init(void) > > +{ > > + const struct dt_device_node *psci; > > + > > + psci = dt_find_compatible_node(NULL, NULL, "arm,psci"); > > + if ( psci ) > > + return psci_init_0_1(psci); > > + > > + psci = dt_find_compatible_node(NULL, NULL, "arm,psci-0.2"); > > + if ( psci ) > > + return psci_init_0_2(psci); > > + > > I think we need to prefer PSCI 0.2 if the platform supports the both > version of PSCI. Yes, please. This may require also falling back to 0.1 if psci_init_0_2 fails? > > + return -ENODEV; > > +} > > + > > /* > > * Local variables: > > * mode: C > > diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h > > index 9777c03..ab37984 100644 > > --- a/xen/include/asm-arm/psci.h > > +++ b/xen/include/asm-arm/psci.h > > @@ -13,10 +13,12 @@ > > #define PSCI_DISABLED -8 > > > > /* availability of PSCI on the host for SMP bringup */ > > -extern bool_t psci_available; > > +extern int psci_ver; > > I would use unsigned int here, or even better an enum to describe the > different version of PSCI. unsigned, to match the psci spec, would be sufficient. The code should also use the existing XEN_PSCI_V_0_1 and XEN_PSCI_V_0_2 where appropriate. Ian. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 2014-10-02 14:19 ` Ian Campbell @ 2014-10-02 20:17 ` Suravee Suthikulpanit 0 siblings, 0 replies; 14+ messages in thread From: Suravee Suthikulpanit @ 2014-10-02 20:17 UTC (permalink / raw) To: Ian Campbell, Julien Grall; +Cc: xen-devel, stefano.stabellini On 10/02/2014 09:19 AM, Ian Campbell wrote: >>> +int __init psci_init(void) >>> > >+{ >>> > >+ const struct dt_device_node *psci; >>> > >+ >>> > >+ psci = dt_find_compatible_node(NULL, NULL, "arm,psci"); >>> > >+ if ( psci ) >>> > >+ return psci_init_0_1(psci); >>> > >+ >>> > >+ psci = dt_find_compatible_node(NULL, NULL, "arm,psci-0.2"); >>> > >+ if ( psci ) >>> > >+ return psci_init_0_2(psci); >>> > >+ >> > >> >I think we need to prefer PSCI 0.2 if the platform supports the both >> >version of PSCI. > Yes, please. > > This may require also falling back to 0.1 if psci_init_0_2 fails? > Good point. I just realized that DT could have: compatible = "arm,psci-0.2", "arm,psci" Suravee ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 2014-10-01 20:02 ` [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 suravee.suthikulpanit 2014-10-02 9:07 ` Stefano Stabellini 2014-10-02 10:51 ` Julien Grall @ 2014-10-02 14:21 ` Ian Campbell 2014-10-02 19:43 ` Suravee Suthikulpanit 2 siblings, 1 reply; 14+ messages in thread From: Ian Campbell @ 2014-10-02 14:21 UTC (permalink / raw) To: suravee.suthikulpanit; +Cc: julien.grall, xen-devel, stefano.stabellini On Wed, 2014-10-01 at 15:02 -0500, suravee.suthikulpanit@amd.com wrote: > -int __init psci_init(void) > +void call_psci_system_off(void) > +{ > + if ( psci_ver > 2 ) Doesn't this need to be >= to do anything on a 0.2 system? (Likewise in the fn below) > + __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); Should we print a message in the case that we aren't able to call the 0.2 handler? (again, likewise below) > +} Ian. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 2014-10-02 14:21 ` Ian Campbell @ 2014-10-02 19:43 ` Suravee Suthikulpanit 0 siblings, 0 replies; 14+ messages in thread From: Suravee Suthikulpanit @ 2014-10-02 19:43 UTC (permalink / raw) To: Ian Campbell; +Cc: julien.grall, xen-devel, stefano.stabellini On 10/02/2014 09:21 AM, Ian Campbell wrote: > On Wed, 2014-10-01 at 15:02 -0500, suravee.suthikulpanit@amd.com wrote: >> -int __init psci_init(void) >> +void call_psci_system_off(void) >> +{ >> + if ( psci_ver > 2 ) > > Doesn't this need to be >= to do anything on a 0.2 system? (Likewise in > the fn below) Ah yes. Thanks. > >> + __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); > > Should we print a message in the case that we aren't able to call the > 0.2 handler? (again, likewise below) > I feel that this will be too verbose for the PSCI-0.1 case since this function always get called in the arch/arm/shutdown.c Suravee ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default 2014-10-01 20:02 [PATCH 0/2] Introduce PSCI-0.2 supports suravee.suthikulpanit 2014-10-01 20:02 ` [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 suravee.suthikulpanit @ 2014-10-01 20:02 ` suravee.suthikulpanit 2014-10-02 9:04 ` Stefano Stabellini 2014-10-02 10:54 ` Julien Grall 1 sibling, 2 replies; 14+ messages in thread From: suravee.suthikulpanit @ 2014-10-01 20:02 UTC (permalink / raw) To: stefano.stabellini, julien.grall, ian.campbell Cc: Suravee Suthikulpanit, xen-devel From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> "machine_halt()" and "machine_restart()" are modified to use PSCI interface by default if PSCI-0.2 is supported. The "raw_machine_reset()" is also removed since this is unnecessary. For non-PSCI, platform_poweroff() and platform_reset() are used instead. Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> --- xen/arch/arm/shutdown.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/shutdown.c b/xen/arch/arm/shutdown.c index adc0529..2289ad1 100644 --- a/xen/arch/arm/shutdown.c +++ b/xen/arch/arm/shutdown.c @@ -5,11 +5,7 @@ #include <xen/lib.h> #include <xen/smp.h> #include <asm/platform.h> - -static void raw_machine_reset(void) -{ - platform_reset(); -} +#include <asm/psci.h> static void noreturn halt_this_cpu(void *arg) { @@ -18,10 +14,22 @@ 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); + + /* Not return if success */ + call_psci_system_off(); + + platform_poweroff(); halt_this_cpu(NULL); } @@ -39,9 +47,12 @@ void machine_restart(unsigned int delay_millisecs) while ( (num_online_cpus() > 1) && (timeout-- > 0) ) mdelay(1); + /* Not return if success */ + call_psci_system_reset(); + while ( 1 ) { - raw_machine_reset(); + platform_reset(); mdelay(100); } } -- 1.9.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default 2014-10-01 20:02 ` [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default suravee.suthikulpanit @ 2014-10-02 9:04 ` Stefano Stabellini 2014-10-02 10:54 ` Julien Grall 1 sibling, 0 replies; 14+ messages in thread From: Stefano Stabellini @ 2014-10-02 9:04 UTC (permalink / raw) To: Suravee Suthikulpanit Cc: julien.grall, xen-devel, ian.campbell, stefano.stabellini On Wed, 1 Oct 2014, suravee.suthikulpanit@amd.com wrote: > From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> > > "machine_halt()" and "machine_restart()" are modified to use PSCI interface > by default if PSCI-0.2 is supported. The "raw_machine_reset()" is also removed > since this is unnecessary. > > For non-PSCI, platform_poweroff() and platform_reset() are used instead. > > Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > xen/arch/arm/shutdown.c | 23 +++++++++++++++++------ > 1 file changed, 17 insertions(+), 6 deletions(-) > > diff --git a/xen/arch/arm/shutdown.c b/xen/arch/arm/shutdown.c > index adc0529..2289ad1 100644 > --- a/xen/arch/arm/shutdown.c > +++ b/xen/arch/arm/shutdown.c > @@ -5,11 +5,7 @@ > #include <xen/lib.h> > #include <xen/smp.h> > #include <asm/platform.h> > - > -static void raw_machine_reset(void) > -{ > - platform_reset(); > -} > +#include <asm/psci.h> > > static void noreturn halt_this_cpu(void *arg) > { > @@ -18,10 +14,22 @@ 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); > + > + /* Not return if success */ > + call_psci_system_off(); > + > + platform_poweroff(); > halt_this_cpu(NULL); > } > > @@ -39,9 +47,12 @@ void machine_restart(unsigned int delay_millisecs) > while ( (num_online_cpus() > 1) && (timeout-- > 0) ) > mdelay(1); > > + /* Not return if success */ > + call_psci_system_reset(); > + > while ( 1 ) > { > - raw_machine_reset(); > + platform_reset(); > mdelay(100); > } > } > -- > 1.9.3 > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default 2014-10-01 20:02 ` [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default suravee.suthikulpanit 2014-10-02 9:04 ` Stefano Stabellini @ 2014-10-02 10:54 ` Julien Grall 2014-10-02 19:51 ` Suravee Suthikulpanit 1 sibling, 1 reply; 14+ messages in thread From: Julien Grall @ 2014-10-02 10:54 UTC (permalink / raw) To: suravee.suthikulpanit, stefano.stabellini, ian.campbell; +Cc: xen-devel Hi Suravee, On 10/01/2014 09:02 PM, suravee.suthikulpanit@amd.com wrote: > 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); > + This doesn't look like PSCI specific. Can you explain in the commit message why you need to add this new block of code? Regards, -- Julien Grall ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default 2014-10-02 10:54 ` Julien Grall @ 2014-10-02 19:51 ` Suravee Suthikulpanit 2014-10-02 21:50 ` Julien Grall 0 siblings, 1 reply; 14+ messages in thread From: Suravee Suthikulpanit @ 2014-10-02 19:51 UTC (permalink / raw) To: Julien Grall, stefano.stabellini, ian.campbell; +Cc: xen-devel On 10/02/2014 05:54 AM, Julien Grall wrote: > Hi Suravee, > > On 10/01/2014 09:02 PM, suravee.suthikulpanit@amd.com wrote: >> 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); >> + > > This doesn't look like PSCI specific. Can you explain in the commit > message why you need to add this new block of code? > > Regards, > It's not PSCI specific. I was just trying to handle the graceful shutdown similar to the code flow in machine_restart. If you think it's not necessary, I can take this out. Suravee ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default 2014-10-02 19:51 ` Suravee Suthikulpanit @ 2014-10-02 21:50 ` Julien Grall 2014-10-03 0:00 ` Suravee Suthikulpanit 0 siblings, 1 reply; 14+ messages in thread From: Julien Grall @ 2014-10-02 21:50 UTC (permalink / raw) To: Suravee Suthikulpanit, stefano.stabellini, ian.campbell; +Cc: xen-devel On 02/10/2014 20:51, Suravee Suthikulpanit wrote: > > > On 10/02/2014 05:54 AM, Julien Grall wrote: >> Hi Suravee, >> >> On 10/01/2014 09:02 PM, suravee.suthikulpanit@amd.com wrote: >>> 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); >>> + >> >> This doesn't look like PSCI specific. Can you explain in the commit >> message why you need to add this new block of code? >> >> Regards, >> > > It's not PSCI specific. I was just trying to handle the graceful > shutdown similar to the code flow in machine_restart. If you think it's > not necessary, I can take this out. I'm fine with keeping this code in the patch. I was requesting to specify in the commit message that you are adding this code for... Regards, -- Julien Grall ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default 2014-10-02 21:50 ` Julien Grall @ 2014-10-03 0:00 ` Suravee Suthikulpanit 0 siblings, 0 replies; 14+ messages in thread From: Suravee Suthikulpanit @ 2014-10-03 0:00 UTC (permalink / raw) To: Julien Grall, stefano.stabellini, ian.campbell; +Cc: xen-devel On 10/02/2014 04:50 PM, Julien Grall wrote: > > > On 02/10/2014 20:51, Suravee Suthikulpanit wrote: >> >> >> On 10/02/2014 05:54 AM, Julien Grall wrote: >>> Hi Suravee, >>> >>> On 10/01/2014 09:02 PM, suravee.suthikulpanit@amd.com wrote: >>>> 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); >>>> + >>> >>> This doesn't look like PSCI specific. Can you explain in the commit >>> message why you need to add this new block of code? >>> >>> Regards, >>> >> >> It's not PSCI specific. I was just trying to handle the graceful >> shutdown similar to the code flow in machine_restart. If you think it's >> not necessary, I can take this out. > > I'm fine with keeping this code in the patch. I was requesting to > specify in the commit message that you are adding this code for... > > Regards, > > Ok, I'll resend w/ the update commit message. Thanks, Suravee ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2014-10-03 0:00 UTC | newest] Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-10-01 20:02 [PATCH 0/2] Introduce PSCI-0.2 supports suravee.suthikulpanit 2014-10-01 20:02 ` [PATCH 1/2] xen/arm: Initial support for PSCI-0.2 suravee.suthikulpanit 2014-10-02 9:07 ` Stefano Stabellini 2014-10-02 10:51 ` Julien Grall 2014-10-02 14:19 ` Ian Campbell 2014-10-02 20:17 ` Suravee Suthikulpanit 2014-10-02 14:21 ` Ian Campbell 2014-10-02 19:43 ` Suravee Suthikulpanit 2014-10-01 20:02 ` [PATCH 2/2] xen/arm: Use PSCI-0.2 for machine_halt/restart by default suravee.suthikulpanit 2014-10-02 9:04 ` Stefano Stabellini 2014-10-02 10:54 ` Julien Grall 2014-10-02 19:51 ` Suravee Suthikulpanit 2014-10-02 21:50 ` Julien Grall 2014-10-03 0:00 ` Suravee Suthikulpanit
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.