1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright(c) 2020 Intel Corporation. */
7 #include <linux/bitfield.h>
8 #include <linux/bitops.h>
11 /* CXL 2.0 8.2.5 CXL.cache and CXL.mem Registers*/
12 #define CXL_CM_OFFSET 0x1000
13 #define CXL_CM_CAP_HDR_OFFSET 0x0
14 #define CXL_CM_CAP_HDR_ID_MASK GENMASK(15, 0)
15 #define CM_CAP_HDR_CAP_ID 1
16 #define CXL_CM_CAP_HDR_VERSION_MASK GENMASK(19, 16)
17 #define CM_CAP_HDR_CAP_VERSION 1
18 #define CXL_CM_CAP_HDR_CACHE_MEM_VERSION_MASK GENMASK(23, 20)
19 #define CM_CAP_HDR_CACHE_MEM_VERSION 1
20 #define CXL_CM_CAP_HDR_ARRAY_SIZE_MASK GENMASK(31, 24)
21 #define CXL_CM_CAP_PTR_MASK GENMASK(31, 20)
23 #define CXL_CM_CAP_CAP_ID_HDM 0x5
24 #define CXL_CM_CAP_CAP_HDM_VERSION 1
26 /* HDM decoders CXL 2.0 8.2.5.12 CXL HDM Decoder Capability Structure */
27 #define CXL_HDM_DECODER_CAP_OFFSET 0x0
28 #define CXL_HDM_DECODER_COUNT_MASK GENMASK(3, 0)
29 #define CXL_HDM_DECODER_TARGET_COUNT_MASK GENMASK(7, 4)
30 #define CXL_HDM_DECODER0_BASE_LOW_OFFSET 0x10
31 #define CXL_HDM_DECODER0_BASE_HIGH_OFFSET 0x14
32 #define CXL_HDM_DECODER0_SIZE_LOW_OFFSET 0x18
33 #define CXL_HDM_DECODER0_SIZE_HIGH_OFFSET 0x1c
34 #define CXL_HDM_DECODER0_CTRL_OFFSET 0x20
36 /* CXL 2.0 8.2.8.1 Device Capabilities Array Register */
37 #define CXLDEV_CAP_ARRAY_OFFSET 0x0
38 #define CXLDEV_CAP_ARRAY_CAP_ID 0
39 #define CXLDEV_CAP_ARRAY_ID_MASK GENMASK_ULL(15, 0)
40 #define CXLDEV_CAP_ARRAY_COUNT_MASK GENMASK_ULL(47, 32)
41 /* CXL 2.0 8.2.8.2 CXL Device Capability Header Register */
42 #define CXLDEV_CAP_HDR_CAP_ID_MASK GENMASK(15, 0)
43 /* CXL 2.0 8.2.8.2.1 CXL Device Capabilities */
44 #define CXLDEV_CAP_CAP_ID_DEVICE_STATUS 0x1
45 #define CXLDEV_CAP_CAP_ID_PRIMARY_MAILBOX 0x2
46 #define CXLDEV_CAP_CAP_ID_SECONDARY_MAILBOX 0x3
47 #define CXLDEV_CAP_CAP_ID_MEMDEV 0x4000
49 /* CXL 2.0 8.2.8.4 Mailbox Registers */
50 #define CXLDEV_MBOX_CAPS_OFFSET 0x00
51 #define CXLDEV_MBOX_CAP_PAYLOAD_SIZE_MASK GENMASK(4, 0)
52 #define CXLDEV_MBOX_CTRL_OFFSET 0x04
53 #define CXLDEV_MBOX_CTRL_DOORBELL BIT(0)
54 #define CXLDEV_MBOX_CMD_OFFSET 0x08
55 #define CXLDEV_MBOX_CMD_COMMAND_OPCODE_MASK GENMASK_ULL(15, 0)
56 #define CXLDEV_MBOX_CMD_PAYLOAD_LENGTH_MASK GENMASK_ULL(36, 16)
57 #define CXLDEV_MBOX_STATUS_OFFSET 0x10
58 #define CXLDEV_MBOX_STATUS_RET_CODE_MASK GENMASK_ULL(47, 32)
59 #define CXLDEV_MBOX_BG_CMD_STATUS_OFFSET 0x18
60 #define CXLDEV_MBOX_PAYLOAD_OFFSET 0x20
62 #define CXL_COMPONENT_REGS() \
63 void __iomem *hdm_decoder
65 #define CXL_DEVICE_REGS() \
66 void __iomem *status; \
70 /* See note for 'struct cxl_regs' for the rationale of this organization */
72 * CXL_COMPONENT_REGS - Common set of CXL Component register block base pointers
73 * @hdm_decoder: CXL 2.0 8.2.5.12 CXL HDM Decoder Capability Structure
75 struct cxl_component_regs {
79 /* See note for 'struct cxl_regs' for the rationale of this organization */
81 * CXL_DEVICE_REGS - Common set of CXL Device register block base pointers
82 * @status: CXL 2.0 8.2.8.3 Device Status Registers
83 * @mbox: CXL 2.0 8.2.8.4 Mailbox Registers
84 * @memdev: CXL 2.0 8.2.8.5 Memory Device Registers
86 struct cxl_device_regs {
91 * Note, the anonymous union organization allows for per
92 * register-block-type helper routines, without requiring block-type
93 * agnostic code to include the prefix.
100 struct cxl_component_regs component;
106 struct cxl_device_regs device_regs;
112 unsigned long offset;
116 struct cxl_component_reg_map {
117 struct cxl_reg_map hdm_decoder;
120 struct cxl_device_reg_map {
121 struct cxl_reg_map status;
122 struct cxl_reg_map mbox;
123 struct cxl_reg_map memdev;
126 struct cxl_register_map {
127 struct list_head list;
132 struct cxl_component_reg_map component_map;
133 struct cxl_device_reg_map device_map;
137 void cxl_probe_component_regs(struct device *dev, void __iomem *base,
138 struct cxl_component_reg_map *map);
139 void cxl_probe_device_regs(struct device *dev, void __iomem *base,
140 struct cxl_device_reg_map *map);
141 int cxl_map_component_regs(struct pci_dev *pdev,
142 struct cxl_component_regs *regs,
143 struct cxl_register_map *map);
144 int cxl_map_device_regs(struct pci_dev *pdev,
145 struct cxl_device_regs *regs,
146 struct cxl_register_map *map);
148 extern struct bus_type cxl_bus_type;
149 #endif /* __CXL_H__ */