| # SPDX-License-Identifier: GPL-2.0-only | 
 | menuconfig CXL_BUS | 
 | 	tristate "CXL (Compute Express Link) Devices Support" | 
 | 	depends on PCI | 
 | 	select FW_LOADER | 
 | 	select FW_UPLOAD | 
 | 	select PCI_DOE | 
 | 	select FIRMWARE_TABLE | 
 | 	select NUMA_KEEP_MEMINFO if NUMA_MEMBLKS | 
 | 	select FWCTL if CXL_FEATURES | 
 | 	help | 
 | 	  CXL is a bus that is electrically compatible with PCI Express, but | 
 | 	  layers three protocols on that signalling (CXL.io, CXL.cache, and | 
 | 	  CXL.mem). The CXL.cache protocol allows devices to hold cachelines | 
 | 	  locally, the CXL.mem protocol allows devices to be fully coherent | 
 | 	  memory targets, the CXL.io protocol is equivalent to PCI Express. | 
 | 	  Say 'y' to enable support for the configuration and management of | 
 | 	  devices supporting these protocols. | 
 |  | 
 | if CXL_BUS | 
 |  | 
 | config CXL_PCI | 
 | 	tristate "PCI manageability" | 
 | 	default CXL_BUS | 
 | 	help | 
 | 	  The CXL specification defines a "CXL memory device" sub-class in the | 
 | 	  PCI "memory controller" base class of devices. Device's identified by | 
 | 	  this class code provide support for volatile and / or persistent | 
 | 	  memory to be mapped into the system address map (Host-managed Device | 
 | 	  Memory (HDM)). | 
 |  | 
 | 	  Say 'y/m' to enable a driver that will attach to CXL memory expander | 
 | 	  devices enumerated by the memory device class code for configuration | 
 | 	  and management primarily via the mailbox interface. See Chapter 2.3 | 
 | 	  Type 3 CXL Device in the CXL 2.0 specification for more details. | 
 |  | 
 | 	  If unsure say 'm'. | 
 |  | 
 | config CXL_MEM_RAW_COMMANDS | 
 | 	bool "RAW Command Interface for Memory Devices" | 
 | 	depends on CXL_PCI | 
 | 	help | 
 | 	  Enable CXL RAW command interface. | 
 |  | 
 | 	  The CXL driver ioctl interface may assign a kernel ioctl command | 
 | 	  number for each specification defined opcode. At any given point in | 
 | 	  time the number of opcodes that the specification defines and a device | 
 | 	  may implement may exceed the kernel's set of associated ioctl function | 
 | 	  numbers. The mismatch is either by omission, specification is too new, | 
 | 	  or by design. When prototyping new hardware, or developing / debugging | 
 | 	  the driver it is useful to be able to submit any possible command to | 
 | 	  the hardware, even commands that may crash the kernel due to their | 
 | 	  potential impact to memory currently in use by the kernel. | 
 |  | 
 | 	  If developing CXL hardware or the driver say Y, otherwise say N. | 
 |  | 
 | config CXL_ACPI | 
 | 	tristate "CXL ACPI: Platform Support" | 
 | 	depends on ACPI | 
 | 	depends on ACPI_NUMA | 
 | 	default CXL_BUS | 
 | 	select ACPI_TABLE_LIB | 
 | 	select ACPI_HMAT | 
 | 	select CXL_PORT | 
 | 	help | 
 | 	  Enable support for host managed device memory (HDM) resources | 
 | 	  published by a platform's ACPI CXL memory layout description.  See | 
 | 	  Chapter 9.14.1 CXL Early Discovery Table (CEDT) in the CXL 2.0 | 
 | 	  specification, and CXL Fixed Memory Window Structures (CEDT.CFMWS) | 
 | 	  (https://www.computeexpresslink.org/spec-landing). The CXL core | 
 | 	  consumes these resource to publish the root of a cxl_port decode | 
 | 	  hierarchy to map regions that represent System RAM, or Persistent | 
 | 	  Memory regions to be managed by LIBNVDIMM. | 
 |  | 
 | 	  If unsure say 'm'. | 
 |  | 
 | config CXL_PMEM | 
 | 	tristate "CXL PMEM: Persistent Memory Support" | 
 | 	depends on LIBNVDIMM | 
 | 	default CXL_BUS | 
 | 	help | 
 | 	  In addition to typical memory resources a platform may also advertise | 
 | 	  support for persistent memory attached via CXL. This support is | 
 | 	  managed via a bridge driver from CXL to the LIBNVDIMM system | 
 | 	  subsystem. Say 'y/m' to enable support for enumerating and | 
 | 	  provisioning the persistent memory capacity of CXL memory expanders. | 
 |  | 
 | 	  If unsure say 'm'. | 
 |  | 
 | config CXL_MEM | 
 | 	tristate "CXL: Memory Expansion" | 
 | 	depends on CXL_PCI | 
 | 	default CXL_BUS | 
 | 	help | 
 | 	  The CXL.mem protocol allows a device to act as a provider of "System | 
 | 	  RAM" and/or "Persistent Memory" that is fully coherent as if the | 
 | 	  memory were attached to the typical CPU memory controller. This is | 
 | 	  known as HDM "Host-managed Device Memory". | 
 |  | 
 | 	  Say 'y/m' to enable a driver that will attach to CXL.mem devices for | 
 | 	  memory expansion and control of HDM. See Chapter 9.13 in the CXL 2.0 | 
 | 	  specification for a detailed description of HDM. | 
 |  | 
 | 	  If unsure say 'm'. | 
 |  | 
 | config CXL_FEATURES | 
 | 	bool "CXL: Features" | 
 | 	depends on CXL_PCI | 
 | 	help | 
 | 	  Enable support for CXL Features. A CXL device that includes a mailbox | 
 | 	  supports commands that allows listing, getting, and setting of | 
 | 	  optionally defined features such as memory sparing or post package | 
 | 	  sparing. Vendors may define custom features for the device. | 
 |  | 
 | 	  If unsure say 'n' | 
 |  | 
 | config CXL_EDAC_MEM_FEATURES | 
 | 	bool "CXL: EDAC Memory Features" | 
 | 	depends on EXPERT | 
 | 	depends on CXL_MEM | 
 | 	depends on CXL_FEATURES | 
 | 	depends on EDAC >= CXL_BUS | 
 | 	help | 
 | 	  The CXL EDAC memory feature is optional and allows host to | 
 | 	  control the EDAC memory features configurations of CXL memory | 
 | 	  expander devices. | 
 |  | 
 | 	  Say 'y' if you have an expert need to change default settings | 
 | 	  of a memory RAS feature established by the platform/device. | 
 | 	  Otherwise say 'n'. | 
 |  | 
 | config CXL_EDAC_SCRUB | 
 | 	bool "Enable CXL Patrol Scrub Control (Patrol Read)" | 
 | 	depends on CXL_EDAC_MEM_FEATURES | 
 | 	depends on EDAC_SCRUB | 
 | 	help | 
 | 	  The CXL EDAC scrub control is optional and allows host to | 
 | 	  control the scrub feature configurations of CXL memory expander | 
 | 	  devices. | 
 |  | 
 | 	  When enabled 'cxl_mem' and 'cxl_region' EDAC devices are | 
 | 	  published with memory scrub control attributes as described by | 
 | 	  Documentation/ABI/testing/sysfs-edac-scrub. | 
 |  | 
 | 	  Say 'y' if you have an expert need to change default settings | 
 | 	  of a memory scrub feature established by the platform/device | 
 | 	  (e.g. scrub rates for the patrol scrub feature). | 
 | 	  Otherwise say 'n'. | 
 |  | 
 | config CXL_EDAC_ECS | 
 | 	bool "Enable CXL Error Check Scrub (Repair)" | 
 | 	depends on CXL_EDAC_MEM_FEATURES | 
 | 	depends on EDAC_ECS | 
 | 	help | 
 | 	  The CXL EDAC ECS control is optional and allows host to | 
 | 	  control the ECS feature configurations of CXL memory expander | 
 | 	  devices. | 
 |  | 
 | 	  When enabled 'cxl_mem' EDAC devices are published with memory | 
 | 	  ECS control attributes as described by | 
 | 	  Documentation/ABI/testing/sysfs-edac-ecs. | 
 |  | 
 | 	  Say 'y' if you have an expert need to change default settings | 
 | 	  of a memory ECS feature established by the platform/device. | 
 | 	  Otherwise say 'n'. | 
 |  | 
 | config CXL_EDAC_MEM_REPAIR | 
 | 	bool "Enable CXL Memory Repair" | 
 | 	depends on CXL_EDAC_MEM_FEATURES | 
 | 	depends on EDAC_MEM_REPAIR | 
 | 	help | 
 | 	  The CXL EDAC memory repair control is optional and allows host | 
 | 	  to control the memory repair features (e.g. sparing, PPR) | 
 | 	  configurations of CXL memory expander devices. | 
 |  | 
 | 	  When enabled, the memory repair feature requires an additional | 
 | 	  memory of approximately 43KB to store CXL DRAM and CXL general | 
 | 	  media event records. | 
 |  | 
 | 	  When enabled 'cxl_mem' EDAC devices are published with memory | 
 | 	  repair control attributes as described by | 
 | 	  Documentation/ABI/testing/sysfs-edac-memory-repair. | 
 |  | 
 | 	  Say 'y' if you have an expert need to change default settings | 
 | 	  of a memory repair feature established by the platform/device. | 
 | 	  Otherwise say 'n'. | 
 |  | 
 | config CXL_PORT | 
 | 	default CXL_BUS | 
 | 	tristate | 
 |  | 
 | config CXL_SUSPEND | 
 | 	def_bool y | 
 | 	depends on SUSPEND && CXL_MEM | 
 |  | 
 | config CXL_REGION | 
 | 	bool "CXL: Region Support" | 
 | 	default CXL_BUS | 
 | 	# For MAX_PHYSMEM_BITS | 
 | 	depends on SPARSEMEM | 
 | 	select MEMREGION | 
 | 	select GET_FREE_REGION | 
 | 	help | 
 | 	  Enable the CXL core to enumerate and provision CXL regions. A CXL | 
 | 	  region is defined by one or more CXL expanders that decode a given | 
 | 	  system-physical address range. For CXL regions established by | 
 | 	  platform-firmware this option enables memory error handling to | 
 | 	  identify the devices participating in a given interleaved memory | 
 | 	  range. Otherwise, platform-firmware managed CXL is enabled by being | 
 | 	  placed in the system address map and does not need a driver. | 
 |  | 
 | 	  If unsure say 'y' | 
 |  | 
 | config CXL_REGION_INVALIDATION_TEST | 
 | 	bool "CXL: Region Cache Management Bypass (TEST)" | 
 | 	depends on CXL_REGION | 
 | 	help | 
 | 	  CXL Region management and security operations potentially invalidate | 
 | 	  the content of CPU caches without notifying those caches to | 
 | 	  invalidate the affected cachelines. The CXL Region driver attempts | 
 | 	  to invalidate caches when those events occur.  If that invalidation | 
 | 	  fails the region will fail to enable.  Reasons for cache | 
 | 	  invalidation failure are due to the CPU not providing a cache | 
 | 	  invalidation mechanism. For example usage of wbinvd is restricted to | 
 | 	  bare metal x86. However, for testing purposes toggling this option | 
 | 	  can disable that data integrity safety and proceed with enabling | 
 | 	  regions when there might be conflicting contents in the CPU cache. | 
 |  | 
 | 	  If unsure, or if this kernel is meant for production environments, | 
 | 	  say N. | 
 |  | 
 | config CXL_MCE | 
 | 	def_bool y | 
 | 	depends on X86_MCE && MEMORY_FAILURE | 
 |  | 
 | endif |