xref: /openbmc/linux/drivers/dma/ioat/hw.h (revision 9ab65aff)
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 
66570727b5SDave Jiang 
67228c4f5cSDan Williams int system_has_dca_enabled(struct pci_dev *pdev);
68228c4f5cSDan Williams 
69dd4645ebSDave Jiang #define IOAT_DESC_SZ	64
70dd4645ebSDave Jiang 
71584ec227SDan Williams struct ioat_dma_descriptor {
72584ec227SDan Williams 	uint32_t	size;
73c7984f4eSDan Williams 	union {
74584ec227SDan Williams 		uint32_t ctl;
75c7984f4eSDan Williams 		struct {
76c7984f4eSDan Williams 			unsigned int int_en:1;
77c7984f4eSDan Williams 			unsigned int src_snoop_dis:1;
78c7984f4eSDan Williams 			unsigned int dest_snoop_dis:1;
79c7984f4eSDan Williams 			unsigned int compl_write:1;
80c7984f4eSDan Williams 			unsigned int fence:1;
81c7984f4eSDan Williams 			unsigned int null:1;
82c7984f4eSDan Williams 			unsigned int src_brk:1;
83c7984f4eSDan Williams 			unsigned int dest_brk:1;
84c7984f4eSDan Williams 			unsigned int bundle:1;
85c7984f4eSDan Williams 			unsigned int dest_dca:1;
86c7984f4eSDan Williams 			unsigned int hint:1;
87c7984f4eSDan Williams 			unsigned int rsvd2:13;
882aec048cSDan Williams 			#define IOAT_OP_COPY 0x00
89c7984f4eSDan Williams 			unsigned int op:8;
90c7984f4eSDan Williams 		} ctl_f;
91c7984f4eSDan Williams 	};
92584ec227SDan Williams 	uint64_t	src_addr;
93584ec227SDan Williams 	uint64_t	dst_addr;
94584ec227SDan Williams 	uint64_t	next;
95584ec227SDan Williams 	uint64_t	rsv1;
96584ec227SDan Williams 	uint64_t	rsv2;
97ad643f54SDan Williams 	/* store some driver data in an unused portion of the descriptor */
98ad643f54SDan Williams 	union {
99584ec227SDan Williams 		uint64_t	user1;
100ad643f54SDan Williams 		uint64_t	tx_cnt;
101ad643f54SDan Williams 	};
102584ec227SDan Williams 	uint64_t	user2;
103584ec227SDan Williams };
1042aec048cSDan Williams 
1052aec048cSDan Williams struct ioat_xor_descriptor {
1062aec048cSDan Williams 	uint32_t	size;
1072aec048cSDan Williams 	union {
1082aec048cSDan Williams 		uint32_t ctl;
1092aec048cSDan Williams 		struct {
1102aec048cSDan Williams 			unsigned int int_en:1;
1112aec048cSDan Williams 			unsigned int src_snoop_dis:1;
1122aec048cSDan Williams 			unsigned int dest_snoop_dis:1;
1132aec048cSDan Williams 			unsigned int compl_write:1;
1142aec048cSDan Williams 			unsigned int fence:1;
1152aec048cSDan Williams 			unsigned int src_cnt:3;
1162aec048cSDan Williams 			unsigned int bundle:1;
1172aec048cSDan Williams 			unsigned int dest_dca:1;
1182aec048cSDan Williams 			unsigned int hint:1;
1192aec048cSDan Williams 			unsigned int rsvd:13;
1202aec048cSDan Williams 			#define IOAT_OP_XOR 0x87
1212aec048cSDan Williams 			#define IOAT_OP_XOR_VAL 0x88
1222aec048cSDan Williams 			unsigned int op:8;
1232aec048cSDan Williams 		} ctl_f;
1242aec048cSDan Williams 	};
1252aec048cSDan Williams 	uint64_t	src_addr;
1262aec048cSDan Williams 	uint64_t	dst_addr;
1272aec048cSDan Williams 	uint64_t	next;
1282aec048cSDan Williams 	uint64_t	src_addr2;
1292aec048cSDan Williams 	uint64_t	src_addr3;
1302aec048cSDan Williams 	uint64_t	src_addr4;
1312aec048cSDan Williams 	uint64_t	src_addr5;
1322aec048cSDan Williams };
1332aec048cSDan Williams 
1342aec048cSDan Williams struct ioat_xor_ext_descriptor {
1352aec048cSDan Williams 	uint64_t	src_addr6;
1362aec048cSDan Williams 	uint64_t	src_addr7;
1372aec048cSDan Williams 	uint64_t	src_addr8;
1382aec048cSDan Williams 	uint64_t	next;
1392aec048cSDan Williams 	uint64_t	rsvd[4];
1402aec048cSDan Williams };
1412aec048cSDan Williams 
1422aec048cSDan Williams struct ioat_pq_descriptor {
14375c6f0abSDave Jiang 	union {
1442aec048cSDan Williams 		uint32_t	size;
14575c6f0abSDave Jiang 		uint32_t	dwbes;
14675c6f0abSDave Jiang 		struct {
14775c6f0abSDave Jiang 			unsigned int rsvd:25;
14875c6f0abSDave Jiang 			unsigned int p_val_err:1;
14975c6f0abSDave Jiang 			unsigned int q_val_err:1;
15075c6f0abSDave Jiang 			unsigned int rsvd1:4;
15175c6f0abSDave Jiang 			unsigned int wbes:1;
15275c6f0abSDave Jiang 		} dwbes_f;
15375c6f0abSDave Jiang 	};
1542aec048cSDan Williams 	union {
1552aec048cSDan Williams 		uint32_t ctl;
1562aec048cSDan Williams 		struct {
1572aec048cSDan Williams 			unsigned int int_en:1;
1582aec048cSDan Williams 			unsigned int src_snoop_dis:1;
1592aec048cSDan Williams 			unsigned int dest_snoop_dis:1;
1602aec048cSDan Williams 			unsigned int compl_write:1;
1612aec048cSDan Williams 			unsigned int fence:1;
1622aec048cSDan Williams 			unsigned int src_cnt:3;
1632aec048cSDan Williams 			unsigned int bundle:1;
1642aec048cSDan Williams 			unsigned int dest_dca:1;
1652aec048cSDan Williams 			unsigned int hint:1;
1662aec048cSDan Williams 			unsigned int p_disable:1;
1672aec048cSDan Williams 			unsigned int q_disable:1;
16875c6f0abSDave Jiang 			unsigned int rsvd2:2;
16975c6f0abSDave Jiang 			unsigned int wb_en:1;
17075c6f0abSDave Jiang 			unsigned int prl_en:1;
17175c6f0abSDave Jiang 			unsigned int rsvd3:7;
1722aec048cSDan Williams 			#define IOAT_OP_PQ 0x89
1732aec048cSDan Williams 			#define IOAT_OP_PQ_VAL 0x8a
1747727eaa4SDave Jiang 			#define IOAT_OP_PQ_16S 0xa0
1757727eaa4SDave Jiang 			#define IOAT_OP_PQ_VAL_16S 0xa1
1762aec048cSDan Williams 			unsigned int op:8;
1772aec048cSDan Williams 		} ctl_f;
1782aec048cSDan Williams 	};
1792aec048cSDan Williams 	uint64_t	src_addr;
1802aec048cSDan Williams 	uint64_t	p_addr;
1812aec048cSDan Williams 	uint64_t	next;
1822aec048cSDan Williams 	uint64_t	src_addr2;
1837727eaa4SDave Jiang 	union {
1842aec048cSDan Williams 		uint64_t	src_addr3;
1857727eaa4SDave Jiang 		uint64_t	sed_addr;
1867727eaa4SDave Jiang 	};
1872aec048cSDan Williams 	uint8_t		coef[8];
1882aec048cSDan Williams 	uint64_t	q_addr;
1892aec048cSDan Williams };
1902aec048cSDan Williams 
1912aec048cSDan Williams struct ioat_pq_ext_descriptor {
1922aec048cSDan Williams 	uint64_t	src_addr4;
1932aec048cSDan Williams 	uint64_t	src_addr5;
1942aec048cSDan Williams 	uint64_t	src_addr6;
1952aec048cSDan Williams 	uint64_t	next;
1962aec048cSDan Williams 	uint64_t	src_addr7;
1972aec048cSDan Williams 	uint64_t	src_addr8;
1982aec048cSDan Williams 	uint64_t	rsvd[2];
1992aec048cSDan Williams };
2002aec048cSDan Williams 
2012aec048cSDan Williams struct ioat_pq_update_descriptor {
2022aec048cSDan Williams 	uint32_t	size;
2032aec048cSDan Williams 	union {
2042aec048cSDan Williams 		uint32_t ctl;
2052aec048cSDan Williams 		struct {
2062aec048cSDan Williams 			unsigned int int_en:1;
2072aec048cSDan Williams 			unsigned int src_snoop_dis:1;
2082aec048cSDan Williams 			unsigned int dest_snoop_dis:1;
2092aec048cSDan Williams 			unsigned int compl_write:1;
2102aec048cSDan Williams 			unsigned int fence:1;
2112aec048cSDan Williams 			unsigned int src_cnt:3;
2122aec048cSDan Williams 			unsigned int bundle:1;
2132aec048cSDan Williams 			unsigned int dest_dca:1;
2142aec048cSDan Williams 			unsigned int hint:1;
2152aec048cSDan Williams 			unsigned int p_disable:1;
2162aec048cSDan Williams 			unsigned int q_disable:1;
2172aec048cSDan Williams 			unsigned int rsvd:3;
2182aec048cSDan Williams 			unsigned int coef:8;
2192aec048cSDan Williams 			#define IOAT_OP_PQ_UP 0x8b
2202aec048cSDan Williams 			unsigned int op:8;
2212aec048cSDan Williams 		} ctl_f;
2222aec048cSDan Williams 	};
2232aec048cSDan Williams 	uint64_t	src_addr;
2242aec048cSDan Williams 	uint64_t	p_addr;
2252aec048cSDan Williams 	uint64_t	next;
2262aec048cSDan Williams 	uint64_t	src_addr2;
2272aec048cSDan Williams 	uint64_t	p_src;
2282aec048cSDan Williams 	uint64_t	q_src;
2292aec048cSDan Williams 	uint64_t	q_addr;
2302aec048cSDan Williams };
2312aec048cSDan Williams 
2322aec048cSDan Williams struct ioat_raw_descriptor {
2332aec048cSDan Williams 	uint64_t	field[8];
2342aec048cSDan Williams };
2357727eaa4SDave Jiang 
2367727eaa4SDave Jiang struct ioat_pq16a_descriptor {
2377727eaa4SDave Jiang 	uint8_t coef[8];
2387727eaa4SDave Jiang 	uint64_t src_addr3;
2397727eaa4SDave Jiang 	uint64_t src_addr4;
2407727eaa4SDave Jiang 	uint64_t src_addr5;
2417727eaa4SDave Jiang 	uint64_t src_addr6;
2427727eaa4SDave Jiang 	uint64_t src_addr7;
2437727eaa4SDave Jiang 	uint64_t src_addr8;
2447727eaa4SDave Jiang 	uint64_t src_addr9;
2457727eaa4SDave Jiang };
2467727eaa4SDave Jiang 
2477727eaa4SDave Jiang struct ioat_pq16b_descriptor {
2487727eaa4SDave Jiang 	uint64_t src_addr10;
2497727eaa4SDave Jiang 	uint64_t src_addr11;
2507727eaa4SDave Jiang 	uint64_t src_addr12;
2517727eaa4SDave Jiang 	uint64_t src_addr13;
2527727eaa4SDave Jiang 	uint64_t src_addr14;
2537727eaa4SDave Jiang 	uint64_t src_addr15;
2547727eaa4SDave Jiang 	uint64_t src_addr16;
2557727eaa4SDave Jiang 	uint64_t rsvd;
2567727eaa4SDave Jiang };
2577727eaa4SDave Jiang 
2587727eaa4SDave Jiang union ioat_sed_pq_descriptor {
2597727eaa4SDave Jiang 	struct ioat_pq16a_descriptor a;
2607727eaa4SDave Jiang 	struct ioat_pq16b_descriptor b;
2617727eaa4SDave Jiang };
2627727eaa4SDave Jiang 
2637727eaa4SDave Jiang #define SED_SIZE	64
2647727eaa4SDave Jiang 
2657727eaa4SDave Jiang struct ioat_sed_raw_descriptor {
2667727eaa4SDave Jiang 	uint64_t	a[8];
2677727eaa4SDave Jiang 	uint64_t	b[8];
2687727eaa4SDave Jiang 	uint64_t	c[8];
2697727eaa4SDave Jiang };
2707727eaa4SDave Jiang 
271584ec227SDan Williams #endif
272