1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright 2014-2016 Freescale Semiconductor Inc.
4  * Copyright 2017-2021 NXP
5  *
6  */
7 
8 #ifndef __FSL_DPSW_H
9 #define __FSL_DPSW_H
10 
11 /* Data Path L2-Switch API
12  * Contains API for handling DPSW topology and functionality
13  */
14 
15 struct fsl_mc_io;
16 
17 /* DPSW general definitions */
18 
19 #define DPSW_MAX_PRIORITIES	8
20 
21 #define DPSW_MAX_IF		64
22 
23 int dpsw_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpsw_id, u16 *token);
24 
25 int dpsw_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
26 
27 /* DPSW options */
28 
29 /**
30  * DPSW_OPT_FLOODING_DIS - Flooding was disabled at device create
31  */
32 #define DPSW_OPT_FLOODING_DIS		0x0000000000000001ULL
33 /**
34  * DPSW_OPT_MULTICAST_DIS - Multicast was disabled at device create
35  */
36 #define DPSW_OPT_MULTICAST_DIS		0x0000000000000004ULL
37 /**
38  * DPSW_OPT_CTRL_IF_DIS - Control interface support is disabled
39  */
40 #define DPSW_OPT_CTRL_IF_DIS		0x0000000000000010ULL
41 
42 /**
43  * enum dpsw_component_type - component type of a bridge
44  * @DPSW_COMPONENT_TYPE_C_VLAN: A C-VLAN component of an
45  *   enterprise VLAN bridge or of a Provider Bridge used
46  *   to process C-tagged frames
47  * @DPSW_COMPONENT_TYPE_S_VLAN: An S-VLAN component of a
48  *   Provider Bridge
49  *
50  */
51 enum dpsw_component_type {
52 	DPSW_COMPONENT_TYPE_C_VLAN = 0,
53 	DPSW_COMPONENT_TYPE_S_VLAN
54 };
55 
56 /**
57  *  enum dpsw_flooding_cfg - flooding configuration requested
58  * @DPSW_FLOODING_PER_VLAN: Flooding replicators are allocated per VLAN and
59  * interfaces present in each of them can be configured using
60  * dpsw_vlan_add_if_flooding()/dpsw_vlan_remove_if_flooding().
61  * This is the default configuration.
62  *
63  * @DPSW_FLOODING_PER_FDB: Flooding replicators are allocated per FDB and
64  * interfaces present in each of them can be configured using
65  * dpsw_set_egress_flood().
66  */
67 enum dpsw_flooding_cfg {
68 	DPSW_FLOODING_PER_VLAN = 0,
69 	DPSW_FLOODING_PER_FDB,
70 };
71 
72 /**
73  * enum dpsw_broadcast_cfg - broadcast configuration requested
74  * @DPSW_BROADCAST_PER_OBJECT: There is only one broadcast replicator per DPSW
75  * object. This is the default configuration.
76  * @DPSW_BROADCAST_PER_FDB: Broadcast replicators are allocated per FDB and
77  * interfaces present in each of them can be configured using
78  * dpsw_set_egress_flood().
79  */
80 enum dpsw_broadcast_cfg {
81 	DPSW_BROADCAST_PER_OBJECT = 0,
82 	DPSW_BROADCAST_PER_FDB,
83 };
84 
85 int dpsw_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
86 
87 int dpsw_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
88 
89 int dpsw_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
90 
91 /* DPSW IRQ Index and Events */
92 
93 #define DPSW_IRQ_INDEX_IF		0x0000
94 #define DPSW_IRQ_INDEX_L2SW		0x0001
95 
96 /**
97  * DPSW_IRQ_EVENT_LINK_CHANGED - Indicates that the link state changed
98  */
99 #define DPSW_IRQ_EVENT_LINK_CHANGED	0x0001
100 
101 /**
102  * DPSW_IRQ_EVENT_ENDPOINT_CHANGED - Indicates a change in endpoint
103  */
104 #define DPSW_IRQ_EVENT_ENDPOINT_CHANGED	0x0002
105 
106 /**
107  * struct dpsw_irq_cfg - IRQ configuration
108  * @addr:	Address that must be written to signal a message-based interrupt
109  * @val:	Value to write into irq_addr address
110  * @irq_num: A user defined number associated with this IRQ
111  */
112 struct dpsw_irq_cfg {
113 	u64 addr;
114 	u32 val;
115 	int irq_num;
116 };
117 
118 int dpsw_set_irq_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
119 			u8 irq_index, u8 en);
120 
121 int dpsw_set_irq_mask(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
122 		      u8 irq_index, u32 mask);
123 
124 int dpsw_get_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
125 			u8 irq_index, u32 *status);
126 
127 int dpsw_clear_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
128 			  u8 irq_index, u32 status);
129 
130 /**
131  * struct dpsw_attr - Structure representing DPSW attributes
132  * @id: DPSW object ID
133  * @options: Enable/Disable DPSW features
134  * @max_vlans: Maximum Number of VLANs
135  * @max_meters_per_if:  Number of meters per interface
136  * @max_fdbs: Maximum Number of FDBs
137  * @max_fdb_entries: Number of FDB entries for default FDB table;
138  *			0 - indicates default 1024 entries.
139  * @fdb_aging_time: Default FDB aging time for default FDB table;
140  *			0 - indicates default 300 seconds
141  * @max_fdb_mc_groups: Number of multicast groups in each FDB table;
142  *			0 - indicates default 32
143  * @mem_size: DPSW frame storage memory size
144  * @num_ifs: Number of interfaces
145  * @num_vlans: Current number of VLANs
146  * @num_fdbs: Current number of FDBs
147  * @component_type: Component type of this bridge
148  * @flooding_cfg: Flooding configuration (PER_VLAN - default, PER_FDB)
149  * @broadcast_cfg: Broadcast configuration (PER_OBJECT - default, PER_FDB)
150  */
151 struct dpsw_attr {
152 	int id;
153 	u64 options;
154 	u16 max_vlans;
155 	u8 max_meters_per_if;
156 	u8 max_fdbs;
157 	u16 max_fdb_entries;
158 	u16 fdb_aging_time;
159 	u16 max_fdb_mc_groups;
160 	u16 num_ifs;
161 	u16 mem_size;
162 	u16 num_vlans;
163 	u8 num_fdbs;
164 	enum dpsw_component_type component_type;
165 	enum dpsw_flooding_cfg flooding_cfg;
166 	enum dpsw_broadcast_cfg broadcast_cfg;
167 };
168 
169 int dpsw_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
170 			struct dpsw_attr *attr);
171 
172 /**
173  * struct dpsw_ctrl_if_attr - Control interface attributes
174  * @rx_fqid:		Receive FQID
175  * @rx_err_fqid:	Receive error FQID
176  * @tx_err_conf_fqid:	Transmit error and confirmation FQID
177  */
178 struct dpsw_ctrl_if_attr {
179 	u32 rx_fqid;
180 	u32 rx_err_fqid;
181 	u32 tx_err_conf_fqid;
182 };
183 
184 int dpsw_ctrl_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
185 				u16 token, struct dpsw_ctrl_if_attr *attr);
186 
187 enum dpsw_queue_type {
188 	DPSW_QUEUE_RX,
189 	DPSW_QUEUE_TX_ERR_CONF,
190 	DPSW_QUEUE_RX_ERR,
191 };
192 
193 #define DPSW_MAX_DPBP     8
194 
195 /**
196  * struct dpsw_ctrl_if_pools_cfg - Control interface buffer pools configuration
197  * @num_dpbp: Number of DPBPs
198  * @pools: Array of buffer pools parameters; The number of valid entries
199  *	must match 'num_dpbp' value
200  * @pools.dpbp_id: DPBP object ID
201  * @pools.buffer_size: Buffer size
202  * @pools.backup_pool: Backup pool
203  */
204 struct dpsw_ctrl_if_pools_cfg {
205 	u8 num_dpbp;
206 	struct {
207 		int dpbp_id;
208 		u16 buffer_size;
209 		int backup_pool;
210 	} pools[DPSW_MAX_DPBP];
211 };
212 
213 int dpsw_ctrl_if_set_pools(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
214 			   const struct dpsw_ctrl_if_pools_cfg *cfg);
215 
216 #define DPSW_CTRL_IF_QUEUE_OPT_USER_CTX		0x00000001
217 #define DPSW_CTRL_IF_QUEUE_OPT_DEST		0x00000002
218 
219 enum dpsw_ctrl_if_dest {
220 	DPSW_CTRL_IF_DEST_NONE = 0,
221 	DPSW_CTRL_IF_DEST_DPIO = 1,
222 };
223 
224 struct dpsw_ctrl_if_dest_cfg {
225 	enum dpsw_ctrl_if_dest dest_type;
226 	int dest_id;
227 	u8 priority;
228 };
229 
230 struct dpsw_ctrl_if_queue_cfg {
231 	u32 options;
232 	u64 user_ctx;
233 	struct dpsw_ctrl_if_dest_cfg dest_cfg;
234 };
235 
236 int dpsw_ctrl_if_set_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
237 			   enum dpsw_queue_type qtype,
238 			   const struct dpsw_ctrl_if_queue_cfg *cfg);
239 
240 int dpsw_ctrl_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
241 
242 int dpsw_ctrl_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
243 
244 /**
245  * enum dpsw_action - Action selection for special/control frames
246  * @DPSW_ACTION_DROP: Drop frame
247  * @DPSW_ACTION_REDIRECT: Redirect frame to control port
248  */
249 enum dpsw_action {
250 	DPSW_ACTION_DROP = 0,
251 	DPSW_ACTION_REDIRECT = 1
252 };
253 
254 #define DPSW_LINK_OPT_AUTONEG		0x0000000000000001ULL
255 #define DPSW_LINK_OPT_HALF_DUPLEX	0x0000000000000002ULL
256 #define DPSW_LINK_OPT_PAUSE		0x0000000000000004ULL
257 #define DPSW_LINK_OPT_ASYM_PAUSE	0x0000000000000008ULL
258 
259 /**
260  * struct dpsw_link_cfg - Structure representing DPSW link configuration
261  * @rate: Rate
262  * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values
263  */
264 struct dpsw_link_cfg {
265 	u32 rate;
266 	u64 options;
267 };
268 
269 int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
270 			 struct dpsw_link_cfg *cfg);
271 
272 /**
273  * struct dpsw_link_state - Structure representing DPSW link state
274  * @rate: Rate
275  * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values
276  * @up: 0 - covers two cases: down and disconnected, 1 - up
277  */
278 struct dpsw_link_state {
279 	u32 rate;
280 	u64 options;
281 	u8 up;
282 };
283 
284 int dpsw_if_get_link_state(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
285 			   u16 if_id, struct dpsw_link_state *state);
286 
287 /**
288  * struct dpsw_tci_cfg - Tag Control Information (TCI) configuration
289  * @pcp: Priority Code Point (PCP): a 3-bit field which refers
290  *		 to the IEEE 802.1p priority
291  * @dei: Drop Eligible Indicator (DEI): a 1-bit field. May be used
292  *		 separately or in conjunction with PCP to indicate frames
293  *		 eligible to be dropped in the presence of congestion
294  * @vlan_id: VLAN Identifier (VID): a 12-bit field specifying the VLAN
295  *			to which the frame belongs. The hexadecimal values
296  *			of 0x000 and 0xFFF are reserved;
297  *			all other values may be used as VLAN identifiers,
298  *			allowing up to 4,094 VLANs
299  */
300 struct dpsw_tci_cfg {
301 	u8 pcp;
302 	u8 dei;
303 	u16 vlan_id;
304 };
305 
306 int dpsw_if_set_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
307 		    const struct dpsw_tci_cfg *cfg);
308 
309 int dpsw_if_get_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
310 		    struct dpsw_tci_cfg *cfg);
311 
312 /**
313  * enum dpsw_stp_state - Spanning Tree Protocol (STP) states
314  * @DPSW_STP_STATE_DISABLED: Disabled state
315  * @DPSW_STP_STATE_LISTENING: Listening state
316  * @DPSW_STP_STATE_LEARNING: Learning state
317  * @DPSW_STP_STATE_FORWARDING: Forwarding state
318  * @DPSW_STP_STATE_BLOCKING: Blocking state
319  *
320  */
321 enum dpsw_stp_state {
322 	DPSW_STP_STATE_DISABLED = 0,
323 	DPSW_STP_STATE_LISTENING = 1,
324 	DPSW_STP_STATE_LEARNING = 2,
325 	DPSW_STP_STATE_FORWARDING = 3,
326 	DPSW_STP_STATE_BLOCKING = 0
327 };
328 
329 /**
330  * struct dpsw_stp_cfg - Spanning Tree Protocol (STP) Configuration
331  * @vlan_id: VLAN ID STP state
332  * @state: STP state
333  */
334 struct dpsw_stp_cfg {
335 	u16 vlan_id;
336 	enum dpsw_stp_state state;
337 };
338 
339 int dpsw_if_set_stp(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
340 		    const struct dpsw_stp_cfg *cfg);
341 
342 /**
343  * enum dpsw_accepted_frames - Types of frames to accept
344  * @DPSW_ADMIT_ALL: The device accepts VLAN tagged, untagged and
345  *			priority tagged frames
346  * @DPSW_ADMIT_ONLY_VLAN_TAGGED: The device discards untagged frames or
347  *			Priority-Tagged frames received on this interface.
348  *
349  */
350 enum dpsw_accepted_frames {
351 	DPSW_ADMIT_ALL = 1,
352 	DPSW_ADMIT_ONLY_VLAN_TAGGED = 3
353 };
354 
355 /**
356  * enum dpsw_counter  - Counters types
357  * @DPSW_CNT_ING_FRAME: Counts ingress frames
358  * @DPSW_CNT_ING_BYTE: Counts ingress bytes
359  * @DPSW_CNT_ING_FLTR_FRAME: Counts filtered ingress frames
360  * @DPSW_CNT_ING_FRAME_DISCARD: Counts discarded ingress frame
361  * @DPSW_CNT_ING_MCAST_FRAME: Counts ingress multicast frames
362  * @DPSW_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes
363  * @DPSW_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames
364  * @DPSW_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes
365  * @DPSW_CNT_EGR_FRAME: Counts egress frames
366  * @DPSW_CNT_EGR_BYTE: Counts egress bytes
367  * @DPSW_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames
368  * @DPSW_CNT_EGR_STP_FRAME_DISCARD: Counts egress STP discarded frames
369  * @DPSW_CNT_ING_NO_BUFF_DISCARD: Counts ingress no buffer discarded frames
370  */
371 enum dpsw_counter {
372 	DPSW_CNT_ING_FRAME = 0x0,
373 	DPSW_CNT_ING_BYTE = 0x1,
374 	DPSW_CNT_ING_FLTR_FRAME = 0x2,
375 	DPSW_CNT_ING_FRAME_DISCARD = 0x3,
376 	DPSW_CNT_ING_MCAST_FRAME = 0x4,
377 	DPSW_CNT_ING_MCAST_BYTE = 0x5,
378 	DPSW_CNT_ING_BCAST_FRAME = 0x6,
379 	DPSW_CNT_ING_BCAST_BYTES = 0x7,
380 	DPSW_CNT_EGR_FRAME = 0x8,
381 	DPSW_CNT_EGR_BYTE = 0x9,
382 	DPSW_CNT_EGR_FRAME_DISCARD = 0xa,
383 	DPSW_CNT_EGR_STP_FRAME_DISCARD = 0xb,
384 	DPSW_CNT_ING_NO_BUFF_DISCARD = 0xc,
385 };
386 
387 int dpsw_if_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
388 			u16 if_id, enum dpsw_counter type, u64 *counter);
389 
390 int dpsw_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id);
391 
392 int dpsw_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id);
393 
394 /**
395  * struct dpsw_if_attr - Structure representing DPSW interface attributes
396  * @num_tcs: Number of traffic classes
397  * @rate: Transmit rate in bits per second
398  * @options: Interface configuration options (bitmap)
399  * @enabled: Indicates if interface is enabled
400  * @accept_all_vlan: The device discards/accepts incoming frames
401  *		for VLANs that do not include this interface
402  * @admit_untagged: When set to 'DPSW_ADMIT_ONLY_VLAN_TAGGED', the device
403  *		discards untagged frames or priority-tagged frames received on
404  *		this interface;
405  *		When set to 'DPSW_ADMIT_ALL', untagged frames or priority-
406  *		tagged frames received on this interface are accepted
407  * @qdid: control frames transmit qdid
408  */
409 struct dpsw_if_attr {
410 	u8 num_tcs;
411 	u32 rate;
412 	u32 options;
413 	int enabled;
414 	int accept_all_vlan;
415 	enum dpsw_accepted_frames admit_untagged;
416 	u16 qdid;
417 };
418 
419 int dpsw_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
420 			   u16 if_id, struct dpsw_if_attr *attr);
421 
422 int dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
423 				 u16 if_id, u16 frame_length);
424 
425 /**
426  * struct dpsw_vlan_cfg - VLAN Configuration
427  * @fdb_id: Forwarding Data Base
428  */
429 struct dpsw_vlan_cfg {
430 	u16 fdb_id;
431 };
432 
433 int dpsw_vlan_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
434 		  u16 vlan_id, const struct dpsw_vlan_cfg *cfg);
435 
436 #define DPSW_VLAN_ADD_IF_OPT_FDB_ID            0x0001
437 
438 /**
439  * struct dpsw_vlan_if_cfg - Set of VLAN Interfaces
440  * @num_ifs: The number of interfaces that are assigned to the egress
441  *		list for this VLAN
442  * @if_id: The set of interfaces that are
443  *		assigned to the egress list for this VLAN
444  * @options: Options map for this command (DPSW_VLAN_ADD_IF_OPT_FDB_ID)
445  * @fdb_id: FDB id to be used by this VLAN on these specific interfaces
446  *		(taken into account only if the DPSW_VLAN_ADD_IF_OPT_FDB_ID is
447  *		specified in the options field)
448  */
449 struct dpsw_vlan_if_cfg {
450 	u16 num_ifs;
451 	u16 options;
452 	u16 if_id[DPSW_MAX_IF];
453 	u16 fdb_id;
454 };
455 
456 int dpsw_vlan_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
457 		     u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
458 
459 int dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
460 			      u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
461 
462 int dpsw_vlan_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
463 			u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
464 
465 int dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
466 				 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
467 
468 int dpsw_vlan_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
469 		     u16 vlan_id);
470 
471 /**
472  * enum dpsw_fdb_entry_type - FDB Entry type - Static/Dynamic
473  * @DPSW_FDB_ENTRY_STATIC: Static entry
474  * @DPSW_FDB_ENTRY_DINAMIC: Dynamic entry
475  */
476 enum dpsw_fdb_entry_type {
477 	DPSW_FDB_ENTRY_STATIC = 0,
478 	DPSW_FDB_ENTRY_DINAMIC = 1
479 };
480 
481 /**
482  * struct dpsw_fdb_unicast_cfg - Unicast entry configuration
483  * @type: Select static or dynamic entry
484  * @mac_addr: MAC address
485  * @if_egress: Egress interface ID
486  */
487 struct dpsw_fdb_unicast_cfg {
488 	enum dpsw_fdb_entry_type type;
489 	u8 mac_addr[6];
490 	u16 if_egress;
491 };
492 
493 int dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
494 			 u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg);
495 
496 int dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
497 			    u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg);
498 
499 #define DPSW_FDB_ENTRY_TYPE_DYNAMIC  BIT(0)
500 #define DPSW_FDB_ENTRY_TYPE_UNICAST  BIT(1)
501 
502 /**
503  * struct fdb_dump_entry - fdb snapshot entry
504  * @mac_addr: MAC address
505  * @type: bit0 - DINAMIC(1)/STATIC(0), bit1 - UNICAST(1)/MULTICAST(0)
506  * @if_info: unicast - egress interface, multicast - number of egress interfaces
507  * @if_mask: multicast - egress interface mask
508  */
509 struct fdb_dump_entry {
510 	u8 mac_addr[6];
511 	u8 type;
512 	u8 if_info;
513 	u8 if_mask[8];
514 };
515 
516 int dpsw_fdb_dump(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id,
517 		  u64 iova_addr, u32 iova_size, u16 *num_entries);
518 
519 /**
520  * struct dpsw_fdb_multicast_cfg - Multi-cast entry configuration
521  * @type: Select static or dynamic entry
522  * @mac_addr: MAC address
523  * @num_ifs: Number of external and internal interfaces
524  * @if_id: Egress interface IDs
525  */
526 struct dpsw_fdb_multicast_cfg {
527 	enum dpsw_fdb_entry_type type;
528 	u8 mac_addr[6];
529 	u16 num_ifs;
530 	u16 if_id[DPSW_MAX_IF];
531 };
532 
533 int dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
534 			   u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg);
535 
536 int dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
537 			      u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg);
538 
539 /**
540  * enum dpsw_learning_mode - Auto-learning modes
541  * @DPSW_LEARNING_MODE_DIS: Disable Auto-learning
542  * @DPSW_LEARNING_MODE_HW: Enable HW auto-Learning
543  * @DPSW_LEARNING_MODE_NON_SECURE: Enable None secure learning by CPU
544  * @DPSW_LEARNING_MODE_SECURE: Enable secure learning by CPU
545  *
546  *	NONE - SECURE LEARNING
547  *	SMAC found	DMAC found	CTLU Action
548  *	v		v	Forward frame to
549  *						1.  DMAC destination
550  *	-		v	Forward frame to
551  *						1.  DMAC destination
552  *						2.  Control interface
553  *	v		-	Forward frame to
554  *						1.  Flooding list of interfaces
555  *	-		-	Forward frame to
556  *						1.  Flooding list of interfaces
557  *						2.  Control interface
558  *	SECURE LEARING
559  *	SMAC found	DMAC found	CTLU Action
560  *	v		v		Forward frame to
561  *						1.  DMAC destination
562  *	-		v		Forward frame to
563  *						1.  Control interface
564  *	v		-		Forward frame to
565  *						1.  Flooding list of interfaces
566  *	-		-		Forward frame to
567  *						1.  Control interface
568  */
569 enum dpsw_learning_mode {
570 	DPSW_LEARNING_MODE_DIS = 0,
571 	DPSW_LEARNING_MODE_HW = 1,
572 	DPSW_LEARNING_MODE_NON_SECURE = 2,
573 	DPSW_LEARNING_MODE_SECURE = 3
574 };
575 
576 /**
577  * struct dpsw_fdb_attr - FDB Attributes
578  * @max_fdb_entries: Number of FDB entries
579  * @fdb_ageing_time: Ageing time in seconds
580  * @learning_mode: Learning mode
581  * @num_fdb_mc_groups: Current number of multicast groups
582  * @max_fdb_mc_groups: Maximum number of multicast groups
583  */
584 struct dpsw_fdb_attr {
585 	u16 max_fdb_entries;
586 	u16 fdb_ageing_time;
587 	enum dpsw_learning_mode learning_mode;
588 	u16 num_fdb_mc_groups;
589 	u16 max_fdb_mc_groups;
590 };
591 
592 int dpsw_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
593 			 u16 *major_ver, u16 *minor_ver);
594 
595 int dpsw_if_get_port_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
596 			      u16 if_id, u8 mac_addr[6]);
597 
598 /**
599  * struct dpsw_fdb_cfg  - FDB Configuration
600  * @num_fdb_entries: Number of FDB entries
601  * @fdb_ageing_time: Ageing time in seconds
602  */
603 struct dpsw_fdb_cfg {
604 	u16 num_fdb_entries;
605 	u16 fdb_ageing_time;
606 };
607 
608 int dpsw_fdb_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *fdb_id,
609 		 const struct dpsw_fdb_cfg *cfg);
610 
611 int dpsw_fdb_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id);
612 
613 /**
614  * enum dpsw_flood_type - Define the flood type of a DPSW object
615  * @DPSW_BROADCAST: Broadcast flooding
616  * @DPSW_FLOODING: Unknown flooding
617  */
618 enum dpsw_flood_type {
619 	DPSW_BROADCAST = 0,
620 	DPSW_FLOODING,
621 };
622 
623 struct dpsw_egress_flood_cfg {
624 	u16 fdb_id;
625 	enum dpsw_flood_type flood_type;
626 	u16 num_ifs;
627 	u16 if_id[DPSW_MAX_IF];
628 };
629 
630 int dpsw_set_egress_flood(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
631 			  const struct dpsw_egress_flood_cfg *cfg);
632 
633 int dpsw_if_set_learning_mode(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
634 			      u16 if_id, enum dpsw_learning_mode mode);
635 
636 /**
637  * struct dpsw_acl_cfg - ACL Configuration
638  * @max_entries: Number of ACL rules
639  */
640 struct dpsw_acl_cfg {
641 	u16 max_entries;
642 };
643 
644 int dpsw_acl_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *acl_id,
645 		 const struct dpsw_acl_cfg *cfg);
646 
647 int dpsw_acl_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
648 		    u16 acl_id);
649 
650 /**
651  * struct dpsw_acl_if_cfg - List of interfaces to associate with an ACL table
652  * @num_ifs: Number of interfaces
653  * @if_id: List of interfaces
654  */
655 struct dpsw_acl_if_cfg {
656 	u16 num_ifs;
657 	u16 if_id[DPSW_MAX_IF];
658 };
659 
660 int dpsw_acl_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
661 		    u16 acl_id, const struct dpsw_acl_if_cfg *cfg);
662 
663 int dpsw_acl_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
664 		       u16 acl_id, const struct dpsw_acl_if_cfg *cfg);
665 
666 /**
667  * struct dpsw_acl_fields - ACL fields.
668  * @l2_dest_mac: Destination MAC address: BPDU, Multicast, Broadcast, Unicast,
669  *			slow protocols, MVRP, STP
670  * @l2_source_mac: Source MAC address
671  * @l2_tpid: Layer 2 (Ethernet) protocol type, used to identify the following
672  *		protocols: MPLS, PTP, PFC, ARP, Jumbo frames, LLDP, IEEE802.1ae,
673  *		Q-in-Q, IPv4, IPv6, PPPoE
674  * @l2_pcp_dei: indicate which protocol is encapsulated in the payload
675  * @l2_vlan_id: layer 2 VLAN ID
676  * @l2_ether_type: layer 2 Ethernet type
677  * @l3_dscp: Layer 3 differentiated services code point
678  * @l3_protocol: Tells the Network layer at the destination host, to which
679  *		Protocol this packet belongs to. The following protocol are
680  *		supported: ICMP, IGMP, IPv4 (encapsulation), TCP, IPv6
681  *		(encapsulation), GRE, PTP
682  * @l3_source_ip: Source IPv4 IP
683  * @l3_dest_ip: Destination IPv4 IP
684  * @l4_source_port: Source TCP/UDP Port
685  * @l4_dest_port: Destination TCP/UDP Port
686  */
687 struct dpsw_acl_fields {
688 	u8 l2_dest_mac[6];
689 	u8 l2_source_mac[6];
690 	u16 l2_tpid;
691 	u8 l2_pcp_dei;
692 	u16 l2_vlan_id;
693 	u16 l2_ether_type;
694 	u8 l3_dscp;
695 	u8 l3_protocol;
696 	u32 l3_source_ip;
697 	u32 l3_dest_ip;
698 	u16 l4_source_port;
699 	u16 l4_dest_port;
700 };
701 
702 /**
703  * struct dpsw_acl_key - ACL key
704  * @match: Match fields
705  * @mask: Mask: b'1 - valid, b'0 don't care
706  */
707 struct dpsw_acl_key {
708 	struct dpsw_acl_fields match;
709 	struct dpsw_acl_fields mask;
710 };
711 
712 /**
713  * enum dpsw_acl_action - action to be run on the ACL rule match
714  * @DPSW_ACL_ACTION_DROP: Drop frame
715  * @DPSW_ACL_ACTION_REDIRECT: Redirect to certain port
716  * @DPSW_ACL_ACTION_ACCEPT: Accept frame
717  * @DPSW_ACL_ACTION_REDIRECT_TO_CTRL_IF: Redirect to control interface
718  */
719 enum dpsw_acl_action {
720 	DPSW_ACL_ACTION_DROP,
721 	DPSW_ACL_ACTION_REDIRECT,
722 	DPSW_ACL_ACTION_ACCEPT,
723 	DPSW_ACL_ACTION_REDIRECT_TO_CTRL_IF
724 };
725 
726 /**
727  * struct dpsw_acl_result - ACL action
728  * @action: Action should be taken when	ACL entry hit
729  * @if_id:  Interface IDs to redirect frame. Valid only if redirect selected for
730  *		 action
731  */
732 struct dpsw_acl_result {
733 	enum dpsw_acl_action action;
734 	u16 if_id;
735 };
736 
737 /**
738  * struct dpsw_acl_entry_cfg - ACL entry
739  * @key_iova: I/O virtual address of DMA-able memory filled with key after call
740  *				to dpsw_acl_prepare_entry_cfg()
741  * @result: Required action when entry hit occurs
742  * @precedence: Precedence inside ACL 0 is lowest; This priority can not change
743  *		during the lifetime of a Policy. It is user responsibility to
744  *		space the priorities according to consequent rule additions.
745  */
746 struct dpsw_acl_entry_cfg {
747 	u64 key_iova;
748 	struct dpsw_acl_result result;
749 	int precedence;
750 };
751 
752 void dpsw_acl_prepare_entry_cfg(const struct dpsw_acl_key *key,
753 				u8 *entry_cfg_buf);
754 
755 int dpsw_acl_add_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
756 		       u16 acl_id, const struct dpsw_acl_entry_cfg *cfg);
757 
758 int dpsw_acl_remove_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
759 			  u16 acl_id, const struct dpsw_acl_entry_cfg *cfg);
760 
761 /**
762  * enum dpsw_reflection_filter - Filter type for frames to be reflected
763  * @DPSW_REFLECTION_FILTER_INGRESS_ALL: Reflect all frames
764  * @DPSW_REFLECTION_FILTER_INGRESS_VLAN: Reflect only frames that belong to
765  *	the particular VLAN defined by vid parameter
766  *
767  */
768 enum dpsw_reflection_filter {
769 	DPSW_REFLECTION_FILTER_INGRESS_ALL = 0,
770 	DPSW_REFLECTION_FILTER_INGRESS_VLAN = 1
771 };
772 
773 /**
774  * struct dpsw_reflection_cfg - Structure representing the mirroring config
775  * @filter: Filter type for frames to be mirrored
776  * @vlan_id: VLAN ID to mirror; valid only when the type is DPSW_INGRESS_VLAN
777  */
778 struct dpsw_reflection_cfg {
779 	enum dpsw_reflection_filter filter;
780 	u16 vlan_id;
781 };
782 
783 int dpsw_set_reflection_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
784 			   u16 if_id);
785 
786 int dpsw_if_add_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
787 			   u16 if_id, const struct dpsw_reflection_cfg *cfg);
788 
789 int dpsw_if_remove_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
790 			      u16 if_id, const struct dpsw_reflection_cfg *cfg);
791 #endif /* __FSL_DPSW_H */
792