[PATCH 1/4] arm/arm64: smccc/psci: add arm_smccc_get_conduit()
Robin Murphy
robin.murphy at arm.com
Fri May 4 10:54:14 PDT 2018
Hi Mark,
On 03/05/18 18:03, Mark Rutland wrote:
> SMCCC callers are currently amassing a collection of enums for the SMCCC
> conduit, and are having to dig into the PSCI driver's internals in order
> to figure out what to do.
>
> Let's clean this up, with common SMCCC_CONDUIT_* definitions, and an
> arm_smccc_get_conduit() helper that abstracts the PSCI driver's internal
> state.
>
> We can kill off the PSCI_CONDUIT_* definitions once we've migrated users
> over to the nerw interface.
new
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
> Cc: Will Deacon <will.deacon at arm.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> ---
> drivers/firmware/psci.c | 15 +++++++++++++++
> include/linux/arm-smccc.h | 16 ++++++++++++++++
> 2 files changed, 31 insertions(+)
>
> diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c
> index c80ec1d03274..310882185ca4 100644
> --- a/drivers/firmware/psci.c
> +++ b/drivers/firmware/psci.c
> @@ -64,6 +64,21 @@ struct psci_operations psci_ops = {
> .smccc_version = SMCCC_VERSION_1_0,
> };
>
> +enum arm_smccc_conduit arm_smccc_get_conduit(void)
> +{
> + if (psci_ops.smccc_version < SMCCC_VERSION_1_1)
> + return SMCCC_CONDUIT_NONE;
> +
> + switch (psci_ops.conduit) {
> + case PSCI_CONDUIT_SMC:
> + return SMCCC_CONDUIT_SMC;
> + case PSCI_CONDUIT_HVC:
> + return SMCCC_CONDUIT_HVC;
> + default:
> + return SMCCC_CONDUIT_NONE;
> + }
> +}
> +
> typedef unsigned long (psci_fn)(unsigned long, unsigned long,
> unsigned long, unsigned long);
> static psci_fn *invoke_psci_fn;
> diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
> index a031897fca76..193e9d8a1ac2 100644
> --- a/include/linux/arm-smccc.h
> +++ b/include/linux/arm-smccc.h
> @@ -84,6 +84,22 @@
>
> #include <linux/linkage.h>
> #include <linux/types.h>
> +
> +enum arm_smccc_conduit {
> + SMCCC_CONDUIT_NONE,
> + SMCCC_CONDUIT_SMC,
> + SMCCC_CONDUIT_HVC,
> +};
> +
> +/**
> + * arm_smccc_get_conduit()
> + *
> + * Returns the conduit to be used for SMCCCv1.1 or later.
> + *
> + * When SMCCCv1.1 is not present, returns SMCCC_CONDUIT_NONE.
> + */
> +enum arm_smccc_conduit arm_smccc_get_conduit(void);
Given that implicit condition, can we save some confusion by naming this
arm_smccc_1_1_conduit(), in line with the actual SMCCCv1.1 calls?
Robin.
> +
> /**
> * struct arm_smccc_res - Result from SMC/HVC call
> * @a0-a3 result values from registers 0 to 3
>
More information about the linux-arm-kernel
mailing list