Message ID | 20191011125930.40834-9-steven.price@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: Stolen time support | expand |
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.
On 21/10/2019 12:42, Marc Zyngier wrote: > On 2019-10-11 13:59, Steven Price wrote: [...] > 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). Good point, I'll rebase. Are you happy for the entire series to be based on top of that? i.e. based on commit e6ea46511b1a ("firmware: arm_sdei: use common SMCCC_CONDUIT_*") Thanks, Steve
On 2019-10-21 14:43, Steven Price wrote: > On 21/10/2019 12:42, Marc Zyngier wrote: >> On 2019-10-11 13:59, Steven Price wrote: > [...] >> 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). > > Good point, I'll rebase. Are you happy for the entire series to be > based > on top of that? i.e. based on commit e6ea46511b1a ("firmware: > arm_sdei: > use common SMCCC_CONDUIT_*") Absolutely. I'll sync with Will and Catalin to get a stable branch that includes these commits. Thanks, M.
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. + */ +#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, \