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 IDXD_MMIO_BAR 0
12 #define IDXD_PORTAL_SIZE PAGE_SIZE
14 /* MMIO Device BAR0 Registers */
15 #define IDXD_VER_OFFSET 0x00
16 #define IDXD_VER_MAJOR_MASK 0xf0
17 #define IDXD_VER_MINOR_MASK 0x0f
18 #define GET_IDXD_VER_MAJOR(x) (((x) & IDXD_VER_MAJOR_MASK) >> 4)
19 #define GET_IDXD_VER_MINOR(x) ((x) & IDXD_VER_MINOR_MASK)
25 u64 cache_control_mem:1;
26 u64 cache_control_cache:1;
33 u64 max_batch_shift:4;
36 u64 max_descs_per_engine:8;
41 #define IDXD_GENCAP_OFFSET 0x10
59 #define IDXD_WQCAP_OFFSET 0x20
60 #define IDXD_WQCFG_MIN 5
72 #define IDXD_GRPCAP_OFFSET 0x30
74 union engine_cap_reg {
82 #define IDXD_ENGCAP_OFFSET 0x38
84 #define IDXD_OPCAP_NOOP 0x0001
85 #define IDXD_OPCAP_BATCH 0x0002
86 #define IDXD_OPCAP_MEMMOVE 0x0008
91 #define IDXD_OPCAP_OFFSET 0x40
93 #define IDXD_TABLE_OFFSET 0x60
106 #define IDXD_TABLE_MULT 0x100
108 #define IDXD_GENCFG_OFFSET 0x80
119 #define IDXD_GENCTRL_OFFSET 0x88
122 u32 softerr_int_en:1;
129 #define IDXD_GENSTATS_OFFSET 0x90
139 enum idxd_device_status_state {
140 IDXD_DEVICE_STATE_DISABLED = 0,
141 IDXD_DEVICE_STATE_ENABLED,
142 IDXD_DEVICE_STATE_DRAIN,
143 IDXD_DEVICE_STATE_HALT,
146 enum idxd_device_reset_type {
147 IDXD_DEVICE_RESET_SOFTWARE = 0,
148 IDXD_DEVICE_RESET_FLR,
149 IDXD_DEVICE_RESET_WARM,
150 IDXD_DEVICE_RESET_COLD,
153 #define IDXD_INTCAUSE_OFFSET 0x98
154 #define IDXD_INTC_ERR 0x01
155 #define IDXD_INTC_CMD 0x02
156 #define IDXD_INTC_OCCUPY 0x04
157 #define IDXD_INTC_PERFMON_OVFL 0x08
159 #define IDXD_CMD_OFFSET 0xa0
160 union idxd_command_reg {
171 IDXD_CMD_ENABLE_DEVICE = 1,
172 IDXD_CMD_DISABLE_DEVICE,
175 IDXD_CMD_RESET_DEVICE,
181 IDXD_CMD_DRAIN_PASID,
182 IDXD_CMD_ABORT_PASID,
183 IDXD_CMD_REQUEST_INT_HANDLE,
184 IDXD_CMD_RELEASE_INT_HANDLE,
187 #define CMD_INT_HANDLE_IMS 0x10000
189 #define IDXD_CMDSTS_OFFSET 0xa8
199 #define IDXD_CMDSTS_ACTIVE 0x80000000
200 #define IDXD_CMDSTS_ERR_MASK 0xff
201 #define IDXD_CMDSTS_RES_SHIFT 8
203 enum idxd_cmdsts_err {
204 IDXD_CMDSTS_SUCCESS = 0,
205 IDXD_CMDSTS_INVAL_CMD,
206 IDXD_CMDSTS_INVAL_WQIDX,
208 /* enable device errors */
209 IDXD_CMDSTS_ERR_DEV_ENABLED = 0x10,
210 IDXD_CMDSTS_ERR_CONFIG,
211 IDXD_CMDSTS_ERR_BUSMASTER_EN,
212 IDXD_CMDSTS_ERR_PASID_INVAL,
213 IDXD_CMDSTS_ERR_WQ_SIZE_ERANGE,
214 IDXD_CMDSTS_ERR_GRP_CONFIG,
215 IDXD_CMDSTS_ERR_GRP_CONFIG2,
216 IDXD_CMDSTS_ERR_GRP_CONFIG3,
217 IDXD_CMDSTS_ERR_GRP_CONFIG4,
218 /* enable wq errors */
219 IDXD_CMDSTS_ERR_DEV_NOTEN = 0x20,
220 IDXD_CMDSTS_ERR_WQ_ENABLED,
221 IDXD_CMDSTS_ERR_WQ_SIZE,
222 IDXD_CMDSTS_ERR_WQ_PRIOR,
223 IDXD_CMDSTS_ERR_WQ_MODE,
224 IDXD_CMDSTS_ERR_BOF_EN,
225 IDXD_CMDSTS_ERR_PASID_EN,
226 IDXD_CMDSTS_ERR_MAX_BATCH_SIZE,
227 IDXD_CMDSTS_ERR_MAX_XFER_SIZE,
228 /* disable device errors */
229 IDXD_CMDSTS_ERR_DIS_DEV_EN = 0x31,
230 /* disable WQ, drain WQ, abort WQ, reset WQ */
231 IDXD_CMDSTS_ERR_DEV_NOT_EN,
232 /* request interrupt handle */
233 IDXD_CMDSTS_ERR_INVAL_INT_IDX = 0x41,
234 IDXD_CMDSTS_ERR_NO_HANDLE,
237 #define IDXD_CMDCAP_OFFSET 0xb0
239 #define IDXD_SWERR_OFFSET 0xc0
240 #define IDXD_SWERR_VALID 0x00000001
241 #define IDXD_SWERR_OVERFLOW 0x00000002
242 #define IDXD_SWERR_ACK (IDXD_SWERR_VALID | IDXD_SWERR_OVERFLOW)
262 u64 invalid_flags:32;
287 u32 use_token_limit:1;
288 u32 tokens_reserved:8;
290 u32 tokens_allowed:8;
299 union group_flags flags;
313 u32 mode:1; /* shared or dedicated */
314 u32 bof:1; /* block on fault */
315 u32 wq_ats_disable:1;
324 u32 max_xfer_shift:5;
325 u32 max_batch_shift:4;
330 u16 occupancy_table_sel:1;
335 u16 occupancy_int_en:1;
351 #define WQCFG_PASID_IDX 2
354 * This macro calculates the offset into the WQCFG register
355 * idxd - struct idxd *
357 * ofs - the index of the 32b dword for the config register
359 * The WQCFG register block is divided into groups per each wq. The n index
360 * allows us to move to the register group that's for that particular wq.
361 * Each register is 32bits. The ofs gives us the number of register to access.
363 #define WQCFG_OFFSET(_idxd_dev, n, ofs) \
365 typeof(_idxd_dev) __idxd_dev = (_idxd_dev); \
366 (__idxd_dev)->wqcfg_offset + (n) * (__idxd_dev)->wqcfg_size + sizeof(u32) * (ofs); \
369 #define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32))
371 #define GRPCFG_SIZE 64
372 #define GRPWQCFG_STRIDES 4
375 * This macro calculates the offset into the GRPCFG register
376 * idxd - struct idxd *
378 * ofs - the index of the 32b dword for the config register
380 * The WQCFG register block is divided into groups per each wq. The n index
381 * allows us to move to the register group that's for that particular wq.
382 * Each register is 32bits. The ofs gives us the number of register to access.
384 #define GRPWQCFG_OFFSET(idxd_dev, n, ofs) ((idxd_dev)->grpcfg_offset +\
385 (n) * GRPCFG_SIZE + sizeof(u64) * (ofs))
386 #define GRPENGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 32)
387 #define GRPFLGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 40)
389 /* Following is performance monitor registers */
390 #define IDXD_PERFCAP_OFFSET 0x0
393 u64 num_perf_counter:6;
396 u64 num_event_category:4;
397 u64 global_event_category:16;
400 u64 cap_per_counter:1;
401 u64 writeable_counter:1;
402 u64 counter_freeze:1;
403 u64 overflow_interrupt:1;
409 #define IDXD_EVNTCAP_OFFSET 0x80
421 u32 event_category:4;
428 #define IDXD_CNTRCAP_OFFSET 0x800
429 struct idxd_cntrcap {
438 struct idxd_event events[];
441 #define IDXD_PERFRST_OFFSET 0x10
444 u32 perfrst_config:1;
445 u32 perfrst_counter:1;
451 #define IDXD_OVFSTATUS_OFFSET 0x30
452 #define IDXD_PERFFRZ_OFFSET 0x20
453 #define IDXD_CNTRCFG_OFFSET 0x100
458 u64 global_freeze_ovf:1;
460 u64 event_category:4;
468 #define IDXD_FLTCFG_OFFSET 0x300
470 #define IDXD_CNTRDATA_OFFSET 0x200
471 union idxd_cntrdata {
473 u64 event_count_value;