menu "Firmware Drivers"
 
-config ARM_SCMI_PROTOCOL
-       tristate "ARM System Control and Management Interface (SCMI) Message Protocol"
-       depends on ARM || ARM64 || COMPILE_TEST
-       depends on MAILBOX || HAVE_ARM_SMCCC_DISCOVERY
-       help
-         ARM System Control and Management Interface (SCMI) protocol is a
-         set of operating system-independent software interfaces that are
-         used in system management. SCMI is extensible and currently provides
-         interfaces for: Discovery and self-description of the interfaces
-         it supports, Power domain management which is the ability to place
-         a given device or domain into the various power-saving states that
-         it supports, Performance management which is the ability to control
-         the performance of a domain that is composed of compute engines
-         such as application processors and other accelerators, Clock
-         management which is the ability to set and inquire rates on platform
-         managed clocks and Sensor management which is the ability to read
-         sensor data, and be notified of sensor value.
-
-         This protocol library provides interface for all the client drivers
-         making use of the features offered by the SCMI.
-
-config ARM_SCMI_POWER_DOMAIN
-       tristate "SCMI power domain driver"
-       depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF)
-       default y
-       select PM_GENERIC_DOMAINS if PM
-       help
-         This enables support for the SCMI power domains which can be
-         enabled or disabled via the SCP firmware
-
-         This driver can also be built as a module.  If so, the module
-         will be called scmi_pm_domain. Note this may needed early in boot
-         before rootfs may be available.
+source "drivers/firmware/arm_scmi/Kconfig"
 
 config ARM_SCPI_PROTOCOL
        tristate "ARM System Control and Power Interface (SCPI) Message Protocol"
 
--- /dev/null
+# SPDX-License-Identifier: GPL-2.0-only
+menu "ARM System Control and Management Interface Protocol"
+
+config ARM_SCMI_PROTOCOL
+       tristate "ARM System Control and Management Interface (SCMI) Message Protocol"
+       depends on ARM || ARM64 || COMPILE_TEST
+       help
+         ARM System Control and Management Interface (SCMI) protocol is a
+         set of operating system-independent software interfaces that are
+         used in system management. SCMI is extensible and currently provides
+         interfaces for: Discovery and self-description of the interfaces
+         it supports, Power domain management which is the ability to place
+         a given device or domain into the various power-saving states that
+         it supports, Performance management which is the ability to control
+         the performance of a domain that is composed of compute engines
+         such as application processors and other accelerators, Clock
+         management which is the ability to set and inquire rates on platform
+         managed clocks and Sensor management which is the ability to read
+         sensor data, and be notified of sensor value.
+
+         This protocol library provides interface for all the client drivers
+         making use of the features offered by the SCMI.
+
+if ARM_SCMI_PROTOCOL
+
+config ARM_SCMI_HAVE_TRANSPORT
+       bool
+       help
+         This declares whether at least one SCMI transport has been configured.
+         Used to trigger a build bug when trying to build SCMI without any
+         configured transport.
+
+config ARM_SCMI_TRANSPORT_MAILBOX
+       bool "SCMI transport based on Mailbox"
+       depends on MAILBOX
+       select ARM_SCMI_HAVE_TRANSPORT
+       default y
+       help
+         Enable mailbox based transport for SCMI.
+
+         If you want the ARM SCMI PROTOCOL stack to include support for a
+         transport based on mailboxes, answer Y.
+
+config ARM_SCMI_TRANSPORT_SMC
+       bool "SCMI transport based on SMC"
+       depends on HAVE_ARM_SMCCC_DISCOVERY
+       select ARM_SCMI_HAVE_TRANSPORT
+       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.
+
+endif #ARM_SCMI_PROTOCOL
+
+config ARM_SCMI_POWER_DOMAIN
+       tristate "SCMI power domain driver"
+       depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF)
+       default y
+       select PM_GENERIC_DOMAINS if PM
+       help
+         This enables support for the SCMI power domains which can be
+         enabled or disabled via the SCP firmware
+
+         This driver can also be built as a module.  If so, the module
+         will be called scmi_pm_domain. Note this may needed early in boot
+         before rootfs may be available.
+
+endmenu
 
 scmi-bus-y = bus.o
 scmi-driver-y = driver.o notify.o
 scmi-transport-y = shmem.o
-scmi-transport-$(CONFIG_MAILBOX) += mailbox.o
-scmi-transport-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) += smc.o
+scmi-transport-$(CONFIG_ARM_SCMI_TRANSPORT_MAILBOX) += mailbox.o
+scmi-transport-$(CONFIG_ARM_SCMI_TRANSPORT_SMC) += smc.o
 scmi-protocols-y = base.o clock.o perf.o power.o reset.o sensors.o system.o voltage.o
 scmi-module-objs := $(scmi-bus-y) $(scmi-driver-y) $(scmi-protocols-y) \
                    $(scmi-transport-y)
 
        int max_msg_size;
 };
 
+#ifdef CONFIG_ARM_SCMI_TRANSPORT_MAILBOX
 extern const struct scmi_desc scmi_mailbox_desc;
-#ifdef CONFIG_HAVE_ARM_SMCCC_DISCOVERY
+#endif
+#ifdef CONFIG_ARM_SCMI_TRANSPORT_SMC
 extern const struct scmi_desc scmi_smc_desc;
 #endif
 
 
 
 /* Each compatible listed below must have descriptor associated with it */
 static const struct of_device_id scmi_of_match[] = {
-#ifdef CONFIG_MAILBOX
+#ifdef CONFIG_ARM_SCMI_TRANSPORT_MAILBOX
        { .compatible = "arm,scmi", .data = &scmi_mailbox_desc },
 #endif
-#ifdef CONFIG_HAVE_ARM_SMCCC_DISCOVERY
+#ifdef CONFIG_ARM_SCMI_TRANSPORT_SMC
        { .compatible = "arm,scmi-smc", .data = &scmi_smc_desc},
 #endif
        { /* Sentinel */ },
 
        scmi_bus_init();
 
+       BUILD_BUG_ON(!IS_ENABLED(CONFIG_ARM_SCMI_HAVE_TRANSPORT));
+
        /* Initialize any compiled-in transport which provided an init/exit */
        ret = scmi_transports_init();
        if (ret)