xref: /openbmc/u-boot/include/fsl-mc/fsl_dpni.h (revision 00a457b2)
1 /*
2  * Copyright (C) 2013-2015 Freescale Semiconductor
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 #ifndef _FSL_DPNI_H
7 #define _FSL_DPNI_H
8 
9 /* DPNI Version */
10 #define DPNI_VER_MAJOR				5
11 #define DPNI_VER_MINOR				1
12 
13 /* Command IDs */
14 #define DPNI_CMDID_OPEN				0x801
15 #define DPNI_CMDID_CLOSE			0x800
16 #define DPNI_CMDID_CREATE			0x901
17 #define DPNI_CMDID_DESTROY			0x900
18 
19 #define DPNI_CMDID_ENABLE			0x002
20 #define DPNI_CMDID_DISABLE			0x003
21 #define DPNI_CMDID_GET_ATTR			0x004
22 #define DPNI_CMDID_RESET			0x005
23 
24 #define DPNI_CMDID_SET_POOLS			0x200
25 #define DPNI_CMDID_GET_RX_BUFFER_LAYOUT		0x201
26 #define DPNI_CMDID_SET_RX_BUFFER_LAYOUT		0x202
27 #define DPNI_CMDID_GET_TX_BUFFER_LAYOUT		0x203
28 #define DPNI_CMDID_SET_TX_BUFFER_LAYOUT		0x204
29 #define DPNI_CMDID_SET_TX_CONF_BUFFER_LAYOUT	0x205
30 #define DPNI_CMDID_GET_TX_CONF_BUFFER_LAYOUT	0x206
31 
32 #define DPNI_CMDID_GET_QDID			0x210
33 #define DPNI_CMDID_GET_TX_DATA_OFFSET		0x212
34 #define DPNI_CMDID_GET_COUNTER			0x213
35 #define DPNI_CMDID_SET_COUNTER			0x214
36 #define DPNI_CMDID_GET_LINK_STATE		0x215
37 #define DPNI_CMDID_SET_LINK_CFG		0x21A
38 
39 #define DPNI_CMDID_SET_PRIM_MAC			0x224
40 #define DPNI_CMDID_GET_PRIM_MAC			0x225
41 #define DPNI_CMDID_ADD_MAC_ADDR			0x226
42 #define DPNI_CMDID_REMOVE_MAC_ADDR		0x227
43 
44 #define DPNI_CMDID_SET_TX_FLOW			0x236
45 #define DPNI_CMDID_GET_TX_FLOW			0x237
46 #define DPNI_CMDID_SET_RX_FLOW			0x238
47 #define DPNI_CMDID_GET_RX_FLOW			0x239
48 
49 /*                cmd, param, offset, width, type, arg_name */
50 #define DPNI_CMD_OPEN(cmd, dpni_id) \
51 	MC_CMD_OP(cmd,	 0,	0,	32,	int,	dpni_id)
52 
53 /*                cmd, param, offset, width, type, arg_name */
54 #define DPNI_CMD_CREATE(cmd, cfg) \
55 do { \
56 	MC_CMD_OP(cmd, 0, 0,	8,  uint8_t,  cfg->adv.max_tcs); \
57 	MC_CMD_OP(cmd, 0, 8,	8,  uint8_t,  cfg->adv.max_senders); \
58 	MC_CMD_OP(cmd, 0, 16,	8,  uint8_t,  cfg->mac_addr[5]); \
59 	MC_CMD_OP(cmd, 0, 24,	8,  uint8_t,  cfg->mac_addr[4]); \
60 	MC_CMD_OP(cmd, 0, 32,	8,  uint8_t,  cfg->mac_addr[3]); \
61 	MC_CMD_OP(cmd, 0, 40,	8,  uint8_t,  cfg->mac_addr[2]); \
62 	MC_CMD_OP(cmd, 0, 48,	8,  uint8_t,  cfg->mac_addr[1]); \
63 	MC_CMD_OP(cmd, 0, 56,	8,  uint8_t,  cfg->mac_addr[0]); \
64 	MC_CMD_OP(cmd, 1, 0,	32, uint32_t, cfg->adv.options); \
65 	MC_CMD_OP(cmd, 2, 0,	8,  uint8_t,  cfg->adv.max_unicast_filters); \
66 	MC_CMD_OP(cmd, 2, 8,	8,  uint8_t,  cfg->adv.max_multicast_filters); \
67 	MC_CMD_OP(cmd, 2, 16,	8,  uint8_t,  cfg->adv.max_vlan_filters); \
68 	MC_CMD_OP(cmd, 2, 24,	8,  uint8_t,  cfg->adv.max_qos_entries); \
69 	MC_CMD_OP(cmd, 2, 32,	8,  uint8_t,  cfg->adv.max_qos_key_size); \
70 	MC_CMD_OP(cmd, 2, 48,	8,  uint8_t,  cfg->adv.max_dist_key_size); \
71 	MC_CMD_OP(cmd, 2, 56,	8,  enum net_prot, cfg->adv.start_hdr); \
72 	MC_CMD_OP(cmd, 3, 0,	8,  uint8_t,  cfg->adv.max_dist_per_tc[0]); \
73 	MC_CMD_OP(cmd, 3, 8,	8,  uint8_t,  cfg->adv.max_dist_per_tc[1]); \
74 	MC_CMD_OP(cmd, 3, 16,	8,  uint8_t,  cfg->adv.max_dist_per_tc[2]); \
75 	MC_CMD_OP(cmd, 3, 24,	8,  uint8_t,  cfg->adv.max_dist_per_tc[3]); \
76 	MC_CMD_OP(cmd, 3, 32,	8,  uint8_t,  cfg->adv.max_dist_per_tc[4]); \
77 	MC_CMD_OP(cmd, 3, 40,	8,  uint8_t,  cfg->adv.max_dist_per_tc[5]); \
78 	MC_CMD_OP(cmd, 3, 48,	8,  uint8_t,  cfg->adv.max_dist_per_tc[6]); \
79 	MC_CMD_OP(cmd, 3, 56,	8,  uint8_t,  cfg->adv.max_dist_per_tc[7]); \
80 	MC_CMD_OP(cmd, 4, 0,	16, uint16_t, \
81 				    cfg->adv.ipr_cfg.max_reass_frm_size); \
82 	MC_CMD_OP(cmd, 4, 16,	16, uint16_t, \
83 				    cfg->adv.ipr_cfg.min_frag_size_ipv4); \
84 	MC_CMD_OP(cmd, 4, 32,	16, uint16_t, \
85 				    cfg->adv.ipr_cfg.min_frag_size_ipv6); \
86 	MC_CMD_OP(cmd, 4, 48,	8,  uint8_t, cfg->adv.max_policers); \
87 	MC_CMD_OP(cmd, 4, 56,	8,  uint8_t, cfg->adv.max_congestion_ctrl); \
88 	MC_CMD_OP(cmd, 5, 0,	16, uint16_t, \
89 				  cfg->adv.ipr_cfg.max_open_frames_ipv4); \
90 	MC_CMD_OP(cmd, 5, 16,	16, uint16_t, \
91 				  cfg->adv.ipr_cfg.max_open_frames_ipv6); \
92 } while (0)
93 
94 /*                cmd, param, offset, width, type, arg_name */
95 #define DPNI_CMD_SET_POOLS(cmd, cfg) \
96 do { \
97 	MC_CMD_OP(cmd, 0, 0,  8,  uint8_t,  cfg->num_dpbp); \
98 	MC_CMD_OP(cmd, 0, 32, 32, int,      cfg->pools[0].dpbp_id); \
99 	MC_CMD_OP(cmd, 4, 32, 16, uint16_t, cfg->pools[0].buffer_size);\
100 	MC_CMD_OP(cmd, 1, 0,  32, int,      cfg->pools[1].dpbp_id); \
101 	MC_CMD_OP(cmd, 4, 48, 16, uint16_t, cfg->pools[1].buffer_size);\
102 	MC_CMD_OP(cmd, 1, 32, 32, int,      cfg->pools[2].dpbp_id); \
103 	MC_CMD_OP(cmd, 5, 0,  16, uint16_t, cfg->pools[2].buffer_size);\
104 	MC_CMD_OP(cmd, 2, 0,  32, int,      cfg->pools[3].dpbp_id); \
105 	MC_CMD_OP(cmd, 5, 16, 16, uint16_t, cfg->pools[3].buffer_size);\
106 	MC_CMD_OP(cmd, 2, 32, 32, int,      cfg->pools[4].dpbp_id); \
107 	MC_CMD_OP(cmd, 5, 32, 16, uint16_t, cfg->pools[4].buffer_size);\
108 	MC_CMD_OP(cmd, 3, 0,  32, int,      cfg->pools[5].dpbp_id); \
109 	MC_CMD_OP(cmd, 5, 48, 16, uint16_t, cfg->pools[5].buffer_size);\
110 	MC_CMD_OP(cmd, 3, 32, 32, int,      cfg->pools[6].dpbp_id); \
111 	MC_CMD_OP(cmd, 6, 0,  16, uint16_t, cfg->pools[6].buffer_size);\
112 	MC_CMD_OP(cmd, 4, 0,  32, int,      cfg->pools[7].dpbp_id); \
113 	MC_CMD_OP(cmd, 6, 16, 16, uint16_t, cfg->pools[7].buffer_size);\
114 } while (0)
115 
116 /*                cmd, param, offset, width, type, arg_name */
117 #define DPNI_RSP_GET_ATTR(cmd, attr) \
118 do { \
119 	MC_RSP_OP(cmd, 0, 0,  32, int,	    attr->id);\
120 	MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  attr->max_tcs); \
121 	MC_RSP_OP(cmd, 0, 40, 8,  uint8_t,  attr->max_senders); \
122 	MC_RSP_OP(cmd, 0, 48, 8,  enum net_prot, attr->start_hdr); \
123 	MC_RSP_OP(cmd, 1, 0,  32, uint32_t, attr->options); \
124 	MC_RSP_OP(cmd, 2, 0,  8,  uint8_t,  attr->max_unicast_filters); \
125 	MC_RSP_OP(cmd, 2, 8,  8,  uint8_t,  attr->max_multicast_filters);\
126 	MC_RSP_OP(cmd, 2, 16, 8,  uint8_t,  attr->max_vlan_filters); \
127 	MC_RSP_OP(cmd, 2, 24, 8,  uint8_t,  attr->max_qos_entries); \
128 	MC_RSP_OP(cmd, 2, 32, 8,  uint8_t,  attr->max_qos_key_size); \
129 	MC_RSP_OP(cmd, 2, 40, 8,  uint8_t,  attr->max_dist_key_size); \
130 	MC_RSP_OP(cmd, 3, 0,  8,  uint8_t,  attr->max_dist_per_tc[0]); \
131 	MC_RSP_OP(cmd, 3, 8,  8,  uint8_t,  attr->max_dist_per_tc[1]); \
132 	MC_RSP_OP(cmd, 3, 16, 8,  uint8_t,  attr->max_dist_per_tc[2]); \
133 	MC_RSP_OP(cmd, 3, 24, 8,  uint8_t,  attr->max_dist_per_tc[3]); \
134 	MC_RSP_OP(cmd, 3, 32, 8,  uint8_t,  attr->max_dist_per_tc[4]); \
135 	MC_RSP_OP(cmd, 3, 40, 8,  uint8_t,  attr->max_dist_per_tc[5]); \
136 	MC_RSP_OP(cmd, 3, 48, 8,  uint8_t,  attr->max_dist_per_tc[6]); \
137 	MC_RSP_OP(cmd, 3, 56, 8,  uint8_t,  attr->max_dist_per_tc[7]); \
138 	MC_RSP_OP(cmd, 4, 0,	16, uint16_t, \
139 				    attr->ipr_cfg.max_reass_frm_size); \
140 	MC_RSP_OP(cmd, 4, 16,	16, uint16_t, \
141 				    attr->ipr_cfg.min_frag_size_ipv4); \
142 	MC_RSP_OP(cmd, 4, 32,	16, uint16_t, \
143 				    attr->ipr_cfg.min_frag_size_ipv6);\
144 	MC_RSP_OP(cmd, 4, 48,	8,  uint8_t, attr->max_policers); \
145 	MC_RSP_OP(cmd, 4, 56,	8,  uint8_t, attr->max_congestion_ctrl); \
146 	MC_RSP_OP(cmd, 5, 0,	16, uint16_t, \
147 				  attr->ipr_cfg.max_open_frames_ipv4); \
148 	MC_RSP_OP(cmd, 5, 16,	16, uint16_t, \
149 				  attr->ipr_cfg.max_open_frames_ipv6); \
150 	MC_RSP_OP(cmd, 5, 32, 16, uint16_t, attr->version.major);\
151 	MC_RSP_OP(cmd, 5, 48, 16, uint16_t, attr->version.minor);\
152 } while (0)
153 
154 /*                cmd, param, offset, width, type, arg_name */
155 #define DPNI_RSP_GET_RX_BUFFER_LAYOUT(cmd, layout) \
156 do { \
157 	MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
158 	MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
159 	MC_RSP_OP(cmd, 1, 0,  1,  int,	    layout->pass_timestamp); \
160 	MC_RSP_OP(cmd, 1, 1,  1,  int,	    layout->pass_parser_result); \
161 	MC_RSP_OP(cmd, 1, 2,  1,  int,	    layout->pass_frame_status); \
162 	MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
163 	MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
164 } while (0)
165 
166 /*                cmd, param, offset, width, type, arg_name */
167 #define DPNI_CMD_SET_RX_BUFFER_LAYOUT(cmd, layout) \
168 do { \
169 	MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
170 	MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
171 	MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
172 	MC_CMD_OP(cmd, 1, 0,  1,  int,	    layout->pass_timestamp); \
173 	MC_CMD_OP(cmd, 1, 1,  1,  int,	    layout->pass_parser_result); \
174 	MC_CMD_OP(cmd, 1, 2,  1,  int,	    layout->pass_frame_status); \
175 	MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
176 	MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
177 } while (0)
178 
179 /*                cmd, param, offset, width, type, arg_name */
180 #define DPNI_RSP_GET_TX_BUFFER_LAYOUT(cmd, layout) \
181 do { \
182 	MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
183 	MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
184 	MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
185 	MC_RSP_OP(cmd, 1, 1,  1,  int,	    layout->pass_parser_result); \
186 	MC_RSP_OP(cmd, 1, 2,  1,  int,	    layout->pass_frame_status); \
187 	MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
188 	MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
189 } while (0)
190 
191 /*                cmd, param, offset, width, type, arg_name */
192 #define DPNI_CMD_SET_TX_BUFFER_LAYOUT(cmd, layout) \
193 do { \
194 	MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
195 	MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
196 	MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
197 	MC_CMD_OP(cmd, 1, 0,  1,  int,	    layout->pass_timestamp); \
198 	MC_CMD_OP(cmd, 1, 1,  1,  int,	    layout->pass_parser_result); \
199 	MC_CMD_OP(cmd, 1, 2,  1,  int,	    layout->pass_frame_status); \
200 	MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
201 	MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
202 } while (0)
203 
204 /*                cmd, param, offset, width, type, arg_name */
205 #define DPNI_RSP_GET_TX_CONF_BUFFER_LAYOUT(cmd, layout) \
206 do { \
207 	MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
208 	MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
209 	MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
210 	MC_RSP_OP(cmd, 1, 1,  1,  int,	    layout->pass_parser_result); \
211 	MC_RSP_OP(cmd, 1, 2,  1,  int,	    layout->pass_frame_status); \
212 	MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
213 	MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
214 } while (0)
215 
216 /*                cmd, param, offset, width, type, arg_name */
217 #define DPNI_CMD_SET_TX_CONF_BUFFER_LAYOUT(cmd, layout) \
218 do { \
219 	MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
220 	MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
221 	MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
222 	MC_CMD_OP(cmd, 1, 0,  1,  int,	    layout->pass_timestamp); \
223 	MC_CMD_OP(cmd, 1, 1,  1,  int,	    layout->pass_parser_result); \
224 	MC_CMD_OP(cmd, 1, 2,  1,  int,	    layout->pass_frame_status); \
225 	MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
226 	MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
227 } while (0)
228 
229 /*                cmd, param, offset, width, type, arg_name */
230 #define DPNI_RSP_GET_QDID(cmd, qdid) \
231 	MC_RSP_OP(cmd, 0, 0,  16, uint16_t, qdid)
232 
233 /*                cmd, param, offset, width, type, arg_name */
234 #define DPNI_RSP_GET_TX_DATA_OFFSET(cmd, data_offset) \
235 	MC_RSP_OP(cmd, 0, 0,  16, uint16_t, data_offset)
236 
237 /*                cmd, param, offset, width, type, arg_name */
238 #define DPNI_CMD_GET_COUNTER(cmd, counter) \
239 	MC_CMD_OP(cmd, 0, 0,  16, enum dpni_counter, counter)
240 
241 /*                cmd, param, offset, width, type, arg_name */
242 #define DPNI_RSP_GET_COUNTER(cmd, value) \
243 	MC_RSP_OP(cmd, 1, 0,  64, uint64_t, value)
244 
245 /*                cmd, param, offset, width, type, arg_name */
246 #define DPNI_CMD_SET_COUNTER(cmd, counter, value) \
247 do { \
248 	MC_CMD_OP(cmd, 0, 0,  16, enum dpni_counter, counter); \
249 	MC_CMD_OP(cmd, 1, 0,  64, uint64_t, value); \
250 } while (0)
251 
252 /*                cmd, param, offset, width, type, arg_name */
253 #define DPNI_CMD_SET_LINK_CFG(cmd, cfg) \
254 do { \
255 	MC_CMD_OP(cmd, 1, 0,  32, uint32_t, cfg->rate);\
256 	MC_CMD_OP(cmd, 2, 0,  64, uint64_t, cfg->options);\
257 } while (0)
258 
259 /*                cmd, param, offset, width, type, arg_name */
260 #define DPNI_RSP_GET_LINK_STATE(cmd, state) \
261 do { \
262 	MC_RSP_OP(cmd, 0, 32,  1, int,      state->up);\
263 	MC_RSP_OP(cmd, 1, 0,  32, uint32_t, state->rate);\
264 	MC_RSP_OP(cmd, 2, 0,  64, uint64_t, state->options);\
265 } while (0)
266 
267 
268 
269 /*                cmd, param, offset, width, type, arg_name */
270 #define DPNI_CMD_SET_PRIMARY_MAC_ADDR(cmd, mac_addr) \
271 do { \
272 	MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
273 	MC_CMD_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
274 	MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
275 	MC_CMD_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
276 	MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
277 	MC_CMD_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
278 } while (0)
279 
280 /*                cmd, param, offset, width, type, arg_name */
281 #define DPNI_RSP_GET_PRIMARY_MAC_ADDR(cmd, mac_addr) \
282 do { \
283 	MC_RSP_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
284 	MC_RSP_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
285 	MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
286 	MC_RSP_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
287 	MC_RSP_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
288 	MC_RSP_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
289 } while (0)
290 
291 /*                cmd, param, offset, width, type, arg_name */
292 #define DPNI_CMD_ADD_MAC_ADDR(cmd, mac_addr) \
293 do { \
294 	MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
295 	MC_CMD_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
296 	MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
297 	MC_CMD_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
298 	MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
299 	MC_CMD_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
300 } while (0)
301 
302 /*                cmd, param, offset, width, type, arg_name */
303 #define DPNI_CMD_REMOVE_MAC_ADDR(cmd, mac_addr) \
304 do { \
305 	MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
306 	MC_CMD_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
307 	MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
308 	MC_CMD_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
309 	MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
310 	MC_CMD_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
311 } while (0)
312 
313 /*                cmd, param, offset, width, type, arg_name */
314 #define DPNI_CMD_SET_TX_FLOW(cmd, flow_id, cfg) \
315 do { \
316 	MC_CMD_OP(cmd, 0, 0,  32, int,     \
317 			   cfg->conf_err_cfg.queue_cfg.dest_cfg.dest_id);\
318 	MC_CMD_OP(cmd, 0, 32, 8,  uint8_t, \
319 			   cfg->conf_err_cfg.queue_cfg.dest_cfg.priority);\
320 	MC_CMD_OP(cmd, 0, 40, 2,  enum dpni_dest, \
321 			   cfg->conf_err_cfg.queue_cfg.dest_cfg.dest_type);\
322 	MC_CMD_OP(cmd, 0, 42, 1,  int,	    cfg->conf_err_cfg.errors_only);\
323 	MC_CMD_OP(cmd, 0, 43, 1,  int,	    cfg->l3_chksum_gen);\
324 	MC_CMD_OP(cmd, 0, 44, 1,  int,	    cfg->l4_chksum_gen);\
325 	MC_CMD_OP(cmd, 0, 45, 1,  int,	    \
326 			   cfg->conf_err_cfg.use_default_queue);\
327 	MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id);\
328 	MC_CMD_OP(cmd, 1, 0,  64, uint64_t, \
329 			   cfg->conf_err_cfg.queue_cfg.user_ctx);\
330 	MC_CMD_OP(cmd, 2, 0,  32, uint32_t, cfg->options);\
331 	MC_CMD_OP(cmd, 2, 32,  32, uint32_t, \
332 			   cfg->conf_err_cfg.queue_cfg.options);\
333 } while (0)
334 
335 /*                cmd, param, offset, width, type, arg_name */
336 #define DPNI_RSP_SET_TX_FLOW(cmd, flow_id) \
337 	MC_RSP_OP(cmd, 0, 48, 16, uint16_t, flow_id)
338 
339 /*                cmd, param, offset, width, type, arg_name */
340 #define DPNI_CMD_GET_TX_FLOW(cmd, flow_id) \
341 	MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id)
342 
343 /*                cmd, param, offset, width, type, arg_name */
344 #define DPNI_RSP_GET_TX_FLOW(cmd, attr) \
345 do { \
346 	MC_RSP_OP(cmd, 0, 0,  32, int,      \
347 			attr->conf_err_attr.queue_attr.dest_cfg.dest_id);\
348 	MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  \
349 			attr->conf_err_attr.queue_attr.dest_cfg.priority);\
350 	MC_RSP_OP(cmd, 0, 40, 2,  enum dpni_dest, \
351 			attr->conf_err_attr.queue_attr.dest_cfg.dest_type);\
352 	MC_RSP_OP(cmd, 0, 42, 1,  int,	    attr->conf_err_attr.errors_only);\
353 	MC_RSP_OP(cmd, 0, 43, 1,  int,	    attr->l3_chksum_gen);\
354 	MC_RSP_OP(cmd, 0, 44, 1,  int,	    attr->l4_chksum_gen);\
355 	MC_RSP_OP(cmd, 0, 45, 1,  int,	    \
356 			attr->conf_err_attr.use_default_queue);\
357 	MC_RSP_OP(cmd, 1, 0,  64, uint64_t, \
358 			attr->conf_err_attr.queue_attr.user_ctx);\
359 	MC_RSP_OP(cmd, 2, 32, 32, uint32_t, \
360 			attr->conf_err_attr.queue_attr.fqid);\
361 } while (0)
362 
363 /*                cmd, param, offset, width, type, arg_name */
364 #define DPNI_CMD_SET_RX_FLOW(cmd, tc_id, flow_id, cfg) \
365 do { \
366 	MC_CMD_OP(cmd, 0, 0,  32, int,      cfg->dest_cfg.dest_id); \
367 	MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  cfg->dest_cfg.priority);\
368 	MC_CMD_OP(cmd, 0, 40, 2,  enum dpni_dest, cfg->dest_cfg.dest_type);\
369 	MC_CMD_OP(cmd, 0, 42, 1,  int,      cfg->order_preservation_en);\
370 	MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id); \
371 	MC_CMD_OP(cmd, 1, 0,  64, uint64_t, cfg->user_ctx); \
372 	MC_CMD_OP(cmd, 2, 16, 8,  uint8_t,  tc_id); \
373 	MC_CMD_OP(cmd, 2, 32,  32, uint32_t, cfg->options); \
374 	MC_CMD_OP(cmd, 3, 0,  4,  enum dpni_flc_type, cfg->flc_cfg.flc_type); \
375 	MC_CMD_OP(cmd, 3, 4,  4,  enum dpni_stash_size, \
376 		cfg->flc_cfg.frame_data_size);\
377 	MC_CMD_OP(cmd, 3, 8,  4,  enum dpni_stash_size, \
378 		cfg->flc_cfg.flow_context_size);\
379 	MC_CMD_OP(cmd, 3, 32, 32, uint32_t, cfg->flc_cfg.options);\
380 	MC_CMD_OP(cmd, 4, 0,  64, uint64_t, cfg->flc_cfg.flow_context);\
381 } while (0)
382 
383 /*                cmd, param, offset, width, type, arg_name */
384 #define DPNI_CMD_GET_RX_FLOW(cmd, tc_id, flow_id) \
385 do { \
386 	MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  tc_id); \
387 	MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id); \
388 } while (0)
389 
390 /*                cmd, param, offset, width, type, arg_name */
391 #define DPNI_RSP_GET_RX_FLOW(cmd, attr) \
392 do { \
393 	MC_RSP_OP(cmd, 0, 0,  32, int,      attr->dest_cfg.dest_id); \
394 	MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  attr->dest_cfg.priority);\
395 	MC_RSP_OP(cmd, 0, 40, 2,  enum dpni_dest, attr->dest_cfg.dest_type); \
396 	MC_CMD_OP(cmd, 0, 42, 1,  int,      attr->order_preservation_en);\
397 	MC_RSP_OP(cmd, 1, 0,  64, uint64_t, attr->user_ctx); \
398 	MC_RSP_OP(cmd, 2, 32, 32, uint32_t, attr->fqid); \
399 	MC_RSP_OP(cmd, 3, 0,  4,  enum dpni_flc_type, attr->flc_cfg.flc_type); \
400 	MC_RSP_OP(cmd, 3, 4,  4,  enum dpni_stash_size, \
401 		attr->flc_cfg.frame_data_size);\
402 	MC_RSP_OP(cmd, 3, 8,  4,  enum dpni_stash_size, \
403 		attr->flc_cfg.flow_context_size);\
404 	MC_RSP_OP(cmd, 3, 32, 32, uint32_t, attr->flc_cfg.options);\
405 	MC_RSP_OP(cmd, 4, 0,  64, uint64_t, attr->flc_cfg.flow_context);\
406 } while (0)
407 
408 enum net_prot {
409 	NET_PROT_NONE = 0,
410 	NET_PROT_PAYLOAD,
411 	NET_PROT_ETH,
412 	NET_PROT_VLAN,
413 	NET_PROT_IPV4,
414 	NET_PROT_IPV6,
415 	NET_PROT_IP,
416 	NET_PROT_TCP,
417 	NET_PROT_UDP,
418 	NET_PROT_UDP_LITE,
419 	NET_PROT_IPHC,
420 	NET_PROT_SCTP,
421 	NET_PROT_SCTP_CHUNK_DATA,
422 	NET_PROT_PPPOE,
423 	NET_PROT_PPP,
424 	NET_PROT_PPPMUX,
425 	NET_PROT_PPPMUX_SUBFRM,
426 	NET_PROT_L2TPV2,
427 	NET_PROT_L2TPV3_CTRL,
428 	NET_PROT_L2TPV3_SESS,
429 	NET_PROT_LLC,
430 	NET_PROT_LLC_SNAP,
431 	NET_PROT_NLPID,
432 	NET_PROT_SNAP,
433 	NET_PROT_MPLS,
434 	NET_PROT_IPSEC_AH,
435 	NET_PROT_IPSEC_ESP,
436 	NET_PROT_UDP_ENC_ESP, /* RFC 3948 */
437 	NET_PROT_MACSEC,
438 	NET_PROT_GRE,
439 	NET_PROT_MINENCAP,
440 	NET_PROT_DCCP,
441 	NET_PROT_ICMP,
442 	NET_PROT_IGMP,
443 	NET_PROT_ARP,
444 	NET_PROT_CAPWAP_DATA,
445 	NET_PROT_CAPWAP_CTRL,
446 	NET_PROT_RFC2684,
447 	NET_PROT_ICMPV6,
448 	NET_PROT_FCOE,
449 	NET_PROT_FIP,
450 	NET_PROT_ISCSI,
451 	NET_PROT_GTP,
452 	NET_PROT_USER_DEFINED_L2,
453 	NET_PROT_USER_DEFINED_L3,
454 	NET_PROT_USER_DEFINED_L4,
455 	NET_PROT_USER_DEFINED_L5,
456 	NET_PROT_USER_DEFINED_SHIM1,
457 	NET_PROT_USER_DEFINED_SHIM2,
458 
459 	NET_PROT_DUMMY_LAST
460 };
461 
462 /**
463  * Data Path Network Interface API
464  * Contains initialization APIs and runtime control APIs for DPNI
465  */
466 
467 struct fsl_mc_io;
468 
469 /* General DPNI macros */
470 
471 /* Maximum number of traffic classes */
472 #define DPNI_MAX_TC				8
473 /* Maximum number of buffer pools per DPNI */
474 #define DPNI_MAX_DPBP				8
475 
476 /* All traffic classes considered; see dpni_set_rx_flow() */
477 #define DPNI_ALL_TCS				(uint8_t)(-1)
478 /* All flows within traffic class considered; see dpni_set_rx_flow() */
479 #define DPNI_ALL_TC_FLOWS			(uint16_t)(-1)
480 /* Generate new flow ID; see dpni_set_tx_flow() */
481 #define DPNI_NEW_FLOW_ID			(uint16_t)(-1)
482 
483 /**
484  * dpni_open() - Open a control session for the specified object
485  * @mc_io:	Pointer to MC portal's I/O object
486  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
487  * @dpni_id:	DPNI unique ID
488  * @token:	Returned token; use in subsequent API calls
489  *
490  * This function can be used to open a control session for an
491  * already created object; an object may have been declared in
492  * the DPL or by calling the dpni_create() function.
493  * This function returns a unique authentication token,
494  * associated with the specific object ID and the specific MC
495  * portal; this token must be used in all subsequent commands for
496  * this specific object.
497  *
498  * Return:	'0' on Success; Error code otherwise.
499  */
500 int dpni_open(struct fsl_mc_io	*mc_io,
501 	      uint32_t		cmd_flags,
502 	      int		dpni_id,
503 	      uint16_t		*token);
504 
505 /**
506  * dpni_close() - Close the control session of the object
507  * @mc_io:	Pointer to MC portal's I/O object
508  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
509  * @token:	Token of DPNI object
510  *
511  * After this function is called, no further operations are
512  * allowed on the object without opening a new control session.
513  *
514  * Return:	'0' on Success; Error code otherwise.
515  */
516 int dpni_close(struct fsl_mc_io	*mc_io,
517 	       uint32_t		cmd_flags,
518 	       uint16_t		token);
519 
520 /* DPNI configuration options */
521 
522 /**
523  * Allow different distribution key profiles for different traffic classes;
524  * if not set, a single key profile is assumed
525  */
526 #define DPNI_OPT_ALLOW_DIST_KEY_PER_TC		0x00000001
527 
528 /**
529  * Disable all non-error transmit confirmation; error frames are reported
530  * back to a common Tx error queue
531  */
532 #define DPNI_OPT_TX_CONF_DISABLED		0x00000002
533 
534 /* Disable per-sender private Tx confirmation/error queue */
535 #define DPNI_OPT_PRIVATE_TX_CONF_ERROR_DISABLED	0x00000004
536 
537 /**
538  * Support distribution based on hashed key;
539  * allows statistical distribution over receive queues in a traffic class
540  */
541 #define DPNI_OPT_DIST_HASH			0x00000010
542 
543 /**
544  * Support distribution based on flow steering;
545  * allows explicit control of distribution over receive queues in a traffic
546  * class
547  */
548 #define DPNI_OPT_DIST_FS			0x00000020
549 
550 /* Unicast filtering support */
551 #define DPNI_OPT_UNICAST_FILTER			0x00000080
552 /* Multicast filtering support */
553 #define DPNI_OPT_MULTICAST_FILTER		0x00000100
554 /* VLAN filtering support */
555 #define DPNI_OPT_VLAN_FILTER			0x00000200
556 /* Support IP reassembly on received packets */
557 #define DPNI_OPT_IPR				0x00000800
558 /* Support IP fragmentation on transmitted packets */
559 #define DPNI_OPT_IPF				0x00001000
560 /* VLAN manipulation support */
561 #define DPNI_OPT_VLAN_MANIPULATION		0x00010000
562 /* Support masking of QoS lookup keys */
563 #define DPNI_OPT_QOS_MASK_SUPPORT		0x00020000
564 /* Support masking of Flow Steering lookup keys */
565 #define DPNI_OPT_FS_MASK_SUPPORT		0x00040000
566 
567 /**
568  * struct dpni_ipr_cfg - Structure representing IP reassembly configuration
569  * @max_reass_frm_size: Maximum size of the reassembled frame
570  * @min_frag_size_ipv4: Minimum fragment size of IPv4 fragments
571  * @min_frag_size_ipv6: Minimum fragment size of IPv6 fragments
572  * @max_open_frames_ipv4: Maximum concurrent IPv4 packets in reassembly process
573  * @max_open_frames_ipv6: Maximum concurrent IPv6 packets in reassembly process
574  */
575 struct dpni_ipr_cfg {
576 	uint16_t max_reass_frm_size;
577 	uint16_t min_frag_size_ipv4;
578 	uint16_t min_frag_size_ipv6;
579 	uint16_t max_open_frames_ipv4;
580 	uint16_t max_open_frames_ipv6;
581 };
582 
583 /**
584  * struct dpni_cfg - Structure representing DPNI configuration
585  * @mac_addr: Primary MAC address
586  * @adv: Advanced parameters; default is all zeros;
587  *		use this structure to change default settings
588  */
589 struct dpni_cfg {
590 	uint8_t mac_addr[6];
591 	/**
592 	 * struct adv - Advanced parameters
593 	 * @options: Mask of available options; use 'DPNI_OPT_<X>' values
594 	 * @start_hdr: Selects the packet starting header for parsing;
595 	 *		'NET_PROT_NONE' is treated as default: 'NET_PROT_ETH'
596 	 * @max_senders: Maximum number of different senders; used as the number
597 	 *		of dedicated Tx flows; Non-power-of-2 values are rounded
598 	 *		up to the next power-of-2 value as hardware demands it;
599 	 *		'0' will be treated as '1'
600 	 * @max_tcs: Maximum number of traffic classes (for both Tx and Rx);
601 	 *		'0' will e treated as '1'
602 	 * @max_dist_per_tc: Maximum distribution size per Rx traffic class;
603 	 *			Must be set to the required value minus 1;
604 	 *			i.e. 0->1, 1->2, ... ,255->256;
605 	 *			Non-power-of-2 values are rounded up to the next
606 	 *			power-of-2 value as hardware demands it
607 	 * @max_unicast_filters: Maximum number of unicast filters;
608 	 *			'0' is treated	as '16'
609 	 * @max_multicast_filters: Maximum number of multicast filters;
610 	 *			'0' is treated as '64'
611 	 * @max_qos_entries: if 'max_tcs > 1', declares the maximum entries in
612 	 *			the QoS	table; '0' is treated as '64'
613 	 * @max_qos_key_size: Maximum key size for the QoS look-up;
614 	 *			'0' is treated as '24' which is enough for IPv4
615 	 *			5-tuple
616 	 * @max_dist_key_size: Maximum key size for the distribution;
617 	 *		'0' is treated as '24' which is enough for IPv4 5-tuple
618 	 * @max_policers: Maximum number of policers;
619 	 *		should be between '0' and max_tcs
620 	 * @max_congestion_ctrl: Maximum number of congestion control groups
621 	 *		(CGs); covers early drop and congestion notification
622 	 *		requirements for traffic classes;
623 	 *		should be between '0' and max_tcs
624 	 * @ipr_cfg: IP reassembly configuration
625 	 */
626 	struct {
627 		uint32_t		options;
628 		enum net_prot		start_hdr;
629 		uint8_t		max_senders;
630 		uint8_t		max_tcs;
631 		uint8_t			max_dist_per_tc[DPNI_MAX_TC];
632 		uint8_t		max_unicast_filters;
633 		uint8_t		max_multicast_filters;
634 		uint8_t			max_vlan_filters;
635 		uint8_t		max_qos_entries;
636 		uint8_t		max_qos_key_size;
637 		uint8_t		max_dist_key_size;
638 		uint8_t		max_policers;
639 		uint8_t		max_congestion_ctrl;
640 		struct dpni_ipr_cfg	ipr_cfg;
641 	} adv;
642 };
643 
644 /**
645  * dpni_create() - Create the DPNI object
646  * @mc_io:	Pointer to MC portal's I/O object
647  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
648  * @cfg:	Configuration structure
649  * @token:	Returned token; use in subsequent API calls
650  *
651  * Create the DPNI object, allocate required resources and
652  * perform required initialization.
653  *
654  * The object can be created either by declaring it in the
655  * DPL file, or by calling this function.
656  *
657  * This function returns a unique authentication token,
658  * associated with the specific object ID and the specific MC
659  * portal; this token must be used in all subsequent calls to
660  * this specific object. For objects that are created using the
661  * DPL file, call dpni_open() function to get an authentication
662  * token first.
663  *
664  * Return:	'0' on Success; Error code otherwise.
665  */
666 int dpni_create(struct fsl_mc_io	*mc_io,
667 		uint32_t		cmd_flags,
668 		const struct dpni_cfg	*cfg,
669 		uint16_t		*token);
670 
671 /**
672  * dpni_destroy() - Destroy the DPNI object and release all its resources.
673  * @mc_io:	Pointer to MC portal's I/O object
674  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
675  * @token:	Token of DPNI object
676  *
677  * Return:	'0' on Success; error code otherwise.
678  */
679 int dpni_destroy(struct fsl_mc_io	*mc_io,
680 		 uint32_t		cmd_flags,
681 		 uint16_t		token);
682 
683 /**
684  * struct dpni_pools_cfg - Structure representing buffer pools configuration
685  * @num_dpbp: Number of DPBPs
686  * @pools: Array of buffer pools parameters; The number of valid entries
687  *	must match 'num_dpbp' value
688  */
689 struct dpni_pools_cfg {
690 	uint8_t num_dpbp;
691 	/**
692 	 * struct pools - Buffer pools parameters
693 	 * @dpbp_id: DPBP object ID
694 	 * @buffer_size: Buffer size
695 	 * @backup_pool: Backup pool
696 	 */
697 	struct {
698 		int		dpbp_id;
699 		uint16_t	buffer_size;
700 		int		backup_pool;
701 	} pools[DPNI_MAX_DPBP];
702 };
703 
704 /**
705  * dpni_set_pools() - Set buffer pools configuration
706  * @mc_io:	Pointer to MC portal's I/O object
707  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
708  * @token:	Token of DPNI object
709  * @cfg:	Buffer pools configuration
710  *
711  * mandatory for DPNI operation
712  * warning:Allowed only when DPNI is disabled
713  *
714  * Return:	'0' on Success; Error code otherwise.
715  */
716 int dpni_set_pools(struct fsl_mc_io		*mc_io,
717 		   uint32_t			cmd_flags,
718 		   uint16_t			token,
719 		   const struct dpni_pools_cfg	*cfg);
720 
721 /**
722  * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
723  * @mc_io:	Pointer to MC portal's I/O object
724  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
725  * @token:		Token of DPNI object
726  *
727  * Return:	'0' on Success; Error code otherwise.
728  */
729 int dpni_enable(struct fsl_mc_io	*mc_io,
730 		uint32_t		cmd_flags,
731 		uint16_t		token);
732 
733 /**
734  * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
735  * @mc_io:	Pointer to MC portal's I/O object
736  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
737  * @token:	Token of DPNI object
738  *
739  * Return:	'0' on Success; Error code otherwise.
740  */
741 int dpni_disable(struct fsl_mc_io	*mc_io,
742 		 uint32_t		cmd_flags,
743 		 uint16_t		token);
744 
745 
746 /**
747  * dpni_reset() - Reset the DPNI, returns the object to initial state.
748  * @mc_io:	Pointer to MC portal's I/O object
749  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
750  * @token:	Token of DPNI object
751  *
752  * Return:	'0' on Success; Error code otherwise.
753  */
754 int dpni_reset(struct fsl_mc_io	*mc_io,
755 	       uint32_t		cmd_flags,
756 	       uint16_t		token);
757 
758 /**
759  * struct dpni_attr - Structure representing DPNI attributes
760  * @id: DPNI object ID
761  * @version: DPNI version
762  * @start_hdr: Indicates the packet starting header for parsing
763  * @options: Mask of available options; reflects the value as was given in
764  *		object's creation
765  * @max_senders: Maximum number of different senders; used as the number
766  *		of dedicated Tx flows;
767  * @max_tcs: Maximum number of traffic classes (for both Tx and Rx)
768  * @max_dist_per_tc: Maximum distribution size per Rx traffic class;
769  *			Set to the required value minus 1
770  * @max_unicast_filters: Maximum number of unicast filters
771  * @max_multicast_filters: Maximum number of multicast filters
772  * @max_vlan_filters: Maximum number of VLAN filters
773  * @max_qos_entries: if 'max_tcs > 1', declares the maximum entries in QoS table
774  * @max_qos_key_size: Maximum key size for the QoS look-up
775  * @max_dist_key_size: Maximum key size for the distribution look-up
776  * @max_policers: Maximum number of policers;
777  * @max_congestion_ctrl: Maximum number of congestion control groups (CGs);
778  * @ipr_cfg: IP reassembly configuration
779  */
780 struct dpni_attr {
781 	int id;
782 	/**
783 	 * struct version - DPNI version
784 	 * @major: DPNI major version
785 	 * @minor: DPNI minor version
786 	 */
787 	struct {
788 		uint16_t major;
789 		uint16_t minor;
790 	} version;
791 	enum net_prot start_hdr;
792 	uint32_t options;
793 	uint8_t max_senders;
794 	uint8_t max_tcs;
795 	uint8_t max_dist_per_tc[DPNI_MAX_TC];
796 	uint8_t max_unicast_filters;
797 	uint8_t max_multicast_filters;
798 	uint8_t max_vlan_filters;
799 	uint8_t max_qos_entries;
800 	uint8_t max_qos_key_size;
801 	uint8_t max_dist_key_size;
802 	uint8_t max_policers;
803 	uint8_t max_congestion_ctrl;
804 	struct dpni_ipr_cfg ipr_cfg;
805 };
806 
807 /**
808  * dpni_get_attributes() - Retrieve DPNI attributes.
809  * @mc_io:	Pointer to MC portal's I/O object
810  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
811  * @token:	Token of DPNI object
812  * @attr:	Returned object's attributes
813  *
814  * Return:	'0' on Success; Error code otherwise.
815  */
816 int dpni_get_attributes(struct fsl_mc_io	*mc_io,
817 			uint32_t		cmd_flags,
818 			uint16_t		token,
819 			struct dpni_attr	*attr);
820 
821 /* DPNI buffer layout modification options */
822 
823 /* Select to modify the time-stamp setting */
824 #define DPNI_BUF_LAYOUT_OPT_TIMESTAMP		0x00000001
825 /* Select to modify the parser-result setting; not applicable for Tx */
826 #define DPNI_BUF_LAYOUT_OPT_PARSER_RESULT	0x00000002
827 /* Select to modify the frame-status setting */
828 #define DPNI_BUF_LAYOUT_OPT_FRAME_STATUS	0x00000004
829 /* Select to modify the private-data-size setting */
830 #define DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE	0x00000008
831 /* Select to modify the data-alignment setting */
832 #define DPNI_BUF_LAYOUT_OPT_DATA_ALIGN		0x00000010
833 /* Select to modify the data-head-room setting */
834 #define DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM	0x00000020
835 /*!< Select to modify the data-tail-room setting */
836 #define DPNI_BUF_LAYOUT_OPT_DATA_TAIL_ROOM	0x00000040
837 
838 /**
839  * struct dpni_buffer_layout - Structure representing DPNI buffer layout
840  * @options: Flags representing the suggested modifications to the buffer
841  *		layout; Use any combination of 'DPNI_BUF_LAYOUT_OPT_<X>' flags
842  * @pass_timestamp: Pass timestamp value
843  * @pass_parser_result: Pass parser results
844  * @pass_frame_status: Pass frame status
845  * @private_data_size: Size kept for private data (in bytes)
846  * @data_align: Data alignment
847  * @data_head_room: Data head room
848  * @data_tail_room: Data tail room
849  */
850 struct dpni_buffer_layout {
851 	uint32_t options;
852 	int pass_timestamp;
853 	int pass_parser_result;
854 	int pass_frame_status;
855 	uint16_t private_data_size;
856 	uint16_t data_align;
857 	uint16_t data_head_room;
858 	uint16_t data_tail_room;
859 };
860 
861 /**
862  * dpni_get_rx_buffer_layout() - Retrieve Rx buffer layout attributes.
863  * @mc_io:	Pointer to MC portal's I/O object
864  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
865  * @token:	Token of DPNI object
866  * @layout:	Returns buffer layout attributes
867  *
868  * Return:	'0' on Success; Error code otherwise.
869  */
870 int dpni_get_rx_buffer_layout(struct fsl_mc_io		*mc_io,
871 			      uint32_t			cmd_flags,
872 			      uint16_t			token,
873 			      struct dpni_buffer_layout	*layout);
874 
875 /**
876  * dpni_set_rx_buffer_layout() - Set Rx buffer layout configuration.
877  * @mc_io:	Pointer to MC portal's I/O object
878  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
879  * @token:	Token of DPNI object
880  * @layout:	Buffer layout configuration
881  *
882  * Return:	'0' on Success; Error code otherwise.
883  *
884  * @warning	Allowed only when DPNI is disabled
885  */
886 int dpni_set_rx_buffer_layout(struct fsl_mc_io			*mc_io,
887 			      uint32_t				cmd_flags,
888 			      uint16_t				token,
889 			      const struct dpni_buffer_layout	*layout);
890 
891 /**
892  * dpni_get_tx_buffer_layout() - Retrieve Tx buffer layout attributes.
893  * @mc_io:	Pointer to MC portal's I/O object
894  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
895  * @token:	Token of DPNI object
896  * @layout:	Returns buffer layout attributes
897  *
898  * Return:	'0' on Success; Error code otherwise.
899  */
900 int dpni_get_tx_buffer_layout(struct fsl_mc_io		*mc_io,
901 			      uint32_t			cmd_flags,
902 			      uint16_t			token,
903 			      struct dpni_buffer_layout	*layout);
904 
905 /**
906  * dpni_set_tx_buffer_layout() - Set Tx buffer layout configuration.
907  * @mc_io:	Pointer to MC portal's I/O object
908  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
909  * @token:	Token of DPNI object
910  * @layout:	Buffer layout configuration
911  *
912  * Return:	'0' on Success; Error code otherwise.
913  *
914  * @warning	Allowed only when DPNI is disabled
915  */
916 int dpni_set_tx_buffer_layout(struct fsl_mc_io			*mc_io,
917 			      uint32_t				cmd_flags,
918 			      uint16_t				token,
919 			      const struct dpni_buffer_layout	*layout);
920 
921 /**
922  * dpni_get_tx_conf_buffer_layout() - Retrieve Tx confirmation buffer layout
923  *				attributes.
924  * @mc_io:	Pointer to MC portal's I/O object
925  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
926  * @token:	Token of DPNI object
927  * @layout:	Returns buffer layout attributes
928  *
929  * Return:	'0' on Success; Error code otherwise.
930  */
931 int dpni_get_tx_conf_buffer_layout(struct fsl_mc_io		*mc_io,
932 				   uint32_t			cmd_flags,
933 				   uint16_t			token,
934 				   struct dpni_buffer_layout	*layout);
935 
936 /**
937  * dpni_set_tx_conf_buffer_layout() - Set Tx confirmation buffer layout
938  *					configuration.
939  * @mc_io:	Pointer to MC portal's I/O object
940  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
941  * @token:	Token of DPNI object
942  * @layout:	Buffer layout configuration
943  *
944  * Return:	'0' on Success; Error code otherwise.
945  *
946  * @warning	Allowed only when DPNI is disabled
947  */
948 int dpni_set_tx_conf_buffer_layout(struct fsl_mc_io		   *mc_io,
949 				   uint32_t			   cmd_flags,
950 				   uint16_t			   token,
951 				   const struct dpni_buffer_layout *layout);
952 
953 /**
954  * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
955  *			for enqueue operations
956  * @mc_io:	Pointer to MC portal's I/O object
957  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
958  * @token:	Token of DPNI object
959  * @qdid:	Returned virtual QDID value that should be used as an argument
960  *			in all enqueue operations
961  *
962  * Return:	'0' on Success; Error code otherwise.
963  */
964 int dpni_get_qdid(struct fsl_mc_io	*mc_io,
965 		  uint32_t		cmd_flags,
966 		  uint16_t		token,
967 		  uint16_t		*qdid);
968 
969 /**
970  * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
971  * @mc_io:	Pointer to MC portal's I/O object
972  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
973  * @token:	Token of DPNI object
974  * @data_offset: Tx data offset (from start of buffer)
975  *
976  * Return:	'0' on Success; Error code otherwise.
977  */
978 int dpni_get_tx_data_offset(struct fsl_mc_io	*mc_io,
979 			    uint32_t		cmd_flags,
980 			    uint16_t		token,
981 			    uint16_t		*data_offset);
982 
983 /**
984  * enum dpni_counter - DPNI counter types
985  * @DPNI_CNT_ING_FRAME: Counts ingress frames
986  * @DPNI_CNT_ING_BYTE: Counts ingress bytes
987  * @DPNI_CNT_ING_FRAME_DROP: Counts ingress frames dropped due to explicit
988  *		'drop' setting
989  * @DPNI_CNT_ING_FRAME_DISCARD: Counts ingress frames discarded due to errors
990  * @DPNI_CNT_ING_MCAST_FRAME: Counts ingress multicast frames
991  * @DPNI_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes
992  * @DPNI_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames
993  * @DPNI_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes
994  * @DPNI_CNT_EGR_FRAME: Counts egress frames
995  * @DPNI_CNT_EGR_BYTE: Counts egress bytes
996  * @DPNI_CNT_EGR_FRAME_DISCARD: Counts egress frames discarded due to errors
997  */
998 enum dpni_counter {
999 	DPNI_CNT_ING_FRAME = 0x0,
1000 	DPNI_CNT_ING_BYTE = 0x1,
1001 	DPNI_CNT_ING_FRAME_DROP = 0x2,
1002 	DPNI_CNT_ING_FRAME_DISCARD = 0x3,
1003 	DPNI_CNT_ING_MCAST_FRAME = 0x4,
1004 	DPNI_CNT_ING_MCAST_BYTE = 0x5,
1005 	DPNI_CNT_ING_BCAST_FRAME = 0x6,
1006 	DPNI_CNT_ING_BCAST_BYTES = 0x7,
1007 	DPNI_CNT_EGR_FRAME = 0x8,
1008 	DPNI_CNT_EGR_BYTE = 0x9,
1009 	DPNI_CNT_EGR_FRAME_DISCARD = 0xa
1010 };
1011 
1012 /**
1013  * dpni_get_counter() - Read a specific DPNI counter
1014  * @mc_io:	Pointer to MC portal's I/O object
1015  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1016  * @token:	Token of DPNI object
1017  * @counter:	The requested counter
1018  * @value:	Returned counter's current value
1019  *
1020  * Return:	'0' on Success; Error code otherwise.
1021  */
1022 int dpni_get_counter(struct fsl_mc_io	*mc_io,
1023 		     uint32_t		cmd_flags,
1024 		     uint16_t		token,
1025 		     enum dpni_counter	counter,
1026 		     uint64_t		*value);
1027 
1028 /**
1029  * dpni_set_counter() - Set (or clear) a specific DPNI counter
1030  * @mc_io:	Pointer to MC portal's I/O object
1031  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1032  * @token:	Token of DPNI object
1033  * @counter:	The requested counter
1034  * @value:	New counter value; typically pass '0' for resetting
1035  *			the counter.
1036  *
1037  * Return:	'0' on Success; Error code otherwise.
1038  */
1039 int dpni_set_counter(struct fsl_mc_io	*mc_io,
1040 		     uint32_t		cmd_flags,
1041 		     uint16_t		token,
1042 		     enum dpni_counter	counter,
1043 		     uint64_t		value);
1044 
1045 /* Enable auto-negotiation */
1046 #define DPNI_LINK_OPT_AUTONEG		0x0000000000000001ULL
1047 /* Enable half-duplex mode */
1048 #define DPNI_LINK_OPT_HALF_DUPLEX	0x0000000000000002ULL
1049 /* Enable pause frames */
1050 #define DPNI_LINK_OPT_PAUSE		0x0000000000000004ULL
1051 /* Enable a-symmetric pause frames */
1052 #define DPNI_LINK_OPT_ASYM_PAUSE	0x0000000000000008ULL
1053 
1054 /**
1055  * struct - Structure representing DPNI link configuration
1056  * @rate: Rate
1057  * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
1058  */
1059 struct dpni_link_cfg {
1060 	uint32_t rate;
1061 	uint64_t options;
1062 };
1063 
1064 /**
1065  * dpni_set_link_cfg() - set the link configuration.
1066  * @mc_io:	Pointer to MC portal's I/O object
1067  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1068  * @token:	Token of DPNI object
1069  * @cfg:	Link configuration
1070  *
1071  * Return:	'0' on Success; Error code otherwise.
1072  */
1073 int dpni_set_link_cfg(struct fsl_mc_io			*mc_io,
1074 		      uint32_t				cmd_flags,
1075 		      uint16_t				token,
1076 		      const struct dpni_link_cfg	*cfg);
1077 
1078 /**
1079  * struct dpni_link_state - Structure representing DPNI link state
1080  * @rate: Rate
1081  * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
1082  * @up: Link state; '0' for down, '1' for up
1083  */
1084 struct dpni_link_state {
1085 	uint32_t rate;
1086 	uint64_t options;
1087 	int up;
1088 };
1089 
1090 /**
1091  * dpni_get_link_state() - Return the link state (either up or down)
1092  * @mc_io:	Pointer to MC portal's I/O object
1093  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1094  * @token:	Token of DPNI object
1095  * @state:	Returned link state;
1096  *
1097  * Return:	'0' on Success; Error code otherwise.
1098  */
1099 int dpni_get_link_state(struct fsl_mc_io	*mc_io,
1100 			uint32_t		cmd_flags,
1101 			uint16_t		token,
1102 			struct dpni_link_state	*state);
1103 
1104 /**
1105  * dpni_set_primary_mac_addr() - Set the primary MAC address
1106  * @mc_io:	Pointer to MC portal's I/O object
1107  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1108  * @token:	Token of DPNI object
1109  * @mac_addr:	MAC address to set as primary address
1110  *
1111  * Return:	'0' on Success; Error code otherwise.
1112  */
1113 int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
1114 			      uint32_t		cmd_flags,
1115 			      uint16_t		token,
1116 			      const uint8_t	mac_addr[6]);
1117 
1118 /**
1119  * dpni_get_primary_mac_addr() - Get the primary MAC address
1120  * @mc_io:	Pointer to MC portal's I/O object
1121  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1122  * @token:	Token of DPNI object
1123  * @mac_addr:	Returned MAC address
1124  *
1125  * Return:	'0' on Success; Error code otherwise.
1126  */
1127 int dpni_get_primary_mac_addr(struct fsl_mc_io	*mc_io,
1128 			      uint32_t		cmd_flags,
1129 			      uint16_t		token,
1130 			      uint8_t		mac_addr[6]);
1131 
1132 /**
1133  * dpni_add_mac_addr() - Add MAC address filter
1134  * @mc_io:	Pointer to MC portal's I/O object
1135  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1136  * @token:	Token of DPNI object
1137  * @mac_addr:	MAC address to add
1138  *
1139  * Return:	'0' on Success; Error code otherwise.
1140  */
1141 int dpni_add_mac_addr(struct fsl_mc_io	*mc_io,
1142 		      uint32_t		cmd_flags,
1143 		      uint16_t		token,
1144 		      const uint8_t	mac_addr[6]);
1145 
1146 /**
1147  * dpni_remove_mac_addr() - Remove MAC address filter
1148  * @mc_io:	Pointer to MC portal's I/O object
1149  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1150  * @token:	Token of DPNI object
1151  * @mac_addr:	MAC address to remove
1152  *
1153  * Return:	'0' on Success; Error code otherwise.
1154  */
1155 int dpni_remove_mac_addr(struct fsl_mc_io	*mc_io,
1156 			 uint32_t		cmd_flags,
1157 			 uint16_t		token,
1158 			 const uint8_t		mac_addr[6]);
1159 
1160 /**
1161  * enum dpni_dest - DPNI destination types
1162  * @DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and
1163  *		does not generate FQDAN notifications; user is expected to
1164  *		dequeue from the queue based on polling or other user-defined
1165  *		method
1166  * @DPNI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
1167  *		notifications to the specified DPIO; user is expected to dequeue
1168  *		from the queue only after notification is received
1169  * @DPNI_DEST_DPCON: The queue is set in schedule mode and does not generate
1170  *		FQDAN notifications, but is connected to the specified DPCON
1171  *		object; user is expected to dequeue from the DPCON channel
1172  */
1173 enum dpni_dest {
1174 	DPNI_DEST_NONE = 0,
1175 	DPNI_DEST_DPIO = 1,
1176 	DPNI_DEST_DPCON = 2
1177 };
1178 
1179 /**
1180  * struct dpni_dest_cfg - Structure representing DPNI destination parameters
1181  * @dest_type: Destination type
1182  * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type
1183  * @priority: Priority selection within the DPIO or DPCON channel; valid values
1184  *		are 0-1 or 0-7, depending on the number of priorities in that
1185  *		channel; not relevant for 'DPNI_DEST_NONE' option
1186  */
1187 struct dpni_dest_cfg {
1188 	enum dpni_dest dest_type;
1189 	int dest_id;
1190 	uint8_t priority;
1191 };
1192 
1193 /**
1194  * enum dpni_flc_type - DPNI FLC types
1195  * @DPNI_FLC_USER_DEFINED: select the FLC to be used for user defined value
1196  * @DPNI_FLC_STASH: select the FLC to be used for stash control
1197  */
1198 enum dpni_flc_type {
1199 	DPNI_FLC_USER_DEFINED = 0,
1200 	DPNI_FLC_STASH = 1,
1201 };
1202 
1203 /**
1204  * enum dpni_stash_size - DPNI FLC stashing size
1205  * @DPNI_STASH_SIZE_0B: no stash
1206  * @DPNI_STASH_SIZE_64B: stashes 64 bytes
1207  * @DPNI_STASH_SIZE_128B: stashes 128 bytes
1208  * @DPNI_STASH_SIZE_192B: stashes 192 bytes
1209  */
1210 enum dpni_stash_size {
1211 	DPNI_STASH_SIZE_0B = 0,
1212 	DPNI_STASH_SIZE_64B = 1,
1213 	DPNI_STASH_SIZE_128B = 2,
1214 	DPNI_STASH_SIZE_192B = 3,
1215 };
1216 
1217 /* DPNI FLC stash options */
1218 
1219 /* stashes the whole annotation area (up to 192 bytes) */
1220 #define DPNI_FLC_STASH_FRAME_ANNOTATION	0x00000001
1221 
1222 /**
1223  * struct dpni_flc_cfg - Structure representing DPNI FLC configuration
1224  * @flc_type: FLC type
1225  * @options: Mask of available options;
1226  *	use 'DPNI_FLC_STASH_<X>' values
1227  * @frame_data_size: Size of frame data to be stashed
1228  * @flow_context_size: Size of flow context to be stashed
1229  * @flow_context: 1. In case flc_type is 'DPNI_FLC_USER_DEFINED':
1230  *			this value will be provided in the frame descriptor
1231  *			(FD[FLC])
1232  *		  2. In case flc_type is 'DPNI_FLC_STASH':
1233  *			this value will be I/O virtual address of the
1234  *			flow-context;
1235  *			Must be cacheline-aligned and DMA-able memory
1236  */
1237 struct dpni_flc_cfg {
1238 	enum dpni_flc_type flc_type;
1239 	uint32_t options;
1240 	enum dpni_stash_size frame_data_size;
1241 	enum dpni_stash_size flow_context_size;
1242 	uint64_t flow_context;
1243 };
1244 
1245 /* DPNI queue modification options */
1246 
1247 /* Select to modify the user's context associated with the queue */
1248 #define DPNI_QUEUE_OPT_USER_CTX		0x00000001
1249 /* Select to modify the queue's destination */
1250 #define DPNI_QUEUE_OPT_DEST		0x00000002
1251 /** Select to modify the flow-context parameters;
1252  * not applicable for Tx-conf/Err queues as the FD comes from the user
1253  */
1254 #define DPNI_QUEUE_OPT_FLC		0x00000004
1255 /* Select to modify the queue's order preservation */
1256 #define DPNI_QUEUE_OPT_ORDER_PRESERVATION 0x00000008
1257 
1258 /**
1259  * struct dpni_queue_cfg - Structure representing queue configuration
1260  * @options: Flags representing the suggested modifications to the queue;
1261  *		Use any combination of 'DPNI_QUEUE_OPT_<X>' flags
1262  * @user_ctx: User context value provided in the frame descriptor of each
1263  *		dequeued frame; valid only if 'DPNI_QUEUE_OPT_USER_CTX'
1264  *		is contained in 'options'
1265  * @dest_cfg: Queue destination parameters;
1266  *		valid only if 'DPNI_QUEUE_OPT_DEST' is contained in 'options'
1267  * @flc_cfg: Flow context configuration; in case the TC's distribution
1268  *		is either NONE or HASH the FLC's settings of flow#0 are used.
1269  *		in the case of FS (flow-steering) the flow's FLC settings
1270  *		are used.
1271  *		valid only if 'DPNI_QUEUE_OPT_FLC' is contained in 'options'
1272  * @order_preservation_en: enable/disable order preservation;
1273  *		valid only if 'DPNI_QUEUE_OPT_ORDER_PRESERVATION' is contained
1274  *		in 'options'
1275  */
1276 struct dpni_queue_cfg {
1277 	uint32_t options;
1278 	uint64_t user_ctx;
1279 	struct dpni_dest_cfg dest_cfg;
1280 	struct dpni_flc_cfg flc_cfg;
1281 	int order_preservation_en;
1282 };
1283 
1284 /**
1285  * struct dpni_queue_attr - Structure representing queue attributes
1286  * @user_ctx: User context value provided in the frame descriptor of each
1287  *	dequeued frame
1288  * @dest_cfg: Queue destination configuration
1289  * @flc_cfg: Flow context configuration
1290  * @order_preservation_en: enable/disable order preservation
1291  * @fqid: Virtual fqid value to be used for dequeue operations
1292  */
1293 struct dpni_queue_attr {
1294 	uint64_t user_ctx;
1295 	struct dpni_dest_cfg dest_cfg;
1296 	struct dpni_flc_cfg flc_cfg;
1297 	int order_preservation_en;
1298 	uint32_t fqid;
1299 };
1300 
1301 /* DPNI Tx flow modification options */
1302 
1303 /* Select to modify the settings for dedicate Tx confirmation/error */
1304 #define DPNI_TX_FLOW_OPT_TX_CONF_ERROR	0x00000001
1305 /*!< Select to modify the Tx confirmation and/or error setting */
1306 #define DPNI_TX_FLOW_OPT_ONLY_TX_ERROR	0x00000002
1307 /*!< Select to modify the queue configuration */
1308 #define DPNI_TX_FLOW_OPT_QUEUE		0x00000004
1309 /*!< Select to modify the L3 checksum generation setting */
1310 #define DPNI_TX_FLOW_OPT_L3_CHKSUM_GEN	0x00000010
1311 /*!< Select to modify the L4 checksum generation setting */
1312 #define DPNI_TX_FLOW_OPT_L4_CHKSUM_GEN	0x00000020
1313 
1314 /**
1315  * struct dpni_tx_flow_cfg - Structure representing Tx flow configuration
1316  * @options: Flags representing the suggested modifications to the Tx flow;
1317  *		Use any combination 'DPNI_TX_FLOW_OPT_<X>' flags
1318  * @conf_err_cfg: Tx confirmation and error configuration; these settings are
1319  *		ignored if 'DPNI_OPT_PRIVATE_TX_CONF_ERROR_DISABLED' was set at
1320  *		DPNI creation
1321  * @l3_chksum_gen: Set to '1' to enable L3 checksum generation; '0' to disable;
1322  *		valid only if 'DPNI_TX_FLOW_OPT_L3_CHKSUM_GEN' is contained in
1323  *		'options'
1324  * @l4_chksum_gen: Set to '1' to enable L4 checksum generation; '0' to disable;
1325  *		valid only if 'DPNI_TX_FLOW_OPT_L4_CHKSUM_GEN' is contained in
1326  *		'options'
1327  */
1328 struct dpni_tx_flow_cfg {
1329 	uint32_t options;
1330 	/**
1331 	 * struct cnf_err_cfg - Tx confirmation and error configuration
1332 	 * @use_default_queue: Set to '1' to use the common (default) Tx
1333 	 *		confirmation and error queue; Set to '0' to use the
1334 	 *		private Tx confirmation and error queue; valid only if
1335 	 *		'DPNI_TX_FLOW_OPT_TX_CONF_ERROR' is contained in
1336 	 *		'options'
1337 	 * @errors_only: Set to '1' to report back only error frames;
1338 	 *		Set to '0' to confirm transmission/error for all
1339 	 *		transmitted frames;
1340 	 *		valid only if 'DPNI_TX_FLOW_OPT_ONLY_TX_ERROR' is
1341 	 *		contained in 'options' and 'use_default_queue = 0';
1342 	 * @queue_cfg: Queue configuration; valid only if
1343 	 *		'DPNI_TX_FLOW_OPT_QUEUE' is contained in 'options'
1344 	 */
1345 	struct {
1346 		int use_default_queue;
1347 		int errors_only;
1348 		struct dpni_queue_cfg queue_cfg;
1349 	} conf_err_cfg;
1350 	int l3_chksum_gen;
1351 	int l4_chksum_gen;
1352 };
1353 
1354 /**
1355  * dpni_set_tx_flow() - Set Tx flow configuration
1356  * @mc_io:	Pointer to MC portal's I/O object
1357  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1358  * @token:	Token of DPNI object
1359  * @flow_id:	Provides (or returns) the sender's flow ID;
1360  *				for each new sender set (*flow_id) to
1361  *				'DPNI_NEW_FLOW_ID' to generate a new flow_id;
1362  *				this ID should be used as the QDBIN argument
1363  *				in enqueue operations
1364  * @cfg:	Tx flow configuration
1365  *
1366  * Return:	'0' on Success; Error code otherwise.
1367  */
1368 int dpni_set_tx_flow(struct fsl_mc_io			*mc_io,
1369 		     uint32_t				cmd_flags,
1370 		     uint16_t				token,
1371 		     uint16_t				*flow_id,
1372 		     const struct dpni_tx_flow_cfg	*cfg);
1373 
1374 /**
1375  * struct dpni_tx_flow_attr - Structure representing Tx flow attributes
1376  * @conf_err_attr: Tx confirmation and error attributes
1377  * @l3_chksum_gen: '1' if L3 checksum generation is enabled; '0' if disabled
1378  * @l4_chksum_gen: '1' if L4 checksum generation is enabled; '0' if disabled
1379  */
1380 struct dpni_tx_flow_attr {
1381 	/**
1382 	 * struct conf_err_attr - Tx confirmation and error attributes
1383 	 * @use_default_queue: '1' if using common (default) Tx confirmation and
1384 	 *			error queue;
1385 	 *			'0' if using private Tx confirmation and error
1386 	 *			queue
1387 	 * @errors_only: '1' if only error frames are reported back; '0' if all
1388 	 *		transmitted frames are confirmed
1389 	 * @queue_attr: Queue attributes
1390 	 */
1391 	struct {
1392 		int use_default_queue;
1393 		int errors_only;
1394 		struct dpni_queue_attr queue_attr;
1395 	} conf_err_attr;
1396 	int l3_chksum_gen;
1397 	int l4_chksum_gen;
1398 };
1399 
1400 /**
1401  * dpni_get_tx_flow() - Get Tx flow attributes
1402  * @mc_io:	Pointer to MC portal's I/O object
1403  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1404  * @token:	Token of DPNI object
1405  * @flow_id:	The sender's flow ID, as returned by the
1406  *			dpni_set_tx_flow() function
1407  * @attr:	Returned Tx flow attributes
1408  *
1409  * Return:	'0' on Success; Error code otherwise.
1410  */
1411 int dpni_get_tx_flow(struct fsl_mc_io		*mc_io,
1412 		     uint32_t			cmd_flags,
1413 		     uint16_t			token,
1414 		     uint16_t			flow_id,
1415 		     struct dpni_tx_flow_attr	*attr);
1416 
1417 /**
1418  * dpni_set_rx_flow() - Set Rx flow configuration
1419  * @mc_io:	Pointer to MC portal's I/O object
1420  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1421  * @token:	Token of DPNI object
1422  * @tc_id:	Traffic class selection (0-7);
1423  *			use 'DPNI_ALL_TCS' to set all TCs and all flows
1424  * @flow_id:	Rx flow id within the traffic class; use
1425  *			'DPNI_ALL_TC_FLOWS' to set all flows within
1426  *			this tc_id; ignored if tc_id is set to
1427  *			'DPNI_ALL_TCS';
1428  * @cfg:	Rx flow configuration
1429  *
1430  * Return:	'0' on Success; Error code otherwise.
1431  */
1432 int dpni_set_rx_flow(struct fsl_mc_io			*mc_io,
1433 		     uint32_t				cmd_flags,
1434 		     uint16_t				token,
1435 		     uint8_t				tc_id,
1436 		     uint16_t				flow_id,
1437 		     const struct dpni_queue_cfg	*cfg);
1438 
1439 /**
1440  * dpni_get_rx_flow() -	Get Rx flow attributes
1441  * @mc_io:	Pointer to MC portal's I/O object
1442  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1443  * @token:	Token of DPNI object
1444  * @tc_id:	Traffic class selection (0-7)
1445  * @flow_id:	Rx flow id within the traffic class
1446  * @attr:	Returned Rx flow attributes
1447  *
1448  * Return:	'0' on Success; Error code otherwise.
1449  */
1450 int dpni_get_rx_flow(struct fsl_mc_io		*mc_io,
1451 		     uint32_t			cmd_flags,
1452 		     uint16_t			token,
1453 		     uint8_t			tc_id,
1454 		     uint16_t			flow_id,
1455 		     struct dpni_queue_attr	*attr);
1456 
1457 #endif /* _FSL_DPNI_H */
1458