19ab65affSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2584ec227SDan Williams /*
3584ec227SDan Williams  * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
4584ec227SDan Williams  */
5584ec227SDan Williams #ifndef _IOAT_HW_H_
6584ec227SDan Williams #define _IOAT_HW_H_
7584ec227SDan Williams 
8584ec227SDan Williams /* PCI Configuration Space Values */
9e6c0b69aSDan Williams #define IOAT_MMIO_BAR		0
10584ec227SDan Williams 
11584ec227SDan Williams /* CB device ID's */
121a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB0	0x0e20
131a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB1	0x0e21
141a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB2	0x0e22
151a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB3	0x0e23
161a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB4	0x0e24
171a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB5	0x0e25
181a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB6	0x0e26
191a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB7	0x0e27
201a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB8	0x0e2e
211a363068SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_IVB9	0x0e2f
221a363068SDave Jiang 
23570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW0	0x2f20
24570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW1	0x2f21
25570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW2	0x2f22
26570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW3	0x2f23
27570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW4	0x2f24
28570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW5	0x2f25
29570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW6	0x2f26
30570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW7	0x2f27
31570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW8	0x2f2e
32570727b5SDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_HSW9	0x2f2f
33570727b5SDave Jiang 
340132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD0	0x0C50
350132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD1	0x0C51
360132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD2	0x0C52
370132bcefSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BWD3	0x0C53
380132bcefSDave Jiang 
3968a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE0	0x6f50
4068a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE1	0x6f51
4168a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE2	0x6f52
4268a8cc9eSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE3	0x6f53
4368a8cc9eSDave Jiang 
44ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX0	0x6f20
45ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX1	0x6f21
46ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX2	0x6f22
47ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX3	0x6f23
48ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX4	0x6f24
49ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX5	0x6f25
50ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX6	0x6f26
51ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX7	0x6f27
52ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX8	0x6f2e
53ab98193dSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_BDX9	0x6f2f
54ab98193dSDave Jiang 
551594c18fSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_SKX	0x2021
561594c18fSDave Jiang 
574d75873fSDave Jiang #define PCI_DEVICE_ID_INTEL_IOAT_ICX	0x0b00
584d75873fSDave Jiang 
59570727b5SDave Jiang #define IOAT_VER_1_2            0x12    /* Version 1.2 */
60570727b5SDave Jiang #define IOAT_VER_2_0            0x20    /* Version 2.0 */
61570727b5SDave Jiang #define IOAT_VER_3_0            0x30    /* Version 3.0 */
62570727b5SDave Jiang #define IOAT_VER_3_2            0x32    /* Version 3.2 */
630132bcefSDave Jiang #define IOAT_VER_3_3            0x33    /* Version 3.3 */
6411e31e28SDave Jiang #define IOAT_VER_3_4		0x34	/* Version 3.4 */
65570727b5SDave Jiang 
66dd4645ebSDave Jiang #define IOAT_DESC_SZ	64
67dd4645ebSDave Jiang 
68584ec227SDan Williams struct ioat_dma_descriptor {
69584ec227SDan Williams 	uint32_t	size;
70c7984f4eSDan Williams 	union {
71584ec227SDan Williams 		uint32_t ctl;
72c7984f4eSDan Williams 		struct {
73c7984f4eSDan Williams 			unsigned int int_en:1;
74c7984f4eSDan Williams 			unsigned int src_snoop_dis:1;
75c7984f4eSDan Williams 			unsigned int dest_snoop_dis:1;
76c7984f4eSDan Williams 			unsigned int compl_write:1;
77c7984f4eSDan Williams 			unsigned int fence:1;
78c7984f4eSDan Williams 			unsigned int null:1;
79c7984f4eSDan Williams 			unsigned int src_brk:1;
80c7984f4eSDan Williams 			unsigned int dest_brk:1;
81c7984f4eSDan Williams 			unsigned int bundle:1;
82c7984f4eSDan Williams 			unsigned int dest_dca:1;
83c7984f4eSDan Williams 			unsigned int hint:1;
84c7984f4eSDan Williams 			unsigned int rsvd2:13;
852aec048cSDan Williams 			#define IOAT_OP_COPY 0x00
86c7984f4eSDan Williams 			unsigned int op:8;
87c7984f4eSDan Williams 		} ctl_f;
88c7984f4eSDan Williams 	};
89584ec227SDan Williams 	uint64_t	src_addr;
90584ec227SDan Williams 	uint64_t	dst_addr;
91584ec227SDan Williams 	uint64_t	next;
92584ec227SDan Williams 	uint64_t	rsv1;
93584ec227SDan Williams 	uint64_t	rsv2;
94ad643f54SDan Williams 	/* store some driver data in an unused portion of the descriptor */
95ad643f54SDan Williams 	union {
96584ec227SDan Williams 		uint64_t	user1;
97ad643f54SDan Williams 		uint64_t	tx_cnt;
98ad643f54SDan Williams 	};
99584ec227SDan Williams 	uint64_t	user2;
100584ec227SDan Williams };
1012aec048cSDan Williams 
1022aec048cSDan Williams struct ioat_xor_descriptor {
1032aec048cSDan Williams 	uint32_t	size;
1042aec048cSDan Williams 	union {
1052aec048cSDan Williams 		uint32_t ctl;
1062aec048cSDan Williams 		struct {
1072aec048cSDan Williams 			unsigned int int_en:1;
1082aec048cSDan Williams 			unsigned int src_snoop_dis:1;
1092aec048cSDan Williams 			unsigned int dest_snoop_dis:1;
1102aec048cSDan Williams 			unsigned int compl_write:1;
1112aec048cSDan Williams 			unsigned int fence:1;
1122aec048cSDan Williams 			unsigned int src_cnt:3;
1132aec048cSDan Williams 			unsigned int bundle:1;
1142aec048cSDan Williams 			unsigned int dest_dca:1;
1152aec048cSDan Williams 			unsigned int hint:1;
1162aec048cSDan Williams 			unsigned int rsvd:13;
1172aec048cSDan Williams 			#define IOAT_OP_XOR 0x87
1182aec048cSDan Williams 			#define IOAT_OP_XOR_VAL 0x88
1192aec048cSDan Williams 			unsigned int op:8;
1202aec048cSDan Williams 		} ctl_f;
1212aec048cSDan Williams 	};
1222aec048cSDan Williams 	uint64_t	src_addr;
1232aec048cSDan Williams 	uint64_t	dst_addr;
1242aec048cSDan Williams 	uint64_t	next;
1252aec048cSDan Williams 	uint64_t	src_addr2;
1262aec048cSDan Williams 	uint64_t	src_addr3;
1272aec048cSDan Williams 	uint64_t	src_addr4;
1282aec048cSDan Williams 	uint64_t	src_addr5;
1292aec048cSDan Williams };
1302aec048cSDan Williams 
1312aec048cSDan Williams struct ioat_xor_ext_descriptor {
1322aec048cSDan Williams 	uint64_t	src_addr6;
1332aec048cSDan Williams 	uint64_t	src_addr7;
1342aec048cSDan Williams 	uint64_t	src_addr8;
1352aec048cSDan Williams 	uint64_t	next;
1362aec048cSDan Williams 	uint64_t	rsvd[4];
1372aec048cSDan Williams };
1382aec048cSDan Williams 
1392aec048cSDan Williams struct ioat_pq_descriptor {
14075c6f0abSDave Jiang 	union {
1412aec048cSDan Williams 		uint32_t	size;
14275c6f0abSDave Jiang 		uint32_t	dwbes;
14375c6f0abSDave Jiang 		struct {
14475c6f0abSDave Jiang 			unsigned int rsvd:25;
14575c6f0abSDave Jiang 			unsigned int p_val_err:1;
14675c6f0abSDave Jiang 			unsigned int q_val_err:1;
14775c6f0abSDave Jiang 			unsigned int rsvd1:4;
14875c6f0abSDave Jiang 			unsigned int wbes:1;
14975c6f0abSDave Jiang 		} dwbes_f;
15075c6f0abSDave Jiang 	};
1512aec048cSDan Williams 	union {
1522aec048cSDan Williams 		uint32_t ctl;
1532aec048cSDan Williams 		struct {
1542aec048cSDan Williams 			unsigned int int_en:1;
1552aec048cSDan Williams 			unsigned int src_snoop_dis:1;
1562aec048cSDan Williams 			unsigned int dest_snoop_dis:1;
1572aec048cSDan Williams 			unsigned int compl_write:1;
1582aec048cSDan Williams 			unsigned int fence:1;
1592aec048cSDan Williams 			unsigned int src_cnt:3;
1602aec048cSDan Williams 			unsigned int bundle:1;
1612aec048cSDan Williams 			unsigned int dest_dca:1;
1622aec048cSDan Williams 			unsigned int hint:1;
1632aec048cSDan Williams 			unsigned int p_disable:1;
1642aec048cSDan Williams 			unsigned int q_disable:1;
16575c6f0abSDave Jiang 			unsigned int rsvd2:2;
16675c6f0abSDave Jiang 			unsigned int wb_en:1;
16775c6f0abSDave Jiang 			unsigned int prl_en:1;
16875c6f0abSDave Jiang 			unsigned int rsvd3:7;
1692aec048cSDan Williams 			#define IOAT_OP_PQ 0x89
1702aec048cSDan Williams 			#define IOAT_OP_PQ_VAL 0x8a
1717727eaa4SDave Jiang 			#define IOAT_OP_PQ_16S 0xa0
1727727eaa4SDave Jiang 			#define IOAT_OP_PQ_VAL_16S 0xa1
1732aec048cSDan Williams 			unsigned int op:8;
1742aec048cSDan Williams 		} ctl_f;
1752aec048cSDan Williams 	};
1762aec048cSDan Williams 	uint64_t	src_addr;
1772aec048cSDan Williams 	uint64_t	p_addr;
1782aec048cSDan Williams 	uint64_t	next;
1792aec048cSDan Williams 	uint64_t	src_addr2;
1807727eaa4SDave Jiang 	union {
1812aec048cSDan Williams 		uint64_t	src_addr3;
1827727eaa4SDave Jiang 		uint64_t	sed_addr;
1837727eaa4SDave Jiang 	};
1842aec048cSDan Williams 	uint8_t		coef[8];
1852aec048cSDan Williams 	uint64_t	q_addr;
1862aec048cSDan Williams };
1872aec048cSDan Williams 
1882aec048cSDan Williams struct ioat_pq_ext_descriptor {
1892aec048cSDan Williams 	uint64_t	src_addr4;
1902aec048cSDan Williams 	uint64_t	src_addr5;
1912aec048cSDan Williams 	uint64_t	src_addr6;
1922aec048cSDan Williams 	uint64_t	next;
1932aec048cSDan Williams 	uint64_t	src_addr7;
1942aec048cSDan Williams 	uint64_t	src_addr8;
1952aec048cSDan Williams 	uint64_t	rsvd[2];
1962aec048cSDan Williams };
1972aec048cSDan Williams 
1982aec048cSDan Williams struct ioat_pq_update_descriptor {
1992aec048cSDan Williams 	uint32_t	size;
2002aec048cSDan Williams 	union {
2012aec048cSDan Williams 		uint32_t ctl;
2022aec048cSDan Williams 		struct {
2032aec048cSDan Williams 			unsigned int int_en:1;
2042aec048cSDan Williams 			unsigned int src_snoop_dis:1;
2052aec048cSDan Williams 			unsigned int dest_snoop_dis:1;
2062aec048cSDan Williams 			unsigned int compl_write:1;
2072aec048cSDan Williams 			unsigned int fence:1;
2082aec048cSDan Williams 			unsigned int src_cnt:3;
2092aec048cSDan Williams 			unsigned int bundle:1;
2102aec048cSDan Williams 			unsigned int dest_dca:1;
2112aec048cSDan Williams 			unsigned int hint:1;
2122aec048cSDan Williams 			unsigned int p_disable:1;
2132aec048cSDan Williams 			unsigned int q_disable:1;
2142aec048cSDan Williams 			unsigned int rsvd:3;
2152aec048cSDan Williams 			unsigned int coef:8;
2162aec048cSDan Williams 			#define IOAT_OP_PQ_UP 0x8b
2172aec048cSDan Williams 			unsigned int op:8;
2182aec048cSDan Williams 		} ctl_f;
2192aec048cSDan Williams 	};
2202aec048cSDan Williams 	uint64_t	src_addr;
2212aec048cSDan Williams 	uint64_t	p_addr;
2222aec048cSDan Williams 	uint64_t	next;
2232aec048cSDan Williams 	uint64_t	src_addr2;
2242aec048cSDan Williams 	uint64_t	p_src;
2252aec048cSDan Williams 	uint64_t	q_src;
2262aec048cSDan Williams 	uint64_t	q_addr;
2272aec048cSDan Williams };
2282aec048cSDan Williams 
2292aec048cSDan Williams struct ioat_raw_descriptor {
2302aec048cSDan Williams 	uint64_t	field[8];
2312aec048cSDan Williams };
2327727eaa4SDave Jiang 
2337727eaa4SDave Jiang struct ioat_pq16a_descriptor {
2347727eaa4SDave Jiang 	uint8_t coef[8];
2357727eaa4SDave Jiang 	uint64_t src_addr3;
2367727eaa4SDave Jiang 	uint64_t src_addr4;
2377727eaa4SDave Jiang 	uint64_t src_addr5;
2387727eaa4SDave Jiang 	uint64_t src_addr6;
2397727eaa4SDave Jiang 	uint64_t src_addr7;
2407727eaa4SDave Jiang 	uint64_t src_addr8;
2417727eaa4SDave Jiang 	uint64_t src_addr9;
2427727eaa4SDave Jiang };
2437727eaa4SDave Jiang 
2447727eaa4SDave Jiang struct ioat_pq16b_descriptor {
2457727eaa4SDave Jiang 	uint64_t src_addr10;
2467727eaa4SDave Jiang 	uint64_t src_addr11;
2477727eaa4SDave Jiang 	uint64_t src_addr12;
2487727eaa4SDave Jiang 	uint64_t src_addr13;
2497727eaa4SDave Jiang 	uint64_t src_addr14;
2507727eaa4SDave Jiang 	uint64_t src_addr15;
2517727eaa4SDave Jiang 	uint64_t src_addr16;
2527727eaa4SDave Jiang 	uint64_t rsvd;
2537727eaa4SDave Jiang };
2547727eaa4SDave Jiang 
2557727eaa4SDave Jiang union ioat_sed_pq_descriptor {
2567727eaa4SDave Jiang 	struct ioat_pq16a_descriptor a;
2577727eaa4SDave Jiang 	struct ioat_pq16b_descriptor b;
2587727eaa4SDave Jiang };
2597727eaa4SDave Jiang 
2607727eaa4SDave Jiang #define SED_SIZE	64
2617727eaa4SDave Jiang 
2627727eaa4SDave Jiang struct ioat_sed_raw_descriptor {
2637727eaa4SDave Jiang 	uint64_t	a[8];
2647727eaa4SDave Jiang 	uint64_t	b[8];
2657727eaa4SDave Jiang 	uint64_t	c[8];
2667727eaa4SDave Jiang };
2677727eaa4SDave Jiang 
268584ec227SDan Williams #endif
269