]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firmware: arm_scmi: Make SMC transport a standalone driver
authorCristian Marussi <cristian.marussi@arm.com>
Mon, 12 Aug 2024 17:33:37 +0000 (18:33 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Fri, 16 Aug 2024 09:26:06 +0000 (10:26 +0100)
Make SCMI SMC transport a standalone driver that can be optionally
loaded as a module.

CC: Peng Fan <peng.fan@nxp.com>
CC: Nikunj Kela <quic_nkela@quicinc.com>
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Message-Id: <20240812173340.3912830-7-cristian.marussi@arm.com>
[sudeep.holla: moved Clang Thumb2 build fix to the new makefile]
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/Kconfig
drivers/firmware/arm_scmi/Makefile
drivers/firmware/arm_scmi/common.h
drivers/firmware/arm_scmi/driver.c
drivers/firmware/arm_scmi/transports/Kconfig
drivers/firmware/arm_scmi/transports/Makefile
drivers/firmware/arm_scmi/transports/smc.c [moved from drivers/firmware/arm_scmi/smc.c with 89% similarity]

index e9a7c9aaa9568735be9ad4f29aa8d4b1e216e922..27de15ad6444f28633285ad878a0f893f22d8e75 100644 (file)
@@ -84,32 +84,6 @@ config ARM_SCMI_TRANSPORT_OPTEE
          If you want the ARM SCMI PROTOCOL stack to include support for a
          transport based on OP-TEE SCMI service, answer Y.
 
-config ARM_SCMI_TRANSPORT_SMC
-       bool "SCMI transport based on SMC"
-       depends on HAVE_ARM_SMCCC_DISCOVERY
-       select ARM_SCMI_HAVE_TRANSPORT
-       select ARM_SCMI_HAVE_SHMEM
-       default y
-       help
-         Enable SMC based transport for SCMI.
-
-         If you want the ARM SCMI PROTOCOL stack to include support for a
-         transport based on SMC, answer Y.
-
-config ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE
-       bool "Enable atomic mode support for SCMI SMC transport"
-       depends on ARM_SCMI_TRANSPORT_SMC
-       help
-         Enable support of atomic operation for SCMI SMC based transport.
-
-         If you want the SCMI SMC based transport to operate in atomic
-         mode, avoiding any kind of sleeping behaviour for selected
-         transactions on the TX path, answer Y.
-         Enabling atomic mode operations allows any SCMI driver using this
-         transport to optionally ask for atomic SCMI transactions and operate
-         in atomic context too, at the price of using a number of busy-waiting
-         primitives all over instead. If unsure say N.
-
 config ARM_SCMI_TRANSPORT_VIRTIO
        bool "SCMI transport based on VirtIO"
        depends on VIRTIO=y || VIRTIO=ARM_SCMI_PROTOCOL
index beaa55c146b87b124736800fb94e3c03446fb113..4c58c668ecc4c63afa1a2929f4a6e6104502a89a 100644 (file)
@@ -5,7 +5,6 @@ scmi-core-objs := $(scmi-bus-y)
 scmi-driver-y = driver.o notify.o
 scmi-driver-$(CONFIG_ARM_SCMI_RAW_MODE_SUPPORT) += raw_mode.o
 scmi-transport-$(CONFIG_ARM_SCMI_HAVE_SHMEM) = shmem.o
-scmi-transport-$(CONFIG_ARM_SCMI_TRANSPORT_SMC) += smc.o
 scmi-transport-$(CONFIG_ARM_SCMI_HAVE_MSG) += msg.o
 scmi-transport-$(CONFIG_ARM_SCMI_TRANSPORT_VIRTIO) += virtio.o
 scmi-transport-$(CONFIG_ARM_SCMI_TRANSPORT_OPTEE) += optee.o
@@ -19,10 +18,3 @@ obj-$(CONFIG_ARM_SCMI_PROTOCOL) += scmi-core.o
 obj-$(CONFIG_ARM_SCMI_PROTOCOL) += scmi-module.o
 
 obj-$(CONFIG_ARM_SCMI_POWER_CONTROL) += scmi_power_control.o
-
-ifeq ($(CONFIG_THUMB2_KERNEL)$(CONFIG_CC_IS_CLANG),yy)
-# The use of R7 in the SMCCC conflicts with the compiler's use of R7 as a frame
-# pointer in Thumb2 mode, which is forcibly enabled by Clang when profiling
-# hooks are inserted via the -pg switch.
-CFLAGS_REMOVE_smc.o += $(CC_FLAGS_FTRACE)
-endif
index 2bca62a8ecde2448eaffd74ca246bd8b39395734..231b061dadb9ba793b00bca2ffae7cbd7353572b 100644 (file)
@@ -286,9 +286,6 @@ int scmi_xfer_raw_inflight_register(const struct scmi_handle *handle,
 int scmi_xfer_raw_wait_for_message_response(struct scmi_chan_info *cinfo,
                                            struct scmi_xfer *xfer,
                                            unsigned int timeout_ms);
-#ifdef CONFIG_ARM_SCMI_TRANSPORT_SMC
-extern const struct scmi_desc scmi_smc_desc;
-#endif
 #ifdef CONFIG_ARM_SCMI_TRANSPORT_VIRTIO
 extern const struct scmi_desc scmi_virtio_desc;
 #endif
index c13bef8a1796a31bcb18a636a72ddb6dc93dffdc..bdb952c385d217ccab8df3c00c535ba06ddb015e 100644 (file)
@@ -3321,11 +3321,6 @@ static const struct of_device_id scmi_of_match[] = {
 #ifdef CONFIG_ARM_SCMI_TRANSPORT_OPTEE
        { .compatible = "linaro,scmi-optee", .data = &scmi_optee_desc },
 #endif
-#ifdef CONFIG_ARM_SCMI_TRANSPORT_SMC
-       { .compatible = "arm,scmi-smc", .data = &scmi_smc_desc},
-       { .compatible = "arm,scmi-smc-param", .data = &scmi_smc_desc},
-       { .compatible = "qcom,scmi-smc", .data = &scmi_smc_desc},
-#endif
 #ifdef CONFIG_ARM_SCMI_TRANSPORT_VIRTIO
        { .compatible = "arm,scmi-virtio", .data = &scmi_virtio_desc},
 #endif
index 96c0d76b30426bb3a1aab1cb7d45036b439113ab..85d693811a1cbaf95f1748f5372d949d89f88726 100644 (file)
@@ -34,4 +34,32 @@ config ARM_SCMI_TRANSPORT_MAILBOX
          This driver can also be built as a module. If so, the module
          will be called scmi_transport_mailbox.
 
+config ARM_SCMI_TRANSPORT_SMC
+       tristate "SCMI transport based on SMC"
+       depends on HAVE_ARM_SMCCC_DISCOVERY
+       select ARM_SCMI_HAVE_TRANSPORT
+       select ARM_SCMI_HAVE_SHMEM
+       default y
+       help
+         Enable SMC based transport for SCMI.
+
+         If you want the ARM SCMI PROTOCOL stack to include support for a
+         transport based on SMC, answer Y.
+         This driver can also be built as a module. If so, the module
+         will be called scmi_transport_smc.
+
+config ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE
+       bool "Enable atomic mode support for SCMI SMC transport"
+       depends on ARM_SCMI_TRANSPORT_SMC
+       help
+         Enable support of atomic operation for SCMI SMC based transport.
+
+         If you want the SCMI SMC based transport to operate in atomic
+         mode, avoiding any kind of sleeping behaviour for selected
+         transactions on the TX path, answer Y.
+         Enabling atomic mode operations allows any SCMI driver using this
+         transport to optionally ask for atomic SCMI transactions and operate
+         in atomic context too, at the price of using a number of busy-waiting
+         primitives all over instead. If unsure say N.
+
 endmenu
index cb40be8955be5981ef155cc9f0f45d05aa0f6b6e..080bd76d9dbda44228f0d386c5409921b1a5b824 100644 (file)
@@ -1,4 +1,12 @@
 # SPDX-License-Identifier: GPL-2.0-only
 scmi_transport_mailbox-objs := mailbox.o
 obj-$(CONFIG_ARM_SCMI_TRANSPORT_MAILBOX) += scmi_transport_mailbox.o
+scmi_transport_smc-objs := smc.o
+obj-$(CONFIG_ARM_SCMI_TRANSPORT_SMC) += scmi_transport_smc.o
 
+ifeq ($(CONFIG_THUMB2_KERNEL)$(CONFIG_CC_IS_CLANG),yy)
+# The use of R7 in the SMCCC conflicts with the compiler's use of R7 as a frame
+# pointer in Thumb2 mode, which is forcibly enabled by Clang when profiling
+# hooks are inserted via the -pg switch.
+CFLAGS_REMOVE_smc.o += $(CC_FLAGS_FTRACE)
+endif
similarity index 89%
rename from drivers/firmware/arm_scmi/smc.c
rename to drivers/firmware/arm_scmi/transports/smc.c
index 4cb86386c4909b8e092a053d832581008b6562f7..6fc3e1973c58b850096228c7705bed3027828cb8 100644 (file)
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/limits.h>
+#include <linux/platform_device.h>
 #include <linux/processor.h>
 #include <linux/slab.h>
 
-#include "common.h"
+#include "../common.h"
 
 /*
  * The shmem address is split into 4K page and offset.
@@ -69,12 +70,14 @@ struct scmi_smc {
        unsigned long cap_id;
 };
 
+static struct scmi_transport_core_operations *core;
+
 static irqreturn_t smc_msg_done_isr(int irq, void *data)
 {
        struct scmi_smc *scmi_info = data;
 
-       scmi_rx_callback(scmi_info->cinfo,
-                        scmi_shmem_ops.read_header(scmi_info->shmem), NULL);
+       core->rx_callback(scmi_info->cinfo,
+                         core->shmem->read_header(scmi_info->shmem), NULL);
 
        return IRQ_HANDLED;
 }
@@ -141,7 +144,7 @@ static int smc_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
        if (!scmi_info)
                return -ENOMEM;
 
-       scmi_info->shmem = scmi_shmem_ops.setup_iomap(cinfo, dev, tx, &res);
+       scmi_info->shmem = core->shmem->setup_iomap(cinfo, dev, tx, &res);
        if (IS_ERR(scmi_info->shmem))
                return PTR_ERR(scmi_info->shmem);
 
@@ -226,7 +229,7 @@ static int smc_send_message(struct scmi_chan_info *cinfo,
         */
        smc_channel_lock_acquire(scmi_info, xfer);
 
-       scmi_shmem_ops.tx_prepare(scmi_info->shmem, xfer, cinfo);
+       core->shmem->tx_prepare(scmi_info->shmem, xfer, cinfo);
 
        if (scmi_info->cap_id != ULONG_MAX)
                arm_smccc_1_1_invoke(scmi_info->func_id, scmi_info->cap_id, 0,
@@ -250,7 +253,7 @@ static void smc_fetch_response(struct scmi_chan_info *cinfo,
 {
        struct scmi_smc *scmi_info = cinfo->transport_info;
 
-       scmi_shmem_ops.fetch_response(scmi_info->shmem, xfer);
+       core->shmem->fetch_response(scmi_info->shmem, xfer);
 }
 
 static void smc_mark_txdone(struct scmi_chan_info *cinfo, int ret,
@@ -270,7 +273,7 @@ static const struct scmi_transport_ops scmi_smc_ops = {
        .fetch_response = smc_fetch_response,
 };
 
-const struct scmi_desc scmi_smc_desc = {
+static const struct scmi_desc scmi_smc_desc = {
        .ops = &scmi_smc_ops,
        .max_rx_timeout_ms = 30,
        .max_msg = 20,
@@ -286,3 +289,19 @@ const struct scmi_desc scmi_smc_desc = {
        .sync_cmds_completed_on_ret = true,
        .atomic_enabled = IS_ENABLED(CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE),
 };
+
+static const struct of_device_id scmi_of_match[] = {
+       { .compatible = "arm,scmi-smc" },
+       { .compatible = "arm,scmi-smc-param" },
+       { .compatible = "qcom,scmi-smc" },
+       { /* Sentinel */ },
+};
+
+DEFINE_SCMI_TRANSPORT_DRIVER(scmi_smc, scmi_smc_driver, scmi_smc_desc,
+                            scmi_of_match, core);
+module_platform_driver(scmi_smc_driver);
+
+MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
+MODULE_AUTHOR("Nikunj Kela <quic_nkela@quicinc.com>");
+MODULE_DESCRIPTION("SCMI SMC Transport driver");
+MODULE_LICENSE("GPL");