New upstream version 17.08
[deb_dpdk.git] / drivers / net / cxgbe / base / t4_msg.h
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2014-2017 Chelsio Communications.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Chelsio Communications nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #ifndef T4_MSG_H
35 #define T4_MSG_H
36
37 enum {
38         CPL_SGE_EGR_UPDATE    = 0xA5,
39         CPL_FW4_MSG           = 0xC0,
40         CPL_FW6_MSG           = 0xE0,
41         CPL_TX_PKT_LSO        = 0xED,
42         CPL_TX_PKT_XT         = 0xEE,
43 };
44
45 enum {                     /* TX_PKT_XT checksum types */
46         TX_CSUM_TCPIP  = 8,
47         TX_CSUM_UDPIP  = 9,
48         TX_CSUM_TCPIP6 = 10,
49 };
50
51 union opcode_tid {
52         __be32 opcode_tid;
53         __u8 opcode;
54 };
55
56 struct rss_header {
57         __u8 opcode;
58 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
59         __u8 channel:2;
60         __u8 filter_hit:1;
61         __u8 filter_tid:1;
62         __u8 hash_type:2;
63         __u8 ipv6:1;
64         __u8 send2fw:1;
65 #else
66         __u8 send2fw:1;
67         __u8 ipv6:1;
68         __u8 hash_type:2;
69         __u8 filter_tid:1;
70         __u8 filter_hit:1;
71         __u8 channel:2;
72 #endif
73         __be16 qid;
74         __be32 hash_val;
75 };
76
77 #if defined(RSS_HDR_VLD) || defined(CHELSIO_FW)
78 #define RSS_HDR struct rss_header rss_hdr
79 #else
80 #define RSS_HDR
81 #endif
82
83 #ifndef CHELSIO_FW
84 struct work_request_hdr {
85         __be32 wr_hi;
86         __be32 wr_mid;
87         __be64 wr_lo;
88 };
89
90 #define WR_HDR struct work_request_hdr wr
91 #define WR_HDR_SIZE sizeof(struct work_request_hdr)
92 #else
93 #define WR_HDR
94 #define WR_HDR_SIZE 0
95 #endif
96
97 struct cpl_tx_data {
98         union opcode_tid ot;
99         __be32 len;
100         __be32 rsvd;
101         __be32 flags;
102 };
103
104 struct cpl_tx_pkt_core {
105         __be32 ctrl0;
106         __be16 pack;
107         __be16 len;
108         __be64 ctrl1;
109 };
110
111 struct cpl_tx_pkt {
112         WR_HDR;
113         struct cpl_tx_pkt_core c;
114 };
115
116 /* cpl_tx_pkt_core.ctrl0 fields */
117 #define S_TXPKT_PF    8
118 #define M_TXPKT_PF    0x7
119 #define V_TXPKT_PF(x) ((x) << S_TXPKT_PF)
120 #define G_TXPKT_PF(x) (((x) >> S_TXPKT_PF) & M_TXPKT_PF)
121
122 #define S_TXPKT_INTF    16
123 #define M_TXPKT_INTF    0xF
124 #define V_TXPKT_INTF(x) ((x) << S_TXPKT_INTF)
125 #define G_TXPKT_INTF(x) (((x) >> S_TXPKT_INTF) & M_TXPKT_INTF)
126
127 #define S_TXPKT_OPCODE    24
128 #define M_TXPKT_OPCODE    0xFF
129 #define V_TXPKT_OPCODE(x) ((x) << S_TXPKT_OPCODE)
130 #define G_TXPKT_OPCODE(x) (((x) >> S_TXPKT_OPCODE) & M_TXPKT_OPCODE)
131
132 /* cpl_tx_pkt_core.ctrl1 fields */
133 #define S_TXPKT_IPHDR_LEN    20
134 #define M_TXPKT_IPHDR_LEN    0x3FFF
135 #define V_TXPKT_IPHDR_LEN(x) ((__u64)(x) << S_TXPKT_IPHDR_LEN)
136 #define G_TXPKT_IPHDR_LEN(x) (((x) >> S_TXPKT_IPHDR_LEN) & M_TXPKT_IPHDR_LEN)
137
138 #define S_TXPKT_ETHHDR_LEN    34
139 #define M_TXPKT_ETHHDR_LEN    0x3F
140 #define V_TXPKT_ETHHDR_LEN(x) ((__u64)(x) << S_TXPKT_ETHHDR_LEN)
141 #define G_TXPKT_ETHHDR_LEN(x) (((x) >> S_TXPKT_ETHHDR_LEN) & M_TXPKT_ETHHDR_LEN)
142
143 #define S_T6_TXPKT_ETHHDR_LEN    32
144 #define M_T6_TXPKT_ETHHDR_LEN    0xFF
145 #define V_T6_TXPKT_ETHHDR_LEN(x) ((__u64)(x) << S_T6_TXPKT_ETHHDR_LEN)
146 #define G_T6_TXPKT_ETHHDR_LEN(x) \
147         (((x) >> S_T6_TXPKT_ETHHDR_LEN) & M_T6_TXPKT_ETHHDR_LEN)
148
149 #define S_TXPKT_CSUM_TYPE    40
150 #define M_TXPKT_CSUM_TYPE    0xF
151 #define V_TXPKT_CSUM_TYPE(x) ((__u64)(x) << S_TXPKT_CSUM_TYPE)
152 #define G_TXPKT_CSUM_TYPE(x) (((x) >> S_TXPKT_CSUM_TYPE) & M_TXPKT_CSUM_TYPE)
153
154 #define S_TXPKT_VLAN    44
155 #define M_TXPKT_VLAN    0xFFFF
156 #define V_TXPKT_VLAN(x) ((__u64)(x) << S_TXPKT_VLAN)
157 #define G_TXPKT_VLAN(x) (((x) >> S_TXPKT_VLAN) & M_TXPKT_VLAN)
158
159 #define S_TXPKT_VLAN_VLD    60
160 #define V_TXPKT_VLAN_VLD(x) ((__u64)(x) << S_TXPKT_VLAN_VLD)
161 #define F_TXPKT_VLAN_VLD    V_TXPKT_VLAN_VLD(1ULL)
162
163 #define S_TXPKT_IPCSUM_DIS    62
164 #define V_TXPKT_IPCSUM_DIS(x) ((__u64)(x) << S_TXPKT_IPCSUM_DIS)
165 #define F_TXPKT_IPCSUM_DIS    V_TXPKT_IPCSUM_DIS(1ULL)
166
167 #define S_TXPKT_L4CSUM_DIS    63
168 #define V_TXPKT_L4CSUM_DIS(x) ((__u64)(x) << S_TXPKT_L4CSUM_DIS)
169 #define F_TXPKT_L4CSUM_DIS    V_TXPKT_L4CSUM_DIS(1ULL)
170
171 struct cpl_tx_pkt_lso_core {
172         __be32 lso_ctrl;
173         __be16 ipid_ofst;
174         __be16 mss;
175         __be32 seqno_offset;
176         __be32 len;
177         /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */
178 };
179
180 struct cpl_tx_pkt_lso {
181         WR_HDR;
182         struct cpl_tx_pkt_lso_core c;
183         /* encapsulated CPL (TX_PKT, TX_PKT_XT or TX_DATA) follows here */
184 };
185
186 /* cpl_tx_pkt_lso_core.lso_ctrl fields */
187 #define S_LSO_TCPHDR_LEN    0
188 #define M_LSO_TCPHDR_LEN    0xF
189 #define V_LSO_TCPHDR_LEN(x) ((x) << S_LSO_TCPHDR_LEN)
190 #define G_LSO_TCPHDR_LEN(x) (((x) >> S_LSO_TCPHDR_LEN) & M_LSO_TCPHDR_LEN)
191
192 #define S_LSO_IPHDR_LEN    4
193 #define M_LSO_IPHDR_LEN    0xFFF
194 #define V_LSO_IPHDR_LEN(x) ((x) << S_LSO_IPHDR_LEN)
195 #define G_LSO_IPHDR_LEN(x) (((x) >> S_LSO_IPHDR_LEN) & M_LSO_IPHDR_LEN)
196
197 #define S_LSO_ETHHDR_LEN    16
198 #define M_LSO_ETHHDR_LEN    0xF
199 #define V_LSO_ETHHDR_LEN(x) ((x) << S_LSO_ETHHDR_LEN)
200 #define G_LSO_ETHHDR_LEN(x) (((x) >> S_LSO_ETHHDR_LEN) & M_LSO_ETHHDR_LEN)
201
202 #define S_LSO_IPV6    20
203 #define V_LSO_IPV6(x) ((x) << S_LSO_IPV6)
204 #define F_LSO_IPV6    V_LSO_IPV6(1U)
205
206 #define S_LSO_LAST_SLICE    22
207 #define V_LSO_LAST_SLICE(x) ((x) << S_LSO_LAST_SLICE)
208 #define F_LSO_LAST_SLICE    V_LSO_LAST_SLICE(1U)
209
210 #define S_LSO_FIRST_SLICE    23
211 #define V_LSO_FIRST_SLICE(x) ((x) << S_LSO_FIRST_SLICE)
212 #define F_LSO_FIRST_SLICE    V_LSO_FIRST_SLICE(1U)
213
214 #define S_LSO_OPCODE    24
215 #define M_LSO_OPCODE    0xFF
216 #define V_LSO_OPCODE(x) ((x) << S_LSO_OPCODE)
217 #define G_LSO_OPCODE(x) (((x) >> S_LSO_OPCODE) & M_LSO_OPCODE)
218
219 #define S_LSO_T5_XFER_SIZE         0
220 #define M_LSO_T5_XFER_SIZE    0xFFFFFFF
221 #define V_LSO_T5_XFER_SIZE(x) ((x) << S_LSO_T5_XFER_SIZE)
222 #define G_LSO_T5_XFER_SIZE(x) (((x) >> S_LSO_T5_XFER_SIZE) & M_LSO_T5_XFER_SIZE)
223
224 struct cpl_rx_pkt {
225         RSS_HDR;
226         __u8 opcode;
227 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
228         __u8 iff:4;
229         __u8 csum_calc:1;
230         __u8 ipmi_pkt:1;
231         __u8 vlan_ex:1;
232         __u8 ip_frag:1;
233 #else
234         __u8 ip_frag:1;
235         __u8 vlan_ex:1;
236         __u8 ipmi_pkt:1;
237         __u8 csum_calc:1;
238         __u8 iff:4;
239 #endif
240         __be16 csum;
241         __be16 vlan;
242         __be16 len;
243         __be32 l2info;
244         __be16 hdr_len;
245         __be16 err_vec;
246 };
247
248 /* rx_pkt.l2info fields */
249 #define S_RXF_UDP    22
250 #define V_RXF_UDP(x) ((x) << S_RXF_UDP)
251 #define F_RXF_UDP    V_RXF_UDP(1U)
252
253 #define S_RXF_TCP    23
254 #define V_RXF_TCP(x) ((x) << S_RXF_TCP)
255 #define F_RXF_TCP    V_RXF_TCP(1U)
256
257 #define S_RXF_IP    24
258 #define V_RXF_IP(x) ((x) << S_RXF_IP)
259 #define F_RXF_IP    V_RXF_IP(1U)
260
261 #define S_RXF_IP6    25
262 #define V_RXF_IP6(x) ((x) << S_RXF_IP6)
263 #define F_RXF_IP6    V_RXF_IP6(1U)
264
265 /* rx_pkt.err_vec fields */
266 /* In T6, rx_pkt.err_vec indicates
267  * RxError Error vector (16b) or
268  * Encapsulating header length (8b),
269  * Outer encapsulation type (2b) and
270  * compressed error vector (6b) if CRxPktEnc is
271  * enabled in TP_OUT_CONFIG
272  */
273 #define S_T6_COMPR_RXERR_VEC    0
274 #define M_T6_COMPR_RXERR_VEC    0x3F
275 #define V_T6_COMPR_RXERR_VEC(x) ((x) << S_T6_COMPR_RXERR_VEC)
276 #define G_T6_COMPR_RXERR_VEC(x) \
277         (((x) >> S_T6_COMPR_RXERR_VEC) & M_T6_COMPR_RXERR_VEC)
278
279 /* cpl_fw*.type values */
280 enum {
281         FW_TYPE_RSSCPL = 4,
282 };
283
284 struct cpl_fw4_msg {
285         RSS_HDR;
286         u8 opcode;
287         u8 type;
288         __be16 rsvd0;
289         __be32 rsvd1;
290         __be64 data[2];
291 };
292
293 struct cpl_fw6_msg {
294         RSS_HDR;
295         u8 opcode;
296         u8 type;
297         __be16 rsvd0;
298         __be32 rsvd1;
299         __be64 data[4];
300 };
301
302 enum {
303         ULP_TX_SC_IMM  = 0x81,
304         ULP_TX_SC_DSGL = 0x82,
305         ULP_TX_SC_ISGL = 0x83
306 };
307
308 #define S_ULPTX_CMD    24
309 #define M_ULPTX_CMD    0xFF
310 #define V_ULPTX_CMD(x) ((x) << S_ULPTX_CMD)
311
312 #define S_ULP_TX_SC_MORE 23
313 #define V_ULP_TX_SC_MORE(x) ((x) << S_ULP_TX_SC_MORE)
314 #define F_ULP_TX_SC_MORE  V_ULP_TX_SC_MORE(1U)
315
316 struct ulptx_sge_pair {
317         __be32 len[2];
318         __be64 addr[2];
319 };
320
321 struct ulptx_sgl {
322         __be32 cmd_nsge;
323         __be32 len0;
324         __be64 addr0;
325
326 #if !(defined C99_NOT_SUPPORTED)
327         struct ulptx_sge_pair sge[0];
328 #endif
329
330 };
331
332 struct ulptx_idata {
333         __be32 cmd_more;
334         __be32 len;
335 };
336
337 #define S_ULPTX_NSGE    0
338 #define M_ULPTX_NSGE    0xFFFF
339 #define V_ULPTX_NSGE(x) ((x) << S_ULPTX_NSGE)
340
341 struct ulp_txpkt {
342         __be32 cmd_dest;
343         __be32 len;
344 };
345
346 /* ulp_txpkt.cmd_dest fields */
347 #define S_ULP_TXPKT_DEST    16
348 #define M_ULP_TXPKT_DEST    0x3
349 #define V_ULP_TXPKT_DEST(x) ((x) << S_ULP_TXPKT_DEST)
350
351 #define S_ULP_TXPKT_FID     4
352 #define M_ULP_TXPKT_FID     0x7ff
353 #define V_ULP_TXPKT_FID(x)  ((x) << S_ULP_TXPKT_FID)
354
355 #define S_ULP_TXPKT_RO      3
356 #define V_ULP_TXPKT_RO(x) ((x) << S_ULP_TXPKT_RO)
357 #define F_ULP_TXPKT_RO V_ULP_TXPKT_RO(1U)
358
359 #endif  /* T4_MSG_H */