1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Marvell RVU Ethernet driver
3  *
4  * Copyright (C) 2020 Marvell.
5  *
6  */
7 
8 #ifndef OTX2_STRUCT_H
9 #define OTX2_STRUCT_H
10 
11 /* NIX WQE/CQE size 128 byte or 512 byte */
12 enum nix_cqesz_e {
13 	NIX_XQESZ_W64 = 0x0,
14 	NIX_XQESZ_W16 = 0x1,
15 };
16 
17 enum nix_sqes_e {
18 	NIX_SQESZ_W16 = 0x0,
19 	NIX_SQESZ_W8 = 0x1,
20 };
21 
22 enum nix_send_ldtype {
23 	NIX_SEND_LDTYPE_LDD  = 0x0,
24 	NIX_SEND_LDTYPE_LDT  = 0x1,
25 	NIX_SEND_LDTYPE_LDWB = 0x2,
26 };
27 
28 /* CSUM offload */
29 enum nix_sendl3type {
30 	NIX_SENDL3TYPE_NONE = 0x0,
31 	NIX_SENDL3TYPE_IP4 = 0x2,
32 	NIX_SENDL3TYPE_IP4_CKSUM = 0x3,
33 	NIX_SENDL3TYPE_IP6 = 0x4,
34 };
35 
36 enum nix_sendl4type {
37 	NIX_SENDL4TYPE_NONE,
38 	NIX_SENDL4TYPE_TCP_CKSUM,
39 	NIX_SENDL4TYPE_SCTP_CKSUM,
40 	NIX_SENDL4TYPE_UDP_CKSUM,
41 };
42 
43 /* NIX wqe/cqe types */
44 enum nix_xqe_type {
45 	NIX_XQE_TYPE_INVALID   = 0x0,
46 	NIX_XQE_TYPE_RX        = 0x1,
47 	NIX_XQE_TYPE_RX_IPSECS = 0x2,
48 	NIX_XQE_TYPE_RX_IPSECH = 0x3,
49 	NIX_XQE_TYPE_RX_IPSECD = 0x4,
50 	NIX_XQE_TYPE_SEND      = 0x8,
51 };
52 
53 /* NIX CQE/SQE subdescriptor types */
54 enum nix_subdc {
55 	NIX_SUBDC_NOP  = 0x0,
56 	NIX_SUBDC_EXT  = 0x1,
57 	NIX_SUBDC_CRC  = 0x2,
58 	NIX_SUBDC_IMM  = 0x3,
59 	NIX_SUBDC_SG   = 0x4,
60 	NIX_SUBDC_MEM  = 0x5,
61 	NIX_SUBDC_JUMP = 0x6,
62 	NIX_SUBDC_WORK = 0x7,
63 	NIX_SUBDC_SOD  = 0xf,
64 };
65 
66 /* Algorithm for nix_sqe_mem_s header (value of the `alg` field) */
67 enum nix_sendmemalg {
68 	NIX_SENDMEMALG_E_SET       = 0x0,
69 	NIX_SENDMEMALG_E_SETTSTMP  = 0x1,
70 	NIX_SENDMEMALG_E_SETRSLT   = 0x2,
71 	NIX_SENDMEMALG_E_ADD       = 0x8,
72 	NIX_SENDMEMALG_E_SUB       = 0x9,
73 	NIX_SENDMEMALG_E_ADDLEN    = 0xa,
74 	NIX_SENDMEMALG_E_SUBLEN    = 0xb,
75 	NIX_SENDMEMALG_E_ADDMBUF   = 0xc,
76 	NIX_SENDMEMALG_E_SUBMBUF   = 0xd,
77 	NIX_SENDMEMALG_E_ENUM_LAST = 0xe,
78 };
79 
80 /* NIX CQE header structure */
81 struct nix_cqe_hdr_s {
82 	u64 flow_tag              : 32;
83 	u64 q                     : 20;
84 	u64 reserved_52_57        : 6;
85 	u64 node                  : 2;
86 	u64 cqe_type              : 4;
87 };
88 
89 /* NIX CQE RX parse structure */
90 struct nix_rx_parse_s {
91 	u64 chan         : 12;
92 	u64 desc_sizem1  : 5;
93 	u64 rsvd_17      : 1;
94 	u64 express      : 1;
95 	u64 wqwd         : 1;
96 	u64 errlev       : 4;
97 	u64 errcode      : 8;
98 	u64 latype       : 4;
99 	u64 lbtype       : 4;
100 	u64 lctype       : 4;
101 	u64 ldtype       : 4;
102 	u64 letype       : 4;
103 	u64 lftype       : 4;
104 	u64 lgtype       : 4;
105 	u64 lhtype       : 4;
106 	u64 pkt_lenm1    : 16; /* W1 */
107 	u64 l2m          : 1;
108 	u64 l2b          : 1;
109 	u64 l3m          : 1;
110 	u64 l3b          : 1;
111 	u64 vtag0_valid  : 1;
112 	u64 vtag0_gone   : 1;
113 	u64 vtag1_valid  : 1;
114 	u64 vtag1_gone   : 1;
115 	u64 pkind        : 6;
116 	u64 rsvd_95_94   : 2;
117 	u64 vtag0_tci    : 16;
118 	u64 vtag1_tci    : 16;
119 	u64 laflags      : 8; /* W2 */
120 	u64 lbflags      : 8;
121 	u64 lcflags      : 8;
122 	u64 ldflags      : 8;
123 	u64 leflags      : 8;
124 	u64 lfflags      : 8;
125 	u64 lgflags      : 8;
126 	u64 lhflags      : 8;
127 	u64 eoh_ptr      : 8; /* W3 */
128 	u64 wqe_aura     : 20;
129 	u64 pb_aura      : 20;
130 	u64 match_id     : 16;
131 	u64 laptr        : 8; /* W4 */
132 	u64 lbptr        : 8;
133 	u64 lcptr        : 8;
134 	u64 ldptr        : 8;
135 	u64 leptr        : 8;
136 	u64 lfptr        : 8;
137 	u64 lgptr        : 8;
138 	u64 lhptr        : 8;
139 	u64 vtag0_ptr    : 8; /* W5 */
140 	u64 vtag1_ptr    : 8;
141 	u64 flow_key_alg : 5;
142 	u64 rsvd_359_341 : 19;
143 	u64 color	 : 2;
144 	u64 rsvd_383_362 : 22;
145 	u64 rsvd_447_384;     /* W6 */
146 };
147 
148 /* NIX CQE RX scatter/gather subdescriptor structure */
149 struct nix_rx_sg_s {
150 	u64 seg_size   : 16; /* W0 */
151 	u64 seg2_size  : 16;
152 	u64 seg3_size  : 16;
153 	u64 segs       : 2;
154 	u64 rsvd_59_50 : 10;
155 	u64 subdc      : 4;
156 	u64 seg_addr;
157 	u64 seg2_addr;
158 	u64 seg3_addr;
159 };
160 
161 struct nix_send_comp_s {
162 	u64 status	: 8;
163 	u64 sqe_id	: 16;
164 	u64 rsvd_24_63	: 40;
165 };
166 
167 struct nix_cqe_rx_s {
168 	struct nix_cqe_hdr_s  hdr;
169 	struct nix_rx_parse_s parse;
170 	struct nix_rx_sg_s sg;
171 };
172 
173 struct nix_cqe_tx_s {
174 	struct nix_cqe_hdr_s  hdr;
175 	struct nix_send_comp_s comp;
176 };
177 
178 /* NIX SQE header structure */
179 struct nix_sqe_hdr_s {
180 	u64 total		: 18; /* W0 */
181 	u64 reserved_18		: 1;
182 	u64 df			: 1;
183 	u64 aura		: 20;
184 	u64 sizem1		: 3;
185 	u64 pnc			: 1;
186 	u64 sq			: 20;
187 	u64 ol3ptr		: 8; /* W1 */
188 	u64 ol4ptr		: 8;
189 	u64 il3ptr		: 8;
190 	u64 il4ptr		: 8;
191 	u64 ol3type		: 4;
192 	u64 ol4type		: 4;
193 	u64 il3type		: 4;
194 	u64 il4type		: 4;
195 	u64 sqe_id		: 16;
196 
197 };
198 
199 /* NIX send extended header subdescriptor structure */
200 struct nix_sqe_ext_s {
201 	u64 lso_mps       : 14; /* W0 */
202 	u64 lso           : 1;
203 	u64 tstmp         : 1;
204 	u64 lso_sb        : 8;
205 	u64 lso_format    : 5;
206 	u64 rsvd_31_29    : 3;
207 	u64 shp_chg       : 9;
208 	u64 shp_dis       : 1;
209 	u64 shp_ra        : 2;
210 	u64 markptr       : 8;
211 	u64 markform      : 7;
212 	u64 mark_en       : 1;
213 	u64 subdc         : 4;
214 	u64 vlan0_ins_ptr : 8; /* W1 */
215 	u64 vlan0_ins_tci : 16;
216 	u64 vlan1_ins_ptr : 8;
217 	u64 vlan1_ins_tci : 16;
218 	u64 vlan0_ins_ena : 1;
219 	u64 vlan1_ins_ena : 1;
220 	u64 init_color    : 2;
221 	u64 rsvd_127_116  : 12;
222 };
223 
224 struct nix_sqe_sg_s {
225 	u64 seg1_size	: 16;
226 	u64 seg2_size	: 16;
227 	u64 seg3_size	: 16;
228 	u64 segs	: 2;
229 	u64 rsvd_54_50	: 5;
230 	u64 i1		: 1;
231 	u64 i2		: 1;
232 	u64 i3		: 1;
233 	u64 ld_type	: 2;
234 	u64 subdc	: 4;
235 };
236 
237 /* NIX send memory subdescriptor structure */
238 struct nix_sqe_mem_s {
239 	u64 offset        : 16; /* W0 */
240 	u64 rsvd_51_16    : 36;
241 	u64 per_lso_seg   : 1;
242 	u64 wmem          : 1;
243 	u64 dsz           : 2;
244 	u64 alg           : 4;
245 	u64 subdc         : 4;
246 	u64 addr; /* W1 */
247 };
248 
249 enum nix_cqerrint_e {
250 	NIX_CQERRINT_DOOR_ERR = 0,
251 	NIX_CQERRINT_WR_FULL = 1,
252 	NIX_CQERRINT_CQE_FAULT = 2,
253 };
254 
255 #define NIX_CQERRINT_BITS (BIT_ULL(NIX_CQERRINT_DOOR_ERR) | \
256 			   BIT_ULL(NIX_CQERRINT_CQE_FAULT))
257 
258 enum nix_rqint_e {
259 	NIX_RQINT_DROP = 0,
260 	NIX_RQINT_RED = 1,
261 };
262 
263 #define NIX_RQINT_BITS (BIT_ULL(NIX_RQINT_DROP) | BIT_ULL(NIX_RQINT_RED))
264 
265 enum nix_sqint_e {
266 	NIX_SQINT_LMT_ERR = 0,
267 	NIX_SQINT_MNQ_ERR = 1,
268 	NIX_SQINT_SEND_ERR = 2,
269 	NIX_SQINT_SQB_ALLOC_FAIL = 3,
270 };
271 
272 #define NIX_SQINT_BITS (BIT_ULL(NIX_SQINT_LMT_ERR) | \
273 			BIT_ULL(NIX_SQINT_MNQ_ERR) | \
274 			BIT_ULL(NIX_SQINT_SEND_ERR) | \
275 			BIT_ULL(NIX_SQINT_SQB_ALLOC_FAIL))
276 
277 #endif /* OTX2_STRUCT_H */
278