]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
arm/arm64: smccc/psci: add arm_smccc_1_1_get_conduit()
authorMark Rutland <mark.rutland@arm.com>
Fri, 9 Aug 2019 13:22:40 +0000 (14:22 +0100)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 20 May 2022 13:17:35 +0000 (15:17 +0200)
BugLink: https://bugs.launchpad.net/bugs/1969242
commit 6b7fe77c334ae59fed9500140e08f4f896b36871 upstream.

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_1_1_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 new interface.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/firmware/psci/psci.c
include/linux/arm-smccc.h

index 84f4ff351c6290309db7afdada06fb470f3ffb82..eb797081d159647e06899cb0dbe9c340f6a142f8 100644 (file)
@@ -57,6 +57,21 @@ struct psci_operations psci_ops = {
        .smccc_version = SMCCC_VERSION_1_0,
 };
 
+enum arm_smccc_conduit arm_smccc_1_1_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;
index 6dd50ca39d8b5851fda18b02d48e68ba27339da1..3e6ef64e74d3ddaa9c6de0515cec8b832401c8e5 100644 (file)
 
 #include <linux/linkage.h>
 #include <linux/types.h>
+
+enum arm_smccc_conduit {
+       SMCCC_CONDUIT_NONE,
+       SMCCC_CONDUIT_SMC,
+       SMCCC_CONDUIT_HVC,
+};
+
+/**
+ * arm_smccc_1_1_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_1_1_get_conduit(void);
+
 /**
  * struct arm_smccc_res - Result from SMC/HVC call
  * @a0-a3 result values from registers 0 to 3