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