cxl/pci: Add HDM decoder capabilities
[linux-2.6-microblaze.git] / drivers / cxl / cxl.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright(c) 2020 Intel Corporation. */
3
4 #ifndef __CXL_H__
5 #define __CXL_H__
6
7 #include <linux/bitfield.h>
8 #include <linux/bitops.h>
9 #include <linux/io.h>
10
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)
22
23 #define   CXL_CM_CAP_CAP_ID_HDM 0x5
24 #define   CXL_CM_CAP_CAP_HDM_VERSION 1
25
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
35
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
48
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
61
62 #define CXL_COMPONENT_REGS() \
63         void __iomem *hdm_decoder
64
65 #define CXL_DEVICE_REGS() \
66         void __iomem *status; \
67         void __iomem *mbox; \
68         void __iomem *memdev
69
70 /* See note for 'struct cxl_regs' for the rationale of this organization */
71 /*
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
74  */
75 struct cxl_component_regs {
76         CXL_COMPONENT_REGS();
77 };
78
79 /* See note for 'struct cxl_regs' for the rationale of this organization */
80 /*
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
85  */
86 struct cxl_device_regs {
87         CXL_DEVICE_REGS();
88 };
89
90 /*
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.
94  */
95 struct cxl_regs {
96         union {
97                 struct {
98                         CXL_COMPONENT_REGS();
99                 };
100                 struct cxl_component_regs component;
101         };
102         union {
103                 struct {
104                         CXL_DEVICE_REGS();
105                 };
106                 struct cxl_device_regs device_regs;
107         };
108 };
109
110 struct cxl_reg_map {
111         bool valid;
112         unsigned long offset;
113         unsigned long size;
114 };
115
116 struct cxl_component_reg_map {
117         struct cxl_reg_map hdm_decoder;
118 };
119
120 struct cxl_device_reg_map {
121         struct cxl_reg_map status;
122         struct cxl_reg_map mbox;
123         struct cxl_reg_map memdev;
124 };
125
126 struct cxl_register_map {
127         struct list_head list;
128         u64 block_offset;
129         u8 reg_type;
130         u8 barno;
131         union {
132                 struct cxl_component_reg_map component_map;
133                 struct cxl_device_reg_map device_map;
134         };
135 };
136
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);
147
148 extern struct bus_type cxl_bus_type;
149 #endif /* __CXL_H__ */