Messages in this thread | | | Subject | Re: [PATCH v6 08/10] arm/arm64: Provide a wrapper for SMCCC 1.1 calls | Date | Mon, 21 Oct 2019 12:42:57 +0100 | From | Marc Zyngier <> |
| |
On 2019-10-11 13:59, Steven Price wrote: > SMCCC 1.1 calls may use either HVC or SMC depending on the PSCI > conduit. Rather than coding this in every call site provide a macro > which uses the correct instruction. The macro also handles the case > where no PSCI conduit is configured returning a not supported error > in res, along with returning the conduit used for the call. > > This allow us to remove some duplicated code and will be useful later > when adding paravirtualized time hypervisor calls. > > Signed-off-by: Steven Price <steven.price@arm.com> > Acked-by: Will Deacon <will@kernel.org> > --- > include/linux/arm-smccc.h | 44 > +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 44 insertions(+) > > diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h > index 5daf0e2adf47..fd84a9bfb455 100644 > --- a/include/linux/arm-smccc.h > +++ b/include/linux/arm-smccc.h > @@ -303,6 +303,50 @@ asmlinkage void __arm_smccc_hvc(unsigned long > a0, unsigned long a1, > #define SMCCC_RET_NOT_SUPPORTED -1 > #define SMCCC_RET_NOT_REQUIRED -2 > > +/* Like arm_smccc_1_1* but always returns SMCCC_RET_NOT_SUPPORTED. > + * Used when the PSCI conduit is not defined. The empty asm > statement > + * avoids compiler warnings about unused variables.
nit: comment style.
> + */ > +#define __fail_smccc_1_1(...) \ > + do { \ > + __declare_args(__count_args(__VA_ARGS__), __VA_ARGS__); \ > + asm ("" __constraints(__count_args(__VA_ARGS__))); \ > + if (___res) \ > + ___res->a0 = SMCCC_RET_NOT_SUPPORTED; \ > + } while (0) > + > +/* > + * arm_smccc_1_1_invoke() - make an SMCCC v1.1 compliant call > + * > + * This is a variadic macro taking one to eight source arguments, > and > + * an optional return structure. > + * > + * @a0-a7: arguments passed in registers 0 to 7 > + * @res: result values from registers 0 to 3 > + * > + * This macro will make either an HVC call or an SMC call depending > on the > + * current PSCI conduit. If no valid conduit is available then -1 > + * (SMCCC_RET_NOT_SUPPORTED) is returned in @res.a0 (if supplied). > + * > + * The return value also provides the conduit that was used. > + */ > +#define arm_smccc_1_1_invoke(...) ({ \ > + int method = psci_ops.conduit; \ > + switch (method) { \ > + case PSCI_CONDUIT_HVC: \ > + arm_smccc_1_1_hvc(__VA_ARGS__); \ > + break; \ > + case PSCI_CONDUIT_SMC: \ > + arm_smccc_1_1_smc(__VA_ARGS__); \ > + break; \ > + default: \ > + __fail_smccc_1_1(__VA_ARGS__); \ > + method = PSCI_CONDUIT_NONE; \ > + break; \ > + } \ > + method; \ > + }) > + > /* Paravirtualised time calls (defined by ARM DEN0057A) */ > #define ARM_SMCCC_HV_PV_TIME_FEATURES \ > ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
All this should most probably go on top of the SMCCC conduit cleanup that has already been already queued in the arm64 tree (see arm64/for-next/smccc-conduit-cleanup).
Thanks,
M. -- Jazz is not dead. It just smells funny...
| |