xref: /openbmc/linux/drivers/net/ethernet/freescale/dpaa2/dpni.h (revision 34ff68465a17d0c1f022ec9086504cb27dbb2fd7)
1*34ff6846SIoana Radulescu /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2*34ff6846SIoana Radulescu /* Copyright 2013-2016 Freescale Semiconductor Inc.
3*34ff6846SIoana Radulescu  * Copyright 2016 NXP
4*34ff6846SIoana Radulescu  */
5*34ff6846SIoana Radulescu #ifndef __FSL_DPNI_H
6*34ff6846SIoana Radulescu #define __FSL_DPNI_H
7*34ff6846SIoana Radulescu 
8*34ff6846SIoana Radulescu #include "dpkg.h"
9*34ff6846SIoana Radulescu 
10*34ff6846SIoana Radulescu struct fsl_mc_io;
11*34ff6846SIoana Radulescu 
12*34ff6846SIoana Radulescu /**
13*34ff6846SIoana Radulescu  * Data Path Network Interface API
14*34ff6846SIoana Radulescu  * Contains initialization APIs and runtime control APIs for DPNI
15*34ff6846SIoana Radulescu  */
16*34ff6846SIoana Radulescu 
17*34ff6846SIoana Radulescu /** General DPNI macros */
18*34ff6846SIoana Radulescu 
19*34ff6846SIoana Radulescu /**
20*34ff6846SIoana Radulescu  * Maximum number of traffic classes
21*34ff6846SIoana Radulescu  */
22*34ff6846SIoana Radulescu #define DPNI_MAX_TC				8
23*34ff6846SIoana Radulescu /**
24*34ff6846SIoana Radulescu  * Maximum number of buffer pools per DPNI
25*34ff6846SIoana Radulescu  */
26*34ff6846SIoana Radulescu #define DPNI_MAX_DPBP				8
27*34ff6846SIoana Radulescu 
28*34ff6846SIoana Radulescu /**
29*34ff6846SIoana Radulescu  * All traffic classes considered; see dpni_set_queue()
30*34ff6846SIoana Radulescu  */
31*34ff6846SIoana Radulescu #define DPNI_ALL_TCS				(u8)(-1)
32*34ff6846SIoana Radulescu /**
33*34ff6846SIoana Radulescu  * All flows within traffic class considered; see dpni_set_queue()
34*34ff6846SIoana Radulescu  */
35*34ff6846SIoana Radulescu #define DPNI_ALL_TC_FLOWS			(u16)(-1)
36*34ff6846SIoana Radulescu /**
37*34ff6846SIoana Radulescu  * Generate new flow ID; see dpni_set_queue()
38*34ff6846SIoana Radulescu  */
39*34ff6846SIoana Radulescu #define DPNI_NEW_FLOW_ID			(u16)(-1)
40*34ff6846SIoana Radulescu 
41*34ff6846SIoana Radulescu /**
42*34ff6846SIoana Radulescu  * Tx traffic is always released to a buffer pool on transmit, there are no
43*34ff6846SIoana Radulescu  * resources allocated to have the frames confirmed back to the source after
44*34ff6846SIoana Radulescu  * transmission.
45*34ff6846SIoana Radulescu  */
46*34ff6846SIoana Radulescu #define DPNI_OPT_TX_FRM_RELEASE			0x000001
47*34ff6846SIoana Radulescu /**
48*34ff6846SIoana Radulescu  * Disables support for MAC address filtering for addresses other than primary
49*34ff6846SIoana Radulescu  * MAC address. This affects both unicast and multicast. Promiscuous mode can
50*34ff6846SIoana Radulescu  * still be enabled/disabled for both unicast and multicast. If promiscuous mode
51*34ff6846SIoana Radulescu  * is disabled, only traffic matching the primary MAC address will be accepted.
52*34ff6846SIoana Radulescu  */
53*34ff6846SIoana Radulescu #define DPNI_OPT_NO_MAC_FILTER			0x000002
54*34ff6846SIoana Radulescu /**
55*34ff6846SIoana Radulescu  * Allocate policers for this DPNI. They can be used to rate-limit traffic per
56*34ff6846SIoana Radulescu  * traffic class (TC) basis.
57*34ff6846SIoana Radulescu  */
58*34ff6846SIoana Radulescu #define DPNI_OPT_HAS_POLICING			0x000004
59*34ff6846SIoana Radulescu /**
60*34ff6846SIoana Radulescu  * Congestion can be managed in several ways, allowing the buffer pool to
61*34ff6846SIoana Radulescu  * deplete on ingress, taildrop on each queue or use congestion groups for sets
62*34ff6846SIoana Radulescu  * of queues. If set, it configures a single congestion groups across all TCs.
63*34ff6846SIoana Radulescu  * If reset, a congestion group is allocated for each TC. Only relevant if the
64*34ff6846SIoana Radulescu  * DPNI has multiple traffic classes.
65*34ff6846SIoana Radulescu  */
66*34ff6846SIoana Radulescu #define DPNI_OPT_SHARED_CONGESTION		0x000008
67*34ff6846SIoana Radulescu /**
68*34ff6846SIoana Radulescu  * Enables TCAM for Flow Steering and QoS look-ups. If not specified, all
69*34ff6846SIoana Radulescu  * look-ups are exact match. Note that TCAM is not available on LS1088 and its
70*34ff6846SIoana Radulescu  * variants. Setting this bit on these SoCs will trigger an error.
71*34ff6846SIoana Radulescu  */
72*34ff6846SIoana Radulescu #define DPNI_OPT_HAS_KEY_MASKING		0x000010
73*34ff6846SIoana Radulescu /**
74*34ff6846SIoana Radulescu  * Disables the flow steering table.
75*34ff6846SIoana Radulescu  */
76*34ff6846SIoana Radulescu #define DPNI_OPT_NO_FS				0x000020
77*34ff6846SIoana Radulescu 
78*34ff6846SIoana Radulescu int dpni_open(struct fsl_mc_io	*mc_io,
79*34ff6846SIoana Radulescu 	      u32		cmd_flags,
80*34ff6846SIoana Radulescu 	      int		dpni_id,
81*34ff6846SIoana Radulescu 	      u16		*token);
82*34ff6846SIoana Radulescu 
83*34ff6846SIoana Radulescu int dpni_close(struct fsl_mc_io	*mc_io,
84*34ff6846SIoana Radulescu 	       u32		cmd_flags,
85*34ff6846SIoana Radulescu 	       u16		token);
86*34ff6846SIoana Radulescu 
87*34ff6846SIoana Radulescu /**
88*34ff6846SIoana Radulescu  * struct dpni_pools_cfg - Structure representing buffer pools configuration
89*34ff6846SIoana Radulescu  * @num_dpbp: Number of DPBPs
90*34ff6846SIoana Radulescu  * @pools: Array of buffer pools parameters; The number of valid entries
91*34ff6846SIoana Radulescu  *	must match 'num_dpbp' value
92*34ff6846SIoana Radulescu  * @pools.dpbp_id: DPBP object ID
93*34ff6846SIoana Radulescu  * @pools.buffer_size: Buffer size
94*34ff6846SIoana Radulescu  * @pools.backup_pool: Backup pool
95*34ff6846SIoana Radulescu  */
96*34ff6846SIoana Radulescu struct dpni_pools_cfg {
97*34ff6846SIoana Radulescu 	u8		num_dpbp;
98*34ff6846SIoana Radulescu 	struct {
99*34ff6846SIoana Radulescu 		int	dpbp_id;
100*34ff6846SIoana Radulescu 		u16	buffer_size;
101*34ff6846SIoana Radulescu 		int	backup_pool;
102*34ff6846SIoana Radulescu 	} pools[DPNI_MAX_DPBP];
103*34ff6846SIoana Radulescu };
104*34ff6846SIoana Radulescu 
105*34ff6846SIoana Radulescu int dpni_set_pools(struct fsl_mc_io		*mc_io,
106*34ff6846SIoana Radulescu 		   u32				cmd_flags,
107*34ff6846SIoana Radulescu 		   u16				token,
108*34ff6846SIoana Radulescu 		   const struct dpni_pools_cfg	*cfg);
109*34ff6846SIoana Radulescu 
110*34ff6846SIoana Radulescu int dpni_enable(struct fsl_mc_io	*mc_io,
111*34ff6846SIoana Radulescu 		u32			cmd_flags,
112*34ff6846SIoana Radulescu 		u16			token);
113*34ff6846SIoana Radulescu 
114*34ff6846SIoana Radulescu int dpni_disable(struct fsl_mc_io	*mc_io,
115*34ff6846SIoana Radulescu 		 u32			cmd_flags,
116*34ff6846SIoana Radulescu 		 u16			token);
117*34ff6846SIoana Radulescu 
118*34ff6846SIoana Radulescu int dpni_is_enabled(struct fsl_mc_io	*mc_io,
119*34ff6846SIoana Radulescu 		    u32			cmd_flags,
120*34ff6846SIoana Radulescu 		    u16			token,
121*34ff6846SIoana Radulescu 		    int			*en);
122*34ff6846SIoana Radulescu 
123*34ff6846SIoana Radulescu int dpni_reset(struct fsl_mc_io	*mc_io,
124*34ff6846SIoana Radulescu 	       u32		cmd_flags,
125*34ff6846SIoana Radulescu 	       u16		token);
126*34ff6846SIoana Radulescu 
127*34ff6846SIoana Radulescu /**
128*34ff6846SIoana Radulescu  * DPNI IRQ Index and Events
129*34ff6846SIoana Radulescu  */
130*34ff6846SIoana Radulescu 
131*34ff6846SIoana Radulescu /**
132*34ff6846SIoana Radulescu  * IRQ index
133*34ff6846SIoana Radulescu  */
134*34ff6846SIoana Radulescu #define DPNI_IRQ_INDEX				0
135*34ff6846SIoana Radulescu /**
136*34ff6846SIoana Radulescu  * IRQ event - indicates a change in link state
137*34ff6846SIoana Radulescu  */
138*34ff6846SIoana Radulescu #define DPNI_IRQ_EVENT_LINK_CHANGED		0x00000001
139*34ff6846SIoana Radulescu 
140*34ff6846SIoana Radulescu int dpni_set_irq_enable(struct fsl_mc_io	*mc_io,
141*34ff6846SIoana Radulescu 			u32			cmd_flags,
142*34ff6846SIoana Radulescu 			u16			token,
143*34ff6846SIoana Radulescu 			u8			irq_index,
144*34ff6846SIoana Radulescu 			u8			en);
145*34ff6846SIoana Radulescu 
146*34ff6846SIoana Radulescu int dpni_get_irq_enable(struct fsl_mc_io	*mc_io,
147*34ff6846SIoana Radulescu 			u32			cmd_flags,
148*34ff6846SIoana Radulescu 			u16			token,
149*34ff6846SIoana Radulescu 			u8			irq_index,
150*34ff6846SIoana Radulescu 			u8			*en);
151*34ff6846SIoana Radulescu 
152*34ff6846SIoana Radulescu int dpni_set_irq_mask(struct fsl_mc_io	*mc_io,
153*34ff6846SIoana Radulescu 		      u32		cmd_flags,
154*34ff6846SIoana Radulescu 		      u16		token,
155*34ff6846SIoana Radulescu 		      u8		irq_index,
156*34ff6846SIoana Radulescu 		      u32		mask);
157*34ff6846SIoana Radulescu 
158*34ff6846SIoana Radulescu int dpni_get_irq_mask(struct fsl_mc_io	*mc_io,
159*34ff6846SIoana Radulescu 		      u32		cmd_flags,
160*34ff6846SIoana Radulescu 		      u16		token,
161*34ff6846SIoana Radulescu 		      u8		irq_index,
162*34ff6846SIoana Radulescu 		      u32		*mask);
163*34ff6846SIoana Radulescu 
164*34ff6846SIoana Radulescu int dpni_get_irq_status(struct fsl_mc_io	*mc_io,
165*34ff6846SIoana Radulescu 			u32			cmd_flags,
166*34ff6846SIoana Radulescu 			u16			token,
167*34ff6846SIoana Radulescu 			u8			irq_index,
168*34ff6846SIoana Radulescu 			u32			*status);
169*34ff6846SIoana Radulescu 
170*34ff6846SIoana Radulescu int dpni_clear_irq_status(struct fsl_mc_io	*mc_io,
171*34ff6846SIoana Radulescu 			  u32			cmd_flags,
172*34ff6846SIoana Radulescu 			  u16			token,
173*34ff6846SIoana Radulescu 			  u8			irq_index,
174*34ff6846SIoana Radulescu 			  u32			status);
175*34ff6846SIoana Radulescu 
176*34ff6846SIoana Radulescu /**
177*34ff6846SIoana Radulescu  * struct dpni_attr - Structure representing DPNI attributes
178*34ff6846SIoana Radulescu  * @options: Any combination of the following options:
179*34ff6846SIoana Radulescu  *		DPNI_OPT_TX_FRM_RELEASE
180*34ff6846SIoana Radulescu  *		DPNI_OPT_NO_MAC_FILTER
181*34ff6846SIoana Radulescu  *		DPNI_OPT_HAS_POLICING
182*34ff6846SIoana Radulescu  *		DPNI_OPT_SHARED_CONGESTION
183*34ff6846SIoana Radulescu  *		DPNI_OPT_HAS_KEY_MASKING
184*34ff6846SIoana Radulescu  *		DPNI_OPT_NO_FS
185*34ff6846SIoana Radulescu  * @num_queues: Number of Tx and Rx queues used for traffic distribution.
186*34ff6846SIoana Radulescu  * @num_tcs: Number of traffic classes (TCs), reserved for the DPNI.
187*34ff6846SIoana Radulescu  * @mac_filter_entries: Number of entries in the MAC address filtering table.
188*34ff6846SIoana Radulescu  * @vlan_filter_entries: Number of entries in the VLAN address filtering table.
189*34ff6846SIoana Radulescu  * @qos_entries: Number of entries in the QoS classification table.
190*34ff6846SIoana Radulescu  * @fs_entries: Number of entries in the flow steering table.
191*34ff6846SIoana Radulescu  * @qos_key_size: Size, in bytes, of the QoS look-up key. Defining a key larger
192*34ff6846SIoana Radulescu  *		than this when adding QoS entries will result in an error.
193*34ff6846SIoana Radulescu  * @fs_key_size: Size, in bytes, of the flow steering look-up key. Defining a
194*34ff6846SIoana Radulescu  *		key larger than this when composing the hash + FS key will
195*34ff6846SIoana Radulescu  *		result in an error.
196*34ff6846SIoana Radulescu  * @wriop_version: Version of WRIOP HW block. The 3 version values are stored
197*34ff6846SIoana Radulescu  *		on 6, 5, 5 bits respectively.
198*34ff6846SIoana Radulescu  */
199*34ff6846SIoana Radulescu struct dpni_attr {
200*34ff6846SIoana Radulescu 	u32 options;
201*34ff6846SIoana Radulescu 	u8 num_queues;
202*34ff6846SIoana Radulescu 	u8 num_tcs;
203*34ff6846SIoana Radulescu 	u8 mac_filter_entries;
204*34ff6846SIoana Radulescu 	u8 vlan_filter_entries;
205*34ff6846SIoana Radulescu 	u8 qos_entries;
206*34ff6846SIoana Radulescu 	u16 fs_entries;
207*34ff6846SIoana Radulescu 	u8 qos_key_size;
208*34ff6846SIoana Radulescu 	u8 fs_key_size;
209*34ff6846SIoana Radulescu 	u16 wriop_version;
210*34ff6846SIoana Radulescu };
211*34ff6846SIoana Radulescu 
212*34ff6846SIoana Radulescu int dpni_get_attributes(struct fsl_mc_io	*mc_io,
213*34ff6846SIoana Radulescu 			u32			cmd_flags,
214*34ff6846SIoana Radulescu 			u16			token,
215*34ff6846SIoana Radulescu 			struct dpni_attr	*attr);
216*34ff6846SIoana Radulescu 
217*34ff6846SIoana Radulescu /**
218*34ff6846SIoana Radulescu  * DPNI errors
219*34ff6846SIoana Radulescu  */
220*34ff6846SIoana Radulescu 
221*34ff6846SIoana Radulescu /**
222*34ff6846SIoana Radulescu  * Extract out of frame header error
223*34ff6846SIoana Radulescu  */
224*34ff6846SIoana Radulescu #define DPNI_ERROR_EOFHE	0x00020000
225*34ff6846SIoana Radulescu /**
226*34ff6846SIoana Radulescu  * Frame length error
227*34ff6846SIoana Radulescu  */
228*34ff6846SIoana Radulescu #define DPNI_ERROR_FLE		0x00002000
229*34ff6846SIoana Radulescu /**
230*34ff6846SIoana Radulescu  * Frame physical error
231*34ff6846SIoana Radulescu  */
232*34ff6846SIoana Radulescu #define DPNI_ERROR_FPE		0x00001000
233*34ff6846SIoana Radulescu /**
234*34ff6846SIoana Radulescu  * Parsing header error
235*34ff6846SIoana Radulescu  */
236*34ff6846SIoana Radulescu #define DPNI_ERROR_PHE		0x00000020
237*34ff6846SIoana Radulescu /**
238*34ff6846SIoana Radulescu  * Parser L3 checksum error
239*34ff6846SIoana Radulescu  */
240*34ff6846SIoana Radulescu #define DPNI_ERROR_L3CE		0x00000004
241*34ff6846SIoana Radulescu /**
242*34ff6846SIoana Radulescu  * Parser L3 checksum error
243*34ff6846SIoana Radulescu  */
244*34ff6846SIoana Radulescu #define DPNI_ERROR_L4CE		0x00000001
245*34ff6846SIoana Radulescu 
246*34ff6846SIoana Radulescu /**
247*34ff6846SIoana Radulescu  * enum dpni_error_action - Defines DPNI behavior for errors
248*34ff6846SIoana Radulescu  * @DPNI_ERROR_ACTION_DISCARD: Discard the frame
249*34ff6846SIoana Radulescu  * @DPNI_ERROR_ACTION_CONTINUE: Continue with the normal flow
250*34ff6846SIoana Radulescu  * @DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE: Send the frame to the error queue
251*34ff6846SIoana Radulescu  */
252*34ff6846SIoana Radulescu enum dpni_error_action {
253*34ff6846SIoana Radulescu 	DPNI_ERROR_ACTION_DISCARD = 0,
254*34ff6846SIoana Radulescu 	DPNI_ERROR_ACTION_CONTINUE = 1,
255*34ff6846SIoana Radulescu 	DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE = 2
256*34ff6846SIoana Radulescu };
257*34ff6846SIoana Radulescu 
258*34ff6846SIoana Radulescu /**
259*34ff6846SIoana Radulescu  * struct dpni_error_cfg - Structure representing DPNI errors treatment
260*34ff6846SIoana Radulescu  * @errors: Errors mask; use 'DPNI_ERROR__<X>
261*34ff6846SIoana Radulescu  * @error_action: The desired action for the errors mask
262*34ff6846SIoana Radulescu  * @set_frame_annotation: Set to '1' to mark the errors in frame annotation
263*34ff6846SIoana Radulescu  *		status (FAS); relevant only for the non-discard action
264*34ff6846SIoana Radulescu  */
265*34ff6846SIoana Radulescu struct dpni_error_cfg {
266*34ff6846SIoana Radulescu 	u32			errors;
267*34ff6846SIoana Radulescu 	enum dpni_error_action	error_action;
268*34ff6846SIoana Radulescu 	int			set_frame_annotation;
269*34ff6846SIoana Radulescu };
270*34ff6846SIoana Radulescu 
271*34ff6846SIoana Radulescu int dpni_set_errors_behavior(struct fsl_mc_io		*mc_io,
272*34ff6846SIoana Radulescu 			     u32			cmd_flags,
273*34ff6846SIoana Radulescu 			     u16			token,
274*34ff6846SIoana Radulescu 			     struct dpni_error_cfg	*cfg);
275*34ff6846SIoana Radulescu 
276*34ff6846SIoana Radulescu /**
277*34ff6846SIoana Radulescu  * DPNI buffer layout modification options
278*34ff6846SIoana Radulescu  */
279*34ff6846SIoana Radulescu 
280*34ff6846SIoana Radulescu /**
281*34ff6846SIoana Radulescu  * Select to modify the time-stamp setting
282*34ff6846SIoana Radulescu  */
283*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_TIMESTAMP		0x00000001
284*34ff6846SIoana Radulescu /**
285*34ff6846SIoana Radulescu  * Select to modify the parser-result setting; not applicable for Tx
286*34ff6846SIoana Radulescu  */
287*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_PARSER_RESULT	0x00000002
288*34ff6846SIoana Radulescu /**
289*34ff6846SIoana Radulescu  * Select to modify the frame-status setting
290*34ff6846SIoana Radulescu  */
291*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_FRAME_STATUS	0x00000004
292*34ff6846SIoana Radulescu /**
293*34ff6846SIoana Radulescu  * Select to modify the private-data-size setting
294*34ff6846SIoana Radulescu  */
295*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE	0x00000008
296*34ff6846SIoana Radulescu /**
297*34ff6846SIoana Radulescu  * Select to modify the data-alignment setting
298*34ff6846SIoana Radulescu  */
299*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_DATA_ALIGN		0x00000010
300*34ff6846SIoana Radulescu /**
301*34ff6846SIoana Radulescu  * Select to modify the data-head-room setting
302*34ff6846SIoana Radulescu  */
303*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM	0x00000020
304*34ff6846SIoana Radulescu /**
305*34ff6846SIoana Radulescu  * Select to modify the data-tail-room setting
306*34ff6846SIoana Radulescu  */
307*34ff6846SIoana Radulescu #define DPNI_BUF_LAYOUT_OPT_DATA_TAIL_ROOM	0x00000040
308*34ff6846SIoana Radulescu 
309*34ff6846SIoana Radulescu /**
310*34ff6846SIoana Radulescu  * struct dpni_buffer_layout - Structure representing DPNI buffer layout
311*34ff6846SIoana Radulescu  * @options: Flags representing the suggested modifications to the buffer
312*34ff6846SIoana Radulescu  *		layout; Use any combination of 'DPNI_BUF_LAYOUT_OPT_<X>' flags
313*34ff6846SIoana Radulescu  * @pass_timestamp: Pass timestamp value
314*34ff6846SIoana Radulescu  * @pass_parser_result: Pass parser results
315*34ff6846SIoana Radulescu  * @pass_frame_status: Pass frame status
316*34ff6846SIoana Radulescu  * @private_data_size: Size kept for private data (in bytes)
317*34ff6846SIoana Radulescu  * @data_align: Data alignment
318*34ff6846SIoana Radulescu  * @data_head_room: Data head room
319*34ff6846SIoana Radulescu  * @data_tail_room: Data tail room
320*34ff6846SIoana Radulescu  */
321*34ff6846SIoana Radulescu struct dpni_buffer_layout {
322*34ff6846SIoana Radulescu 	u32	options;
323*34ff6846SIoana Radulescu 	int	pass_timestamp;
324*34ff6846SIoana Radulescu 	int	pass_parser_result;
325*34ff6846SIoana Radulescu 	int	pass_frame_status;
326*34ff6846SIoana Radulescu 	u16	private_data_size;
327*34ff6846SIoana Radulescu 	u16	data_align;
328*34ff6846SIoana Radulescu 	u16	data_head_room;
329*34ff6846SIoana Radulescu 	u16	data_tail_room;
330*34ff6846SIoana Radulescu };
331*34ff6846SIoana Radulescu 
332*34ff6846SIoana Radulescu /**
333*34ff6846SIoana Radulescu  * enum dpni_queue_type - Identifies a type of queue targeted by the command
334*34ff6846SIoana Radulescu  * @DPNI_QUEUE_RX: Rx queue
335*34ff6846SIoana Radulescu  * @DPNI_QUEUE_TX: Tx queue
336*34ff6846SIoana Radulescu  * @DPNI_QUEUE_TX_CONFIRM: Tx confirmation queue
337*34ff6846SIoana Radulescu  * @DPNI_QUEUE_RX_ERR: Rx error queue
338*34ff6846SIoana Radulescu  */enum dpni_queue_type {
339*34ff6846SIoana Radulescu 	DPNI_QUEUE_RX,
340*34ff6846SIoana Radulescu 	DPNI_QUEUE_TX,
341*34ff6846SIoana Radulescu 	DPNI_QUEUE_TX_CONFIRM,
342*34ff6846SIoana Radulescu 	DPNI_QUEUE_RX_ERR,
343*34ff6846SIoana Radulescu };
344*34ff6846SIoana Radulescu 
345*34ff6846SIoana Radulescu int dpni_get_buffer_layout(struct fsl_mc_io		*mc_io,
346*34ff6846SIoana Radulescu 			   u32				cmd_flags,
347*34ff6846SIoana Radulescu 			   u16				token,
348*34ff6846SIoana Radulescu 			   enum dpni_queue_type		qtype,
349*34ff6846SIoana Radulescu 			   struct dpni_buffer_layout	*layout);
350*34ff6846SIoana Radulescu 
351*34ff6846SIoana Radulescu int dpni_set_buffer_layout(struct fsl_mc_io		   *mc_io,
352*34ff6846SIoana Radulescu 			   u32				   cmd_flags,
353*34ff6846SIoana Radulescu 			   u16				   token,
354*34ff6846SIoana Radulescu 			   enum dpni_queue_type		   qtype,
355*34ff6846SIoana Radulescu 			   const struct dpni_buffer_layout *layout);
356*34ff6846SIoana Radulescu 
357*34ff6846SIoana Radulescu /**
358*34ff6846SIoana Radulescu  * enum dpni_offload - Identifies a type of offload targeted by the command
359*34ff6846SIoana Radulescu  * @DPNI_OFF_RX_L3_CSUM: Rx L3 checksum validation
360*34ff6846SIoana Radulescu  * @DPNI_OFF_RX_L4_CSUM: Rx L4 checksum validation
361*34ff6846SIoana Radulescu  * @DPNI_OFF_TX_L3_CSUM: Tx L3 checksum generation
362*34ff6846SIoana Radulescu  * @DPNI_OFF_TX_L4_CSUM: Tx L4 checksum generation
363*34ff6846SIoana Radulescu  */
364*34ff6846SIoana Radulescu enum dpni_offload {
365*34ff6846SIoana Radulescu 	DPNI_OFF_RX_L3_CSUM,
366*34ff6846SIoana Radulescu 	DPNI_OFF_RX_L4_CSUM,
367*34ff6846SIoana Radulescu 	DPNI_OFF_TX_L3_CSUM,
368*34ff6846SIoana Radulescu 	DPNI_OFF_TX_L4_CSUM,
369*34ff6846SIoana Radulescu };
370*34ff6846SIoana Radulescu 
371*34ff6846SIoana Radulescu int dpni_set_offload(struct fsl_mc_io	*mc_io,
372*34ff6846SIoana Radulescu 		     u32		cmd_flags,
373*34ff6846SIoana Radulescu 		     u16		token,
374*34ff6846SIoana Radulescu 		     enum dpni_offload	type,
375*34ff6846SIoana Radulescu 		     u32		config);
376*34ff6846SIoana Radulescu 
377*34ff6846SIoana Radulescu int dpni_get_offload(struct fsl_mc_io	*mc_io,
378*34ff6846SIoana Radulescu 		     u32		cmd_flags,
379*34ff6846SIoana Radulescu 		     u16		token,
380*34ff6846SIoana Radulescu 		     enum dpni_offload	type,
381*34ff6846SIoana Radulescu 		     u32		*config);
382*34ff6846SIoana Radulescu 
383*34ff6846SIoana Radulescu int dpni_get_qdid(struct fsl_mc_io	*mc_io,
384*34ff6846SIoana Radulescu 		  u32			cmd_flags,
385*34ff6846SIoana Radulescu 		  u16			token,
386*34ff6846SIoana Radulescu 		  enum dpni_queue_type	qtype,
387*34ff6846SIoana Radulescu 		  u16			*qdid);
388*34ff6846SIoana Radulescu 
389*34ff6846SIoana Radulescu int dpni_get_tx_data_offset(struct fsl_mc_io	*mc_io,
390*34ff6846SIoana Radulescu 			    u32			cmd_flags,
391*34ff6846SIoana Radulescu 			    u16			token,
392*34ff6846SIoana Radulescu 			    u16			*data_offset);
393*34ff6846SIoana Radulescu 
394*34ff6846SIoana Radulescu #define DPNI_STATISTICS_CNT		7
395*34ff6846SIoana Radulescu 
396*34ff6846SIoana Radulescu /**
397*34ff6846SIoana Radulescu  * union dpni_statistics - Union describing the DPNI statistics
398*34ff6846SIoana Radulescu  * @page_0: Page_0 statistics structure
399*34ff6846SIoana Radulescu  * @page_0.ingress_all_frames: Ingress frame count
400*34ff6846SIoana Radulescu  * @page_0.ingress_all_bytes: Ingress byte count
401*34ff6846SIoana Radulescu  * @page_0.ingress_multicast_frames: Ingress multicast frame count
402*34ff6846SIoana Radulescu  * @page_0.ingress_multicast_bytes: Ingress multicast byte count
403*34ff6846SIoana Radulescu  * @page_0.ingress_broadcast_frames: Ingress broadcast frame count
404*34ff6846SIoana Radulescu  * @page_0.ingress_broadcast_bytes: Ingress broadcast byte count
405*34ff6846SIoana Radulescu  * @page_1: Page_1 statistics structure
406*34ff6846SIoana Radulescu  * @page_1.egress_all_frames: Egress frame count
407*34ff6846SIoana Radulescu  * @page_1.egress_all_bytes: Egress byte count
408*34ff6846SIoana Radulescu  * @page_1.egress_multicast_frames: Egress multicast frame count
409*34ff6846SIoana Radulescu  * @page_1.egress_multicast_bytes: Egress multicast byte count
410*34ff6846SIoana Radulescu  * @page_1.egress_broadcast_frames: Egress broadcast frame count
411*34ff6846SIoana Radulescu  * @page_1.egress_broadcast_bytes: Egress broadcast byte count
412*34ff6846SIoana Radulescu  * @page_2: Page_2 statistics structure
413*34ff6846SIoana Radulescu  * @page_2.ingress_filtered_frames: Ingress filtered frame count
414*34ff6846SIoana Radulescu  * @page_2.ingress_discarded_frames: Ingress discarded frame count
415*34ff6846SIoana Radulescu  * @page_2.ingress_nobuffer_discards: Ingress discarded frame count due to
416*34ff6846SIoana Radulescu  *	lack of buffers
417*34ff6846SIoana Radulescu  * @page_2.egress_discarded_frames: Egress discarded frame count
418*34ff6846SIoana Radulescu  * @page_2.egress_confirmed_frames: Egress confirmed frame count
419*34ff6846SIoana Radulescu  * @raw: raw statistics structure, used to index counters
420*34ff6846SIoana Radulescu  */
421*34ff6846SIoana Radulescu union dpni_statistics {
422*34ff6846SIoana Radulescu 	struct {
423*34ff6846SIoana Radulescu 		u64 ingress_all_frames;
424*34ff6846SIoana Radulescu 		u64 ingress_all_bytes;
425*34ff6846SIoana Radulescu 		u64 ingress_multicast_frames;
426*34ff6846SIoana Radulescu 		u64 ingress_multicast_bytes;
427*34ff6846SIoana Radulescu 		u64 ingress_broadcast_frames;
428*34ff6846SIoana Radulescu 		u64 ingress_broadcast_bytes;
429*34ff6846SIoana Radulescu 	} page_0;
430*34ff6846SIoana Radulescu 	struct {
431*34ff6846SIoana Radulescu 		u64 egress_all_frames;
432*34ff6846SIoana Radulescu 		u64 egress_all_bytes;
433*34ff6846SIoana Radulescu 		u64 egress_multicast_frames;
434*34ff6846SIoana Radulescu 		u64 egress_multicast_bytes;
435*34ff6846SIoana Radulescu 		u64 egress_broadcast_frames;
436*34ff6846SIoana Radulescu 		u64 egress_broadcast_bytes;
437*34ff6846SIoana Radulescu 	} page_1;
438*34ff6846SIoana Radulescu 	struct {
439*34ff6846SIoana Radulescu 		u64 ingress_filtered_frames;
440*34ff6846SIoana Radulescu 		u64 ingress_discarded_frames;
441*34ff6846SIoana Radulescu 		u64 ingress_nobuffer_discards;
442*34ff6846SIoana Radulescu 		u64 egress_discarded_frames;
443*34ff6846SIoana Radulescu 		u64 egress_confirmed_frames;
444*34ff6846SIoana Radulescu 	} page_2;
445*34ff6846SIoana Radulescu 	struct {
446*34ff6846SIoana Radulescu 		u64 counter[DPNI_STATISTICS_CNT];
447*34ff6846SIoana Radulescu 	} raw;
448*34ff6846SIoana Radulescu };
449*34ff6846SIoana Radulescu 
450*34ff6846SIoana Radulescu int dpni_get_statistics(struct fsl_mc_io	*mc_io,
451*34ff6846SIoana Radulescu 			u32			cmd_flags,
452*34ff6846SIoana Radulescu 			u16			token,
453*34ff6846SIoana Radulescu 			u8			page,
454*34ff6846SIoana Radulescu 			union dpni_statistics	*stat);
455*34ff6846SIoana Radulescu 
456*34ff6846SIoana Radulescu /**
457*34ff6846SIoana Radulescu  * Enable auto-negotiation
458*34ff6846SIoana Radulescu  */
459*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_AUTONEG		0x0000000000000001ULL
460*34ff6846SIoana Radulescu /**
461*34ff6846SIoana Radulescu  * Enable half-duplex mode
462*34ff6846SIoana Radulescu  */
463*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_HALF_DUPLEX	0x0000000000000002ULL
464*34ff6846SIoana Radulescu /**
465*34ff6846SIoana Radulescu  * Enable pause frames
466*34ff6846SIoana Radulescu  */
467*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_PAUSE		0x0000000000000004ULL
468*34ff6846SIoana Radulescu /**
469*34ff6846SIoana Radulescu  * Enable a-symmetric pause frames
470*34ff6846SIoana Radulescu  */
471*34ff6846SIoana Radulescu #define DPNI_LINK_OPT_ASYM_PAUSE	0x0000000000000008ULL
472*34ff6846SIoana Radulescu 
473*34ff6846SIoana Radulescu /**
474*34ff6846SIoana Radulescu  * struct - Structure representing DPNI link configuration
475*34ff6846SIoana Radulescu  * @rate: Rate
476*34ff6846SIoana Radulescu  * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
477*34ff6846SIoana Radulescu  */
478*34ff6846SIoana Radulescu struct dpni_link_cfg {
479*34ff6846SIoana Radulescu 	u32 rate;
480*34ff6846SIoana Radulescu 	u64 options;
481*34ff6846SIoana Radulescu };
482*34ff6846SIoana Radulescu 
483*34ff6846SIoana Radulescu int dpni_set_link_cfg(struct fsl_mc_io			*mc_io,
484*34ff6846SIoana Radulescu 		      u32				cmd_flags,
485*34ff6846SIoana Radulescu 		      u16				token,
486*34ff6846SIoana Radulescu 		      const struct dpni_link_cfg	*cfg);
487*34ff6846SIoana Radulescu 
488*34ff6846SIoana Radulescu /**
489*34ff6846SIoana Radulescu  * struct dpni_link_state - Structure representing DPNI link state
490*34ff6846SIoana Radulescu  * @rate: Rate
491*34ff6846SIoana Radulescu  * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
492*34ff6846SIoana Radulescu  * @up: Link state; '0' for down, '1' for up
493*34ff6846SIoana Radulescu  */
494*34ff6846SIoana Radulescu struct dpni_link_state {
495*34ff6846SIoana Radulescu 	u32	rate;
496*34ff6846SIoana Radulescu 	u64	options;
497*34ff6846SIoana Radulescu 	int	up;
498*34ff6846SIoana Radulescu };
499*34ff6846SIoana Radulescu 
500*34ff6846SIoana Radulescu int dpni_get_link_state(struct fsl_mc_io	*mc_io,
501*34ff6846SIoana Radulescu 			u32			cmd_flags,
502*34ff6846SIoana Radulescu 			u16			token,
503*34ff6846SIoana Radulescu 			struct dpni_link_state	*state);
504*34ff6846SIoana Radulescu 
505*34ff6846SIoana Radulescu int dpni_set_max_frame_length(struct fsl_mc_io	*mc_io,
506*34ff6846SIoana Radulescu 			      u32		cmd_flags,
507*34ff6846SIoana Radulescu 			      u16		token,
508*34ff6846SIoana Radulescu 			      u16		max_frame_length);
509*34ff6846SIoana Radulescu 
510*34ff6846SIoana Radulescu int dpni_get_max_frame_length(struct fsl_mc_io	*mc_io,
511*34ff6846SIoana Radulescu 			      u32		cmd_flags,
512*34ff6846SIoana Radulescu 			      u16		token,
513*34ff6846SIoana Radulescu 			      u16		*max_frame_length);
514*34ff6846SIoana Radulescu 
515*34ff6846SIoana Radulescu int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io,
516*34ff6846SIoana Radulescu 			       u32		cmd_flags,
517*34ff6846SIoana Radulescu 			       u16		token,
518*34ff6846SIoana Radulescu 			       int		en);
519*34ff6846SIoana Radulescu 
520*34ff6846SIoana Radulescu int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io,
521*34ff6846SIoana Radulescu 			       u32		cmd_flags,
522*34ff6846SIoana Radulescu 			       u16		token,
523*34ff6846SIoana Radulescu 			       int		*en);
524*34ff6846SIoana Radulescu 
525*34ff6846SIoana Radulescu int dpni_set_unicast_promisc(struct fsl_mc_io	*mc_io,
526*34ff6846SIoana Radulescu 			     u32		cmd_flags,
527*34ff6846SIoana Radulescu 			     u16		token,
528*34ff6846SIoana Radulescu 			     int		en);
529*34ff6846SIoana Radulescu 
530*34ff6846SIoana Radulescu int dpni_get_unicast_promisc(struct fsl_mc_io	*mc_io,
531*34ff6846SIoana Radulescu 			     u32		cmd_flags,
532*34ff6846SIoana Radulescu 			     u16		token,
533*34ff6846SIoana Radulescu 			     int		*en);
534*34ff6846SIoana Radulescu 
535*34ff6846SIoana Radulescu int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
536*34ff6846SIoana Radulescu 			      u32		cmd_flags,
537*34ff6846SIoana Radulescu 			      u16		token,
538*34ff6846SIoana Radulescu 			      const u8		mac_addr[6]);
539*34ff6846SIoana Radulescu 
540*34ff6846SIoana Radulescu int dpni_get_primary_mac_addr(struct fsl_mc_io	*mc_io,
541*34ff6846SIoana Radulescu 			      u32		cmd_flags,
542*34ff6846SIoana Radulescu 			      u16		token,
543*34ff6846SIoana Radulescu 			      u8		mac_addr[6]);
544*34ff6846SIoana Radulescu 
545*34ff6846SIoana Radulescu int dpni_get_port_mac_addr(struct fsl_mc_io	*mc_io,
546*34ff6846SIoana Radulescu 			   u32			cm_flags,
547*34ff6846SIoana Radulescu 			   u16			token,
548*34ff6846SIoana Radulescu 			   u8			mac_addr[6]);
549*34ff6846SIoana Radulescu 
550*34ff6846SIoana Radulescu int dpni_add_mac_addr(struct fsl_mc_io	*mc_io,
551*34ff6846SIoana Radulescu 		      u32		cmd_flags,
552*34ff6846SIoana Radulescu 		      u16		token,
553*34ff6846SIoana Radulescu 		      const u8		mac_addr[6]);
554*34ff6846SIoana Radulescu 
555*34ff6846SIoana Radulescu int dpni_remove_mac_addr(struct fsl_mc_io	*mc_io,
556*34ff6846SIoana Radulescu 			 u32			cmd_flags,
557*34ff6846SIoana Radulescu 			 u16			token,
558*34ff6846SIoana Radulescu 			 const u8		mac_addr[6]);
559*34ff6846SIoana Radulescu 
560*34ff6846SIoana Radulescu int dpni_clear_mac_filters(struct fsl_mc_io	*mc_io,
561*34ff6846SIoana Radulescu 			   u32			cmd_flags,
562*34ff6846SIoana Radulescu 			   u16			token,
563*34ff6846SIoana Radulescu 			   int			unicast,
564*34ff6846SIoana Radulescu 			   int			multicast);
565*34ff6846SIoana Radulescu 
566*34ff6846SIoana Radulescu /**
567*34ff6846SIoana Radulescu  * enum dpni_dist_mode - DPNI distribution mode
568*34ff6846SIoana Radulescu  * @DPNI_DIST_MODE_NONE: No distribution
569*34ff6846SIoana Radulescu  * @DPNI_DIST_MODE_HASH: Use hash distribution; only relevant if
570*34ff6846SIoana Radulescu  *		the 'DPNI_OPT_DIST_HASH' option was set at DPNI creation
571*34ff6846SIoana Radulescu  * @DPNI_DIST_MODE_FS:  Use explicit flow steering; only relevant if
572*34ff6846SIoana Radulescu  *	 the 'DPNI_OPT_DIST_FS' option was set at DPNI creation
573*34ff6846SIoana Radulescu  */
574*34ff6846SIoana Radulescu enum dpni_dist_mode {
575*34ff6846SIoana Radulescu 	DPNI_DIST_MODE_NONE = 0,
576*34ff6846SIoana Radulescu 	DPNI_DIST_MODE_HASH = 1,
577*34ff6846SIoana Radulescu 	DPNI_DIST_MODE_FS = 2
578*34ff6846SIoana Radulescu };
579*34ff6846SIoana Radulescu 
580*34ff6846SIoana Radulescu /**
581*34ff6846SIoana Radulescu  * enum dpni_fs_miss_action -   DPNI Flow Steering miss action
582*34ff6846SIoana Radulescu  * @DPNI_FS_MISS_DROP: In case of no-match, drop the frame
583*34ff6846SIoana Radulescu  * @DPNI_FS_MISS_EXPLICIT_FLOWID: In case of no-match, use explicit flow-id
584*34ff6846SIoana Radulescu  * @DPNI_FS_MISS_HASH: In case of no-match, distribute using hash
585*34ff6846SIoana Radulescu  */
586*34ff6846SIoana Radulescu enum dpni_fs_miss_action {
587*34ff6846SIoana Radulescu 	DPNI_FS_MISS_DROP = 0,
588*34ff6846SIoana Radulescu 	DPNI_FS_MISS_EXPLICIT_FLOWID = 1,
589*34ff6846SIoana Radulescu 	DPNI_FS_MISS_HASH = 2
590*34ff6846SIoana Radulescu };
591*34ff6846SIoana Radulescu 
592*34ff6846SIoana Radulescu /**
593*34ff6846SIoana Radulescu  * struct dpni_fs_tbl_cfg - Flow Steering table configuration
594*34ff6846SIoana Radulescu  * @miss_action: Miss action selection
595*34ff6846SIoana Radulescu  * @default_flow_id: Used when 'miss_action = DPNI_FS_MISS_EXPLICIT_FLOWID'
596*34ff6846SIoana Radulescu  */
597*34ff6846SIoana Radulescu struct dpni_fs_tbl_cfg {
598*34ff6846SIoana Radulescu 	enum dpni_fs_miss_action	miss_action;
599*34ff6846SIoana Radulescu 	u16				default_flow_id;
600*34ff6846SIoana Radulescu };
601*34ff6846SIoana Radulescu 
602*34ff6846SIoana Radulescu int dpni_prepare_key_cfg(const struct dpkg_profile_cfg *cfg,
603*34ff6846SIoana Radulescu 			 u8 *key_cfg_buf);
604*34ff6846SIoana Radulescu 
605*34ff6846SIoana Radulescu /**
606*34ff6846SIoana Radulescu  * struct dpni_rx_tc_dist_cfg - Rx traffic class distribution configuration
607*34ff6846SIoana Radulescu  * @dist_size: Set the distribution size;
608*34ff6846SIoana Radulescu  *	supported values: 1,2,3,4,6,7,8,12,14,16,24,28,32,48,56,64,96,
609*34ff6846SIoana Radulescu  *	112,128,192,224,256,384,448,512,768,896,1024
610*34ff6846SIoana Radulescu  * @dist_mode: Distribution mode
611*34ff6846SIoana Radulescu  * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
612*34ff6846SIoana Radulescu  *		the extractions to be used for the distribution key by calling
613*34ff6846SIoana Radulescu  *		dpni_prepare_key_cfg() relevant only when
614*34ff6846SIoana Radulescu  *		'dist_mode != DPNI_DIST_MODE_NONE', otherwise it can be '0'
615*34ff6846SIoana Radulescu  * @fs_cfg: Flow Steering table configuration; only relevant if
616*34ff6846SIoana Radulescu  *		'dist_mode = DPNI_DIST_MODE_FS'
617*34ff6846SIoana Radulescu  */
618*34ff6846SIoana Radulescu struct dpni_rx_tc_dist_cfg {
619*34ff6846SIoana Radulescu 	u16			dist_size;
620*34ff6846SIoana Radulescu 	enum dpni_dist_mode	dist_mode;
621*34ff6846SIoana Radulescu 	u64			key_cfg_iova;
622*34ff6846SIoana Radulescu 	struct dpni_fs_tbl_cfg	fs_cfg;
623*34ff6846SIoana Radulescu };
624*34ff6846SIoana Radulescu 
625*34ff6846SIoana Radulescu int dpni_set_rx_tc_dist(struct fsl_mc_io			*mc_io,
626*34ff6846SIoana Radulescu 			u32					cmd_flags,
627*34ff6846SIoana Radulescu 			u16					token,
628*34ff6846SIoana Radulescu 			u8					tc_id,
629*34ff6846SIoana Radulescu 			const struct dpni_rx_tc_dist_cfg	*cfg);
630*34ff6846SIoana Radulescu 
631*34ff6846SIoana Radulescu /**
632*34ff6846SIoana Radulescu  * enum dpni_dest - DPNI destination types
633*34ff6846SIoana Radulescu  * @DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and
634*34ff6846SIoana Radulescu  *		does not generate FQDAN notifications; user is expected to
635*34ff6846SIoana Radulescu  *		dequeue from the queue based on polling or other user-defined
636*34ff6846SIoana Radulescu  *		method
637*34ff6846SIoana Radulescu  * @DPNI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
638*34ff6846SIoana Radulescu  *		notifications to the specified DPIO; user is expected to dequeue
639*34ff6846SIoana Radulescu  *		from the queue only after notification is received
640*34ff6846SIoana Radulescu  * @DPNI_DEST_DPCON: The queue is set in schedule mode and does not generate
641*34ff6846SIoana Radulescu  *		FQDAN notifications, but is connected to the specified DPCON
642*34ff6846SIoana Radulescu  *		object; user is expected to dequeue from the DPCON channel
643*34ff6846SIoana Radulescu  */
644*34ff6846SIoana Radulescu enum dpni_dest {
645*34ff6846SIoana Radulescu 	DPNI_DEST_NONE = 0,
646*34ff6846SIoana Radulescu 	DPNI_DEST_DPIO = 1,
647*34ff6846SIoana Radulescu 	DPNI_DEST_DPCON = 2
648*34ff6846SIoana Radulescu };
649*34ff6846SIoana Radulescu 
650*34ff6846SIoana Radulescu /**
651*34ff6846SIoana Radulescu  * struct dpni_queue - Queue structure
652*34ff6846SIoana Radulescu  * @destination - Destination structure
653*34ff6846SIoana Radulescu  * @destination.id: ID of the destination, only relevant if DEST_TYPE is > 0.
654*34ff6846SIoana Radulescu  *	Identifies either a DPIO or a DPCON object.
655*34ff6846SIoana Radulescu  *	Not relevant for Tx queues.
656*34ff6846SIoana Radulescu  * @destination.type:	May be one of the following:
657*34ff6846SIoana Radulescu  *	0 - No destination, queue can be manually
658*34ff6846SIoana Radulescu  *		queried, but will not push traffic or
659*34ff6846SIoana Radulescu  *		notifications to a DPIO;
660*34ff6846SIoana Radulescu  *	1 - The destination is a DPIO. When traffic
661*34ff6846SIoana Radulescu  *		becomes available in the queue a FQDAN
662*34ff6846SIoana Radulescu  *		(FQ data available notification) will be
663*34ff6846SIoana Radulescu  *		generated to selected DPIO;
664*34ff6846SIoana Radulescu  *	2 - The destination is a DPCON. The queue is
665*34ff6846SIoana Radulescu  *		associated with a DPCON object for the
666*34ff6846SIoana Radulescu  *		purpose of scheduling between multiple
667*34ff6846SIoana Radulescu  *		queues. The DPCON may be independently
668*34ff6846SIoana Radulescu  *		configured to generate notifications.
669*34ff6846SIoana Radulescu  *		Not relevant for Tx queues.
670*34ff6846SIoana Radulescu  * @destination.hold_active: Hold active, maintains a queue scheduled for longer
671*34ff6846SIoana Radulescu  *	in a DPIO during dequeue to reduce spread of traffic.
672*34ff6846SIoana Radulescu  *	Only relevant if queues are
673*34ff6846SIoana Radulescu  *	not affined to a single DPIO.
674*34ff6846SIoana Radulescu  * @user_context: User data, presented to the user along with any frames
675*34ff6846SIoana Radulescu  *	from this queue. Not relevant for Tx queues.
676*34ff6846SIoana Radulescu  * @flc: FD FLow Context structure
677*34ff6846SIoana Radulescu  * @flc.value: Default FLC value for traffic dequeued from
678*34ff6846SIoana Radulescu  *      this queue.  Please check description of FD
679*34ff6846SIoana Radulescu  *      structure for more information.
680*34ff6846SIoana Radulescu  *      Note that FLC values set using dpni_add_fs_entry,
681*34ff6846SIoana Radulescu  *      if any, take precedence over values per queue.
682*34ff6846SIoana Radulescu  * @flc.stash_control: Boolean, indicates whether the 6 lowest
683*34ff6846SIoana Radulescu  *      - significant bits are used for stash control.
684*34ff6846SIoana Radulescu  *      significant bits are used for stash control.  If set, the 6
685*34ff6846SIoana Radulescu  *      least significant bits in value are interpreted as follows:
686*34ff6846SIoana Radulescu  *      - bits 0-1: indicates the number of 64 byte units of context
687*34ff6846SIoana Radulescu  *      that are stashed.  FLC value is interpreted as a memory address
688*34ff6846SIoana Radulescu  *      in this case, excluding the 6 LS bits.
689*34ff6846SIoana Radulescu  *      - bits 2-3: indicates the number of 64 byte units of frame
690*34ff6846SIoana Radulescu  *      annotation to be stashed.  Annotation is placed at FD[ADDR].
691*34ff6846SIoana Radulescu  *      - bits 4-5: indicates the number of 64 byte units of frame
692*34ff6846SIoana Radulescu  *      data to be stashed.  Frame data is placed at FD[ADDR] +
693*34ff6846SIoana Radulescu  *      FD[OFFSET].
694*34ff6846SIoana Radulescu  *      For more details check the Frame Descriptor section in the
695*34ff6846SIoana Radulescu  *      hardware documentation.
696*34ff6846SIoana Radulescu  */
697*34ff6846SIoana Radulescu struct dpni_queue {
698*34ff6846SIoana Radulescu 	struct {
699*34ff6846SIoana Radulescu 		u16 id;
700*34ff6846SIoana Radulescu 		enum dpni_dest type;
701*34ff6846SIoana Radulescu 		char hold_active;
702*34ff6846SIoana Radulescu 		u8 priority;
703*34ff6846SIoana Radulescu 	} destination;
704*34ff6846SIoana Radulescu 	u64 user_context;
705*34ff6846SIoana Radulescu 	struct {
706*34ff6846SIoana Radulescu 		u64 value;
707*34ff6846SIoana Radulescu 		char stash_control;
708*34ff6846SIoana Radulescu 	} flc;
709*34ff6846SIoana Radulescu };
710*34ff6846SIoana Radulescu 
711*34ff6846SIoana Radulescu /**
712*34ff6846SIoana Radulescu  * struct dpni_queue_id - Queue identification, used for enqueue commands
713*34ff6846SIoana Radulescu  *			or queue control
714*34ff6846SIoana Radulescu  * @fqid: FQID used for enqueueing to and/or configuration of this specific FQ
715*34ff6846SIoana Radulescu  * @qdbin: Queueing bin, used to enqueue using QDID, DQBIN, QPRI. Only relevant
716*34ff6846SIoana Radulescu  *		for Tx queues.
717*34ff6846SIoana Radulescu  */
718*34ff6846SIoana Radulescu struct dpni_queue_id {
719*34ff6846SIoana Radulescu 	u32 fqid;
720*34ff6846SIoana Radulescu 	u16 qdbin;
721*34ff6846SIoana Radulescu };
722*34ff6846SIoana Radulescu 
723*34ff6846SIoana Radulescu /**
724*34ff6846SIoana Radulescu  * Set User Context
725*34ff6846SIoana Radulescu  */
726*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_USER_CTX		0x00000001
727*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_DEST		0x00000002
728*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_FLC		0x00000004
729*34ff6846SIoana Radulescu #define DPNI_QUEUE_OPT_HOLD_ACTIVE	0x00000008
730*34ff6846SIoana Radulescu 
731*34ff6846SIoana Radulescu int dpni_set_queue(struct fsl_mc_io	*mc_io,
732*34ff6846SIoana Radulescu 		   u32			cmd_flags,
733*34ff6846SIoana Radulescu 		   u16			token,
734*34ff6846SIoana Radulescu 		   enum dpni_queue_type	qtype,
735*34ff6846SIoana Radulescu 		   u8			tc,
736*34ff6846SIoana Radulescu 		   u8			index,
737*34ff6846SIoana Radulescu 		   u8			options,
738*34ff6846SIoana Radulescu 		   const struct dpni_queue *queue);
739*34ff6846SIoana Radulescu 
740*34ff6846SIoana Radulescu int dpni_get_queue(struct fsl_mc_io	*mc_io,
741*34ff6846SIoana Radulescu 		   u32			cmd_flags,
742*34ff6846SIoana Radulescu 		   u16			token,
743*34ff6846SIoana Radulescu 		   enum dpni_queue_type	qtype,
744*34ff6846SIoana Radulescu 		   u8			tc,
745*34ff6846SIoana Radulescu 		   u8			index,
746*34ff6846SIoana Radulescu 		   struct dpni_queue	*queue,
747*34ff6846SIoana Radulescu 		   struct dpni_queue_id	*qid);
748*34ff6846SIoana Radulescu 
749*34ff6846SIoana Radulescu /**
750*34ff6846SIoana Radulescu  * enum dpni_congestion_unit - DPNI congestion units
751*34ff6846SIoana Radulescu  * @DPNI_CONGESTION_UNIT_BYTES: bytes units
752*34ff6846SIoana Radulescu  * @DPNI_CONGESTION_UNIT_FRAMES: frames units
753*34ff6846SIoana Radulescu  */
754*34ff6846SIoana Radulescu enum dpni_congestion_unit {
755*34ff6846SIoana Radulescu 	DPNI_CONGESTION_UNIT_BYTES = 0,
756*34ff6846SIoana Radulescu 	DPNI_CONGESTION_UNIT_FRAMES
757*34ff6846SIoana Radulescu };
758*34ff6846SIoana Radulescu 
759*34ff6846SIoana Radulescu /**
760*34ff6846SIoana Radulescu  * enum dpni_congestion_point - Structure representing congestion point
761*34ff6846SIoana Radulescu  * @DPNI_CP_QUEUE: Set taildrop per queue, identified by QUEUE_TYPE, TC and
762*34ff6846SIoana Radulescu  *		QUEUE_INDEX
763*34ff6846SIoana Radulescu  * @DPNI_CP_GROUP: Set taildrop per queue group. Depending on options used to
764*34ff6846SIoana Radulescu  *		define the DPNI this can be either per TC (default) or per
765*34ff6846SIoana Radulescu  *		interface (DPNI_OPT_SHARED_CONGESTION set at DPNI create).
766*34ff6846SIoana Radulescu  *		QUEUE_INDEX is ignored if this type is used.
767*34ff6846SIoana Radulescu  */
768*34ff6846SIoana Radulescu enum dpni_congestion_point {
769*34ff6846SIoana Radulescu 	DPNI_CP_QUEUE,
770*34ff6846SIoana Radulescu 	DPNI_CP_GROUP,
771*34ff6846SIoana Radulescu };
772*34ff6846SIoana Radulescu 
773*34ff6846SIoana Radulescu /**
774*34ff6846SIoana Radulescu  * struct dpni_taildrop - Structure representing the taildrop
775*34ff6846SIoana Radulescu  * @enable:	Indicates whether the taildrop is active or not.
776*34ff6846SIoana Radulescu  * @units:	Indicates the unit of THRESHOLD. Queue taildrop only supports
777*34ff6846SIoana Radulescu  *		byte units, this field is ignored and assumed = 0 if
778*34ff6846SIoana Radulescu  *		CONGESTION_POINT is 0.
779*34ff6846SIoana Radulescu  * @threshold:	Threshold value, in units identified by UNITS field. Value 0
780*34ff6846SIoana Radulescu  *		cannot be used as a valid taildrop threshold, THRESHOLD must
781*34ff6846SIoana Radulescu  *		be > 0 if the taildrop is enabled.
782*34ff6846SIoana Radulescu  */
783*34ff6846SIoana Radulescu struct dpni_taildrop {
784*34ff6846SIoana Radulescu 	char enable;
785*34ff6846SIoana Radulescu 	enum dpni_congestion_unit units;
786*34ff6846SIoana Radulescu 	u32 threshold;
787*34ff6846SIoana Radulescu };
788*34ff6846SIoana Radulescu 
789*34ff6846SIoana Radulescu int dpni_set_taildrop(struct fsl_mc_io *mc_io,
790*34ff6846SIoana Radulescu 		      u32 cmd_flags,
791*34ff6846SIoana Radulescu 		      u16 token,
792*34ff6846SIoana Radulescu 		      enum dpni_congestion_point cg_point,
793*34ff6846SIoana Radulescu 		      enum dpni_queue_type q_type,
794*34ff6846SIoana Radulescu 		      u8 tc,
795*34ff6846SIoana Radulescu 		      u8 q_index,
796*34ff6846SIoana Radulescu 		      struct dpni_taildrop *taildrop);
797*34ff6846SIoana Radulescu 
798*34ff6846SIoana Radulescu int dpni_get_taildrop(struct fsl_mc_io *mc_io,
799*34ff6846SIoana Radulescu 		      u32 cmd_flags,
800*34ff6846SIoana Radulescu 		      u16 token,
801*34ff6846SIoana Radulescu 		      enum dpni_congestion_point cg_point,
802*34ff6846SIoana Radulescu 		      enum dpni_queue_type q_type,
803*34ff6846SIoana Radulescu 		      u8 tc,
804*34ff6846SIoana Radulescu 		      u8 q_index,
805*34ff6846SIoana Radulescu 		      struct dpni_taildrop *taildrop);
806*34ff6846SIoana Radulescu 
807*34ff6846SIoana Radulescu /**
808*34ff6846SIoana Radulescu  * struct dpni_rule_cfg - Rule configuration for table lookup
809*34ff6846SIoana Radulescu  * @key_iova: I/O virtual address of the key (must be in DMA-able memory)
810*34ff6846SIoana Radulescu  * @mask_iova: I/O virtual address of the mask (must be in DMA-able memory)
811*34ff6846SIoana Radulescu  * @key_size: key and mask size (in bytes)
812*34ff6846SIoana Radulescu  */
813*34ff6846SIoana Radulescu struct dpni_rule_cfg {
814*34ff6846SIoana Radulescu 	u64	key_iova;
815*34ff6846SIoana Radulescu 	u64	mask_iova;
816*34ff6846SIoana Radulescu 	u8	key_size;
817*34ff6846SIoana Radulescu };
818*34ff6846SIoana Radulescu 
819*34ff6846SIoana Radulescu int dpni_get_api_version(struct fsl_mc_io *mc_io,
820*34ff6846SIoana Radulescu 			 u32 cmd_flags,
821*34ff6846SIoana Radulescu 			 u16 *major_ver,
822*34ff6846SIoana Radulescu 			 u16 *minor_ver);
823*34ff6846SIoana Radulescu 
824*34ff6846SIoana Radulescu #endif /* __FSL_DPNI_H */
825