xref: /linux/drivers/dma/ioat/hw.h (revision 827634added7f38b7d724cab1dccdb2b004c13c3)
1 /*
2  * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the Free
6  * Software Foundation; either version 2 of the License, or (at your option)
7  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * The full GNU General Public License is included in this distribution in the
15  * file called COPYING.
16  */
17 #ifndef _IOAT_HW_H_
18 #define _IOAT_HW_H_
19 
20 /* PCI Configuration Space Values */
21 #define IOAT_MMIO_BAR		0
22 
23 /* CB device ID's */
24 #define IOAT_PCI_DID_5000       0x1A38
25 #define IOAT_PCI_DID_CNB        0x360B
26 #define IOAT_PCI_DID_SCNB       0x65FF
27 #define IOAT_PCI_DID_SNB        0x402F
28 
29 #define PCI_DEVICE_ID_INTEL_IOAT_IVB0	0x0e20
30 #define PCI_DEVICE_ID_INTEL_IOAT_IVB1	0x0e21
31 #define PCI_DEVICE_ID_INTEL_IOAT_IVB2	0x0e22
32 #define PCI_DEVICE_ID_INTEL_IOAT_IVB3	0x0e23
33 #define PCI_DEVICE_ID_INTEL_IOAT_IVB4	0x0e24
34 #define PCI_DEVICE_ID_INTEL_IOAT_IVB5	0x0e25
35 #define PCI_DEVICE_ID_INTEL_IOAT_IVB6	0x0e26
36 #define PCI_DEVICE_ID_INTEL_IOAT_IVB7	0x0e27
37 #define PCI_DEVICE_ID_INTEL_IOAT_IVB8	0x0e2e
38 #define PCI_DEVICE_ID_INTEL_IOAT_IVB9	0x0e2f
39 
40 #define PCI_DEVICE_ID_INTEL_IOAT_HSW0	0x2f20
41 #define PCI_DEVICE_ID_INTEL_IOAT_HSW1	0x2f21
42 #define PCI_DEVICE_ID_INTEL_IOAT_HSW2	0x2f22
43 #define PCI_DEVICE_ID_INTEL_IOAT_HSW3	0x2f23
44 #define PCI_DEVICE_ID_INTEL_IOAT_HSW4	0x2f24
45 #define PCI_DEVICE_ID_INTEL_IOAT_HSW5	0x2f25
46 #define PCI_DEVICE_ID_INTEL_IOAT_HSW6	0x2f26
47 #define PCI_DEVICE_ID_INTEL_IOAT_HSW7	0x2f27
48 #define PCI_DEVICE_ID_INTEL_IOAT_HSW8	0x2f2e
49 #define PCI_DEVICE_ID_INTEL_IOAT_HSW9	0x2f2f
50 
51 #define PCI_DEVICE_ID_INTEL_IOAT_BWD0	0x0C50
52 #define PCI_DEVICE_ID_INTEL_IOAT_BWD1	0x0C51
53 #define PCI_DEVICE_ID_INTEL_IOAT_BWD2	0x0C52
54 #define PCI_DEVICE_ID_INTEL_IOAT_BWD3	0x0C53
55 
56 #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE0	0x6f50
57 #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE1	0x6f51
58 #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE2	0x6f52
59 #define PCI_DEVICE_ID_INTEL_IOAT_BDXDE3	0x6f53
60 
61 #define IOAT_VER_1_2            0x12    /* Version 1.2 */
62 #define IOAT_VER_2_0            0x20    /* Version 2.0 */
63 #define IOAT_VER_3_0            0x30    /* Version 3.0 */
64 #define IOAT_VER_3_2            0x32    /* Version 3.2 */
65 #define IOAT_VER_3_3            0x33    /* Version 3.3 */
66 
67 
68 int system_has_dca_enabled(struct pci_dev *pdev);
69 
70 struct ioat_dma_descriptor {
71 	uint32_t	size;
72 	union {
73 		uint32_t ctl;
74 		struct {
75 			unsigned int int_en:1;
76 			unsigned int src_snoop_dis:1;
77 			unsigned int dest_snoop_dis:1;
78 			unsigned int compl_write:1;
79 			unsigned int fence:1;
80 			unsigned int null:1;
81 			unsigned int src_brk:1;
82 			unsigned int dest_brk:1;
83 			unsigned int bundle:1;
84 			unsigned int dest_dca:1;
85 			unsigned int hint:1;
86 			unsigned int rsvd2:13;
87 			#define IOAT_OP_COPY 0x00
88 			unsigned int op:8;
89 		} ctl_f;
90 	};
91 	uint64_t	src_addr;
92 	uint64_t	dst_addr;
93 	uint64_t	next;
94 	uint64_t	rsv1;
95 	uint64_t	rsv2;
96 	/* store some driver data in an unused portion of the descriptor */
97 	union {
98 		uint64_t	user1;
99 		uint64_t	tx_cnt;
100 	};
101 	uint64_t	user2;
102 };
103 
104 struct ioat_xor_descriptor {
105 	uint32_t	size;
106 	union {
107 		uint32_t ctl;
108 		struct {
109 			unsigned int int_en:1;
110 			unsigned int src_snoop_dis:1;
111 			unsigned int dest_snoop_dis:1;
112 			unsigned int compl_write:1;
113 			unsigned int fence:1;
114 			unsigned int src_cnt:3;
115 			unsigned int bundle:1;
116 			unsigned int dest_dca:1;
117 			unsigned int hint:1;
118 			unsigned int rsvd:13;
119 			#define IOAT_OP_XOR 0x87
120 			#define IOAT_OP_XOR_VAL 0x88
121 			unsigned int op:8;
122 		} ctl_f;
123 	};
124 	uint64_t	src_addr;
125 	uint64_t	dst_addr;
126 	uint64_t	next;
127 	uint64_t	src_addr2;
128 	uint64_t	src_addr3;
129 	uint64_t	src_addr4;
130 	uint64_t	src_addr5;
131 };
132 
133 struct ioat_xor_ext_descriptor {
134 	uint64_t	src_addr6;
135 	uint64_t	src_addr7;
136 	uint64_t	src_addr8;
137 	uint64_t	next;
138 	uint64_t	rsvd[4];
139 };
140 
141 struct ioat_pq_descriptor {
142 	union {
143 		uint32_t	size;
144 		uint32_t	dwbes;
145 		struct {
146 			unsigned int rsvd:25;
147 			unsigned int p_val_err:1;
148 			unsigned int q_val_err:1;
149 			unsigned int rsvd1:4;
150 			unsigned int wbes:1;
151 		} dwbes_f;
152 	};
153 	union {
154 		uint32_t ctl;
155 		struct {
156 			unsigned int int_en:1;
157 			unsigned int src_snoop_dis:1;
158 			unsigned int dest_snoop_dis:1;
159 			unsigned int compl_write:1;
160 			unsigned int fence:1;
161 			unsigned int src_cnt:3;
162 			unsigned int bundle:1;
163 			unsigned int dest_dca:1;
164 			unsigned int hint:1;
165 			unsigned int p_disable:1;
166 			unsigned int q_disable:1;
167 			unsigned int rsvd2:2;
168 			unsigned int wb_en:1;
169 			unsigned int prl_en:1;
170 			unsigned int rsvd3:7;
171 			#define IOAT_OP_PQ 0x89
172 			#define IOAT_OP_PQ_VAL 0x8a
173 			#define IOAT_OP_PQ_16S 0xa0
174 			#define IOAT_OP_PQ_VAL_16S 0xa1
175 			unsigned int op:8;
176 		} ctl_f;
177 	};
178 	uint64_t	src_addr;
179 	uint64_t	p_addr;
180 	uint64_t	next;
181 	uint64_t	src_addr2;
182 	union {
183 		uint64_t	src_addr3;
184 		uint64_t	sed_addr;
185 	};
186 	uint8_t		coef[8];
187 	uint64_t	q_addr;
188 };
189 
190 struct ioat_pq_ext_descriptor {
191 	uint64_t	src_addr4;
192 	uint64_t	src_addr5;
193 	uint64_t	src_addr6;
194 	uint64_t	next;
195 	uint64_t	src_addr7;
196 	uint64_t	src_addr8;
197 	uint64_t	rsvd[2];
198 };
199 
200 struct ioat_pq_update_descriptor {
201 	uint32_t	size;
202 	union {
203 		uint32_t ctl;
204 		struct {
205 			unsigned int int_en:1;
206 			unsigned int src_snoop_dis:1;
207 			unsigned int dest_snoop_dis:1;
208 			unsigned int compl_write:1;
209 			unsigned int fence:1;
210 			unsigned int src_cnt:3;
211 			unsigned int bundle:1;
212 			unsigned int dest_dca:1;
213 			unsigned int hint:1;
214 			unsigned int p_disable:1;
215 			unsigned int q_disable:1;
216 			unsigned int rsvd:3;
217 			unsigned int coef:8;
218 			#define IOAT_OP_PQ_UP 0x8b
219 			unsigned int op:8;
220 		} ctl_f;
221 	};
222 	uint64_t	src_addr;
223 	uint64_t	p_addr;
224 	uint64_t	next;
225 	uint64_t	src_addr2;
226 	uint64_t	p_src;
227 	uint64_t	q_src;
228 	uint64_t	q_addr;
229 };
230 
231 struct ioat_raw_descriptor {
232 	uint64_t	field[8];
233 };
234 
235 struct ioat_pq16a_descriptor {
236 	uint8_t coef[8];
237 	uint64_t src_addr3;
238 	uint64_t src_addr4;
239 	uint64_t src_addr5;
240 	uint64_t src_addr6;
241 	uint64_t src_addr7;
242 	uint64_t src_addr8;
243 	uint64_t src_addr9;
244 };
245 
246 struct ioat_pq16b_descriptor {
247 	uint64_t src_addr10;
248 	uint64_t src_addr11;
249 	uint64_t src_addr12;
250 	uint64_t src_addr13;
251 	uint64_t src_addr14;
252 	uint64_t src_addr15;
253 	uint64_t src_addr16;
254 	uint64_t rsvd;
255 };
256 
257 union ioat_sed_pq_descriptor {
258 	struct ioat_pq16a_descriptor a;
259 	struct ioat_pq16b_descriptor b;
260 };
261 
262 #define SED_SIZE	64
263 
264 struct ioat_sed_raw_descriptor {
265 	uint64_t	a[8];
266 	uint64_t	b[8];
267 	uint64_t	c[8];
268 };
269 
270 #endif
271