From mboxrd@z Thu Jan 1 00:00:00 1970 From: robin.murphy@arm.com (Robin Murphy) Date: Fri, 4 May 2018 18:54:14 +0100 Subject: [PATCH 1/4] arm/arm64: smccc/psci: add arm_smccc_get_conduit() In-Reply-To: <20180503170330.5591-2-mark.rutland@arm.com> References: <20180503170330.5591-1-mark.rutland@arm.com> <20180503170330.5591-2-mark.rutland@arm.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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 > Cc: Lorenzo Pieralisi > Cc: Will Deacon > Cc: Catalin Marinas > --- > 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 > #include > + > +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 >