[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] xen/arm: Initial support for PSCI-0.2
On Wed, 1 Oct 2014, suravee.suthikulpanit@xxxxxxx wrote: > From: Suravee Suthikulpanit <Suravee.Suthikulpanit@xxxxxxx> > > 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@xxxxxxx> 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@xxxxxxxxxxxxx> > 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 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |