net/cxgbe: support to offload flows to HASH region
[dpdk.git] / drivers / net / cxgbe / base / t4_msg.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2014-2018 Chelsio Communications.
3  * All rights reserved.
4  */
5
6 #ifndef T4_MSG_H
7 #define T4_MSG_H
8
9 enum {
10         CPL_ACT_OPEN_REQ      = 0x3,
11         CPL_ACT_OPEN_RPL      = 0x25,
12         CPL_SET_TCB_RPL       = 0x3A,
13         CPL_ACT_OPEN_REQ6     = 0x83,
14         CPL_SGE_EGR_UPDATE    = 0xA5,
15         CPL_FW4_MSG           = 0xC0,
16         CPL_FW6_MSG           = 0xE0,
17         CPL_TX_PKT_LSO        = 0xED,
18         CPL_TX_PKT_XT         = 0xEE,
19 };
20
21 enum CPL_error {
22         CPL_ERR_NONE               = 0,
23         CPL_ERR_TCAM_FULL          = 3,
24 };
25
26 enum {
27         ULP_MODE_NONE          = 0,
28 };
29
30 enum {                     /* TX_PKT_XT checksum types */
31         TX_CSUM_TCPIP  = 8,
32         TX_CSUM_UDPIP  = 9,
33         TX_CSUM_TCPIP6 = 10,
34 };
35
36 union opcode_tid {
37         __be32 opcode_tid;
38         __u8 opcode;
39 };
40
41 #define S_CPL_OPCODE    24
42 #define V_CPL_OPCODE(x) ((x) << S_CPL_OPCODE)
43
44 #define G_TID(x)    ((x) & 0xFFFFFF)
45
46 /* tid is assumed to be 24-bits */
47 #define MK_OPCODE_TID(opcode, tid) (V_CPL_OPCODE(opcode) | (tid))
48
49 #define OPCODE_TID(cmd) ((cmd)->ot.opcode_tid)
50
51 /* extract the TID from a CPL command */
52 #define GET_TID(cmd) (G_TID(be32_to_cpu(OPCODE_TID(cmd))))
53
54 /* partitioning of TID fields that also carry a queue id */
55 #define S_TID_TID    0
56 #define M_TID_TID    0x3fff
57 #define G_TID_TID(x) (((x) >> S_TID_TID) & M_TID_TID)
58
59 struct rss_header {
60         __u8 opcode;
61 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
62         __u8 channel:2;
63         __u8 filter_hit:1;
64         __u8 filter_tid:1;
65         __u8 hash_type:2;
66         __u8 ipv6:1;
67         __u8 send2fw:1;
68 #else
69         __u8 send2fw:1;
70         __u8 ipv6:1;
71         __u8 hash_type:2;
72         __u8 filter_tid:1;
73         __u8 filter_hit:1;
74         __u8 channel:2;
75 #endif
76         __be16 qid;
77         __be32 hash_val;
78 };
79
80 #if defined(RSS_HDR_VLD) || defined(CHELSIO_FW)
81 #define RSS_HDR struct rss_header rss_hdr
82 #else
83 #define RSS_HDR
84 #endif
85
86 #ifndef CHELSIO_FW
87 struct work_request_hdr {
88         __be32 wr_hi;
89         __be32 wr_mid;
90         __be64 wr_lo;
91 };
92
93 #define WR_HDR struct work_request_hdr wr
94 #define WR_HDR_SIZE sizeof(struct work_request_hdr)
95 #else
96 #define WR_HDR
97 #define WR_HDR_SIZE 0
98 #endif
99
100 #define S_COOKIE    5
101 #define M_COOKIE    0x7
102 #define V_COOKIE(x) ((x) << S_COOKIE)
103 #define G_COOKIE(x) (((x) >> S_COOKIE) & M_COOKIE)
104
105 /* option 0 fields */
106 #define S_DELACK    5
107 #define V_DELACK(x) ((x) << S_DELACK)
108
109 #define S_NON_OFFLOAD    7
110 #define V_NON_OFFLOAD(x) ((x) << S_NON_OFFLOAD)
111 #define F_NON_OFFLOAD    V_NON_OFFLOAD(1U)
112
113 #define S_ULP_MODE    8
114 #define V_ULP_MODE(x) ((x) << S_ULP_MODE)
115
116 #define S_SMAC_SEL    28
117 #define V_SMAC_SEL(x) ((__u64)(x) << S_SMAC_SEL)
118
119 #define S_TCAM_BYPASS    48
120 #define V_TCAM_BYPASS(x) ((__u64)(x) << S_TCAM_BYPASS)
121 #define F_TCAM_BYPASS    V_TCAM_BYPASS(1ULL)
122
123 /* option 2 fields */
124 #define S_RSS_QUEUE    0
125 #define V_RSS_QUEUE(x) ((x) << S_RSS_QUEUE)
126
127 #define S_RSS_QUEUE_VALID    10
128 #define V_RSS_QUEUE_VALID(x) ((x) << S_RSS_QUEUE_VALID)
129 #define F_RSS_QUEUE_VALID    V_RSS_QUEUE_VALID(1U)
130
131 #define S_CONG_CNTRL    14
132 #define V_CONG_CNTRL(x) ((x) << S_CONG_CNTRL)
133
134 #define S_RX_CHANNEL    26
135 #define V_RX_CHANNEL(x) ((x) << S_RX_CHANNEL)
136 #define F_RX_CHANNEL    V_RX_CHANNEL(1U)
137
138 #define S_T5_OPT_2_VALID    31
139 #define V_T5_OPT_2_VALID(x) ((x) << S_T5_OPT_2_VALID)
140 #define F_T5_OPT_2_VALID    V_T5_OPT_2_VALID(1U)
141
142 struct cpl_t6_act_open_req {
143         WR_HDR;
144         union opcode_tid ot;
145         __be16 local_port;
146         __be16 peer_port;
147         __be32 local_ip;
148         __be32 peer_ip;
149         __be64 opt0;
150         __be32 rsvd;
151         __be32 opt2;
152         __be64 params;
153         __be32 rsvd2;
154         __be32 opt3;
155 };
156
157 struct cpl_t6_act_open_req6 {
158         WR_HDR;
159         union opcode_tid ot;
160         __be16 local_port;
161         __be16 peer_port;
162         __be64 local_ip_hi;
163         __be64 local_ip_lo;
164         __be64 peer_ip_hi;
165         __be64 peer_ip_lo;
166         __be64 opt0;
167         __be32 rsvd;
168         __be32 opt2;
169         __be64 params;
170         __be32 rsvd2;
171         __be32 opt3;
172 };
173
174 #define S_FILTER_TUPLE  24
175 #define V_FILTER_TUPLE(x) ((x) << S_FILTER_TUPLE)
176
177 struct cpl_act_open_rpl {
178         RSS_HDR
179         union opcode_tid ot;
180         __be32 atid_status;
181 };
182
183 /* cpl_act_open_rpl.atid_status fields */
184 #define S_AOPEN_STATUS    0
185 #define M_AOPEN_STATUS    0xFF
186 #define G_AOPEN_STATUS(x) (((x) >> S_AOPEN_STATUS) & M_AOPEN_STATUS)
187
188 #define S_AOPEN_ATID    8
189 #define M_AOPEN_ATID    0xFFFFFF
190 #define G_AOPEN_ATID(x) (((x) >> S_AOPEN_ATID) & M_AOPEN_ATID)
191
192 struct cpl_set_tcb_rpl {
193         RSS_HDR
194         union opcode_tid ot;
195         __be16 rsvd;
196         __u8   cookie;
197         __u8   status;
198         __be64 oldval;
199 };
200
201 struct cpl_tx_data {
202         union opcode_tid ot;
203         __be32 len;
204         __be32 rsvd;
205         __be32 flags;
206 };
207
208 struct cpl_tx_pkt_core {
209         __be32 ctrl0;
210         __be16 pack;
211         __be16 len;
212         __be64 ctrl1;
213 };
214
215 struct cpl_tx_pkt {
216         WR_HDR;
217         struct cpl_tx_pkt_core c;
218 };
219
220 /* cpl_tx_pkt_core.ctrl0 fields */
221 #define S_TXPKT_PF    8
222 #define M_TXPKT_PF    0x7
223 #define V_TXPKT_PF(x) ((x) << S_TXPKT_PF)
224 #define G_TXPKT_PF(x) (((x) >> S_TXPKT_PF) & M_TXPKT_PF)
225
226 #define S_TXPKT_INTF    16
227 #define M_TXPKT_INTF    0xF
228 #define V_TXPKT_INTF(x) ((x) << S_TXPKT_INTF)
229 #define G_TXPKT_INTF(x) (((x) >> S_TXPKT_INTF) & M_TXPKT_INTF)
230
231 #define S_TXPKT_OPCODE    24
232 #define M_TXPKT_OPCODE    0xFF
233 #define V_TXPKT_OPCODE(x) ((x) << S_TXPKT_OPCODE)
234 #define G_TXPKT_OPCODE(x) (((x) >> S_TXPKT_OPCODE) & M_TXPKT_OPCODE)
235
236 /* cpl_tx_pkt_core.ctrl1 fields */
237 #define S_TXPKT_IPHDR_LEN    20
238 #define M_TXPKT_IPHDR_LEN    0x3FFF
239 #define V_TXPKT_IPHDR_LEN(x) ((__u64)(x) << S_TXPKT_IPHDR_LEN)
240 #define G_TXPKT_IPHDR_LEN(x) (((x) >> S_TXPKT_IPHDR_LEN) & M_TXPKT_IPHDR_LEN)
241
242 #define S_TXPKT_ETHHDR_LEN    34
243 #define M_TXPKT_ETHHDR_LEN    0x3F
244 #define V_TXPKT_ETHHDR_LEN(x) ((__u64)(x) << S_TXPKT_ETHHDR_LEN)
245 #define G_TXPKT_ETHHDR_LEN(x) (((x) >> S_TXPKT_ETHHDR_LEN) & M_TXPKT_ETHHDR_LEN)
246
247 #define S_T6_TXPKT_ETHHDR_LEN    32
248 #define M_T6_TXPKT_ETHHDR_LEN    0xFF
249 #define V_T6_TXPKT_ETHHDR_LEN(x) ((__u64)(x) << S_T6_TXPKT_ETHHDR_LEN)
250 #define G_T6_TXPKT_ETHHDR_LEN(x) \
251         (((x) >> S_T6_TXPKT_ETHHDR_LEN) & M_T6_TXPKT_ETHHDR_LEN)
252
253 #define S_TXPKT_CSUM_TYPE    40
254 #define M_TXPKT_CSUM_TYPE    0xF
255 #define V_TXPKT_CSUM_TYPE(x) ((__u64)(x) << S_TXPKT_CSUM_TYPE)
256 #define G_TXPKT_CSUM_TYPE(x) (((x) >> S_TXPKT_CSUM_TYPE) & M_TXPKT_CSUM_TYPE)
257
258 #define S_TXPKT_VLAN    44
259 #define M_TXPKT_VLAN    0xFFFF
260 #define V_TXPKT_VLAN(x) ((__u64)(x) << S_TXPKT_VLAN)
261 #define G_TXPKT_VLAN(x) (((x) >> S_TXPKT_VLAN) & M_TXPKT_VLAN)
262
263 #define S_TXPKT_VLAN_VLD    60
264 #define V_TXPKT_VLAN_VLD(x) ((__u64)(x) << S_TXPKT_VLAN_VLD)
265 #define F_TXPKT_VLAN_VLD    V_TXPKT_VLAN_VLD(1ULL)
266
267 #define S_TXPKT_IPCSUM_DIS    62
268 #define V_TXPKT_IPCSUM_DIS(x) ((__u64)(x) << S_TXPKT_IPCSUM_DIS)
269 #define F_TXPKT_IPCSUM_DIS    V_TXPKT_IPCSUM_DIS(1ULL)
270
271 #define S_TXPKT_L4CSUM_DIS    63
272 #define V_TXPKT_L4CSUM_DIS(x) ((__u64)(x) << S_TXPKT_L4CSUM_DIS)
273 #define F_TXPKT_L4CSUM_DIS    V_TXPKT_L4CSUM_DIS(1ULL)
274
275 struct cpl_tx_pkt_lso_core {
276         __be32 lso_ctrl;
277         __be16 ipid_ofst;
278         __be16 mss;
279         __be32 seqno_offset;
280         __be32 len;
281         /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */
282 };
283
284 struct cpl_tx_pkt_lso {
285         WR_HDR;
286         struct cpl_tx_pkt_lso_core c;
287         /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */
288 };
289
290 /* cpl_tx_pkt_lso_core.lso_ctrl fields */
291 #define S_LSO_TCPHDR_LEN    0
292 #define M_LSO_TCPHDR_LEN    0xF
293 #define V_LSO_TCPHDR_LEN(x) ((x) << S_LSO_TCPHDR_LEN)
294 #define G_LSO_TCPHDR_LEN(x) (((x) >> S_LSO_TCPHDR_LEN) & M_LSO_TCPHDR_LEN)
295
296 #define S_LSO_IPHDR_LEN    4
297 #define M_LSO_IPHDR_LEN    0xFFF
298 #define V_LSO_IPHDR_LEN(x) ((x) << S_LSO_IPHDR_LEN)
299 #define G_LSO_IPHDR_LEN(x) (((x) >> S_LSO_IPHDR_LEN) & M_LSO_IPHDR_LEN)
300
301 #define S_LSO_ETHHDR_LEN    16
302 #define M_LSO_ETHHDR_LEN    0xF
303 #define V_LSO_ETHHDR_LEN(x) ((x) << S_LSO_ETHHDR_LEN)
304 #define G_LSO_ETHHDR_LEN(x) (((x) >> S_LSO_ETHHDR_LEN) & M_LSO_ETHHDR_LEN)
305
306 #define S_LSO_IPV6    20
307 #define V_LSO_IPV6(x) ((x) << S_LSO_IPV6)
308 #define F_LSO_IPV6    V_LSO_IPV6(1U)
309
310 #define S_LSO_LAST_SLICE    22
311 #define V_LSO_LAST_SLICE(x) ((x) << S_LSO_LAST_SLICE)
312 #define F_LSO_LAST_SLICE    V_LSO_LAST_SLICE(1U)
313
314 #define S_LSO_FIRST_SLICE    23
315 #define V_LSO_FIRST_SLICE(x) ((x) << S_LSO_FIRST_SLICE)
316 #define F_LSO_FIRST_SLICE    V_LSO_FIRST_SLICE(1U)
317
318 #define S_LSO_OPCODE    24
319 #define M_LSO_OPCODE    0xFF
320 #define V_LSO_OPCODE(x) ((x) << S_LSO_OPCODE)
321 #define G_LSO_OPCODE(x) (((x) >> S_LSO_OPCODE) & M_LSO_OPCODE)
322
323 #define S_LSO_T5_XFER_SIZE         0
324 #define M_LSO_T5_XFER_SIZE    0xFFFFFFF
325 #define V_LSO_T5_XFER_SIZE(x) ((x) << S_LSO_T5_XFER_SIZE)
326 #define G_LSO_T5_XFER_SIZE(x) (((x) >> S_LSO_T5_XFER_SIZE) & M_LSO_T5_XFER_SIZE)
327
328 struct cpl_rx_pkt {
329         RSS_HDR;
330         __u8 opcode;
331 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
332         __u8 iff:4;
333         __u8 csum_calc:1;
334         __u8 ipmi_pkt:1;
335         __u8 vlan_ex:1;
336         __u8 ip_frag:1;
337 #else
338         __u8 ip_frag:1;
339         __u8 vlan_ex:1;
340         __u8 ipmi_pkt:1;
341         __u8 csum_calc:1;
342         __u8 iff:4;
343 #endif
344         __be16 csum;
345         __be16 vlan;
346         __be16 len;
347         __be32 l2info;
348         __be16 hdr_len;
349         __be16 err_vec;
350 };
351
352 /* rx_pkt.l2info fields */
353 #define S_RXF_UDP    22
354 #define V_RXF_UDP(x) ((x) << S_RXF_UDP)
355 #define F_RXF_UDP    V_RXF_UDP(1U)
356
357 #define S_RXF_TCP    23
358 #define V_RXF_TCP(x) ((x) << S_RXF_TCP)
359 #define F_RXF_TCP    V_RXF_TCP(1U)
360
361 #define S_RXF_IP    24
362 #define V_RXF_IP(x) ((x) << S_RXF_IP)
363 #define F_RXF_IP    V_RXF_IP(1U)
364
365 #define S_RXF_IP6    25
366 #define V_RXF_IP6(x) ((x) << S_RXF_IP6)
367 #define F_RXF_IP6    V_RXF_IP6(1U)
368
369 /* rx_pkt.err_vec fields */
370 /* In T6, rx_pkt.err_vec indicates
371  * RxError Error vector (16b) or
372  * Encapsulating header length (8b),
373  * Outer encapsulation type (2b) and
374  * compressed error vector (6b) if CRxPktEnc is
375  * enabled in TP_OUT_CONFIG
376  */
377 #define S_T6_COMPR_RXERR_VEC    0
378 #define M_T6_COMPR_RXERR_VEC    0x3F
379 #define V_T6_COMPR_RXERR_VEC(x) ((x) << S_T6_COMPR_RXERR_VEC)
380 #define G_T6_COMPR_RXERR_VEC(x) \
381         (((x) >> S_T6_COMPR_RXERR_VEC) & M_T6_COMPR_RXERR_VEC)
382
383 /* cpl_fw*.type values */
384 enum {
385         FW_TYPE_RSSCPL = 4,
386 };
387
388 struct cpl_fw4_msg {
389         RSS_HDR;
390         u8 opcode;
391         u8 type;
392         __be16 rsvd0;
393         __be32 rsvd1;
394         __be64 data[2];
395 };
396
397 struct cpl_fw6_msg {
398         RSS_HDR;
399         u8 opcode;
400         u8 type;
401         __be16 rsvd0;
402         __be32 rsvd1;
403         __be64 data[4];
404 };
405
406 enum {
407         ULP_TX_SC_IMM  = 0x81,
408         ULP_TX_SC_DSGL = 0x82,
409         ULP_TX_SC_ISGL = 0x83
410 };
411
412 #define S_ULPTX_CMD    24
413 #define M_ULPTX_CMD    0xFF
414 #define V_ULPTX_CMD(x) ((x) << S_ULPTX_CMD)
415
416 #define S_ULP_TX_SC_MORE 23
417 #define V_ULP_TX_SC_MORE(x) ((x) << S_ULP_TX_SC_MORE)
418 #define F_ULP_TX_SC_MORE  V_ULP_TX_SC_MORE(1U)
419
420 struct ulptx_sge_pair {
421         __be32 len[2];
422         __be64 addr[2];
423 };
424
425 struct ulptx_sgl {
426         __be32 cmd_nsge;
427         __be32 len0;
428         __be64 addr0;
429
430 #if !(defined C99_NOT_SUPPORTED)
431         struct ulptx_sge_pair sge[0];
432 #endif
433
434 };
435
436 struct ulptx_idata {
437         __be32 cmd_more;
438         __be32 len;
439 };
440
441 #define S_ULPTX_NSGE    0
442 #define M_ULPTX_NSGE    0xFFFF
443 #define V_ULPTX_NSGE(x) ((x) << S_ULPTX_NSGE)
444
445 struct ulp_txpkt {
446         __be32 cmd_dest;
447         __be32 len;
448 };
449
450 /* ulp_txpkt.cmd_dest fields */
451 #define S_ULP_TXPKT_DEST    16
452 #define M_ULP_TXPKT_DEST    0x3
453 #define V_ULP_TXPKT_DEST(x) ((x) << S_ULP_TXPKT_DEST)
454
455 #define S_ULP_TXPKT_FID     4
456 #define M_ULP_TXPKT_FID     0x7ff
457 #define V_ULP_TXPKT_FID(x)  ((x) << S_ULP_TXPKT_FID)
458
459 #define S_ULP_TXPKT_RO      3
460 #define V_ULP_TXPKT_RO(x) ((x) << S_ULP_TXPKT_RO)
461 #define F_ULP_TXPKT_RO V_ULP_TXPKT_RO(1U)
462
463 #endif  /* T4_MSG_H */