# 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_NEED_DEBUGFS
	bool
	help
	  This declares whether at least one SCMI facility is configured
	  which needs debugfs support. When selected causess the creation
	  of a common SCMI debugfs root directory.

config ARM_SCMI_RAW_MODE_SUPPORT
	bool "Enable support for SCMI Raw transmission mode"
	depends on DEBUG_FS
	select ARM_SCMI_NEED_DEBUGFS
	help
	  Enable support for SCMI Raw transmission mode.

	  If enabled allows the direct injection and snooping of SCMI bare
	  messages through a dedicated debugfs interface.
	  It is meant to be used by SCMI compliance/testing suites.

	  When enabled regular SCMI drivers interactions are inhibited in
	  order to avoid unexpected interactions with the SCMI Raw message
	  flow. If unsure say N.

config ARM_SCMI_RAW_MODE_SUPPORT_COEX
	bool "Allow SCMI Raw mode coexistence with normal SCMI stack"
	depends on ARM_SCMI_RAW_MODE_SUPPORT
	help
	  Allow SCMI Raw transmission mode to coexist with normal SCMI stack.

	  This will allow regular SCMI drivers to register with the core and
	  operate normally, thing which could make an SCMI test suite using the
	  SCMI Raw mode support unreliable. If unsure, say N.

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_HAVE_SHMEM
	bool
	help
	  This declares whether a shared memory based transport for SCMI is
	  available.

config ARM_SCMI_HAVE_MSG
	bool
	help
	  This declares whether a message passing based transport for SCMI is
	  available.

config ARM_SCMI_TRANSPORT_MAILBOX
	bool "SCMI transport based on Mailbox"
	depends on MAILBOX
	select ARM_SCMI_HAVE_TRANSPORT
	select ARM_SCMI_HAVE_SHMEM
	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_OPTEE
	bool "SCMI transport based on OP-TEE service"
	depends on OPTEE=y || OPTEE=ARM_SCMI_PROTOCOL
	select ARM_SCMI_HAVE_TRANSPORT
	select ARM_SCMI_HAVE_SHMEM
	select ARM_SCMI_HAVE_MSG
	default y
	help
	  This enables the OP-TEE service based transport for SCMI.

	  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
	select ARM_SCMI_HAVE_TRANSPORT
	select ARM_SCMI_HAVE_MSG
	help
	  This enables the virtio based transport for SCMI.

	  If you want the ARM SCMI PROTOCOL stack to include support for a
	  transport based on VirtIO, answer Y.

config ARM_SCMI_TRANSPORT_VIRTIO_VERSION1_COMPLIANCE
	bool "SCMI VirtIO transport Version 1 compliance"
	depends on ARM_SCMI_TRANSPORT_VIRTIO
	default y
	help
	  This enforces strict compliance with VirtIO Version 1 specification.

	  If you want the ARM SCMI VirtIO transport layer to refuse to work
	  with Legacy VirtIO backends and instead support only VirtIO Version 1
	  devices (or above), answer Y.

	  If you want instead to support also old Legacy VirtIO backends (like
	  the ones implemented by kvmtool) and let the core Kernel VirtIO layer
	  take care of the needed conversions, say N.

config ARM_SCMI_TRANSPORT_VIRTIO_ATOMIC_ENABLE
	bool "Enable atomic mode for SCMI VirtIO transport"
	depends on ARM_SCMI_TRANSPORT_VIRTIO
	help
	  Enable support of atomic operation for SCMI VirtIO based transport.

	  If you want the SCMI VirtIO 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.

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.

config ARM_SCMI_POWER_CONTROL
	tristate "SCMI system power control driver"
	depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF)
	help
	  This enables System Power control logic which binds system shutdown or
	  reboot actions to SCMI System Power notifications generated by SCP
	  firmware.

	  This driver can also be built as a module.  If so, the module will be
	  called scmi_power_control. Note this may needed early in boot to catch
	  early shutdown/reboot SCMI requests.

endmenu
