]>
Commit | Line | Data |
---|---|---|
9f95a23c TL |
1 | /* SPDX-License-Identifier: BSD-3-Clause |
2 | * Copyright 2008-2017 Cisco Systems, Inc. All rights reserved. | |
7c673cae | 3 | * Copyright 2007 Nuova Systems, Inc. All rights reserved. |
7c673cae FG |
4 | */ |
5 | ||
6 | #ifndef _VNIC_DEVCMD_H_ | |
7 | #define _VNIC_DEVCMD_H_ | |
8 | ||
9 | #define _CMD_NBITS 14 | |
10 | #define _CMD_VTYPEBITS 10 | |
11 | #define _CMD_FLAGSBITS 6 | |
12 | #define _CMD_DIRBITS 2 | |
13 | ||
14 | #define _CMD_NMASK ((1 << _CMD_NBITS)-1) | |
15 | #define _CMD_VTYPEMASK ((1 << _CMD_VTYPEBITS)-1) | |
16 | #define _CMD_FLAGSMASK ((1 << _CMD_FLAGSBITS)-1) | |
17 | #define _CMD_DIRMASK ((1 << _CMD_DIRBITS)-1) | |
18 | ||
19 | #define _CMD_NSHIFT 0 | |
20 | #define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS) | |
21 | #define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS) | |
22 | #define _CMD_DIRSHIFT (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS) | |
23 | ||
24 | /* | |
25 | * Direction bits (from host perspective). | |
26 | */ | |
27 | #define _CMD_DIR_NONE 0U | |
28 | #define _CMD_DIR_WRITE 1U | |
29 | #define _CMD_DIR_READ 2U | |
30 | #define _CMD_DIR_RW (_CMD_DIR_WRITE | _CMD_DIR_READ) | |
31 | ||
32 | /* | |
33 | * Flag bits. | |
34 | */ | |
35 | #define _CMD_FLAGS_NONE 0U | |
36 | #define _CMD_FLAGS_NOWAIT 1U | |
37 | ||
38 | /* | |
39 | * vNIC type bits. | |
40 | */ | |
41 | #define _CMD_VTYPE_NONE 0U | |
42 | #define _CMD_VTYPE_ENET 1U | |
43 | #define _CMD_VTYPE_FC 2U | |
44 | #define _CMD_VTYPE_SCSI 4U | |
45 | #define _CMD_VTYPE_ALL (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI) | |
46 | ||
47 | /* | |
48 | * Used to create cmds.. | |
49 | */ | |
50 | #define _CMDCF(dir, flags, vtype, nr) \ | |
51 | (((dir) << _CMD_DIRSHIFT) | \ | |
52 | ((flags) << _CMD_FLAGSSHIFT) | \ | |
53 | ((vtype) << _CMD_VTYPESHIFT) | \ | |
54 | ((nr) << _CMD_NSHIFT)) | |
55 | #define _CMDC(dir, vtype, nr) _CMDCF(dir, 0, vtype, nr) | |
56 | #define _CMDCNW(dir, vtype, nr) _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr) | |
57 | ||
58 | /* | |
59 | * Used to decode cmds.. | |
60 | */ | |
61 | #define _CMD_DIR(cmd) (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK) | |
62 | #define _CMD_FLAGS(cmd) (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK) | |
63 | #define _CMD_VTYPE(cmd) (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK) | |
64 | #define _CMD_N(cmd) (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK) | |
65 | ||
9f95a23c TL |
66 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
67 | ||
7c673cae FG |
68 | enum vnic_devcmd_cmd { |
69 | CMD_NONE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0), | |
70 | ||
71 | /* | |
72 | * mcpu fw info in mem: | |
73 | * in: | |
74 | * (u64)a0=paddr to struct vnic_devcmd_fw_info | |
75 | * action: | |
76 | * Fills in struct vnic_devcmd_fw_info (128 bytes) | |
77 | * note: | |
78 | * An old definition of CMD_MCPU_FW_INFO | |
79 | */ | |
80 | CMD_MCPU_FW_INFO_OLD = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1), | |
81 | ||
82 | /* | |
83 | * mcpu fw info in mem: | |
84 | * in: | |
85 | * (u64)a0=paddr to struct vnic_devcmd_fw_info | |
86 | * (u16)a1=size of the structure | |
87 | * out: | |
88 | * (u16)a1=0 for in:a1 = 0, | |
89 | * data size actually written for other values. | |
90 | * action: | |
91 | * Fills in first 128 bytes of vnic_devcmd_fw_info for in:a1 = 0, | |
92 | * first in:a1 bytes for 0 < in:a1 <= 132, | |
93 | * 132 bytes for other values of in:a1. | |
94 | * note: | |
95 | * CMD_MCPU_FW_INFO and CMD_MCPU_FW_INFO_OLD have the same enum 1 | |
96 | * for source compatibility. | |
97 | */ | |
98 | CMD_MCPU_FW_INFO = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 1), | |
99 | ||
100 | /* dev-specific block member: | |
101 | * in: (u16)a0=offset,(u8)a1=size | |
102 | * out: a0=value | |
103 | */ | |
104 | CMD_DEV_SPEC = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2), | |
105 | ||
106 | /* stats clear */ | |
107 | CMD_STATS_CLEAR = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3), | |
108 | ||
109 | /* stats dump in mem: (u64)a0=paddr to stats area, | |
110 | * (u16)a1=sizeof stats area */ | |
111 | CMD_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4), | |
112 | ||
113 | /* set Rx packet filter: (u32)a0=filters (see CMD_PFILTER_*) */ | |
114 | CMD_PACKET_FILTER = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 7), | |
115 | ||
116 | /* set Rx packet filter for all: (u32)a0=filters (see CMD_PFILTER_*) */ | |
117 | CMD_PACKET_FILTER_ALL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 7), | |
118 | ||
119 | /* hang detection notification */ | |
120 | CMD_HANG_NOTIFY = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8), | |
121 | ||
122 | /* MAC address in (u48)a0 */ | |
123 | CMD_MAC_ADDR = _CMDC(_CMD_DIR_READ, | |
124 | _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9), | |
125 | #define CMD_GET_MAC_ADDR CMD_MAC_ADDR /* some uses are aliased */ | |
126 | ||
127 | /* add addr from (u48)a0 */ | |
128 | CMD_ADDR_ADD = _CMDCNW(_CMD_DIR_WRITE, | |
129 | _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 12), | |
130 | ||
131 | /* del addr from (u48)a0 */ | |
132 | CMD_ADDR_DEL = _CMDCNW(_CMD_DIR_WRITE, | |
133 | _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 13), | |
134 | ||
135 | /* add VLAN id in (u16)a0 */ | |
136 | CMD_VLAN_ADD = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 14), | |
137 | ||
138 | /* del VLAN id in (u16)a0 */ | |
139 | CMD_VLAN_DEL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 15), | |
140 | ||
9f95a23c TL |
141 | /* |
142 | * nic_cfg in (u32)a0 | |
143 | * | |
144 | * Capability query: | |
145 | * out: (u64) a0= 1 if a1 is valid | |
146 | * (u64) a1= (NIC_CFG bits supported) | (flags << 32) | |
147 | * (flags are CMD_NIC_CFG_CAPF_xxx) | |
148 | */ | |
7c673cae FG |
149 | CMD_NIC_CFG = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16), |
150 | ||
9f95a23c TL |
151 | /* |
152 | * nic_cfg_chk (same as nic_cfg, but may return error) | |
153 | * in (u32)a0 | |
154 | * | |
155 | * Capability query: | |
156 | * out: (u64) a0= 1 if a1 is valid | |
157 | * (u64) a1= (NIC_CFG bits supported) | (flags << 32) | |
158 | * (flags are CMD_NIC_CFG_CAPF_xxx) | |
159 | */ | |
160 | CMD_NIC_CFG_CHK = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16), | |
161 | ||
7c673cae FG |
162 | /* union vnic_rss_key in mem: (u64)a0=paddr, (u16)a1=len */ |
163 | CMD_RSS_KEY = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 17), | |
164 | ||
165 | /* union vnic_rss_cpu in mem: (u64)a0=paddr, (u16)a1=len */ | |
166 | CMD_RSS_CPU = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 18), | |
167 | ||
168 | /* initiate softreset */ | |
169 | CMD_SOFT_RESET = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 19), | |
170 | ||
171 | /* softreset status: | |
172 | * out: a0=0 reset complete, a0=1 reset in progress */ | |
173 | CMD_SOFT_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 20), | |
174 | ||
175 | /* set struct vnic_devcmd_notify buffer in mem: | |
176 | * in: | |
177 | * (u64)a0=paddr to notify (set paddr=0 to unset) | |
178 | * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify) | |
179 | * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr) | |
180 | * out: | |
181 | * (u32)a1 = effective size | |
182 | */ | |
183 | CMD_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21), | |
184 | ||
185 | /* UNDI API: (u64)a0=paddr to s_PXENV_UNDI_ struct, | |
186 | * (u8)a1=PXENV_UNDI_xxx */ | |
187 | CMD_UNDI = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 22), | |
188 | ||
189 | /* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */ | |
190 | CMD_OPEN = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23), | |
191 | ||
192 | /* open status: | |
193 | * out: a0=0 open complete, a0=1 open in progress */ | |
194 | CMD_OPEN_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24), | |
195 | ||
196 | /* close vnic */ | |
197 | CMD_CLOSE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25), | |
198 | ||
199 | /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */ | |
200 | /***** Replaced by CMD_INIT *****/ | |
201 | CMD_INIT_v1 = _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26), | |
202 | ||
203 | /* variant of CMD_INIT, with provisioning info | |
204 | * (u64)a0=paddr of vnic_devcmd_provinfo | |
205 | * (u32)a1=sizeof provision info */ | |
206 | CMD_INIT_PROV_INFO = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 27), | |
207 | ||
208 | /* enable virtual link */ | |
209 | CMD_ENABLE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28), | |
210 | ||
211 | /* enable virtual link, waiting variant. */ | |
212 | CMD_ENABLE_WAIT = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28), | |
213 | ||
214 | /* disable virtual link */ | |
215 | CMD_DISABLE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29), | |
216 | ||
217 | /* stats dump sum of all vnic stats on same uplink in mem: | |
218 | * (u64)a0=paddr | |
219 | * (u16)a1=sizeof stats area */ | |
220 | CMD_STATS_DUMP_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30), | |
221 | ||
222 | /* init status: | |
223 | * out: a0=0 init complete, a0=1 init in progress | |
224 | * if a0=0, a1=errno */ | |
225 | CMD_INIT_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31), | |
226 | ||
227 | /* INT13 API: (u64)a0=paddr to vnic_int13_params struct | |
228 | * (u32)a1=INT13_CMD_xxx */ | |
229 | CMD_INT13 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32), | |
230 | ||
231 | /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */ | |
232 | CMD_LOGICAL_UPLINK = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 33), | |
233 | ||
234 | /* undo initialize of virtual link */ | |
235 | CMD_DEINIT = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34), | |
236 | ||
237 | /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */ | |
238 | CMD_INIT = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 35), | |
239 | ||
240 | /* check fw capability of a cmd: | |
241 | * in: (u32)a0=cmd | |
242 | * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */ | |
243 | CMD_CAPABILITY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36), | |
244 | ||
245 | /* persistent binding info | |
246 | * in: (u64)a0=paddr of arg | |
247 | * (u32)a1=CMD_PERBI_XXX */ | |
248 | CMD_PERBI = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37), | |
249 | ||
250 | /* Interrupt Assert Register functionality | |
251 | * in: (u16)a0=interrupt number to assert | |
252 | */ | |
253 | CMD_IAR = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 38), | |
254 | ||
255 | /* initiate hangreset, like softreset after hang detected */ | |
256 | CMD_HANG_RESET = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 39), | |
257 | ||
258 | /* hangreset status: | |
259 | * out: a0=0 reset complete, a0=1 reset in progress */ | |
260 | CMD_HANG_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 40), | |
261 | ||
262 | /* | |
263 | * Set hw ingress packet vlan rewrite mode: | |
264 | * in: (u32)a0=new vlan rewrite mode | |
265 | * out: (u32)a0=old vlan rewrite mode */ | |
266 | CMD_IG_VLAN_REWRITE_MODE = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 41), | |
267 | ||
268 | /* | |
269 | * in: (u16)a0=bdf of target vnic | |
270 | * (u32)a1=cmd to proxy | |
271 | * a2-a15=args to cmd in a1 | |
272 | * out: (u32)a0=status of proxied cmd | |
273 | * a1-a15=out args of proxied cmd */ | |
274 | CMD_PROXY_BY_BDF = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42), | |
275 | ||
276 | /* | |
277 | * As for BY_BDF except a0 is index of hvnlink subordinate vnic | |
278 | * or SR-IOV virtual vnic | |
279 | */ | |
280 | CMD_PROXY_BY_INDEX = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 43), | |
281 | ||
282 | /* | |
283 | * For HPP toggle: | |
284 | * adapter-info-get | |
285 | * in: (u64)a0=phsical address of buffer passed in from caller. | |
286 | * (u16)a1=size of buffer specified in a0. | |
287 | * out: (u64)a0=phsical address of buffer passed in from caller. | |
288 | * (u16)a1=actual bytes from VIF-CONFIG-INFO TLV, or | |
289 | * 0 if no VIF-CONFIG-INFO TLV was ever received. */ | |
290 | CMD_CONFIG_INFO_GET = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 44), | |
291 | ||
292 | /* | |
293 | * INT13 API: (u64)a0=paddr to vnic_int13_params struct | |
294 | * (u32)a1=INT13_CMD_xxx | |
295 | */ | |
296 | CMD_INT13_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 45), | |
297 | ||
298 | /* | |
299 | * Set default vlan: | |
300 | * in: (u16)a0=new default vlan | |
301 | * (u16)a1=zero for overriding vlan with param a0, | |
302 | * non-zero for resetting vlan to the default | |
303 | * out: (u16)a0=old default vlan | |
304 | */ | |
305 | CMD_SET_DEFAULT_VLAN = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 46), | |
306 | ||
307 | /* init_prov_info2: | |
308 | * Variant of CMD_INIT_PROV_INFO, where it will not try to enable | |
309 | * the vnic until CMD_ENABLE2 is issued. | |
310 | * (u64)a0=paddr of vnic_devcmd_provinfo | |
311 | * (u32)a1=sizeof provision info */ | |
312 | CMD_INIT_PROV_INFO2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 47), | |
313 | ||
314 | /* enable2: | |
315 | * (u32)a0=0 ==> standby | |
316 | * =CMD_ENABLE2_ACTIVE ==> active | |
317 | */ | |
318 | CMD_ENABLE2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 48), | |
319 | ||
320 | /* | |
321 | * cmd_status: | |
322 | * Returns the status of the specified command | |
323 | * Input: | |
324 | * a0 = command for which status is being queried. | |
325 | * Possible values are: | |
326 | * CMD_SOFT_RESET | |
327 | * CMD_HANG_RESET | |
328 | * CMD_OPEN | |
329 | * CMD_INIT | |
330 | * CMD_INIT_PROV_INFO | |
331 | * CMD_DEINIT | |
332 | * CMD_INIT_PROV_INFO2 | |
333 | * CMD_ENABLE2 | |
334 | * Output: | |
335 | * if status == STAT_ERROR | |
336 | * a0 = ERR_ENOTSUPPORTED - status for command in a0 is | |
337 | * not supported | |
338 | * if status == STAT_NONE | |
339 | * a0 = status of the devcmd specified in a0 as follows. | |
340 | * ERR_SUCCESS - command in a0 completed successfully | |
341 | * ERR_EINPROGRESS - command in a0 is still in progress | |
342 | */ | |
343 | CMD_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 49), | |
344 | ||
345 | /* | |
346 | * Returns interrupt coalescing timer conversion factors. | |
347 | * After calling this devcmd, ENIC driver can convert | |
348 | * interrupt coalescing timer in usec into CPU cycles as follows: | |
349 | * | |
350 | * intr_timer_cycles = intr_timer_usec * multiplier / divisor | |
351 | * | |
352 | * Interrupt coalescing timer in usecs can be be converted/obtained | |
353 | * from CPU cycles as follows: | |
354 | * | |
355 | * intr_timer_usec = intr_timer_cycles * divisor / multiplier | |
356 | * | |
357 | * in: none | |
358 | * out: (u32)a0 = multiplier | |
359 | * (u32)a1 = divisor | |
360 | * (u32)a2 = maximum timer value in usec | |
361 | */ | |
362 | CMD_INTR_COAL_CONVERT = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 50), | |
363 | ||
364 | /* | |
365 | * ISCSI DUMP API: | |
366 | * in: (u64)a0=paddr of the param or param itself | |
367 | * (u32)a1=ISCSI_CMD_xxx | |
368 | */ | |
369 | CMD_ISCSI_DUMP_REQ = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 51), | |
370 | ||
371 | /* | |
372 | * ISCSI DUMP STATUS API: | |
373 | * in: (u32)a0=cmd tag | |
374 | * in: (u32)a1=ISCSI_CMD_xxx | |
375 | * out: (u32)a0=cmd status | |
376 | */ | |
377 | CMD_ISCSI_DUMP_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 52), | |
378 | ||
379 | /* | |
380 | * Subvnic migration from MQ <--> VF. | |
381 | * Enable the LIF migration from MQ to VF and vice versa. MQ and VF | |
382 | * indexes are statically bound at the time of initialization. | |
383 | * Based on the direction of migration, the resources of either MQ or | |
384 | * the VF shall be attached to the LIF. | |
385 | * in: (u32)a0=Direction of Migration | |
386 | * 0=> Migrate to VF | |
387 | * 1=> Migrate to MQ | |
388 | * (u32)a1=VF index (MQ index) | |
389 | */ | |
390 | CMD_MIGRATE_SUBVNIC = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 53), | |
391 | ||
392 | /* | |
393 | * Register / Deregister the notification block for MQ subvnics | |
394 | * in: | |
395 | * (u64)a0=paddr to notify (set paddr=0 to unset) | |
396 | * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify) | |
397 | * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr) | |
398 | * out: | |
399 | * (u32)a1 = effective size | |
400 | */ | |
401 | CMD_SUBVNIC_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 54), | |
402 | ||
403 | /* | |
404 | * Set the predefined mac address as default | |
405 | * in: | |
406 | * (u48)a0=mac addr | |
407 | */ | |
408 | CMD_SET_MAC_ADDR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 55), | |
409 | ||
410 | /* Update the provisioning info of the given VIF | |
411 | * (u64)a0=paddr of vnic_devcmd_provinfo | |
412 | * (u32)a1=sizeof provision info */ | |
413 | CMD_PROV_INFO_UPDATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 56), | |
414 | ||
415 | /* | |
416 | * Initialization for the devcmd2 interface. | |
417 | * in: (u64) a0=host result buffer physical address | |
418 | * in: (u16) a1=number of entries in result buffer | |
419 | */ | |
420 | CMD_INITIALIZE_DEVCMD2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 57), | |
421 | ||
422 | /* | |
423 | * Add a filter. | |
424 | * in: (u64) a0= filter address | |
425 | * (u32) a1= size of filter | |
426 | * out: (u32) a0=filter identifier | |
427 | * | |
428 | * Capability query: | |
429 | * out: (u64) a0= 1 if capability query supported | |
430 | * (u64) a1= MAX filter type supported | |
431 | */ | |
432 | CMD_ADD_FILTER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 58), | |
433 | ||
434 | /* | |
435 | * Delete a filter. | |
436 | * in: (u32) a0=filter identifier | |
437 | */ | |
438 | CMD_DEL_FILTER = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 59), | |
439 | ||
440 | /* | |
441 | * Enable a Queue Pair in User space NIC | |
442 | * in: (u32) a0=Queue Pair number | |
443 | * (u32) a1= command | |
444 | */ | |
445 | CMD_QP_ENABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 60), | |
446 | ||
447 | /* | |
448 | * Disable a Queue Pair in User space NIC | |
449 | * in: (u32) a0=Queue Pair number | |
450 | * (u32) a1= command | |
451 | */ | |
452 | CMD_QP_DISABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 61), | |
453 | ||
454 | /* | |
455 | * Stats dump Queue Pair in User space NIC | |
456 | * in: (u32) a0=Queue Pair number | |
457 | * (u64) a1=host buffer addr for status dump | |
458 | * (u32) a2=length of the buffer | |
459 | */ | |
460 | CMD_QP_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 62), | |
461 | ||
462 | /* | |
463 | * Clear stats for Queue Pair in User space NIC | |
464 | * in: (u32) a0=Queue Pair number | |
465 | */ | |
466 | CMD_QP_STATS_CLEAR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 63), | |
467 | ||
468 | /* | |
469 | * UEFI BOOT API: (u64)a0= UEFI FLS_CMD_xxx | |
470 | * (ui64)a1= paddr for the info buffer | |
471 | */ | |
472 | CMD_FC_REQ = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 64), | |
473 | ||
474 | /* | |
475 | * Return the iSCSI config details required by the EFI Option ROM | |
476 | * in: (u32) a0=0 Get Boot Info for PXE eNIC as per pxe_boot_config_t | |
477 | * a0=1 Get Boot info for iSCSI enic as per | |
478 | * iscsi_boot_efi_cfg_t | |
479 | * in: (u64) a1=Host address where iSCSI config info is returned | |
480 | */ | |
481 | CMD_VNIC_BOOT_CONFIG_INFO = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 65), | |
482 | ||
483 | /* | |
484 | * Create a Queue Pair (RoCE) | |
485 | * in: (u32) a0 = Queue Pair number | |
486 | * (u32) a1 = Remote QP | |
487 | * (u32) a2 = RDMA-RQ | |
488 | * (u16) a3 = RQ Res Group | |
489 | * (u16) a4 = SQ Res Group | |
490 | * (u32) a5 = Protection Domain | |
491 | * (u64) a6 = Remote MAC | |
492 | * (u32) a7 = start PSN | |
493 | * (u16) a8 = MSS | |
494 | * (u32) a9 = protocol version | |
495 | */ | |
496 | CMD_RDMA_QP_CREATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 66), | |
497 | ||
498 | /* | |
499 | * Delete a Queue Pair (RoCE) | |
500 | * in: (u32) a0 = Queue Pair number | |
501 | */ | |
502 | CMD_RDMA_QP_DELETE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 67), | |
503 | ||
504 | /* | |
505 | * Retrieve a Queue Pair's status information (RoCE) | |
506 | * in: (u32) a0 = Queue Pair number | |
507 | * (u64) a1 = host buffer addr for QP status struct | |
508 | * (u32) a2 = length of the buffer | |
509 | */ | |
510 | CMD_RDMA_QP_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 68), | |
511 | ||
512 | /* | |
513 | * Use this devcmd for agreeing on the highest common version supported | |
514 | * by both driver and fw for by features who need such a facility. | |
515 | * in: (u64) a0 = feature (driver requests for the supported versions | |
516 | * on this feature) | |
517 | * out: (u64) a0 = bitmap of all supported versions for that feature | |
518 | */ | |
519 | CMD_GET_SUPP_FEATURE_VER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 69), | |
520 | ||
521 | /* | |
522 | * Initialize the RDMA notification work queue | |
523 | * in: (u64) a0 = host buffer address | |
524 | * in: (u16) a1 = number of entries in buffer | |
525 | * in: (u16) a2 = resource group number | |
526 | * in: (u16) a3 = CQ number to post completion | |
527 | */ | |
528 | CMD_RDMA_INIT_INFO_BUF = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 70), | |
529 | ||
530 | /* | |
531 | * De-init the RDMA notification work queue | |
532 | * in: (u64) a0=resource group number | |
533 | */ | |
534 | CMD_RDMA_DEINIT_INFO_BUF = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 71), | |
535 | ||
536 | /* | |
537 | * Control (Enable/Disable) overlay offloads on the given vnic | |
538 | * in: (u8) a0 = OVERLAY_FEATURE_NVGRE : NVGRE | |
539 | * a0 = OVERLAY_FEATURE_VXLAN : VxLAN | |
540 | * in: (u8) a1 = OVERLAY_OFFLOAD_ENABLE : Enable or | |
541 | * a1 = OVERLAY_OFFLOAD_DISABLE : Disable or | |
542 | * a1 = OVERLAY_OFFLOAD_ENABLE_V2 : Enable with version 2 | |
543 | */ | |
544 | CMD_OVERLAY_OFFLOAD_CTRL = | |
545 | _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 72), | |
546 | ||
547 | /* | |
548 | * Configuration of overlay offloads feature on a given vNIC | |
549 | * in: (u8) a0 = OVERLAY_CFG_VXLAN_PORT_UPDATE : VxLAN | |
550 | * in: (u16) a1 = unsigned short int port information | |
551 | */ | |
552 | CMD_OVERLAY_OFFLOAD_CFG = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 73), | |
553 | ||
554 | /* | |
555 | * Return the configured name for the device | |
556 | * in: (u64) a0=Host address where the name is copied | |
557 | * (u32) a1=Size of the buffer | |
558 | */ | |
559 | CMD_GET_CONFIG_NAME = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 74), | |
560 | ||
561 | /* | |
562 | * Enable group interrupt for the VF | |
563 | * in: (u32) a0 = GRPINTR_ENABLE : enable | |
564 | * a0 = GRPINTR_DISABLE : disable | |
565 | * a0 = GRPINTR_UPD_VECT: update group vector addr | |
566 | * in: (u32) a1 = interrupt group count | |
567 | * in: (u64) a2 = Start of host buffer address for DMAing group | |
568 | * vector bitmap | |
569 | * in: (u64) a3 = Stride between group vectors | |
570 | */ | |
571 | CMD_CONFIG_GRPINTR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 75), | |
572 | ||
573 | /* | |
574 | * Set cq arrary base and size in a list of consective wqs and | |
575 | * rqs for a device | |
576 | * in: (u16) a0 = the wq relative index in the device. | |
577 | * -1 indicates skipping wq configuration | |
578 | * in: (u16) a1 = the wcq relative index in the device | |
579 | * in: (u16) a2 = the rq relative index in the device | |
580 | * -1 indicates skipping rq configuration | |
581 | * in: (u16) a3 = the rcq relative index in the device | |
582 | */ | |
583 | CMD_CONFIG_CQ_ARRAY = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 76), | |
584 | ||
585 | /* | |
586 | * Add an advanced filter. | |
587 | * in: (u64) a0= filter address | |
588 | * (u32) a1= size of filter | |
589 | * out: (u32) a0=filter identifier | |
590 | * | |
591 | * Capability query: | |
9f95a23c TL |
592 | * in: (u64) a1= supported filter capability exchange modes |
593 | * out: (u64) a0= 1 if capability query supported | |
594 | * if (u64) a1 = 0: a1 = MAX filter type supported | |
595 | * if (u64) a1 & FILTER_CAP_MODE_V1_FLAG: | |
596 | * a1 = bitmask of supported filters | |
597 | * a2 = FILTER_CAP_MODE_V1 | |
598 | * a3 = bitmask of supported actions | |
7c673cae FG |
599 | */ |
600 | CMD_ADD_ADV_FILTER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 77), | |
9f95a23c TL |
601 | |
602 | /* | |
603 | * Allocate a counter for use with CMD_ADD_FILTER | |
604 | * out:(u32) a0 = counter index | |
605 | */ | |
606 | CMD_COUNTER_ALLOC = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ENET, 85), | |
607 | ||
608 | /* | |
609 | * Free a counter | |
610 | * in: (u32) a0 = counter_id | |
611 | */ | |
612 | CMD_COUNTER_FREE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 86), | |
613 | ||
614 | /* | |
615 | * Read a counter | |
616 | * in: (u32) a0 = counter_id | |
617 | * (u32) a1 = clear counter if non-zero | |
618 | * out:(u64) a0 = packet count | |
619 | * (u64) a1 = byte count | |
620 | */ | |
621 | CMD_COUNTER_QUERY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 87), | |
622 | ||
623 | /* | |
624 | * Configure periodic counter DMA. This will trigger an immediate | |
625 | * DMA of the counters (unless period == 0), and then schedule a DMA | |
626 | * of the counters every <period> seconds until disdabled. | |
627 | * Each new COUNTER_DMA_CONFIG will override all previous commands on | |
628 | * this vnic. | |
629 | * Setting a2 (period) = 0 will disable periodic DMAs | |
630 | * If a0 (num_counters) != 0, an immediate DMA will always be done, | |
631 | * irrespective of the value in a2. | |
632 | * in: (u32) a0 = number of counters to DMA | |
633 | * (u64) a1 = host target DMA address | |
634 | * (u32) a2 = DMA period in milliseconds (0 to disable) | |
635 | */ | |
636 | CMD_COUNTER_DMA_CONFIG = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 88), | |
637 | #define VNIC_COUNTER_DMA_MIN_PERIOD 500 | |
638 | ||
639 | /* | |
640 | * Clear all counters on a vnic | |
641 | */ | |
642 | CMD_COUNTER_CLEAR_ALL = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ENET, 89), | |
643 | }; | |
644 | ||
645 | /* Modes for exchanging advanced filter capabilities. The modes supported by | |
646 | * the driver are passed in the CMD_ADD_ADV_FILTER capability command and the | |
647 | * mode selected is returned. | |
648 | * V0: the maximum filter type supported is returned | |
649 | * V1: bitmasks of supported filters and actions are returned | |
650 | */ | |
651 | enum filter_cap_mode { | |
652 | FILTER_CAP_MODE_V0 = 0, /* Must always be 0 for legacy drivers */ | |
653 | FILTER_CAP_MODE_V1 = 1, | |
7c673cae | 654 | }; |
9f95a23c | 655 | #define FILTER_CAP_MODE_V1_FLAG (1 << FILTER_CAP_MODE_V1) |
7c673cae FG |
656 | |
657 | /* CMD_ENABLE2 flags */ | |
658 | #define CMD_ENABLE2_STANDBY 0x0 | |
659 | #define CMD_ENABLE2_ACTIVE 0x1 | |
660 | ||
661 | /* flags for CMD_OPEN */ | |
662 | #define CMD_OPENF_OPROM 0x1 /* open coming from option rom */ | |
9f95a23c | 663 | #define CMD_OPENF_IG_DESCCACHE 0x2 /* Do not flush IG DESC cache */ |
7c673cae FG |
664 | |
665 | /* flags for CMD_INIT */ | |
666 | #define CMD_INITF_DEFAULT_MAC 0x1 /* init with default mac addr */ | |
667 | ||
9f95a23c TL |
668 | /* flags for CMD_NIC_CFG */ |
669 | #define CMD_NIC_CFG_CAPF_UDP_WEAK (1ULL << 0) /* Bodega-style UDP RSS */ | |
670 | ||
7c673cae FG |
671 | /* flags for CMD_PACKET_FILTER */ |
672 | #define CMD_PFILTER_DIRECTED 0x01 | |
673 | #define CMD_PFILTER_MULTICAST 0x02 | |
674 | #define CMD_PFILTER_BROADCAST 0x04 | |
675 | #define CMD_PFILTER_PROMISCUOUS 0x08 | |
676 | #define CMD_PFILTER_ALL_MULTICAST 0x10 | |
677 | ||
678 | /* Commands for CMD_QP_ENABLE/CM_QP_DISABLE */ | |
679 | #define CMD_QP_RQWQ 0x0 | |
680 | ||
681 | /* rewrite modes for CMD_IG_VLAN_REWRITE_MODE */ | |
682 | #define IG_VLAN_REWRITE_MODE_DEFAULT_TRUNK 0 | |
683 | #define IG_VLAN_REWRITE_MODE_UNTAG_DEFAULT_VLAN 1 | |
684 | #define IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN 2 | |
685 | #define IG_VLAN_REWRITE_MODE_PASS_THRU 3 | |
686 | ||
687 | enum vnic_devcmd_status { | |
688 | STAT_NONE = 0, | |
689 | STAT_BUSY = 1 << 0, /* cmd in progress */ | |
690 | STAT_ERROR = 1 << 1, /* last cmd caused error (code in a0) */ | |
691 | STAT_FAILOVER = 1 << 2, /* always set on vnics in pci standby state | |
692 | * if seen a failover to the standby happened | |
693 | */ | |
694 | }; | |
695 | ||
696 | enum vnic_devcmd_error { | |
697 | ERR_SUCCESS = 0, | |
698 | ERR_EINVAL = 1, | |
699 | ERR_EFAULT = 2, | |
700 | ERR_EPERM = 3, | |
701 | ERR_EBUSY = 4, | |
702 | ERR_ECMDUNKNOWN = 5, | |
703 | ERR_EBADSTATE = 6, | |
704 | ERR_ENOMEM = 7, | |
705 | ERR_ETIMEDOUT = 8, | |
706 | ERR_ELINKDOWN = 9, | |
707 | ERR_EMAXRES = 10, | |
708 | ERR_ENOTSUPPORTED = 11, | |
709 | ERR_EINPROGRESS = 12, | |
710 | ERR_MAX | |
711 | }; | |
712 | ||
713 | /* | |
714 | * note: hw_version and asic_rev refer to the same thing, | |
715 | * but have different formats. hw_version is | |
716 | * a 32-byte string (e.g. "A2") and asic_rev is | |
717 | * a 16-bit integer (e.g. 0xA2). | |
718 | */ | |
719 | struct vnic_devcmd_fw_info { | |
720 | char fw_version[32]; | |
721 | char fw_build[32]; | |
722 | char hw_version[32]; | |
723 | char hw_serial_number[32]; | |
724 | u16 asic_type; | |
725 | u16 asic_rev; | |
726 | }; | |
727 | ||
728 | enum fwinfo_asic_type { | |
729 | FWINFO_ASIC_TYPE_UNKNOWN, | |
730 | FWINFO_ASIC_TYPE_PALO, | |
731 | FWINFO_ASIC_TYPE_SERENO, | |
732 | FWINFO_ASIC_TYPE_CRUZ, | |
733 | }; | |
734 | ||
735 | struct vnic_devcmd_notify { | |
736 | u32 csum; /* checksum over following words */ | |
737 | ||
738 | u32 link_state; /* link up == 1 */ | |
739 | u32 port_speed; /* effective port speed (rate limit) */ | |
740 | u32 mtu; /* MTU */ | |
741 | u32 msglvl; /* requested driver msg lvl */ | |
742 | u32 uif; /* uplink interface */ | |
743 | u32 status; /* status bits (see VNIC_STF_*) */ | |
744 | u32 error; /* error code (see ERR_*) for first ERR */ | |
745 | u32 link_down_cnt; /* running count of link down transitions */ | |
746 | u32 perbi_rebuild_cnt; /* running count of perbi rebuilds */ | |
747 | }; | |
748 | #define VNIC_STF_FATAL_ERR 0x0001 /* fatal fw error */ | |
749 | #define VNIC_STF_STD_PAUSE 0x0002 /* standard link-level pause on */ | |
750 | #define VNIC_STF_PFC_PAUSE 0x0004 /* priority flow control pause on */ | |
751 | /* all supported status flags */ | |
752 | #define VNIC_STF_ALL (VNIC_STF_FATAL_ERR |\ | |
753 | VNIC_STF_STD_PAUSE |\ | |
754 | VNIC_STF_PFC_PAUSE |\ | |
755 | 0) | |
756 | ||
757 | struct vnic_devcmd_provinfo { | |
758 | u8 oui[3]; | |
759 | u8 type; | |
760 | u8 data[0]; | |
761 | }; | |
762 | ||
763 | /* | |
764 | * These are used in flags field of different filters to denote | |
765 | * valid fields used. | |
766 | */ | |
767 | #define FILTER_FIELD_VALID(fld) (1 << (fld - 1)) | |
768 | ||
769 | #define FILTER_FIELD_USNIC_VLAN FILTER_FIELD_VALID(1) | |
770 | #define FILTER_FIELD_USNIC_ETHTYPE FILTER_FIELD_VALID(2) | |
771 | #define FILTER_FIELD_USNIC_PROTO FILTER_FIELD_VALID(3) | |
772 | #define FILTER_FIELD_USNIC_ID FILTER_FIELD_VALID(4) | |
773 | ||
774 | #define FILTER_FIELDS_USNIC (FILTER_FIELD_USNIC_VLAN | \ | |
775 | FILTER_FIELD_USNIC_ETHTYPE | \ | |
776 | FILTER_FIELD_USNIC_PROTO | \ | |
777 | FILTER_FIELD_USNIC_ID) | |
778 | ||
779 | struct filter_usnic_id { | |
780 | u32 flags; | |
781 | u16 vlan; | |
782 | u16 ethtype; | |
783 | u8 proto_version; | |
784 | u32 usnic_id; | |
785 | } __attribute__((packed)); | |
786 | ||
787 | #define FILTER_FIELD_5TUP_PROTO FILTER_FIELD_VALID(1) | |
788 | #define FILTER_FIELD_5TUP_SRC_AD FILTER_FIELD_VALID(2) | |
789 | #define FILTER_FIELD_5TUP_DST_AD FILTER_FIELD_VALID(3) | |
790 | #define FILTER_FIELD_5TUP_SRC_PT FILTER_FIELD_VALID(4) | |
791 | #define FILTER_FIELD_5TUP_DST_PT FILTER_FIELD_VALID(5) | |
792 | ||
793 | #define FILTER_FIELDS_IPV4_5TUPLE (FILTER_FIELD_5TUP_PROTO | \ | |
794 | FILTER_FIELD_5TUP_SRC_AD | \ | |
795 | FILTER_FIELD_5TUP_DST_AD | \ | |
796 | FILTER_FIELD_5TUP_SRC_PT | \ | |
797 | FILTER_FIELD_5TUP_DST_PT) | |
798 | ||
799 | /* Enums for the protocol field. */ | |
800 | enum protocol_e { | |
801 | PROTO_UDP = 0, | |
802 | PROTO_TCP = 1, | |
803 | PROTO_IPV4 = 2, | |
804 | PROTO_IPV6 = 3 | |
805 | }; | |
806 | ||
807 | struct filter_ipv4_5tuple { | |
808 | u32 flags; | |
809 | u32 protocol; | |
810 | u32 src_addr; | |
811 | u32 dst_addr; | |
812 | u16 src_port; | |
813 | u16 dst_port; | |
814 | } __attribute__((packed)); | |
815 | ||
816 | #define FILTER_FIELD_VMQ_VLAN FILTER_FIELD_VALID(1) | |
817 | #define FILTER_FIELD_VMQ_MAC FILTER_FIELD_VALID(2) | |
818 | ||
819 | #define FILTER_FIELDS_MAC_VLAN (FILTER_FIELD_VMQ_VLAN | \ | |
820 | FILTER_FIELD_VMQ_MAC) | |
821 | ||
822 | #define FILTER_FIELDS_NVGRE FILTER_FIELD_VMQ_MAC | |
823 | ||
824 | struct filter_mac_vlan { | |
825 | u32 flags; | |
826 | u16 vlan; | |
827 | u8 mac_addr[6]; | |
828 | } __attribute__((packed)); | |
829 | ||
830 | #define FILTER_FIELD_VLAN_IP_3TUP_VLAN FILTER_FIELD_VALID(1) | |
831 | #define FILTER_FIELD_VLAN_IP_3TUP_L3_PROTO FILTER_FIELD_VALID(2) | |
832 | #define FILTER_FIELD_VLAN_IP_3TUP_DST_AD FILTER_FIELD_VALID(3) | |
833 | #define FILTER_FIELD_VLAN_IP_3TUP_L4_PROTO FILTER_FIELD_VALID(4) | |
834 | #define FILTER_FIELD_VLAN_IP_3TUP_DST_PT FILTER_FIELD_VALID(5) | |
835 | ||
836 | #define FILTER_FIELDS_VLAN_IP_3TUP (FILTER_FIELD_VLAN_IP_3TUP_VLAN | \ | |
837 | FILTER_FIELD_VLAN_IP_3TUP_L3_PROTO | \ | |
838 | FILTER_FIELD_VLAN_IP_3TUP_DST_AD | \ | |
839 | FILTER_FIELD_VLAN_IP_3TUP_L4_PROTO | \ | |
840 | FILTER_FIELD_VLAN_IP_3TUP_DST_PT) | |
841 | ||
842 | struct filter_vlan_ip_3tuple { | |
843 | u32 flags; | |
844 | u16 vlan; | |
845 | u16 l3_protocol; | |
846 | union { | |
847 | u32 dst_addr_v4; | |
848 | u8 dst_addr_v6[16]; | |
849 | } u; | |
850 | u32 l4_protocol; | |
851 | u16 dst_port; | |
852 | } __attribute__((packed)); | |
853 | ||
854 | #define FILTER_GENERIC_1_BYTES 64 | |
855 | ||
856 | enum filter_generic_1_layer { | |
857 | FILTER_GENERIC_1_L2, | |
858 | FILTER_GENERIC_1_L3, | |
859 | FILTER_GENERIC_1_L4, | |
860 | FILTER_GENERIC_1_L5, | |
861 | FILTER_GENERIC_1_NUM_LAYERS | |
862 | }; | |
863 | ||
864 | #define FILTER_GENERIC_1_IPV4 (1 << 0) | |
865 | #define FILTER_GENERIC_1_IPV6 (1 << 1) | |
866 | #define FILTER_GENERIC_1_UDP (1 << 2) | |
867 | #define FILTER_GENERIC_1_TCP (1 << 3) | |
868 | #define FILTER_GENERIC_1_TCP_OR_UDP (1 << 4) | |
869 | #define FILTER_GENERIC_1_IP4SUM_OK (1 << 5) | |
870 | #define FILTER_GENERIC_1_L4SUM_OK (1 << 6) | |
871 | #define FILTER_GENERIC_1_IPFRAG (1 << 7) | |
872 | ||
873 | #define FILTER_GENERIC_1_KEY_LEN 64 | |
874 | ||
875 | /* | |
876 | * Version 1 of generic filter specification | |
877 | * position is only 16 bits, reserving positions > 64k to be used by firmware | |
878 | */ | |
879 | struct filter_generic_1 { | |
880 | u16 position; /* lower position comes first */ | |
881 | u32 mask_flags; | |
882 | u32 val_flags; | |
883 | u16 mask_vlan; | |
884 | u16 val_vlan; | |
885 | struct { | |
886 | u8 mask[FILTER_GENERIC_1_KEY_LEN]; /* 0 bit means "don't care"*/ | |
887 | u8 val[FILTER_GENERIC_1_KEY_LEN]; | |
888 | } __attribute__((packed)) layer[FILTER_GENERIC_1_NUM_LAYERS]; | |
889 | } __attribute__((packed)); | |
890 | ||
891 | /* Specifies the filter_action type. */ | |
892 | enum { | |
893 | FILTER_ACTION_RQ_STEERING = 0, | |
9f95a23c | 894 | FILTER_ACTION_V2 = 1, |
7c673cae FG |
895 | FILTER_ACTION_MAX |
896 | }; | |
897 | ||
898 | struct filter_action { | |
899 | u32 type; | |
900 | union { | |
901 | u32 rq_idx; | |
902 | } u; | |
903 | } __attribute__((packed)); | |
904 | ||
9f95a23c TL |
905 | #define FILTER_ACTION_RQ_STEERING_FLAG (1 << 0) |
906 | #define FILTER_ACTION_FILTER_ID_FLAG (1 << 1) | |
907 | #define FILTER_ACTION_DROP_FLAG (1 << 2) | |
908 | #define FILTER_ACTION_COUNTER_FLAG (1 << 3) | |
909 | #define FILTER_ACTION_V2_ALL (FILTER_ACTION_RQ_STEERING_FLAG \ | |
910 | | FILTER_ACTION_FILTER_ID_FLAG \ | |
911 | | FILTER_ACTION_DROP_FLAG \ | |
912 | | FILTER_ACTION_COUNTER_FLAG) | |
913 | ||
914 | /* Version 2 of filter action must be a strict extension of struct filter_action | |
915 | * where the first fields exactly match in size and meaning. | |
916 | */ | |
917 | struct filter_action_v2 { | |
918 | u32 type; | |
919 | u32 rq_idx; | |
920 | u32 flags; /* use FILTER_ACTION_XXX_FLAG defines */ | |
921 | u16 filter_id; | |
922 | u32 counter_index; | |
923 | uint8_t reserved[28]; /* for future expansion */ | |
924 | } __attribute__((packed)); | |
925 | ||
7c673cae FG |
926 | /* Specifies the filter type. */ |
927 | enum filter_type { | |
928 | FILTER_USNIC_ID = 0, | |
929 | FILTER_IPV4_5TUPLE = 1, | |
930 | FILTER_MAC_VLAN = 2, | |
931 | FILTER_VLAN_IP_3TUPLE = 3, | |
932 | FILTER_NVGRE_VMQ = 4, | |
933 | FILTER_USNIC_IP = 5, | |
934 | FILTER_DPDK_1 = 6, | |
935 | FILTER_MAX | |
936 | }; | |
937 | ||
9f95a23c TL |
938 | #define FILTER_USNIC_ID_FLAG (1 << FILTER_USNIC_ID) |
939 | #define FILTER_IPV4_5TUPLE_FLAG (1 << FILTER_IPV4_5TUPLE) | |
940 | #define FILTER_MAC_VLAN_FLAG (1 << FILTER_MAC_VLAN) | |
941 | #define FILTER_VLAN_IP_3TUPLE_FLAG (1 << FILTER_VLAN_IP_3TUPLE) | |
942 | #define FILTER_NVGRE_VMQ_FLAG (1 << FILTER_NVGRE_VMQ) | |
943 | #define FILTER_USNIC_IP_FLAG (1 << FILTER_USNIC_IP) | |
944 | #define FILTER_DPDK_1_FLAG (1 << FILTER_DPDK_1) | |
945 | #define FILTER_V1_ALL (FILTER_USNIC_ID_FLAG | \ | |
946 | FILTER_IPV4_5TUPLE_FLAG | \ | |
947 | FILTER_MAC_VLAN_FLAG | \ | |
948 | FILTER_VLAN_IP_3TUPLE_FLAG | \ | |
949 | FILTER_NVGRE_VMQ_FLAG | \ | |
950 | FILTER_USNIC_IP_FLAG | \ | |
951 | FILTER_DPDK_1_FLAG) | |
952 | ||
7c673cae FG |
953 | struct filter { |
954 | u32 type; | |
955 | union { | |
956 | struct filter_usnic_id usnic; | |
957 | struct filter_ipv4_5tuple ipv4; | |
958 | struct filter_mac_vlan mac_vlan; | |
959 | struct filter_vlan_ip_3tuple vlan_3tuple; | |
960 | } u; | |
961 | } __attribute__((packed)); | |
962 | ||
963 | /* | |
964 | * This is a strict superset of "struct filter" and exists only | |
965 | * because many drivers use "sizeof (struct filter)" in deciding TLV size. | |
966 | * This new, larger struct filter would cause any code that uses that method | |
967 | * to not work with older firmware, so we add filter_v2 to hold the | |
968 | * new filter types. Drivers should use vnic_filter_size() to determine | |
969 | * the TLV size instead of sizeof (struct fiter_v2) to guard against future | |
970 | * growth. | |
971 | */ | |
972 | struct filter_v2 { | |
973 | u32 type; | |
974 | union { | |
975 | struct filter_usnic_id usnic; | |
976 | struct filter_ipv4_5tuple ipv4; | |
977 | struct filter_mac_vlan mac_vlan; | |
978 | struct filter_vlan_ip_3tuple vlan_3tuple; | |
979 | struct filter_generic_1 generic_1; | |
980 | } u; | |
981 | } __attribute__((packed)); | |
982 | ||
983 | enum { | |
984 | CLSF_TLV_FILTER = 0, | |
985 | CLSF_TLV_ACTION = 1, | |
986 | }; | |
987 | ||
988 | struct filter_tlv { | |
9f95a23c TL |
989 | uint32_t type; |
990 | uint32_t length; | |
991 | uint32_t val[0]; | |
7c673cae FG |
992 | }; |
993 | ||
994 | /* Data for CMD_ADD_FILTER is 2 TLV and filter + action structs */ | |
995 | #define FILTER_MAX_BUF_SIZE 100 | |
996 | #define FILTER_V2_MAX_BUF_SIZE (sizeof(struct filter_v2) + \ | |
9f95a23c | 997 | sizeof(struct filter_action_v2) + \ |
7c673cae FG |
998 | (2 * sizeof(struct filter_tlv))) |
999 | ||
1000 | /* | |
1001 | * Compute actual structure size given filter type. To be "future-proof," | |
1002 | * drivers should use this instead of "sizeof (struct filter_v2)" when | |
1003 | * computing length for TLV. | |
1004 | */ | |
9f95a23c | 1005 | static inline uint32_t |
7c673cae FG |
1006 | vnic_filter_size(struct filter_v2 *fp) |
1007 | { | |
9f95a23c | 1008 | uint32_t size; |
7c673cae FG |
1009 | |
1010 | switch (fp->type) { | |
1011 | case FILTER_USNIC_ID: | |
1012 | size = sizeof(fp->u.usnic); | |
1013 | break; | |
1014 | case FILTER_IPV4_5TUPLE: | |
1015 | size = sizeof(fp->u.ipv4); | |
1016 | break; | |
1017 | case FILTER_MAC_VLAN: | |
1018 | case FILTER_NVGRE_VMQ: | |
1019 | size = sizeof(fp->u.mac_vlan); | |
1020 | break; | |
1021 | case FILTER_VLAN_IP_3TUPLE: | |
1022 | size = sizeof(fp->u.vlan_3tuple); | |
1023 | break; | |
1024 | case FILTER_USNIC_IP: | |
1025 | case FILTER_DPDK_1: | |
1026 | size = sizeof(fp->u.generic_1); | |
1027 | break; | |
1028 | default: | |
1029 | size = sizeof(fp->u); | |
1030 | break; | |
1031 | } | |
1032 | size += sizeof(fp->type); | |
1033 | return size; | |
1034 | } | |
1035 | ||
1036 | ||
1037 | enum { | |
1038 | CLSF_ADD = 0, | |
1039 | CLSF_DEL = 1, | |
1040 | }; | |
1041 | ||
9f95a23c TL |
1042 | /* |
1043 | * Get the action structure size given action type. To be "future-proof," | |
1044 | * drivers should use this instead of "sizeof (struct filter_action_v2)" | |
1045 | * when computing length for TLV. | |
1046 | */ | |
1047 | static inline uint32_t | |
1048 | vnic_action_size(struct filter_action_v2 *fap) | |
1049 | { | |
1050 | uint32_t size; | |
1051 | ||
1052 | switch (fap->type) { | |
1053 | case FILTER_ACTION_RQ_STEERING: | |
1054 | size = sizeof(struct filter_action); | |
1055 | break; | |
1056 | case FILTER_ACTION_V2: | |
1057 | size = sizeof(struct filter_action_v2); | |
1058 | break; | |
1059 | default: | |
1060 | size = sizeof(struct filter_action); | |
1061 | break; | |
1062 | } | |
1063 | return size; | |
1064 | } | |
1065 | ||
7c673cae FG |
1066 | /* |
1067 | * Writing cmd register causes STAT_BUSY to get set in status register. | |
1068 | * When cmd completes, STAT_BUSY will be cleared. | |
1069 | * | |
1070 | * If cmd completed successfully STAT_ERROR will be clear | |
1071 | * and args registers contain cmd-specific results. | |
1072 | * | |
1073 | * If cmd error, STAT_ERROR will be set and args[0] contains error code. | |
1074 | * | |
1075 | * status register is read-only. While STAT_BUSY is set, | |
1076 | * all other register contents are read-only. | |
1077 | */ | |
1078 | ||
1079 | /* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */ | |
1080 | #define VNIC_DEVCMD_NARGS 15 | |
1081 | struct vnic_devcmd { | |
1082 | u32 status; /* RO */ | |
1083 | u32 cmd; /* RW */ | |
1084 | u64 args[VNIC_DEVCMD_NARGS]; /* RW cmd args (little-endian) */ | |
1085 | }; | |
1086 | ||
1087 | /* | |
1088 | * Version 2 of the interface. | |
1089 | * | |
1090 | * Some things are carried over, notably the vnic_devcmd_cmd enum. | |
1091 | */ | |
1092 | ||
1093 | /* | |
1094 | * Flags for vnic_devcmd2.flags | |
1095 | */ | |
1096 | ||
1097 | #define DEVCMD2_FNORESULT 0x1 /* Don't copy result to host */ | |
1098 | ||
1099 | #define VNIC_DEVCMD2_NARGS VNIC_DEVCMD_NARGS | |
1100 | struct vnic_devcmd2 { | |
1101 | u16 pad; | |
1102 | u16 flags; | |
1103 | u32 cmd; /* same command #defines as original */ | |
1104 | u64 args[VNIC_DEVCMD2_NARGS]; | |
1105 | }; | |
1106 | ||
1107 | #define VNIC_DEVCMD2_NRESULTS VNIC_DEVCMD_NARGS | |
1108 | struct devcmd2_result { | |
1109 | u64 results[VNIC_DEVCMD2_NRESULTS]; | |
1110 | u32 pad; | |
1111 | u16 completed_index; /* into copy WQ */ | |
1112 | u8 error; /* same error codes as original */ | |
1113 | u8 color; /* 0 or 1 as with completion queues */ | |
1114 | }; | |
1115 | ||
1116 | #define DEVCMD2_RING_SIZE 32 | |
1117 | #define DEVCMD2_DESC_SIZE 128 | |
1118 | ||
1119 | #define DEVCMD2_RESULTS_SIZE_MAX ((1 << 16) - 1) | |
1120 | ||
1121 | /* Overlay related definitions */ | |
1122 | ||
1123 | /* | |
1124 | * This enum lists the flag associated with each of the overlay features | |
1125 | */ | |
1126 | typedef enum { | |
1127 | OVERLAY_FEATURE_NVGRE = 1, | |
1128 | OVERLAY_FEATURE_VXLAN, | |
1129 | OVERLAY_FEATURE_MAX, | |
1130 | } overlay_feature_t; | |
1131 | ||
1132 | #define OVERLAY_OFFLOAD_ENABLE 0 | |
1133 | #define OVERLAY_OFFLOAD_DISABLE 1 | |
1134 | #define OVERLAY_OFFLOAD_ENABLE_V2 2 | |
1135 | ||
1136 | #define OVERLAY_CFG_VXLAN_PORT_UPDATE 0 | |
1137 | ||
1138 | /* | |
1139 | * Use this enum to get the supported versions for each of these features | |
1140 | * If you need to use the devcmd_get_supported_feature_version(), add | |
1141 | * the new feature into this enum and install function handler in devcmd.c | |
1142 | */ | |
1143 | typedef enum { | |
1144 | VIC_FEATURE_VXLAN, | |
1145 | VIC_FEATURE_RDMA, | |
1146 | VIC_FEATURE_MAX, | |
1147 | } vic_feature_t; | |
1148 | ||
9f95a23c TL |
1149 | /* |
1150 | * These flags are used in args[1] of devcmd CMD_GET_SUPP_FEATURE_VER | |
1151 | * to indicate the host driver about the VxLAN and Multi WQ features | |
1152 | * supported | |
1153 | */ | |
1154 | #define FEATURE_VXLAN_IPV6_INNER (1 << 0) | |
1155 | #define FEATURE_VXLAN_IPV6_OUTER (1 << 1) | |
1156 | #define FEATURE_VXLAN_MULTI_WQ (1 << 2) | |
1157 | ||
1158 | #define FEATURE_VXLAN_IPV6 (FEATURE_VXLAN_IPV6_INNER | \ | |
1159 | FEATURE_VXLAN_IPV6_OUTER) | |
1160 | ||
7c673cae FG |
1161 | /* |
1162 | * CMD_CONFIG_GRPINTR subcommands | |
1163 | */ | |
1164 | typedef enum { | |
1165 | GRPINTR_ENABLE = 1, | |
1166 | GRPINTR_DISABLE, | |
1167 | GRPINTR_UPD_VECT, | |
1168 | } grpintr_subcmd_t; | |
1169 | ||
9f95a23c TL |
1170 | /* |
1171 | * Structure for counter DMA | |
1172 | * (DMAed by CMD_COUNTER_DMA_CONFIG) | |
1173 | */ | |
1174 | struct vnic_counter_counts { | |
1175 | u64 vcc_packets; | |
1176 | u64 vcc_bytes; | |
1177 | }; | |
1178 | ||
7c673cae | 1179 | #endif /* _VNIC_DEVCMD_H_ */ |