[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 08/17] xen/arm: psci: Detect SMCCC version
On Thu, 15 Feb 2018, Julien Grall wrote: > PSCI 1.0 and later allows the SMCCC version to be (indirectly) probed > via PSCI_FEATURES. If the PSCI_FEATURES does not exist (PSCI 0.2 or > earlier) and the function return an error, then we considered SMCCC 1.0 > is implemented. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > Changes in v2: > - Patch added > --- > xen/arch/arm/psci.c | 34 +++++++++++++++++++++++++++++++++- > xen/include/asm-arm/smccc.h | 2 ++ > 2 files changed, 35 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/psci.c b/xen/arch/arm/psci.c > index 5dda35cd7c..bc7b2260e8 100644 > --- a/xen/arch/arm/psci.c > +++ b/xen/arch/arm/psci.c > @@ -37,6 +37,7 @@ > #endif > > uint32_t psci_ver; > +uint32_t smccc_ver; > > static uint32_t psci_cpu_on_nr; > > @@ -57,6 +58,14 @@ void call_psci_system_reset(void) > call_smc(PSCI_0_2_FN32_SYSTEM_RESET, 0, 0, 0); > } > > +static int __init psci_features(uint32_t psci_func_id) > +{ > + if ( psci_ver < PSCI_VERSION(1, 0) ) > + return PSCI_NOT_SUPPORTED; > + > + return call_smc(PSCI_1_0_FN32_PSCI_FEATURES, psci_func_id, 0, 0); > +} > + > int __init psci_is_smc_method(const struct dt_device_node *psci) > { > int ret; > @@ -82,6 +91,24 @@ int __init psci_is_smc_method(const struct dt_device_node > *psci) > return 0; > } > > +static void __init psci_init_smccc(void) > +{ > + /* PSCI is using at least SMCC 1.0 calling convention. */ > + smccc_ver = ARM_SMCCC_VERSION_1_0; > + > + if ( psci_features(ARM_SMCCC_VERSION_FID) != PSCI_NOT_SUPPORTED ) > + { > + uint32_t ret; > + > + ret = call_smc(ARM_SMCCC_VERSION_FID, 0, 0, 0); > + if ( ret != ARM_SMCCC_NOT_SUPPORTED ) > + smccc_ver = ret; > + } > + > + printk(XENLOG_INFO "Using SMC Calling Convention v%u.%u\n", > + SMCCC_VERSION_MAJOR(smccc_ver), SMCCC_VERSION_MINOR(smccc_ver)); > +} > + > int __init psci_init_0_1(void) > { > int ret; > @@ -173,7 +200,12 @@ int __init psci_init(void) > if ( ret ) > ret = psci_init_0_1(); > > - return ret; > + if ( ret ) > + return ret; > + > + psci_init_smccc(); > + > + return 0; > } > > /* > diff --git a/xen/include/asm-arm/smccc.h b/xen/include/asm-arm/smccc.h > index d0240d64bf..bc067892c7 100644 > --- a/xen/include/asm-arm/smccc.h > +++ b/xen/include/asm-arm/smccc.h > @@ -52,6 +52,8 @@ > > #ifndef __ASSEMBLY__ > > +extern uint32_t smccc_ver; > + > /* Check if this is fast call. */ > static inline bool smccc_is_fast_call(register_t funcid) > { > -- > 2.11.0 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |