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