|  | # SPDX-License-Identifier: GPL-2.0-only | 
|  | menuconfig LIBNVDIMM | 
|  | tristate "NVDIMM (Non-Volatile Memory Device) Support" | 
|  | depends on PHYS_ADDR_T_64BIT | 
|  | depends on HAS_IOMEM | 
|  | depends on BLK_DEV | 
|  | select MEMREGION | 
|  | help | 
|  | Generic support for non-volatile memory devices including | 
|  | ACPI-6-NFIT defined resources.  On platforms that define an | 
|  | NFIT, or otherwise can discover NVDIMM resources, a libnvdimm | 
|  | bus is registered to advertise PMEM (persistent memory) | 
|  | namespaces (/dev/pmemX). A PMEM namespace refers to a | 
|  | memory resource that may span multiple DIMMs and support DAX | 
|  | (see CONFIG_DAX). | 
|  |  | 
|  | if LIBNVDIMM | 
|  |  | 
|  | config BLK_DEV_PMEM | 
|  | tristate "PMEM: Persistent memory block device support" | 
|  | default LIBNVDIMM | 
|  | select DAX | 
|  | select ND_BTT if BTT | 
|  | select ND_PFN if NVDIMM_PFN | 
|  | help | 
|  | Memory ranges for PMEM are described by either an NFIT | 
|  | (NVDIMM Firmware Interface Table, see CONFIG_ACPI_NFIT), a | 
|  | non-standard OEM-specific E820 memory type (type-12, see | 
|  | CONFIG_X86_PMEM_LEGACY), or it is manually specified by the | 
|  | 'memmap=nn[KMG]!ss[KMG]' kernel command line (see | 
|  | Documentation/admin-guide/kernel-parameters.rst).  This driver converts | 
|  | these persistent memory ranges into block devices that are | 
|  | capable of DAX (direct-access) file system mappings.  See | 
|  | Documentation/driver-api/nvdimm/nvdimm.rst for more details. | 
|  |  | 
|  | Say Y if you want to use an NVDIMM | 
|  |  | 
|  | config ND_CLAIM | 
|  | bool | 
|  |  | 
|  | config ND_BTT | 
|  | tristate | 
|  |  | 
|  | config BTT | 
|  | bool "BTT: Block Translation Table (atomic sector updates)" | 
|  | default y if LIBNVDIMM | 
|  | select ND_CLAIM | 
|  | help | 
|  | The Block Translation Table (BTT) provides atomic sector | 
|  | update semantics for persistent memory devices, so that | 
|  | applications that rely on sector writes not being torn (a | 
|  | guarantee that typical disks provide) can continue to do so. | 
|  | The BTT manifests itself as an alternate personality for an | 
|  | NVDIMM namespace, i.e. a namespace can be in raw mode pmemX, | 
|  | or 'sectored' mode. | 
|  |  | 
|  | Select Y if unsure | 
|  |  | 
|  | config ND_PFN | 
|  | tristate | 
|  |  | 
|  | config NVDIMM_PFN | 
|  | bool "PFN: Map persistent (device) memory" | 
|  | default LIBNVDIMM | 
|  | depends on ZONE_DEVICE | 
|  | select ND_CLAIM | 
|  | help | 
|  | Map persistent memory, i.e. advertise it to the memory | 
|  | management sub-system.  By default persistent memory does | 
|  | not support direct I/O, RDMA, or any other usage that | 
|  | requires a 'struct page' to mediate an I/O request.  This | 
|  | driver allocates and initializes the infrastructure needed | 
|  | to support those use cases. | 
|  |  | 
|  | Select Y if unsure | 
|  |  | 
|  | config NVDIMM_DAX | 
|  | bool "NVDIMM DAX: Raw access to persistent memory" | 
|  | default LIBNVDIMM | 
|  | depends on NVDIMM_PFN | 
|  | help | 
|  | Support raw device dax access to a persistent memory | 
|  | namespace.  For environments that want to hard partition | 
|  | persistent memory, this capability provides a mechanism to | 
|  | sub-divide a namespace into character devices that can only be | 
|  | accessed via DAX (mmap(2)). | 
|  |  | 
|  | Select Y if unsure | 
|  |  | 
|  | config OF_PMEM | 
|  | tristate "Device-tree support for persistent memory regions" | 
|  | depends on OF | 
|  | default LIBNVDIMM | 
|  | help | 
|  | Allows regions of persistent memory to be described in the | 
|  | device-tree. | 
|  |  | 
|  | Select Y if unsure. | 
|  |  | 
|  | config NVDIMM_KEYS | 
|  | def_bool y | 
|  | depends on ENCRYPTED_KEYS | 
|  | depends on (LIBNVDIMM=ENCRYPTED_KEYS) || LIBNVDIMM=m | 
|  |  | 
|  | config NVDIMM_KMSAN | 
|  | bool | 
|  | depends on KMSAN | 
|  | help | 
|  | KMSAN, and other memory debug facilities, increase the size of | 
|  | 'struct page' to contain extra metadata. This collides with | 
|  | the NVDIMM capability to store a potentially | 
|  | larger-than-"System RAM" size 'struct page' array in a | 
|  | reservation of persistent memory rather than limited / | 
|  | precious DRAM. However, that reservation needs to persist for | 
|  | the life of the given NVDIMM namespace. If you are using KMSAN | 
|  | to debug an issue unrelated to NVDIMMs or DAX then say N to this | 
|  | option. Otherwise, say Y but understand that any namespaces | 
|  | (with the page array stored pmem) created with this build of | 
|  | the kernel will permanently reserve and strand excess | 
|  | capacity compared to the CONFIG_KMSAN=n case. | 
|  |  | 
|  | Select N if unsure. | 
|  |  | 
|  | config NVDIMM_TEST_BUILD | 
|  | tristate "Build the unit test core" | 
|  | depends on m | 
|  | depends on COMPILE_TEST && X86_64 | 
|  | default m if COMPILE_TEST | 
|  | help | 
|  | Build the core of the unit test infrastructure. The result of | 
|  | this build is non-functional for unit test execution, but it | 
|  | otherwise helps catch build errors induced by changes to the | 
|  | core devm_memremap_pages() implementation and other | 
|  | infrastructure. | 
|  |  | 
|  | config NVDIMM_SECURITY_TEST | 
|  | bool "Enable NVDIMM security unit tests" | 
|  | depends on NVDIMM_KEYS | 
|  | help | 
|  | The NVDIMM and CXL subsystems support unit testing of their device | 
|  | security state machines. The NVDIMM_SECURITY_TEST option disables CPU | 
|  | cache maintenance operations around events like secure erase and | 
|  | overwrite.  Also, when enabled, the NVDIMM subsystem core helps the unit | 
|  | test implement a mock state machine. | 
|  |  | 
|  | Select N if unsure. | 
|  |  | 
|  | endif |