# SPDX-License-Identifier: GPL-2.0-only
menu "EFI (Extensible Firmware Interface) Support"
	depends on EFI

config EFI_ESRT
	bool
	depends on EFI
	default y

config EFI_VARS_PSTORE
	tristate "Register efivars backend for pstore"
	depends on PSTORE
	select UCS2_STRING
	default y
	help
	  Say Y here to enable use efivars as a backend to pstore. This
	  will allow writing console messages, crash dumps, or anything
	  else supported by pstore to EFI variables.

config EFI_VARS_PSTORE_DEFAULT_DISABLE
	bool "Disable using efivars as a pstore backend by default"
	depends on EFI_VARS_PSTORE
	default n
	help
	  Saying Y here will disable the use of efivars as a storage
	  backend for pstore by default. This setting can be overridden
	  using the efivars module's pstore_disable parameter.

config EFI_SOFT_RESERVE
	bool "Reserve EFI Specific Purpose Memory"
	depends on EFI && EFI_STUB && ACPI_HMAT
	default ACPI_HMAT
	help
	  On systems that have mixed performance classes of memory EFI
	  may indicate specific purpose memory with an attribute (See
	  EFI_MEMORY_SP in UEFI 2.8). A memory range tagged with this
	  attribute may have unique performance characteristics compared
	  to the system's general purpose "System RAM" pool. On the
	  expectation that such memory has application specific usage,
	  and its base EFI memory type is "conventional" answer Y to
	  arrange for the kernel to reserve it as a "Soft Reserved"
	  resource, and set aside for direct-access (device-dax) by
	  default. The memory range can later be optionally assigned to
	  the page allocator by system administrator policy via the
	  device-dax kmem facility. Say N to have the kernel treat this
	  memory as "System RAM" by default.

	  If unsure, say Y.

config EFI_DXE_MEM_ATTRIBUTES
	bool "Adjust memory attributes in EFISTUB"
	depends on EFI && EFI_STUB && X86
	default y
	help
	  UEFI specification does not guarantee all memory to be
	  accessible for both write and execute as the kernel expects
	  it to be.
	  Use DXE services to check and alter memory protection
	  attributes during boot via EFISTUB to ensure that memory
	  ranges used by the kernel are writable and executable.

config EFI_PARAMS_FROM_FDT
	bool
	help
	  Select this config option from the architecture Kconfig if
	  the EFI runtime support gets system table address, memory
          map address, and other parameters from the device tree.

config EFI_RUNTIME_WRAPPERS
	bool

config EFI_GENERIC_STUB
	bool

config EFI_ZBOOT
	bool "Enable the generic EFI decompressor"
	depends on EFI_GENERIC_STUB && !ARM
	select HAVE_KERNEL_GZIP
	select HAVE_KERNEL_LZ4
	select HAVE_KERNEL_LZMA
	select HAVE_KERNEL_LZO
	select HAVE_KERNEL_XZ
	select HAVE_KERNEL_ZSTD
	help
	  Create the bootable image as an EFI application that carries the
	  actual kernel image in compressed form, and decompresses it into
	  memory before executing it via LoadImage/StartImage EFI boot service
	  calls. For compatibility with non-EFI loaders, the payload can be
	  decompressed and executed by the loader as well, provided that the
	  loader implements the decompression algorithm and that non-EFI boot
	  is supported by the encapsulated image. (The compression algorithm
	  used is described in the zboot image header)

config EFI_ARMSTUB_DTB_LOADER
	bool "Enable the DTB loader"
	depends on EFI_GENERIC_STUB && !RISCV && !LOONGARCH
	default y
	help
	  Select this config option to add support for the dtb= command
	  line parameter, allowing a device tree blob to be loaded into
	  memory from the EFI System Partition by the stub.

	  If the device tree is provided by the platform or by
	  the bootloader this option may not be needed.
	  But, for various development reasons and to maintain existing
	  functionality for bootloaders that do not have such support
	  this option is necessary.

config EFI_BOOTLOADER_CONTROL
	tristate "EFI Bootloader Control"
	select UCS2_STRING
	default n
	help
	  This module installs a reboot hook, such that if reboot() is
	  invoked with a string argument NNN, "NNN" is copied to the
	  "LoaderEntryOneShot" EFI variable, to be read by the
	  bootloader. If the string matches one of the boot labels
	  defined in its configuration, the bootloader will boot once
	  to that label. The "LoaderEntryRebootReason" EFI variable is
	  set with the reboot reason: "reboot" or "shutdown". The
	  bootloader reads this reboot reason and takes particular
	  action according to its policy.

config EFI_CAPSULE_LOADER
	tristate "EFI capsule loader"
	depends on EFI
	help
	  This option exposes a loader interface "/dev/efi_capsule_loader" for
	  users to load EFI capsules. This driver requires working runtime
	  capsule support in the firmware, which many OEMs do not provide.

	  Most users should say N.

config EFI_CAPSULE_QUIRK_QUARK_CSH
	bool "Add support for Quark capsules with non-standard headers"
	depends on X86 && !64BIT
	select EFI_CAPSULE_LOADER
	default y
	help
	  Add support for processing Quark X1000 EFI capsules, whose header
	  layout deviates from the layout mandated by the UEFI specification.

config EFI_TEST
	tristate "EFI Runtime Service Tests Support"
	depends on EFI
	default n
	help
	  This driver uses the efi.<service> function pointers directly instead
	  of going through the efivar API, because it is not trying to test the
	  kernel subsystem, just for testing the UEFI runtime service
	  interfaces which are provided by the firmware. This driver is used
	  by the Firmware Test Suite (FWTS) for testing the UEFI runtime
	  interfaces readiness of the firmware.
	  Details for FWTS are available from:
	  <https://wiki.ubuntu.com/FirmwareTestSuite>

	  Say Y here to enable the runtime services support via /dev/efi_test.
	  If unsure, say N.

config EFI_DEV_PATH_PARSER
	bool

config APPLE_PROPERTIES
	bool "Apple Device Properties"
	depends on EFI_STUB && X86
	select EFI_DEV_PATH_PARSER
	select UCS2_STRING
	help
	  Retrieve properties from EFI on Apple Macs and assign them to
	  devices, allowing for improved support of Apple hardware.
	  Properties that would otherwise be missing include the
	  Thunderbolt Device ROM and GPU configuration data.

	  If unsure, say Y if you have a Mac.  Otherwise N.

config RESET_ATTACK_MITIGATION
	bool "Reset memory attack mitigation"
	depends on EFI_STUB
	help
	  Request that the firmware clear the contents of RAM after a reboot
	  using the TCG Platform Reset Attack Mitigation specification. This
	  protects against an attacker forcibly rebooting the system while it
	  still contains secrets in RAM, booting another OS and extracting the
	  secrets. This should only be enabled when userland is configured to
	  clear the MemoryOverwriteRequest flag on clean shutdown after secrets
	  have been evicted, since otherwise it will trigger even on clean
	  reboots.

config EFI_RCI2_TABLE
	bool "EFI Runtime Configuration Interface Table Version 2 Support"
	depends on X86 || COMPILE_TEST
	help
	  Displays the content of the Runtime Configuration Interface
	  Table version 2 on Dell EMC PowerEdge systems as a binary
	  attribute 'rci2' under /sys/firmware/efi/tables directory.

	  RCI2 table contains BIOS HII in XML format and is used to populate
	  BIOS setup page in Dell EMC OpenManage Server Administrator tool.
	  The BIOS setup page contains BIOS tokens which can be configured.

	  Say Y here for Dell EMC PowerEdge systems.

config EFI_DISABLE_PCI_DMA
       bool "Clear Busmaster bit on PCI bridges during ExitBootServices()"
       help
	  Disable the busmaster bit in the control register on all PCI bridges
	  while calling ExitBootServices() and passing control to the runtime
	  kernel. System firmware may configure the IOMMU to prevent malicious
	  PCI devices from being able to attack the OS via DMA. However, since
	  firmware can't guarantee that the OS is IOMMU-aware, it will tear
	  down IOMMU configuration when ExitBootServices() is called. This
	  leaves a window between where a hostile device could still cause
	  damage before Linux configures the IOMMU again.

	  If you say Y here, the EFI stub will clear the busmaster bit on all
	  PCI bridges before ExitBootServices() is called. This will prevent
	  any malicious PCI devices from being able to perform DMA until the
	  kernel reenables busmastering after configuring the IOMMU.

	  This option will cause failures with some poorly behaved hardware
	  and should not be enabled without testing. The kernel commandline
	  options "efi=disable_early_pci_dma" or "efi=no_disable_early_pci_dma"
	  may be used to override this option.

config EFI_EARLYCON
	def_bool y
	depends on SERIAL_EARLYCON && !ARM
	select FONT_SUPPORT
	select ARCH_USE_MEMREMAP_PROT

config EFI_CUSTOM_SSDT_OVERLAYS
	bool "Load custom ACPI SSDT overlay from an EFI variable"
	depends on ACPI
	default ACPI_TABLE_UPGRADE
	help
	  Allow loading of an ACPI SSDT overlay from an EFI variable specified
	  by a kernel command line option.

	  See Documentation/admin-guide/acpi/ssdt-overlays.rst for more
	  information.

config EFI_DISABLE_RUNTIME
	bool "Disable EFI runtime services support by default"
	default y if PREEMPT_RT
	help
	  Allow to disable the EFI runtime services support by default. This can
	  already be achieved by using the efi=noruntime option, but it could be
	  useful to have this default without any kernel command line parameter.

	  The EFI runtime services are disabled by default when PREEMPT_RT is
	  enabled, because measurements have shown that some EFI functions calls
	  might take too much time to complete, causing large latencies which is
	  an issue for Real-Time kernels.

	  This default can be overridden by using the efi=runtime option.

config EFI_COCO_SECRET
	bool "EFI Confidential Computing Secret Area Support"
	help
	  Confidential Computing platforms (such as AMD SEV) allow the
	  Guest Owner to securely inject secrets during guest VM launch.
	  The secrets are placed in a designated EFI reserved memory area.

	  In order to use the secrets in the kernel, the location of the secret
	  area (as published in the EFI config table) must be kept.

	  If you say Y here, the address of the EFI secret area will be kept
	  for usage inside the kernel.  This will allow the
	  virt/coco/efi_secret module to access the secrets, which in turn
	  allows userspace programs to access the injected secrets.

config UNACCEPTED_MEMORY
	bool
	depends on EFI_STUB
	help
	   Some Virtual Machine platforms, such as Intel TDX, require
	   some memory to be "accepted" by the guest before it can be used.
	   This mechanism helps prevent malicious hosts from making changes
	   to guest memory.

	   UEFI specification v2.9 introduced EFI_UNACCEPTED_MEMORY memory type.

	   This option adds support for unaccepted memory and makes such memory
	   usable by the kernel.

config EFI_EMBEDDED_FIRMWARE
	bool
	select CRYPTO_LIB_SHA256

endmenu

config UEFI_CPER
	bool

config UEFI_CPER_ARM
	bool
	depends on UEFI_CPER && ( ARM || ARM64 )
	default y

config UEFI_CPER_X86
	bool
	depends on UEFI_CPER && X86
	default y

config TEE_STMM_EFI
	tristate "TEE-based EFI runtime variable service driver"
	depends on EFI && OPTEE
	help
	  Select this config option if TEE is compiled to include StandAloneMM
	  as a separate secure partition. It has the ability to check and store
	  EFI variables on an RPMB or any other non-volatile medium used by
	  StandAloneMM.

	  Enabling this will change the EFI runtime services from the firmware
	  provided functions to TEE calls.

	  To compile this driver as a module, choose M here: the module
	  will be called tee_stmm_efi.
