Commit e8419c24 authored by Cristian Marussi's avatar Cristian Marussi Committed by Sudeep Holla
Browse files

firmware: arm_scmi: Make SCMI transports configurable

Add configuration options to be able to select which SCMI transports have
to be compiled into the SCMI stack.

Mailbox and SMC are by default enabled if their related dependencies are
satisfied.

While doing that move all SCMI related config options in their own
dedicated submenu.

Link: https://lore.kernel.org/r/20210803131024.40280-9-cristian.marussi@arm.com


Signed-off-by: default avatarCristian Marussi <cristian.marussi@arm.com>
Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
parent 2930abcf
Loading
Loading
Loading
Loading
+1 −33
Original line number Diff line number Diff line
@@ -6,39 +6,7 @@

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"
+70 −0
Original line number Diff line number Diff line
# 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
+2 −2
Original line number Diff line number Diff line
@@ -2,8 +2,8 @@
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)
+3 −1
Original line number Diff line number Diff line
@@ -403,8 +403,10 @@ struct scmi_desc {
	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

+4 −2
Original line number Diff line number Diff line
@@ -1933,10 +1933,10 @@ ATTRIBUTE_GROUPS(versions);

/* 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 */ },
@@ -2008,6 +2008,8 @@ static int __init scmi_driver_init(void)

	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)