# SPDX-License-Identifier: GPL-2.0-only
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.rst.
#

menu "Qualcomm firmware drivers"

config QCOM_SCM
	select QCOM_TZMEM
	tristate

config QCOM_TZMEM
	tristate
	select GENERIC_ALLOCATOR

choice
	prompt "TrustZone interface memory allocator mode"
	depends on QCOM_TZMEM
	default QCOM_TZMEM_MODE_GENERIC
	help
	  Selects the mode of the memory allocator providing memory buffers of
	  suitable format for sharing with the TrustZone. If in doubt, select
	  'Generic'.

config QCOM_TZMEM_MODE_GENERIC
	bool "Generic"
	help
	  Use the generic allocator mode. The memory is page-aligned, non-cachable
	  and physically contiguous.

config QCOM_TZMEM_MODE_SHMBRIDGE
	bool "SHM Bridge"
	help
	  Use Qualcomm Shared Memory Bridge. The memory has the same alignment as
	  in the 'Generic' allocator but is also explicitly marked as an SHM Bridge
	  buffer.

	  With this selected, all buffers passed to the TrustZone must be allocated
	  using the TZMem allocator or else the TrustZone will refuse to use them.

endchoice

config QCOM_SCM_DOWNLOAD_MODE_DEFAULT
	bool "Qualcomm download mode enabled by default"
	depends on QCOM_SCM
	help
	  A device with "download mode" enabled will upon an unexpected
	  warm-restart enter a special debug mode that allows the user to
	  "download" memory content over USB for offline postmortem analysis.
	  The feature can be enabled/disabled on the kernel command line.

	  Say Y here to enable "download mode" by default.

config QCOM_QSEECOM
	bool "Qualcomm QSEECOM interface driver"
	depends on QCOM_SCM=y
	select AUXILIARY_BUS
	help
	  Various Qualcomm SoCs have a Secure Execution Environment (SEE) running
	  in the Trust Zone. This module provides an interface to that via the
	  QSEECOM mechanism, using SCM calls.

	  The QSEECOM interface allows, among other things, access to applications
	  running in the SEE. An example of such an application is 'uefisecapp',
	  which is required to access UEFI variables on certain systems. If
	  selected, the interface will also attempt to detect and register client
	  devices for supported applications.

	  Select Y here to enable the QSEECOM interface driver.

config QCOM_QSEECOM_UEFISECAPP
	bool "Qualcomm SEE UEFI Secure App client driver"
	depends on QCOM_QSEECOM
	depends on EFI
	help
	  Various Qualcomm SoCs do not allow direct access to EFI variables.
	  Instead, these need to be accessed via the UEFI Secure Application
	  (uefisecapp), residing in the Secure Execution Environment (SEE).

	  This module provides a client driver for uefisecapp, installing efivar
	  operations to allow the kernel accessing EFI variables, and via that also
	  provide user-space with access to EFI variables via efivarfs.

	  Select Y here to provide access to EFI variables on the aforementioned
	  platforms.

endmenu
