From: Manish Honap <[email protected]>

The CXL component register layout and the HDM Decoder Capability
Structure defines live in drivers/cxl/cxl.h, where userspace
consumers cannot include them without depending on kernel-only
headers.  A VMM that owns a vfio-cxl COMP_REGS shadow region needs
these defines to interpret the shadow contents.

Move the spec-defined register layout, capability identifiers, and
HDM decoder field masks to a new public uapi header,
include/uapi/cxl/cxl_regs.h.  Use __GENMASK() and _BITUL() (not
GENMASK() / BIT()) so the header is uapi-clean.  Include
<asm/bitsperlong.h> for the __BITS_PER_LONG that __GENMASK() needs.

drivers/cxl/cxl.h now includes <uapi/cxl/cxl_regs.h>; the values
are identical, so kernel callers see no change.  Static inline
helpers that use FIELD_GET stay in drivers/cxl/cxl.h.

Signed-off-by: Manish Honap <[email protected]>
---
 drivers/cxl/cxl.h           | 52 +++++-------------------------
 include/uapi/cxl/cxl_regs.h | 63 +++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 45 deletions(-)
 create mode 100644 include/uapi/cxl/cxl_regs.h

diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index f43abd1903ce..583a27b6659e 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -24,51 +24,13 @@ extern const struct nvdimm_security_ops *cxl_security_ops;
  * (port-driver, region-driver, nvdimm object-drivers... etc).
  */
 
-/* CXL 2.0 8.2.4 CXL Component Register Layout and Definition */
-#define CXL_COMPONENT_REG_BLOCK_SIZE SZ_64K
-
-/* CXL 2.0 8.2.5 CXL.cache and CXL.mem Registers*/
-#define CXL_CM_OFFSET 0x1000
-#define CXL_CM_CAP_HDR_OFFSET 0x0
-#define   CXL_CM_CAP_HDR_ID_MASK GENMASK(15, 0)
-#define     CM_CAP_HDR_CAP_ID 1
-#define   CXL_CM_CAP_HDR_VERSION_MASK GENMASK(19, 16)
-#define     CM_CAP_HDR_CAP_VERSION 1
-#define   CXL_CM_CAP_HDR_CACHE_MEM_VERSION_MASK GENMASK(23, 20)
-#define     CM_CAP_HDR_CACHE_MEM_VERSION 1
-#define   CXL_CM_CAP_HDR_ARRAY_SIZE_MASK GENMASK(31, 24)
-#define CXL_CM_CAP_PTR_MASK GENMASK(31, 20)
-
-#define   CXL_CM_CAP_CAP_ID_RAS 0x2
-#define   CXL_CM_CAP_CAP_ID_HDM 0x5
-#define   CXL_CM_CAP_CAP_HDM_VERSION 1
-
-/* HDM decoders CXL 2.0 8.2.5.12 CXL HDM Decoder Capability Structure */
-#define CXL_HDM_DECODER_CAP_OFFSET 0x0
-#define   CXL_HDM_DECODER_COUNT_MASK GENMASK(3, 0)
-#define   CXL_HDM_DECODER_TARGET_COUNT_MASK GENMASK(7, 4)
-#define   CXL_HDM_DECODER_INTERLEAVE_11_8 BIT(8)
-#define   CXL_HDM_DECODER_INTERLEAVE_14_12 BIT(9)
-#define   CXL_HDM_DECODER_INTERLEAVE_3_6_12_WAY BIT(11)
-#define   CXL_HDM_DECODER_INTERLEAVE_16_WAY BIT(12)
-#define CXL_HDM_DECODER_CTRL_OFFSET 0x4
-#define   CXL_HDM_DECODER_ENABLE BIT(1)
-#define CXL_HDM_DECODER0_BASE_LOW_OFFSET(i) (0x20 * (i) + 0x10)
-#define CXL_HDM_DECODER0_BASE_HIGH_OFFSET(i) (0x20 * (i) + 0x14)
-#define CXL_HDM_DECODER0_SIZE_LOW_OFFSET(i) (0x20 * (i) + 0x18)
-#define CXL_HDM_DECODER0_SIZE_HIGH_OFFSET(i) (0x20 * (i) + 0x1c)
-#define CXL_HDM_DECODER0_CTRL_OFFSET(i) (0x20 * (i) + 0x20)
-#define   CXL_HDM_DECODER0_CTRL_IG_MASK GENMASK(3, 0)
-#define   CXL_HDM_DECODER0_CTRL_IW_MASK GENMASK(7, 4)
-#define   CXL_HDM_DECODER0_CTRL_LOCK BIT(8)
-#define   CXL_HDM_DECODER0_CTRL_COMMIT BIT(9)
-#define   CXL_HDM_DECODER0_CTRL_COMMITTED BIT(10)
-#define   CXL_HDM_DECODER0_CTRL_COMMIT_ERROR BIT(11)
-#define   CXL_HDM_DECODER0_CTRL_HOSTONLY BIT(12)
-#define CXL_HDM_DECODER0_TL_LOW(i) (0x20 * (i) + 0x24)
-#define CXL_HDM_DECODER0_TL_HIGH(i) (0x20 * (i) + 0x28)
-#define CXL_HDM_DECODER0_SKIP_LOW(i) CXL_HDM_DECODER0_TL_LOW(i)
-#define CXL_HDM_DECODER0_SKIP_HIGH(i) CXL_HDM_DECODER0_TL_HIGH(i)
+/*
+ * Spec-defined CXL component register layout and HDM Decoder
+ * Capability Structure constants live in <uapi/cxl/cxl_regs.h> so a
+ * userspace VMM that owns a vfio-cxl COMP_REGS shadow region can
+ * consume them without depending on kernel-only headers.
+ */
+#include <uapi/cxl/cxl_regs.h>
 
 /* HDM decoder control register constants CXL 3.0 8.2.5.19.7 */
 #define CXL_DECODER_MIN_GRANULARITY 256
diff --git a/include/uapi/cxl/cxl_regs.h b/include/uapi/cxl/cxl_regs.h
new file mode 100644
index 000000000000..b284b7ad2d42
--- /dev/null
+++ b/include/uapi/cxl/cxl_regs.h
@@ -0,0 +1,63 @@
+/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
+/*
+ * CXL component register layout and HDM Decoder Capability Structure
+ * defines.  Userspace consumers (e.g. a VMM that owns a vfio-cxl
+ * COMP_REGS shadow region) need these without kernel-only header
+ * dependencies.
+ *
+ * Spec references: CXL r4.0 sections 8.2.3 and 8.2.4.20.
+ */
+#ifndef _UAPI_CXL_REGS_H_
+#define _UAPI_CXL_REGS_H_
+
+#include <asm/bitsperlong.h>   /* __BITS_PER_LONG; needed by __GENMASK() */
+#include <linux/const.h>       /* _BITUL(), _BITULL() */
+#include <linux/bits.h>                /* __GENMASK() */
+
+/* CXL r4.0 8.2.3 CXL Component Register Layout and Definition */
+#define CXL_COMPONENT_REG_BLOCK_SIZE           0x00010000
+
+/* CXL r4.0 8.2.4 CXL.cache and CXL.mem Registers */
+#define CXL_CM_OFFSET                          0x1000
+#define CXL_CM_CAP_HDR_OFFSET                  0x0
+#define   CXL_CM_CAP_HDR_ID_MASK               __GENMASK(15, 0)
+#define     CM_CAP_HDR_CAP_ID                  1
+#define   CXL_CM_CAP_HDR_VERSION_MASK          __GENMASK(19, 16)
+#define     CM_CAP_HDR_CAP_VERSION             1
+#define   CXL_CM_CAP_HDR_CACHE_MEM_VERSION_MASK        __GENMASK(23, 20)
+#define     CM_CAP_HDR_CACHE_MEM_VERSION       1
+#define   CXL_CM_CAP_HDR_ARRAY_SIZE_MASK       __GENMASK(31, 24)
+#define CXL_CM_CAP_PTR_MASK                    __GENMASK(31, 20)
+
+#define   CXL_CM_CAP_CAP_ID_RAS                        0x2
+#define   CXL_CM_CAP_CAP_ID_HDM                        0x5
+#define   CXL_CM_CAP_CAP_HDM_VERSION           1
+
+/* HDM decoders, CXL r4.0 8.2.4.20 */
+#define CXL_HDM_DECODER_CAP_OFFSET             0x0
+#define   CXL_HDM_DECODER_COUNT_MASK           __GENMASK(3, 0)
+#define   CXL_HDM_DECODER_TARGET_COUNT_MASK    __GENMASK(7, 4)
+#define   CXL_HDM_DECODER_INTERLEAVE_11_8      _BITUL(8)
+#define   CXL_HDM_DECODER_INTERLEAVE_14_12     _BITUL(9)
+#define   CXL_HDM_DECODER_INTERLEAVE_3_6_12_WAY        _BITUL(11)
+#define   CXL_HDM_DECODER_INTERLEAVE_16_WAY    _BITUL(12)
+#define CXL_HDM_DECODER_CTRL_OFFSET            0x4
+#define   CXL_HDM_DECODER_ENABLE               _BITUL(1)
+#define CXL_HDM_DECODER0_BASE_LOW_OFFSET(i)    (0x20 * (i) + 0x10)
+#define CXL_HDM_DECODER0_BASE_HIGH_OFFSET(i)   (0x20 * (i) + 0x14)
+#define CXL_HDM_DECODER0_SIZE_LOW_OFFSET(i)    (0x20 * (i) + 0x18)
+#define CXL_HDM_DECODER0_SIZE_HIGH_OFFSET(i)   (0x20 * (i) + 0x1c)
+#define CXL_HDM_DECODER0_CTRL_OFFSET(i)                (0x20 * (i) + 0x20)
+#define   CXL_HDM_DECODER0_CTRL_IG_MASK                __GENMASK(3, 0)
+#define   CXL_HDM_DECODER0_CTRL_IW_MASK                __GENMASK(7, 4)
+#define   CXL_HDM_DECODER0_CTRL_LOCK           _BITUL(8)
+#define   CXL_HDM_DECODER0_CTRL_COMMIT         _BITUL(9)
+#define   CXL_HDM_DECODER0_CTRL_COMMITTED      _BITUL(10)
+#define   CXL_HDM_DECODER0_CTRL_COMMIT_ERROR   _BITUL(11)
+#define   CXL_HDM_DECODER0_CTRL_HOSTONLY       _BITUL(12)
+#define CXL_HDM_DECODER0_TL_LOW(i)             (0x20 * (i) + 0x24)
+#define CXL_HDM_DECODER0_TL_HIGH(i)            (0x20 * (i) + 0x28)
+#define CXL_HDM_DECODER0_SKIP_LOW(i)           CXL_HDM_DECODER0_TL_LOW(i)
+#define CXL_HDM_DECODER0_SKIP_HIGH(i)          CXL_HDM_DECODER0_TL_HIGH(i)
+
+#endif /* _UAPI_CXL_REGS_H_ */
-- 
2.25.1


Reply via email to