1bfe1d560SDave Jiang /* SPDX-License-Identifier: GPL-2.0 */
2bfe1d560SDave Jiang /* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
3bfe1d560SDave Jiang #ifndef _IDXD_REGISTERS_H_
4bfe1d560SDave Jiang #define _IDXD_REGISTERS_H_
5bfe1d560SDave Jiang 
6003e6fafSDavid Matlack #ifdef __KERNEL__
7244da66cSDave Jiang #include <uapi/linux/idxd.h>
8003e6fafSDavid Matlack #else
9003e6fafSDavid Matlack #include <linux/idxd.h>
10003e6fafSDavid Matlack #endif
11244da66cSDave Jiang 
12bfe1d560SDave Jiang /* PCI Config */
133e482e28SFenghua Yu #define PCI_DEVICE_ID_INTEL_DSA_GNRD	0x11fb
143e482e28SFenghua Yu #define PCI_DEVICE_ID_INTEL_DSA_DMR	0x1212
153e482e28SFenghua Yu #define PCI_DEVICE_ID_INTEL_IAA_DMR	0x1216
1680a9b50bSFenghua Yu #define PCI_DEVICE_ID_INTEL_IAA_PTL	0xb02d
17c937969aSAnil S Keshavamurthy #define PCI_DEVICE_ID_INTEL_IAA_WCL	0xfd2d
183e482e28SFenghua Yu 
19ade8a86bSDave Jiang #define DEVICE_VERSION_1		0x100
20ade8a86bSDave Jiang #define DEVICE_VERSION_2		0x200
21ade8a86bSDave Jiang 
22bfe1d560SDave Jiang #define IDXD_MMIO_BAR		0
23bfe1d560SDave Jiang #define IDXD_WQ_BAR		2
248326be9fSDave Jiang #define IDXD_PORTAL_SIZE	PAGE_SIZE
25bfe1d560SDave Jiang 
26bfe1d560SDave Jiang /* MMIO Device BAR0 Registers */
27bfe1d560SDave Jiang #define IDXD_VER_OFFSET			0x00
28bfe1d560SDave Jiang #define IDXD_VER_MAJOR_MASK		0xf0
29bfe1d560SDave Jiang #define IDXD_VER_MINOR_MASK		0x0f
30bfe1d560SDave Jiang #define GET_IDXD_VER_MAJOR(x)		(((x) & IDXD_VER_MAJOR_MASK) >> 4)
31bfe1d560SDave Jiang #define GET_IDXD_VER_MINOR(x)		((x) & IDXD_VER_MINOR_MASK)
32bfe1d560SDave Jiang 
33bfe1d560SDave Jiang union gen_cap_reg {
34bfe1d560SDave Jiang 	struct {
35bfe1d560SDave Jiang 		u64 block_on_fault:1;
36bfe1d560SDave Jiang 		u64 overlap_copy:1;
37bfe1d560SDave Jiang 		u64 cache_control_mem:1;
38bfe1d560SDave Jiang 		u64 cache_control_cache:1;
39eb15e715SDave Jiang 		u64 cmd_cap:1;
40bfe1d560SDave Jiang 		u64 rsvd:3;
41bfe1d560SDave Jiang 		u64 dest_readback:1;
42bfe1d560SDave Jiang 		u64 drain_readback:1;
431649091fSDave Jiang 		u64 rsvd2:3;
441649091fSDave Jiang 		u64 evl_support:2;
452442b747SDave Jiang 		u64 batch_continuation:1;
46bfe1d560SDave Jiang 		u64 max_xfer_shift:5;
47bfe1d560SDave Jiang 		u64 max_batch_shift:4;
48bfe1d560SDave Jiang 		u64 max_ims_mult:6;
49bfe1d560SDave Jiang 		u64 config_en:1;
50c5b64b68SDave Jiang 		u64 rsvd3:32;
51bfe1d560SDave Jiang 	};
52bfe1d560SDave Jiang 	u64 bits;
530044c5fcSYi Sun };
54bfe1d560SDave Jiang #define IDXD_GENCAP_OFFSET		0x10
55bfe1d560SDave Jiang 
56bfe1d560SDave Jiang union wq_cap_reg {
57bfe1d560SDave Jiang 	struct {
58bfe1d560SDave Jiang 		u64 total_wq_size:16;
59bfe1d560SDave Jiang 		u64 num_wqs:8;
60484f910eSDave Jiang 		u64 wqcfg_size:4;
61484f910eSDave Jiang 		u64 rsvd:20;
62bfe1d560SDave Jiang 		u64 shared_mode:1;
63bfe1d560SDave Jiang 		u64 dedicated_mode:1;
6492de5fa2SDave Jiang 		u64 wq_ats_support:1;
65bfe1d560SDave Jiang 		u64 priority:1;
66bfe1d560SDave Jiang 		u64 occupancy:1;
67bfe1d560SDave Jiang 		u64 occupancy_int:1;
68b0325aefSDave Jiang 		u64 op_config:1;
69f2dc3271SDave Jiang 		u64 wq_prs_support:1;
70f2dc3271SDave Jiang 		u64 rsvd4:8;
71bfe1d560SDave Jiang 	};
72bfe1d560SDave Jiang 	u64 bits;
730044c5fcSYi Sun };
74bfe1d560SDave Jiang #define IDXD_WQCAP_OFFSET		0x20
75484f910eSDave Jiang #define IDXD_WQCFG_MIN			5
76bfe1d560SDave Jiang 
77bfe1d560SDave Jiang union group_cap_reg {
78bfe1d560SDave Jiang 	struct {
79bfe1d560SDave Jiang 		u64 num_groups:8;
807ed6f1b8SDave Jiang 		u64 total_rdbufs:8;	/* formerly total_tokens */
817ed6f1b8SDave Jiang 		u64 rdbuf_ctrl:1;	/* formerly token_en */
827ed6f1b8SDave Jiang 		u64 rdbuf_limit:1;	/* formerly token_limit */
831f273752SDave Jiang 		u64 progress_limit:1;	/* descriptor and batch descriptor */
841f273752SDave Jiang 		u64 rsvd:45;
85bfe1d560SDave Jiang 	};
86bfe1d560SDave Jiang 	u64 bits;
870044c5fcSYi Sun };
88bfe1d560SDave Jiang #define IDXD_GRPCAP_OFFSET		0x30
89bfe1d560SDave Jiang 
90bfe1d560SDave Jiang union engine_cap_reg {
91bfe1d560SDave Jiang 	struct {
92bfe1d560SDave Jiang 		u64 num_engines:8;
93bfe1d560SDave Jiang 		u64 rsvd:56;
94bfe1d560SDave Jiang 	};
95bfe1d560SDave Jiang 	u64 bits;
960044c5fcSYi Sun };
97bfe1d560SDave Jiang 
98bfe1d560SDave Jiang #define IDXD_ENGCAP_OFFSET		0x38
99bfe1d560SDave Jiang 
100bfe1d560SDave Jiang #define IDXD_OPCAP_NOOP			0x0001
101bfe1d560SDave Jiang #define IDXD_OPCAP_BATCH			0x0002
102bfe1d560SDave Jiang #define IDXD_OPCAP_MEMMOVE		0x0008
103bfe1d560SDave Jiang struct opcap {
104bfe1d560SDave Jiang 	u64 bits[4];
105bfe1d560SDave Jiang };
106bfe1d560SDave Jiang 
107a8563a33SDave Jiang #define IDXD_MAX_OPCAP_BITS		256U
108a8563a33SDave Jiang 
109bfe1d560SDave Jiang #define IDXD_OPCAP_OFFSET		0x40
110bfe1d560SDave Jiang 
111bfe1d560SDave Jiang #define IDXD_TABLE_OFFSET		0x60
112bfe1d560SDave Jiang union offsets_reg {
113bfe1d560SDave Jiang 	struct {
114bfe1d560SDave Jiang 		u64 grpcfg:16;
115bfe1d560SDave Jiang 		u64 wqcfg:16;
116bfe1d560SDave Jiang 		u64 msix_perm:16;
117bfe1d560SDave Jiang 		u64 ims:16;
118bfe1d560SDave Jiang 		u64 perfmon:16;
119bfe1d560SDave Jiang 		u64 rsvd:48;
120bfe1d560SDave Jiang 	};
121bfe1d560SDave Jiang 	u64 bits[2];
1220044c5fcSYi Sun };
123bfe1d560SDave Jiang 
1242f8417a9SDave Jiang #define IDXD_TABLE_MULT			0x100
1252f8417a9SDave Jiang 
126bfe1d560SDave Jiang #define IDXD_GENCFG_OFFSET		0x80
127bfe1d560SDave Jiang union gencfg_reg {
128bfe1d560SDave Jiang 	struct {
1297ed6f1b8SDave Jiang 		u32 rdbuf_limit:8;
130bfe1d560SDave Jiang 		u32 rsvd:4;
131bfe1d560SDave Jiang 		u32 user_int_en:1;
132244da66cSDave Jiang 		u32 evl_en:1;
133244da66cSDave Jiang 		u32 rsvd2:18;
134bfe1d560SDave Jiang 	};
135bfe1d560SDave Jiang 	u32 bits;
1360044c5fcSYi Sun };
137bfe1d560SDave Jiang 
138bfe1d560SDave Jiang #define IDXD_GENCTRL_OFFSET		0x88
139bfe1d560SDave Jiang union genctrl_reg {
140bfe1d560SDave Jiang 	struct {
141bfe1d560SDave Jiang 		u32 softerr_int_en:1;
1425b0c68c4SDave Jiang 		u32 halt_int_en:1;
143244da66cSDave Jiang 		u32 evl_int_en:1;
144244da66cSDave Jiang 		u32 rsvd:29;
145bfe1d560SDave Jiang 	};
146bfe1d560SDave Jiang 	u32 bits;
1470044c5fcSYi Sun };
148bfe1d560SDave Jiang 
149bfe1d560SDave Jiang #define IDXD_GENSTATS_OFFSET		0x90
150bfe1d560SDave Jiang union gensts_reg {
151bfe1d560SDave Jiang 	struct {
152bfe1d560SDave Jiang 		u32 state:2;
153bfe1d560SDave Jiang 		u32 reset_type:2;
154bfe1d560SDave Jiang 		u32 rsvd:28;
155bfe1d560SDave Jiang 	};
156bfe1d560SDave Jiang 	u32 bits;
1570044c5fcSYi Sun };
158bfe1d560SDave Jiang 
159bfe1d560SDave Jiang enum idxd_device_status_state {
160bfe1d560SDave Jiang 	IDXD_DEVICE_STATE_DISABLED = 0,
161bfe1d560SDave Jiang 	IDXD_DEVICE_STATE_ENABLED,
162bfe1d560SDave Jiang 	IDXD_DEVICE_STATE_DRAIN,
163bfe1d560SDave Jiang 	IDXD_DEVICE_STATE_HALT,
164bfe1d560SDave Jiang };
165bfe1d560SDave Jiang 
166bfe1d560SDave Jiang enum idxd_device_reset_type {
167bfe1d560SDave Jiang 	IDXD_DEVICE_RESET_SOFTWARE = 0,
168bfe1d560SDave Jiang 	IDXD_DEVICE_RESET_FLR,
169bfe1d560SDave Jiang 	IDXD_DEVICE_RESET_WARM,
170bfe1d560SDave Jiang 	IDXD_DEVICE_RESET_COLD,
171bfe1d560SDave Jiang };
172bfe1d560SDave Jiang 
173bfe1d560SDave Jiang #define IDXD_INTCAUSE_OFFSET		0x98
174bfe1d560SDave Jiang #define IDXD_INTC_ERR			0x01
175bfe1d560SDave Jiang #define IDXD_INTC_CMD			0x02
176bfe1d560SDave Jiang #define IDXD_INTC_OCCUPY			0x04
177bfe1d560SDave Jiang #define IDXD_INTC_PERFMON_OVFL		0x08
17888d97ea8SDave Jiang #define IDXD_INTC_HALT_STATE		0x10
1792f431ba9SDave Jiang #define IDXD_INTC_EVL			0x20
18056fc39f5SDave Jiang #define IDXD_INTC_INT_HANDLE_REVOKED	0x80000000
181bfe1d560SDave Jiang 
182bfe1d560SDave Jiang #define IDXD_CMD_OFFSET			0xa0
183bfe1d560SDave Jiang union idxd_command_reg {
184bfe1d560SDave Jiang 	struct {
185bfe1d560SDave Jiang 		u32 operand:20;
186bfe1d560SDave Jiang 		u32 cmd:5;
187bfe1d560SDave Jiang 		u32 rsvd:6;
188bfe1d560SDave Jiang 		u32 int_req:1;
189bfe1d560SDave Jiang 	};
190bfe1d560SDave Jiang 	u32 bits;
1910044c5fcSYi Sun };
192bfe1d560SDave Jiang 
193bfe1d560SDave Jiang enum idxd_cmd {
194bfe1d560SDave Jiang 	IDXD_CMD_ENABLE_DEVICE = 1,
195bfe1d560SDave Jiang 	IDXD_CMD_DISABLE_DEVICE,
196bfe1d560SDave Jiang 	IDXD_CMD_DRAIN_ALL,
197bfe1d560SDave Jiang 	IDXD_CMD_ABORT_ALL,
198bfe1d560SDave Jiang 	IDXD_CMD_RESET_DEVICE,
199bfe1d560SDave Jiang 	IDXD_CMD_ENABLE_WQ,
200bfe1d560SDave Jiang 	IDXD_CMD_DISABLE_WQ,
201bfe1d560SDave Jiang 	IDXD_CMD_DRAIN_WQ,
202bfe1d560SDave Jiang 	IDXD_CMD_ABORT_WQ,
203bfe1d560SDave Jiang 	IDXD_CMD_RESET_WQ,
204bfe1d560SDave Jiang 	IDXD_CMD_DRAIN_PASID,
205bfe1d560SDave Jiang 	IDXD_CMD_ABORT_PASID,
206bfe1d560SDave Jiang 	IDXD_CMD_REQUEST_INT_HANDLE,
207eb15e715SDave Jiang 	IDXD_CMD_RELEASE_INT_HANDLE,
208bfe1d560SDave Jiang };
209bfe1d560SDave Jiang 
210eb15e715SDave Jiang #define CMD_INT_HANDLE_IMS		0x10000
211eb15e715SDave Jiang 
212bfe1d560SDave Jiang #define IDXD_CMDSTS_OFFSET		0xa8
213bfe1d560SDave Jiang union cmdsts_reg {
214bfe1d560SDave Jiang 	struct {
215bfe1d560SDave Jiang 		u8 err;
216bfe1d560SDave Jiang 		u16 result;
217bfe1d560SDave Jiang 		u8 rsvd:7;
218bfe1d560SDave Jiang 		u8 active:1;
219bfe1d560SDave Jiang 	};
220bfe1d560SDave Jiang 	u32 bits;
2210044c5fcSYi Sun };
222bfe1d560SDave Jiang #define IDXD_CMDSTS_ACTIVE		0x80000000
223eb15e715SDave Jiang #define IDXD_CMDSTS_ERR_MASK		0xff
224eb15e715SDave Jiang #define IDXD_CMDSTS_RES_SHIFT		8
225bfe1d560SDave Jiang 
226bfe1d560SDave Jiang enum idxd_cmdsts_err {
227bfe1d560SDave Jiang 	IDXD_CMDSTS_SUCCESS = 0,
228bfe1d560SDave Jiang 	IDXD_CMDSTS_INVAL_CMD,
229bfe1d560SDave Jiang 	IDXD_CMDSTS_INVAL_WQIDX,
230bfe1d560SDave Jiang 	IDXD_CMDSTS_HW_ERR,
231bfe1d560SDave Jiang 	/* enable device errors */
232bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_DEV_ENABLED = 0x10,
233bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_CONFIG,
234bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_BUSMASTER_EN,
235bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_PASID_INVAL,
236bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_WQ_SIZE_ERANGE,
237bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_GRP_CONFIG,
238bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_GRP_CONFIG2,
239bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_GRP_CONFIG3,
240bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_GRP_CONFIG4,
241bfe1d560SDave Jiang 	/* enable wq errors */
242bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_DEV_NOTEN = 0x20,
243bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_WQ_ENABLED,
244bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_WQ_SIZE,
245bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_WQ_PRIOR,
246bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_WQ_MODE,
247bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_BOF_EN,
248bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_PASID_EN,
249bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_MAX_BATCH_SIZE,
250bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_MAX_XFER_SIZE,
251bfe1d560SDave Jiang 	/* disable device errors */
252bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_DIS_DEV_EN = 0x31,
253bfe1d560SDave Jiang 	/* disable WQ, drain WQ, abort WQ, reset WQ */
254bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_DEV_NOT_EN,
255bfe1d560SDave Jiang 	/* request interrupt handle */
256bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_INVAL_INT_IDX = 0x41,
257bfe1d560SDave Jiang 	IDXD_CMDSTS_ERR_NO_HANDLE,
258bfe1d560SDave Jiang };
259bfe1d560SDave Jiang 
260eb15e715SDave Jiang #define IDXD_CMDCAP_OFFSET		0xb0
261eb15e715SDave Jiang 
262bfe1d560SDave Jiang #define IDXD_SWERR_OFFSET		0xc0
263bfe1d560SDave Jiang #define IDXD_SWERR_VALID		0x00000001
264bfe1d560SDave Jiang #define IDXD_SWERR_OVERFLOW		0x00000002
265bfe1d560SDave Jiang #define IDXD_SWERR_ACK			(IDXD_SWERR_VALID | IDXD_SWERR_OVERFLOW)
266bfe1d560SDave Jiang union sw_err_reg {
267bfe1d560SDave Jiang 	struct {
268bfe1d560SDave Jiang 		u64 valid:1;
269bfe1d560SDave Jiang 		u64 overflow:1;
270bfe1d560SDave Jiang 		u64 desc_valid:1;
271bfe1d560SDave Jiang 		u64 wq_idx_valid:1;
272bfe1d560SDave Jiang 		u64 batch:1;
273bfe1d560SDave Jiang 		u64 fault_rw:1;
274bfe1d560SDave Jiang 		u64 priv:1;
275bfe1d560SDave Jiang 		u64 rsvd:1;
276bfe1d560SDave Jiang 		u64 error:8;
277bfe1d560SDave Jiang 		u64 wq_idx:8;
278bfe1d560SDave Jiang 		u64 rsvd2:8;
279bfe1d560SDave Jiang 		u64 operation:8;
280bfe1d560SDave Jiang 		u64 pasid:20;
281bfe1d560SDave Jiang 		u64 rsvd3:4;
282bfe1d560SDave Jiang 
283bfe1d560SDave Jiang 		u64 batch_idx:16;
284bfe1d560SDave Jiang 		u64 rsvd4:16;
285bfe1d560SDave Jiang 		u64 invalid_flags:32;
286bfe1d560SDave Jiang 
287bfe1d560SDave Jiang 		u64 fault_addr;
288bfe1d560SDave Jiang 
289bfe1d560SDave Jiang 		u64 rsvd5;
290bfe1d560SDave Jiang 	};
291bfe1d560SDave Jiang 	u64 bits[4];
2920044c5fcSYi Sun };
293bfe1d560SDave Jiang 
2949f0d99b3SDave Jiang union iaa_cap_reg {
2959f0d99b3SDave Jiang 	struct {
2969f0d99b3SDave Jiang 		u64 dec_aecs_format_ver:1;
2979f0d99b3SDave Jiang 		u64 drop_init_bits:1;
2989f0d99b3SDave Jiang 		u64 chaining:1;
2999f0d99b3SDave Jiang 		u64 force_array_output_mod:1;
3009f0d99b3SDave Jiang 		u64 load_part_aecs:1;
3019f0d99b3SDave Jiang 		u64 comp_early_abort:1;
3029f0d99b3SDave Jiang 		u64 nested_comp:1;
3039f0d99b3SDave Jiang 		u64 diction_comp:1;
3049f0d99b3SDave Jiang 		u64 header_gen:1;
3059f0d99b3SDave Jiang 		u64 crypto_gcm:1;
3069f0d99b3SDave Jiang 		u64 crypto_cfb:1;
3079f0d99b3SDave Jiang 		u64 crypto_xts:1;
3089f0d99b3SDave Jiang 		u64 rsvd:52;
3099f0d99b3SDave Jiang 	};
3109f0d99b3SDave Jiang 	u64 bits;
3110044c5fcSYi Sun };
3129f0d99b3SDave Jiang 
3139f0d99b3SDave Jiang #define IDXD_IAACAP_OFFSET	0x180
3149f0d99b3SDave Jiang 
315244da66cSDave Jiang #define IDXD_EVLCFG_OFFSET	0xe0
316244da66cSDave Jiang union evlcfg_reg {
317244da66cSDave Jiang 	struct {
318244da66cSDave Jiang 		u64 pasid_en:1;
319244da66cSDave Jiang 		u64 priv:1;
320244da66cSDave Jiang 		u64 rsvd:10;
321244da66cSDave Jiang 		u64 base_addr:52;
322244da66cSDave Jiang 
323244da66cSDave Jiang 		u64 size:16;
324244da66cSDave Jiang 		u64 pasid:20;
325244da66cSDave Jiang 		u64 rsvd2:28;
326244da66cSDave Jiang 	};
327244da66cSDave Jiang 	u64 bits[2];
3280044c5fcSYi Sun };
329244da66cSDave Jiang 
3301649091fSDave Jiang #define IDXD_EVL_SIZE_MIN	0x0040
3311649091fSDave Jiang #define IDXD_EVL_SIZE_MAX	0xffff
3321649091fSDave Jiang 
333bfe1d560SDave Jiang union msix_perm {
334bfe1d560SDave Jiang 	struct {
335bfe1d560SDave Jiang 		u32 rsvd:2;
336bfe1d560SDave Jiang 		u32 ignore:1;
337bfe1d560SDave Jiang 		u32 pasid_en:1;
338bfe1d560SDave Jiang 		u32 rsvd2:8;
339bfe1d560SDave Jiang 		u32 pasid:20;
340bfe1d560SDave Jiang 	};
341bfe1d560SDave Jiang 	u32 bits;
3420044c5fcSYi Sun };
343bfe1d560SDave Jiang 
344bfe1d560SDave Jiang union group_flags {
345bfe1d560SDave Jiang 	struct {
3461f273752SDave Jiang 		u64 tc_a:3;
3471f273752SDave Jiang 		u64 tc_b:3;
3481f273752SDave Jiang 		u64 rsvd:1;
3491f273752SDave Jiang 		u64 use_rdbuf_limit:1;
3501f273752SDave Jiang 		u64 rdbufs_reserved:8;
3511f273752SDave Jiang 		u64 rsvd2:4;
3521f273752SDave Jiang 		u64 rdbufs_allowed:8;
3531f273752SDave Jiang 		u64 rsvd3:4;
3541f273752SDave Jiang 		u64 desc_progress_limit:2;
3557ca68fa3SDave Jiang 		u64 rsvd4:2;
3567ca68fa3SDave Jiang 		u64 batch_progress_limit:2;
3577ca68fa3SDave Jiang 		u64 rsvd5:26;
358bfe1d560SDave Jiang 	};
3591f273752SDave Jiang 	u64 bits;
3600044c5fcSYi Sun };
361bfe1d560SDave Jiang 
362bfe1d560SDave Jiang struct grpcfg {
363bfe1d560SDave Jiang 	u64 wqs[4];
364bfe1d560SDave Jiang 	u64 engines;
365bfe1d560SDave Jiang 	union group_flags flags;
3660044c5fcSYi Sun };
367bfe1d560SDave Jiang 
368bfe1d560SDave Jiang union wqcfg {
369bfe1d560SDave Jiang 	struct {
370bfe1d560SDave Jiang 		/* bytes 0-3 */
371bfe1d560SDave Jiang 		u16 wq_size;
372bfe1d560SDave Jiang 		u16 rsvd;
373bfe1d560SDave Jiang 
374bfe1d560SDave Jiang 		/* bytes 4-7 */
375bfe1d560SDave Jiang 		u16 wq_thresh;
376bfe1d560SDave Jiang 		u16 rsvd1;
377bfe1d560SDave Jiang 
378bfe1d560SDave Jiang 		/* bytes 8-11 */
379bfe1d560SDave Jiang 		u32 mode:1;	/* shared or dedicated */
380bfe1d560SDave Jiang 		u32 bof:1;	/* block on fault */
38192de5fa2SDave Jiang 		u32 wq_ats_disable:1;
382f2dc3271SDave Jiang 		u32 wq_prs_disable:1;
383bfe1d560SDave Jiang 		u32 priority:4;
384bfe1d560SDave Jiang 		u32 pasid:20;
385bfe1d560SDave Jiang 		u32 pasid_en:1;
386bfe1d560SDave Jiang 		u32 priv:1;
387bfe1d560SDave Jiang 		u32 rsvd3:2;
388bfe1d560SDave Jiang 
389bfe1d560SDave Jiang 		/* bytes 12-15 */
390bfe1d560SDave Jiang 		u32 max_xfer_shift:5;
391bfe1d560SDave Jiang 		u32 max_batch_shift:4;
392bfe1d560SDave Jiang 		u32 rsvd4:23;
393bfe1d560SDave Jiang 
394bfe1d560SDave Jiang 		/* bytes 16-19 */
395bfe1d560SDave Jiang 		u16 occupancy_inth;
396bfe1d560SDave Jiang 		u16 occupancy_table_sel:1;
397bfe1d560SDave Jiang 		u16 rsvd5:15;
398bfe1d560SDave Jiang 
399bfe1d560SDave Jiang 		/* bytes 20-23 */
400bfe1d560SDave Jiang 		u16 occupancy_limit;
401bfe1d560SDave Jiang 		u16 occupancy_int_en:1;
402bfe1d560SDave Jiang 		u16 rsvd6:15;
403bfe1d560SDave Jiang 
404bfe1d560SDave Jiang 		/* bytes 24-27 */
405bfe1d560SDave Jiang 		u16 occupancy;
406bfe1d560SDave Jiang 		u16 occupancy_int:1;
407bfe1d560SDave Jiang 		u16 rsvd7:12;
408bfe1d560SDave Jiang 		u16 mode_support:1;
409bfe1d560SDave Jiang 		u16 wq_state:2;
410bfe1d560SDave Jiang 
411bfe1d560SDave Jiang 		/* bytes 28-31 */
412bfe1d560SDave Jiang 		u32 rsvd8;
413b0325aefSDave Jiang 
414b0325aefSDave Jiang 		/* bytes 32-63 */
415b0325aefSDave Jiang 		u64 op_config[4];
416bfe1d560SDave Jiang 	};
417b0325aefSDave Jiang 	u32 bits[16];
4180044c5fcSYi Sun };
419484f910eSDave Jiang 
4208e50d392SDave Jiang #define WQCFG_PASID_IDX                2
4213157dd0aSDave Jiang #define WQCFG_PRIVL_IDX		2
422e753a64bSDave Jiang #define WQCFG_OCCUP_IDX		6
423e753a64bSDave Jiang 
424e753a64bSDave Jiang #define WQCFG_OCCUP_MASK	0xffff
4258e50d392SDave Jiang 
426484f910eSDave Jiang /*
427484f910eSDave Jiang  * This macro calculates the offset into the WQCFG register
428484f910eSDave Jiang  * idxd - struct idxd *
429484f910eSDave Jiang  * n - wq id
430484f910eSDave Jiang  * ofs - the index of the 32b dword for the config register
431484f910eSDave Jiang  *
432484f910eSDave Jiang  * The WQCFG register block is divided into groups per each wq. The n index
433484f910eSDave Jiang  * allows us to move to the register group that's for that particular wq.
434484f910eSDave Jiang  * Each register is 32bits. The ofs gives us the number of register to access.
435484f910eSDave Jiang  */
436484f910eSDave Jiang #define WQCFG_OFFSET(_idxd_dev, n, ofs) \
437484f910eSDave Jiang ({\
438484f910eSDave Jiang 	typeof(_idxd_dev) __idxd_dev = (_idxd_dev);	\
439484f910eSDave Jiang 	(__idxd_dev)->wqcfg_offset + (n) * (__idxd_dev)->wqcfg_size + sizeof(u32) * (ofs);	\
440484f910eSDave Jiang })
441484f910eSDave Jiang 
442484f910eSDave Jiang #define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32))
443484f910eSDave Jiang 
4445a712701SDave Jiang #define GRPCFG_SIZE		64
4455a712701SDave Jiang #define GRPWQCFG_STRIDES	4
4465a712701SDave Jiang 
4475a712701SDave Jiang /*
4485a712701SDave Jiang  * This macro calculates the offset into the GRPCFG register
4495a712701SDave Jiang  * idxd - struct idxd *
4500c154698SGuanjun  * n - group id
4510c154698SGuanjun  * ofs - the index of the 64b qword for the config register
4525a712701SDave Jiang  *
4530c154698SGuanjun  * The GRPCFG register block is divided into three sub-registers, which
4540c154698SGuanjun  * are GRPWQCFG, GRPENGCFG and GRPFLGCFG. The n index allows us to move
4550c154698SGuanjun  * to the register block that contains the three sub-registers.
4560c154698SGuanjun  * Each register block is 64bits. And the ofs gives us the offset
4570c154698SGuanjun  * within the GRPWQCFG register to access.
4585a712701SDave Jiang  */
4595a712701SDave Jiang #define GRPWQCFG_OFFSET(idxd_dev, n, ofs) ((idxd_dev)->grpcfg_offset +\
4605a712701SDave Jiang 					   (n) * GRPCFG_SIZE + sizeof(u64) * (ofs))
4615a712701SDave Jiang #define GRPENGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 32)
4625a712701SDave Jiang #define GRPFLGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 40)
4635a712701SDave Jiang 
46481dd4d4dSTom Zanussi /* Following is performance monitor registers */
46581dd4d4dSTom Zanussi #define IDXD_PERFCAP_OFFSET		0x0
46681dd4d4dSTom Zanussi union idxd_perfcap {
46781dd4d4dSTom Zanussi 	struct {
46881dd4d4dSTom Zanussi 		u64 num_perf_counter:6;
46981dd4d4dSTom Zanussi 		u64 rsvd1:2;
47081dd4d4dSTom Zanussi 		u64 counter_width:8;
47181dd4d4dSTom Zanussi 		u64 num_event_category:4;
47281dd4d4dSTom Zanussi 		u64 global_event_category:16;
47381dd4d4dSTom Zanussi 		u64 filter:8;
47481dd4d4dSTom Zanussi 		u64 rsvd2:8;
47581dd4d4dSTom Zanussi 		u64 cap_per_counter:1;
47681dd4d4dSTom Zanussi 		u64 writeable_counter:1;
47781dd4d4dSTom Zanussi 		u64 counter_freeze:1;
47881dd4d4dSTom Zanussi 		u64 overflow_interrupt:1;
47981dd4d4dSTom Zanussi 		u64 rsvd3:8;
48081dd4d4dSTom Zanussi 	};
48181dd4d4dSTom Zanussi 	u64 bits;
4820044c5fcSYi Sun };
48381dd4d4dSTom Zanussi 
48481dd4d4dSTom Zanussi #define IDXD_EVNTCAP_OFFSET		0x80
48581dd4d4dSTom Zanussi union idxd_evntcap {
48681dd4d4dSTom Zanussi 	struct {
48781dd4d4dSTom Zanussi 		u64 events:28;
48881dd4d4dSTom Zanussi 		u64 rsvd:36;
48981dd4d4dSTom Zanussi 	};
49081dd4d4dSTom Zanussi 	u64 bits;
4910044c5fcSYi Sun };
49281dd4d4dSTom Zanussi 
49381dd4d4dSTom Zanussi struct idxd_event {
49481dd4d4dSTom Zanussi 	union {
49581dd4d4dSTom Zanussi 		struct {
49681dd4d4dSTom Zanussi 			u32 event_category:4;
49781dd4d4dSTom Zanussi 			u32 events:28;
49881dd4d4dSTom Zanussi 		};
49981dd4d4dSTom Zanussi 		u32 val;
50081dd4d4dSTom Zanussi 	};
5010044c5fcSYi Sun };
50281dd4d4dSTom Zanussi 
50381dd4d4dSTom Zanussi #define IDXD_CNTRCAP_OFFSET		0x800
50481dd4d4dSTom Zanussi struct idxd_cntrcap {
50581dd4d4dSTom Zanussi 	union {
50681dd4d4dSTom Zanussi 		struct {
50781dd4d4dSTom Zanussi 			u32 counter_width:8;
50881dd4d4dSTom Zanussi 			u32 rsvd:20;
50981dd4d4dSTom Zanussi 			u32 num_events:4;
51081dd4d4dSTom Zanussi 		};
51181dd4d4dSTom Zanussi 		u32 val;
51281dd4d4dSTom Zanussi 	};
51381dd4d4dSTom Zanussi 	struct idxd_event events[];
5140044c5fcSYi Sun };
51581dd4d4dSTom Zanussi 
51681dd4d4dSTom Zanussi #define IDXD_PERFRST_OFFSET		0x10
51781dd4d4dSTom Zanussi union idxd_perfrst {
51881dd4d4dSTom Zanussi 	struct {
51981dd4d4dSTom Zanussi 		u32 perfrst_config:1;
52081dd4d4dSTom Zanussi 		u32 perfrst_counter:1;
52181dd4d4dSTom Zanussi 		u32 rsvd:30;
52281dd4d4dSTom Zanussi 	};
52381dd4d4dSTom Zanussi 	u32 val;
5240044c5fcSYi Sun };
52581dd4d4dSTom Zanussi 
52681dd4d4dSTom Zanussi #define IDXD_OVFSTATUS_OFFSET		0x30
52781dd4d4dSTom Zanussi #define IDXD_PERFFRZ_OFFSET		0x20
52881dd4d4dSTom Zanussi #define IDXD_CNTRCFG_OFFSET		0x100
52981dd4d4dSTom Zanussi union idxd_cntrcfg {
53081dd4d4dSTom Zanussi 	struct {
53181dd4d4dSTom Zanussi 		u64 enable:1;
53281dd4d4dSTom Zanussi 		u64 interrupt_ovf:1;
53381dd4d4dSTom Zanussi 		u64 global_freeze_ovf:1;
53481dd4d4dSTom Zanussi 		u64 rsvd1:5;
53581dd4d4dSTom Zanussi 		u64 event_category:4;
53681dd4d4dSTom Zanussi 		u64 rsvd2:20;
53781dd4d4dSTom Zanussi 		u64 events:28;
53881dd4d4dSTom Zanussi 		u64 rsvd3:4;
53981dd4d4dSTom Zanussi 	};
54081dd4d4dSTom Zanussi 	u64 val;
5410044c5fcSYi Sun };
54281dd4d4dSTom Zanussi 
54381dd4d4dSTom Zanussi #define IDXD_FLTCFG_OFFSET		0x300
54481dd4d4dSTom Zanussi 
54581dd4d4dSTom Zanussi #define IDXD_CNTRDATA_OFFSET		0x200
54681dd4d4dSTom Zanussi union idxd_cntrdata {
54781dd4d4dSTom Zanussi 	struct {
54881dd4d4dSTom Zanussi 		u64 event_count_value;
54981dd4d4dSTom Zanussi 	};
55081dd4d4dSTom Zanussi 	u64 val;
5510044c5fcSYi Sun };
55281dd4d4dSTom Zanussi 
55381dd4d4dSTom Zanussi union event_cfg {
55481dd4d4dSTom Zanussi 	struct {
55581dd4d4dSTom Zanussi 		u64 event_cat:4;
55681dd4d4dSTom Zanussi 		u64 event_enc:28;
55781dd4d4dSTom Zanussi 	};
55881dd4d4dSTom Zanussi 	u64 val;
5590044c5fcSYi Sun };
56081dd4d4dSTom Zanussi 
56181dd4d4dSTom Zanussi union filter_cfg {
56281dd4d4dSTom Zanussi 	struct {
56381dd4d4dSTom Zanussi 		u64 wq:32;
56481dd4d4dSTom Zanussi 		u64 tc:8;
56581dd4d4dSTom Zanussi 		u64 pg_sz:4;
56681dd4d4dSTom Zanussi 		u64 xfer_sz:8;
56781dd4d4dSTom Zanussi 		u64 eng:8;
56881dd4d4dSTom Zanussi 	};
56981dd4d4dSTom Zanussi 	u64 val;
5700044c5fcSYi Sun };
57181dd4d4dSTom Zanussi 
5722f431ba9SDave Jiang #define IDXD_EVLSTATUS_OFFSET		0xf0
5732f431ba9SDave Jiang 
5742f431ba9SDave Jiang union evl_status_reg {
5752f431ba9SDave Jiang 	struct {
5762f431ba9SDave Jiang 		u32 head:16;
5772f431ba9SDave Jiang 		u32 rsvd:16;
5782f431ba9SDave Jiang 		u32 tail:16;
5792f431ba9SDave Jiang 		u32 rsvd2:14;
5802f431ba9SDave Jiang 		u32 int_pending:1;
5812f431ba9SDave Jiang 		u32 rsvd3:1;
5822f431ba9SDave Jiang 	};
5832f431ba9SDave Jiang 	struct {
5842f431ba9SDave Jiang 		u32 bits_lower32;
5852f431ba9SDave Jiang 		u32 bits_upper32;
5862f431ba9SDave Jiang 	};
5872f431ba9SDave Jiang 	u64 bits;
5880044c5fcSYi Sun };
5892f431ba9SDave Jiang 
5902442b747SDave Jiang #define IDXD_MAX_BATCH_IDENT	256
5912442b747SDave Jiang 
592244da66cSDave Jiang struct __evl_entry {
593244da66cSDave Jiang 	u64 rsvd:2;
594244da66cSDave Jiang 	u64 desc_valid:1;
595244da66cSDave Jiang 	u64 wq_idx_valid:1;
596244da66cSDave Jiang 	u64 batch:1;
597244da66cSDave Jiang 	u64 fault_rw:1;
598244da66cSDave Jiang 	u64 priv:1;
599244da66cSDave Jiang 	u64 err_info_valid:1;
600244da66cSDave Jiang 	u64 error:8;
601244da66cSDave Jiang 	u64 wq_idx:8;
602244da66cSDave Jiang 	u64 batch_id:8;
603244da66cSDave Jiang 	u64 operation:8;
604244da66cSDave Jiang 	u64 pasid:20;
605244da66cSDave Jiang 	u64 rsvd2:4;
606244da66cSDave Jiang 
607244da66cSDave Jiang 	u16 batch_idx;
608244da66cSDave Jiang 	u16 rsvd3;
609244da66cSDave Jiang 	union {
610244da66cSDave Jiang 		/* Invalid Flags 0x11 */
611244da66cSDave Jiang 		u32 invalid_flags;
612244da66cSDave Jiang 		/* Invalid Int Handle 0x19 */
613244da66cSDave Jiang 		/* Page fault 0x1a */
614244da66cSDave Jiang 		/* Page fault 0x06, 0x1f, only operand_id */
615244da66cSDave Jiang 		/* Page fault before drain or in batch, 0x26, 0x27 */
616244da66cSDave Jiang 		struct {
617244da66cSDave Jiang 			u16 int_handle;
618244da66cSDave Jiang 			u16 rci:1;
619244da66cSDave Jiang 			u16 ims:1;
620244da66cSDave Jiang 			u16 rcr:1;
621244da66cSDave Jiang 			u16 first_err_in_batch:1;
622244da66cSDave Jiang 			u16 rsvd4_2:9;
623244da66cSDave Jiang 			u16 operand_id:3;
624244da66cSDave Jiang 		};
625244da66cSDave Jiang 	};
626244da66cSDave Jiang 	u64 fault_addr;
627244da66cSDave Jiang 	u64 rsvd5;
6280044c5fcSYi Sun };
629244da66cSDave Jiang 
630244da66cSDave Jiang struct dsa_evl_entry {
631244da66cSDave Jiang 	struct __evl_entry e;
632244da66cSDave Jiang 	struct dsa_completion_record cr;
6330044c5fcSYi Sun };
634244da66cSDave Jiang 
635244da66cSDave Jiang struct iax_evl_entry {
636244da66cSDave Jiang 	struct __evl_entry e;
637244da66cSDave Jiang 	u64 rsvd[4];
638244da66cSDave Jiang 	struct iax_completion_record cr;
6390044c5fcSYi Sun };
640244da66cSDave Jiang 
641bfe1d560SDave Jiang #endif
642