# SPDX-License-Identifier: GPL-2.0-only
menu "Remoteproc drivers"

config REMOTEPROC
	bool "Support for Remote Processor subsystem"
	depends on HAS_DMA
	select CRC32
	select FW_LOADER
	select VIRTIO
	select WANT_DEV_COREDUMP
	help
	  Support for remote processors (such as DSP coprocessors). These
	  are mainly used on embedded systems.

if REMOTEPROC

config IMX_REMOTEPROC
	tristate "IMX6/7 remoteproc support"
	depends on ARCH_MXC
	help
	  Say y here to support iMX's remote processors (Cortex M4
	  on iMX7D) via the remote processor framework.

	  It's safe to say N here.

config MTK_SCP
	tristate "Mediatek SCP support"
	depends on ARCH_MEDIATEK
	select RPMSG_MTK_SCP
	help
	  Say y here to support Mediatek's System Companion Processor (SCP) via
	  the remote processor framework.

	  It's safe to say N here.

config OMAP_REMOTEPROC
	tristate "OMAP remoteproc support"
	depends on ARCH_OMAP4 || SOC_OMAP5
	depends on OMAP_IOMMU
	select MAILBOX
	select OMAP2PLUS_MBOX
	help
	  Say y here to support OMAP's remote processors (dual M3
	  and DSP on OMAP4) via the remote processor framework.

	  Currently only supported on OMAP4.

	  Usually you want to say Y here, in order to enable multimedia
	  use-cases to run on your platform (multimedia codecs are
	  offloaded to remote DSP processors using this framework).

	  It's safe to say N here if you're not interested in multimedia
	  offloading or just want a bare minimum kernel.

config WKUP_M3_RPROC
	tristate "AMx3xx Wakeup M3 remoteproc support"
	depends on SOC_AM33XX || SOC_AM43XX
	help
	  Say y here to support Wakeup M3 remote processor on TI AM33xx
	  and AM43xx family of SoCs.

	  Required for Suspend-to-RAM on AM33xx and AM43xx SoCs. Also needed
	  for deep CPUIdle states on AM33xx SoCs. Allows for loading of the
	  firmware onto these remote processors.
	  If unsure say N.

config DA8XX_REMOTEPROC
	tristate "DA8xx/OMAP-L13x remoteproc support"
	depends on ARCH_DAVINCI_DA8XX
	depends on DMA_CMA
	help
	  Say y here to support DA8xx/OMAP-L13x remote processors via the
	  remote processor framework.

	  You want to say y here in order to enable AMP
	  use-cases to run on your platform (multimedia codecs are
	  offloaded to remote DSP processors using this framework).

	  This module controls the name of the firmware file that gets
	  loaded on the DSP.  This file must reside in the /lib/firmware
	  directory.  It can be specified via the module parameter
	  da8xx_fw_name=<filename>, and if not specified will default to
	  "rproc-dsp-fw".

	  It's safe to say n here if you're not interested in multimedia
	  offloading.

config KEYSTONE_REMOTEPROC
	tristate "Keystone Remoteproc support"
	depends on ARCH_KEYSTONE
	help
	  Say Y here here to support Keystone remote processors (DSP)
	  via the remote processor framework.

	  It's safe to say N here if you're not interested in the Keystone
	  DSPs or just want to use a bare minimum kernel.

config QCOM_RPROC_COMMON
	tristate

config QCOM_Q6V5_COMMON
	tristate
	depends on ARCH_QCOM
	depends on QCOM_SMEM

config QCOM_Q6V5_ADSP
	tristate "Qualcomm Technology Inc ADSP Peripheral Image Loader"
	depends on OF && ARCH_QCOM
	depends on QCOM_SMEM
	depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
	depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
	depends on QCOM_SYSMON || QCOM_SYSMON=n
	select MFD_SYSCON
	select QCOM_MDT_LOADER
	select QCOM_Q6V5_COMMON
	select QCOM_RPROC_COMMON
	help
	  Say y here to support the Peripheral Image Loader
	  for the Qualcomm Technology Inc. ADSP remote processors.

config QCOM_Q6V5_MSS
	tristate "Qualcomm Hexagon V5 self-authenticating modem subsystem support"
	depends on OF && ARCH_QCOM
	depends on QCOM_SMEM
	depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
	depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
	depends on QCOM_SYSMON || QCOM_SYSMON=n
	select MFD_SYSCON
	select QCOM_MDT_LOADER
	select QCOM_Q6V5_COMMON
	select QCOM_RPROC_COMMON
	select QCOM_SCM
	help
	  Say y here to support the Qualcomm self-authenticating modem
	  subsystem based on Hexagon V5.

config QCOM_Q6V5_PAS
	tristate "Qualcomm Hexagon v5 Peripheral Authentication Service support"
	depends on OF && ARCH_QCOM
	depends on QCOM_SMEM
	depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
	depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
	depends on QCOM_SYSMON || QCOM_SYSMON=n
	select MFD_SYSCON
	select QCOM_MDT_LOADER
	select QCOM_Q6V5_COMMON
	select QCOM_RPROC_COMMON
	select QCOM_SCM
	help
	  Say y here to support the TrustZone based Peripherial Image Loader
	  for the Qualcomm Hexagon v5 based remote processors. This is commonly
	  used to control subsystems such as ADSP, Compute and Sensor.

config QCOM_Q6V5_WCSS
	tristate "Qualcomm Hexagon based WCSS Peripheral Image Loader"
	depends on OF && ARCH_QCOM
	depends on QCOM_SMEM
	depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
	depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
	depends on QCOM_SYSMON || QCOM_SYSMON=n
	select MFD_SYSCON
	select QCOM_MDT_LOADER
	select QCOM_Q6V5_COMMON
	select QCOM_RPROC_COMMON
	select QCOM_SCM
	help
	  Say y here to support the Qualcomm Peripheral Image Loader for the
	  Hexagon V5 based WCSS remote processors.

config QCOM_Q6V5_IPA_NOTIFY
	tristate
	depends on QCOM_IPA
	depends on QCOM_Q6V5_MSS
	default QCOM_IPA

config QCOM_SYSMON
	tristate "Qualcomm sysmon driver"
	depends on RPMSG
	depends on ARCH_QCOM
	depends on NET
	select QCOM_QMI_HELPERS
	help
	  The sysmon driver implements a sysmon QMI client and a handler for
	  the sys_mon SMD and GLINK channel, which are used for graceful
	  shutdown, retrieving failure information and propagating information
	  about other subsystems being shut down.

	  Say y here if your system runs firmware on any other subsystems, e.g.
	  modem or DSP.

config QCOM_WCNSS_PIL
	tristate "Qualcomm WCNSS Peripheral Image Loader"
	depends on OF && ARCH_QCOM
	depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
	depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
	depends on QCOM_SMEM
	depends on QCOM_SYSMON || QCOM_SYSMON=n
	select QCOM_MDT_LOADER
	select QCOM_RPROC_COMMON
	select QCOM_SCM
	help
	  Say y here to support the Peripheral Image Loader for the Qualcomm
	  Wireless Connectivity Subsystem.

config ST_REMOTEPROC
	tristate "ST remoteproc support"
	depends on ARCH_STI
	select MAILBOX
	select STI_MBOX
	help
	  Say y here to support ST's adjunct processors via the remote
	  processor framework.
	  This can be either built-in or a loadable module.

config ST_SLIM_REMOTEPROC
	tristate

config STM32_RPROC
	tristate "STM32 remoteproc support"
	depends on ARCH_STM32
	depends on REMOTEPROC
	select MAILBOX
	help
	  Say y here to support STM32 MCU processors via the
	  remote processor framework.

	  You want to say y here in order to enable AMP
	  use-cases to run on your platform (dedicated firmware could be
	  offloaded to remote MCU processors using this framework).

	  This can be either built-in or a loadable module.

endif # REMOTEPROC

endmenu
