1# SPDX-License-Identifier: GPL-2.0-only
2menuconfig LIBNVDIMM
3	tristate "NVDIMM (Non-Volatile Memory Device) Support"
4	depends on PHYS_ADDR_T_64BIT
5	depends on HAS_IOMEM
6	depends on BLK_DEV
7	select MEMREGION
8	help
9	  Generic support for non-volatile memory devices including
10	  ACPI-6-NFIT defined resources.  On platforms that define an
11	  NFIT, or otherwise can discover NVDIMM resources, a libnvdimm
12	  bus is registered to advertise PMEM (persistent memory)
13	  namespaces (/dev/pmemX) and BLK (sliding mmio window(s))
14	  namespaces (/dev/ndblkX.Y). A PMEM namespace refers to a
15	  memory resource that may span multiple DIMMs and support DAX
16	  (see CONFIG_DAX).  A BLK namespace refers to an NVDIMM control
17	  region which exposes an mmio register set for windowed access
18	  mode to non-volatile memory.
19
20if LIBNVDIMM
21
22config BLK_DEV_PMEM
23	tristate "PMEM: Persistent memory block device support"
24	default LIBNVDIMM
25	select DAX_DRIVER
26	select ND_BTT if BTT
27	select ND_PFN if NVDIMM_PFN
28	help
29	  Memory ranges for PMEM are described by either an NFIT
30	  (NVDIMM Firmware Interface Table, see CONFIG_NFIT_ACPI), a
31	  non-standard OEM-specific E820 memory type (type-12, see
32	  CONFIG_X86_PMEM_LEGACY), or it is manually specified by the
33	  'memmap=nn[KMG]!ss[KMG]' kernel command line (see
34	  Documentation/admin-guide/kernel-parameters.rst).  This driver converts
35	  these persistent memory ranges into block devices that are
36	  capable of DAX (direct-access) file system mappings.  See
37	  Documentation/driver-api/nvdimm/nvdimm.rst for more details.
38
39	  Say Y if you want to use an NVDIMM
40
41config ND_BLK
42	tristate "BLK: Block data window (aperture) device support"
43	default LIBNVDIMM
44	select ND_BTT if BTT
45	help
46	  Support NVDIMMs, or other devices, that implement a BLK-mode
47	  access capability.  BLK-mode access uses memory-mapped-i/o
48	  apertures to access persistent media.
49
50	  Say Y if your platform firmware emits an ACPI.NFIT table
51	  (CONFIG_ACPI_NFIT), or otherwise exposes BLK-mode
52	  capabilities.
53
54config ND_CLAIM
55	bool
56
57config ND_BTT
58	tristate
59
60config BTT
61	bool "BTT: Block Translation Table (atomic sector updates)"
62	default y if LIBNVDIMM
63	select ND_CLAIM
64	help
65	  The Block Translation Table (BTT) provides atomic sector
66	  update semantics for persistent memory devices, so that
67	  applications that rely on sector writes not being torn (a
68	  guarantee that typical disks provide) can continue to do so.
69	  The BTT manifests itself as an alternate personality for an
70	  NVDIMM namespace, i.e. a namespace can be in raw mode (pmemX,
71	  ndblkX.Y, etc...), or 'sectored' mode, (pmemXs, ndblkX.Ys,
72	  etc...).
73
74	  Select Y if unsure
75
76config ND_PFN
77	tristate
78
79config NVDIMM_PFN
80	bool "PFN: Map persistent (device) memory"
81	default LIBNVDIMM
82	depends on ZONE_DEVICE
83	select ND_CLAIM
84	help
85	  Map persistent memory, i.e. advertise it to the memory
86	  management sub-system.  By default persistent memory does
87	  not support direct I/O, RDMA, or any other usage that
88	  requires a 'struct page' to mediate an I/O request.  This
89	  driver allocates and initializes the infrastructure needed
90	  to support those use cases.
91
92	  Select Y if unsure
93
94config NVDIMM_DAX
95	bool "NVDIMM DAX: Raw access to persistent memory"
96	default LIBNVDIMM
97	depends on NVDIMM_PFN
98	help
99	  Support raw device dax access to a persistent memory
100	  namespace.  For environments that want to hard partition
101	  persistent memory, this capability provides a mechanism to
102	  sub-divide a namespace into character devices that can only be
103	  accessed via DAX (mmap(2)).
104
105	  Select Y if unsure
106
107config OF_PMEM
108	tristate "Device-tree support for persistent memory regions"
109	depends on OF
110	default LIBNVDIMM
111	help
112	  Allows regions of persistent memory to be described in the
113	  device-tree.
114
115	  Select Y if unsure.
116
117config NVDIMM_KEYS
118	def_bool y
119	depends on ENCRYPTED_KEYS
120	depends on (LIBNVDIMM=ENCRYPTED_KEYS) || LIBNVDIMM=m
121
122config NVDIMM_TEST_BUILD
123	tristate "Build the unit test core"
124	depends on m
125	depends on COMPILE_TEST && X86_64
126	default m if COMPILE_TEST
127	help
128	  Build the core of the unit test infrastructure. The result of
129	  this build is non-functional for unit test execution, but it
130	  otherwise helps catch build errors induced by changes to the
131	  core devm_memremap_pages() implementation and other
132	  infrastructure.
133
134endif
135