1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
3 #ifndef _IDXD_REGISTERS_H_
4 #define _IDXD_REGISTERS_H_
7 #define PCI_DEVICE_ID_INTEL_DSA_SPR0 0x0b25
8 #define PCI_DEVICE_ID_INTEL_IAX_SPR0 0x0cfe
10 #define DEVICE_VERSION_1 0x100
11 #define DEVICE_VERSION_2 0x200
13 #define IDXD_MMIO_BAR 0
15 #define IDXD_PORTAL_SIZE PAGE_SIZE
17 /* MMIO Device BAR0 Registers */
18 #define IDXD_VER_OFFSET 0x00
19 #define IDXD_VER_MAJOR_MASK 0xf0
20 #define IDXD_VER_MINOR_MASK 0x0f
21 #define GET_IDXD_VER_MAJOR(x) (((x) & IDXD_VER_MAJOR_MASK) >> 4)
22 #define GET_IDXD_VER_MINOR(x) ((x) & IDXD_VER_MINOR_MASK)
28 u64 cache_control_mem:1;
29 u64 cache_control_cache:1;
36 u64 max_batch_shift:4;
43 #define IDXD_GENCAP_OFFSET 0x10
61 #define IDXD_WQCAP_OFFSET 0x20
62 #define IDXD_WQCFG_MIN 5
67 u64 total_rdbufs:8; /* formerly total_tokens */
68 u64 rdbuf_ctrl:1; /* formerly token_en */
69 u64 rdbuf_limit:1; /* formerly token_limit */
74 #define IDXD_GRPCAP_OFFSET 0x30
76 union engine_cap_reg {
84 #define IDXD_ENGCAP_OFFSET 0x38
86 #define IDXD_OPCAP_NOOP 0x0001
87 #define IDXD_OPCAP_BATCH 0x0002
88 #define IDXD_OPCAP_MEMMOVE 0x0008
93 #define IDXD_OPCAP_OFFSET 0x40
95 #define IDXD_TABLE_OFFSET 0x60
108 #define IDXD_TABLE_MULT 0x100
110 #define IDXD_GENCFG_OFFSET 0x80
121 #define IDXD_GENCTRL_OFFSET 0x88
124 u32 softerr_int_en:1;
131 #define IDXD_GENSTATS_OFFSET 0x90
141 enum idxd_device_status_state {
142 IDXD_DEVICE_STATE_DISABLED = 0,
143 IDXD_DEVICE_STATE_ENABLED,
144 IDXD_DEVICE_STATE_DRAIN,
145 IDXD_DEVICE_STATE_HALT,
148 enum idxd_device_reset_type {
149 IDXD_DEVICE_RESET_SOFTWARE = 0,
150 IDXD_DEVICE_RESET_FLR,
151 IDXD_DEVICE_RESET_WARM,
152 IDXD_DEVICE_RESET_COLD,
155 #define IDXD_INTCAUSE_OFFSET 0x98
156 #define IDXD_INTC_ERR 0x01
157 #define IDXD_INTC_CMD 0x02
158 #define IDXD_INTC_OCCUPY 0x04
159 #define IDXD_INTC_PERFMON_OVFL 0x08
160 #define IDXD_INTC_HALT_STATE 0x10
161 #define IDXD_INTC_INT_HANDLE_REVOKED 0x80000000
163 #define IDXD_CMD_OFFSET 0xa0
164 union idxd_command_reg {
175 IDXD_CMD_ENABLE_DEVICE = 1,
176 IDXD_CMD_DISABLE_DEVICE,
179 IDXD_CMD_RESET_DEVICE,
185 IDXD_CMD_DRAIN_PASID,
186 IDXD_CMD_ABORT_PASID,
187 IDXD_CMD_REQUEST_INT_HANDLE,
188 IDXD_CMD_RELEASE_INT_HANDLE,
191 #define CMD_INT_HANDLE_IMS 0x10000
193 #define IDXD_CMDSTS_OFFSET 0xa8
203 #define IDXD_CMDSTS_ACTIVE 0x80000000
204 #define IDXD_CMDSTS_ERR_MASK 0xff
205 #define IDXD_CMDSTS_RES_SHIFT 8
207 enum idxd_cmdsts_err {
208 IDXD_CMDSTS_SUCCESS = 0,
209 IDXD_CMDSTS_INVAL_CMD,
210 IDXD_CMDSTS_INVAL_WQIDX,
212 /* enable device errors */
213 IDXD_CMDSTS_ERR_DEV_ENABLED = 0x10,
214 IDXD_CMDSTS_ERR_CONFIG,
215 IDXD_CMDSTS_ERR_BUSMASTER_EN,
216 IDXD_CMDSTS_ERR_PASID_INVAL,
217 IDXD_CMDSTS_ERR_WQ_SIZE_ERANGE,
218 IDXD_CMDSTS_ERR_GRP_CONFIG,
219 IDXD_CMDSTS_ERR_GRP_CONFIG2,
220 IDXD_CMDSTS_ERR_GRP_CONFIG3,
221 IDXD_CMDSTS_ERR_GRP_CONFIG4,
222 /* enable wq errors */
223 IDXD_CMDSTS_ERR_DEV_NOTEN = 0x20,
224 IDXD_CMDSTS_ERR_WQ_ENABLED,
225 IDXD_CMDSTS_ERR_WQ_SIZE,
226 IDXD_CMDSTS_ERR_WQ_PRIOR,
227 IDXD_CMDSTS_ERR_WQ_MODE,
228 IDXD_CMDSTS_ERR_BOF_EN,
229 IDXD_CMDSTS_ERR_PASID_EN,
230 IDXD_CMDSTS_ERR_MAX_BATCH_SIZE,
231 IDXD_CMDSTS_ERR_MAX_XFER_SIZE,
232 /* disable device errors */
233 IDXD_CMDSTS_ERR_DIS_DEV_EN = 0x31,
234 /* disable WQ, drain WQ, abort WQ, reset WQ */
235 IDXD_CMDSTS_ERR_DEV_NOT_EN,
236 /* request interrupt handle */
237 IDXD_CMDSTS_ERR_INVAL_INT_IDX = 0x41,
238 IDXD_CMDSTS_ERR_NO_HANDLE,
241 #define IDXD_CMDCAP_OFFSET 0xb0
243 #define IDXD_SWERR_OFFSET 0xc0
244 #define IDXD_SWERR_VALID 0x00000001
245 #define IDXD_SWERR_OVERFLOW 0x00000002
246 #define IDXD_SWERR_ACK (IDXD_SWERR_VALID | IDXD_SWERR_OVERFLOW)
266 u64 invalid_flags:32;
291 u32 use_rdbuf_limit:1;
292 u32 rdbufs_reserved:8;
294 u32 rdbufs_allowed:8;
303 union group_flags flags;
317 u32 mode:1; /* shared or dedicated */
318 u32 bof:1; /* block on fault */
319 u32 wq_ats_disable:1;
328 u32 max_xfer_shift:5;
329 u32 max_batch_shift:4;
334 u16 occupancy_table_sel:1;
339 u16 occupancy_int_en:1;
355 #define WQCFG_PASID_IDX 2
356 #define WQCFG_PRIVL_IDX 2
357 #define WQCFG_OCCUP_IDX 6
359 #define WQCFG_OCCUP_MASK 0xffff
362 * This macro calculates the offset into the WQCFG register
363 * idxd - struct idxd *
365 * ofs - the index of the 32b dword for the config register
367 * The WQCFG register block is divided into groups per each wq. The n index
368 * allows us to move to the register group that's for that particular wq.
369 * Each register is 32bits. The ofs gives us the number of register to access.
371 #define WQCFG_OFFSET(_idxd_dev, n, ofs) \
373 typeof(_idxd_dev) __idxd_dev = (_idxd_dev); \
374 (__idxd_dev)->wqcfg_offset + (n) * (__idxd_dev)->wqcfg_size + sizeof(u32) * (ofs); \
377 #define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32))
379 #define GRPCFG_SIZE 64
380 #define GRPWQCFG_STRIDES 4
383 * This macro calculates the offset into the GRPCFG register
384 * idxd - struct idxd *
386 * ofs - the index of the 32b dword for the config register
388 * The WQCFG register block is divided into groups per each wq. The n index
389 * allows us to move to the register group that's for that particular wq.
390 * Each register is 32bits. The ofs gives us the number of register to access.
392 #define GRPWQCFG_OFFSET(idxd_dev, n, ofs) ((idxd_dev)->grpcfg_offset +\
393 (n) * GRPCFG_SIZE + sizeof(u64) * (ofs))
394 #define GRPENGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 32)
395 #define GRPFLGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 40)
397 /* Following is performance monitor registers */
398 #define IDXD_PERFCAP_OFFSET 0x0
401 u64 num_perf_counter:6;
404 u64 num_event_category:4;
405 u64 global_event_category:16;
408 u64 cap_per_counter:1;
409 u64 writeable_counter:1;
410 u64 counter_freeze:1;
411 u64 overflow_interrupt:1;
417 #define IDXD_EVNTCAP_OFFSET 0x80
429 u32 event_category:4;
436 #define IDXD_CNTRCAP_OFFSET 0x800
437 struct idxd_cntrcap {
446 struct idxd_event events[];
449 #define IDXD_PERFRST_OFFSET 0x10
452 u32 perfrst_config:1;
453 u32 perfrst_counter:1;
459 #define IDXD_OVFSTATUS_OFFSET 0x30
460 #define IDXD_PERFFRZ_OFFSET 0x20
461 #define IDXD_CNTRCFG_OFFSET 0x100
466 u64 global_freeze_ovf:1;
468 u64 event_category:4;
476 #define IDXD_FLTCFG_OFFSET 0x300
478 #define IDXD_CNTRDATA_OFFSET 0x200
479 union idxd_cntrdata {
481 u64 event_count_value;