1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright 2014-2016 Freescale Semiconductor Inc.
4  * Copyright 2017-2018 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 /**
18  * DPSW general definitions
19  */
20 
21 /**
22  * Maximum number of traffic class priorities
23  */
24 #define DPSW_MAX_PRIORITIES	8
25 /**
26  * Maximum number of interfaces
27  */
28 #define DPSW_MAX_IF		64
29 
30 int dpsw_open(struct fsl_mc_io *mc_io,
31 	      u32 cmd_flags,
32 	      int dpsw_id,
33 	      u16 *token);
34 
35 int dpsw_close(struct fsl_mc_io *mc_io,
36 	       u32 cmd_flags,
37 	       u16 token);
38 
39 /**
40  * DPSW options
41  */
42 
43 /**
44  * Disable flooding
45  */
46 #define DPSW_OPT_FLOODING_DIS		0x0000000000000001ULL
47 /**
48  * Disable Multicast
49  */
50 #define DPSW_OPT_MULTICAST_DIS		0x0000000000000004ULL
51 /**
52  * Support control interface
53  */
54 #define DPSW_OPT_CTRL_IF_DIS		0x0000000000000010ULL
55 /**
56  * Disable flooding metering
57  */
58 #define DPSW_OPT_FLOODING_METERING_DIS  0x0000000000000020ULL
59 /**
60  * Enable metering
61  */
62 #define DPSW_OPT_METERING_EN            0x0000000000000040ULL
63 
64 /**
65  * enum dpsw_component_type - component type of a bridge
66  * @DPSW_COMPONENT_TYPE_C_VLAN: A C-VLAN component of an
67  *   enterprise VLAN bridge or of a Provider Bridge used
68  *   to process C-tagged frames
69  * @DPSW_COMPONENT_TYPE_S_VLAN: An S-VLAN component of a
70  *   Provider Bridge
71  *
72  */
73 enum dpsw_component_type {
74 	DPSW_COMPONENT_TYPE_C_VLAN = 0,
75 	DPSW_COMPONENT_TYPE_S_VLAN
76 };
77 
78 int dpsw_enable(struct fsl_mc_io *mc_io,
79 		u32 cmd_flags,
80 		u16 token);
81 
82 int dpsw_disable(struct fsl_mc_io *mc_io,
83 		 u32 cmd_flags,
84 		 u16 token);
85 
86 int dpsw_reset(struct fsl_mc_io *mc_io,
87 	       u32 cmd_flags,
88 	       u16 token);
89 
90 /**
91  * DPSW IRQ Index and Events
92  */
93 
94 #define DPSW_IRQ_INDEX_IF		0x0000
95 #define DPSW_IRQ_INDEX_L2SW		0x0001
96 
97 /**
98  * IRQ event - Indicates that the link state changed
99  */
100 #define DPSW_IRQ_EVENT_LINK_CHANGED	0x0001
101 
102 /**
103  * struct dpsw_irq_cfg - IRQ configuration
104  * @addr:	Address that must be written to signal a message-based interrupt
105  * @val:	Value to write into irq_addr address
106  * @irq_num: A user defined number associated with this IRQ
107  */
108 struct dpsw_irq_cfg {
109 	u64 addr;
110 	u32 val;
111 	int irq_num;
112 };
113 
114 int dpsw_set_irq_enable(struct fsl_mc_io *mc_io,
115 			u32 cmd_flags,
116 			u16 token,
117 			u8 irq_index,
118 			u8 en);
119 
120 int dpsw_set_irq_mask(struct fsl_mc_io *mc_io,
121 		      u32 cmd_flags,
122 		      u16 token,
123 		      u8 irq_index,
124 		      u32 mask);
125 
126 int dpsw_get_irq_status(struct fsl_mc_io *mc_io,
127 			u32 cmd_flags,
128 			u16 token,
129 			u8 irq_index,
130 			u32 *status);
131 
132 int dpsw_clear_irq_status(struct fsl_mc_io *mc_io,
133 			  u32 cmd_flags,
134 			  u16 token,
135 			  u8 irq_index,
136 			  u32 status);
137 
138 /**
139  * struct dpsw_attr - Structure representing DPSW attributes
140  * @id: DPSW object ID
141  * @options: Enable/Disable DPSW features
142  * @max_vlans: Maximum Number of VLANs
143  * @max_meters_per_if:  Number of meters per interface
144  * @max_fdbs: Maximum Number of FDBs
145  * @max_fdb_entries: Number of FDB entries for default FDB table;
146  *			0 - indicates default 1024 entries.
147  * @fdb_aging_time: Default FDB aging time for default FDB table;
148  *			0 - indicates default 300 seconds
149  * @max_fdb_mc_groups: Number of multicast groups in each FDB table;
150  *			0 - indicates default 32
151  * @mem_size: DPSW frame storage memory size
152  * @num_ifs: Number of interfaces
153  * @num_vlans: Current number of VLANs
154  * @num_fdbs: Current number of FDBs
155  * @component_type: Component type of this bridge
156  */
157 struct dpsw_attr {
158 	int id;
159 	u64 options;
160 	u16 max_vlans;
161 	u8 max_meters_per_if;
162 	u8 max_fdbs;
163 	u16 max_fdb_entries;
164 	u16 fdb_aging_time;
165 	u16 max_fdb_mc_groups;
166 	u16 num_ifs;
167 	u16 mem_size;
168 	u16 num_vlans;
169 	u8 num_fdbs;
170 	enum dpsw_component_type component_type;
171 };
172 
173 int dpsw_get_attributes(struct fsl_mc_io *mc_io,
174 			u32 cmd_flags,
175 			u16 token,
176 			struct dpsw_attr *attr);
177 
178 /**
179  * enum dpsw_action - Action selection for special/control frames
180  * @DPSW_ACTION_DROP: Drop frame
181  * @DPSW_ACTION_REDIRECT: Redirect frame to control port
182  */
183 enum dpsw_action {
184 	DPSW_ACTION_DROP = 0,
185 	DPSW_ACTION_REDIRECT = 1
186 };
187 
188 /**
189  * Enable auto-negotiation
190  */
191 #define DPSW_LINK_OPT_AUTONEG		0x0000000000000001ULL
192 /**
193  * Enable half-duplex mode
194  */
195 #define DPSW_LINK_OPT_HALF_DUPLEX	0x0000000000000002ULL
196 /**
197  * Enable pause frames
198  */
199 #define DPSW_LINK_OPT_PAUSE		0x0000000000000004ULL
200 /**
201  * Enable a-symmetric pause frames
202  */
203 #define DPSW_LINK_OPT_ASYM_PAUSE	0x0000000000000008ULL
204 
205 /**
206  * struct dpsw_link_cfg - Structure representing DPSW link configuration
207  * @rate: Rate
208  * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values
209  */
210 struct dpsw_link_cfg {
211 	u32 rate;
212 	u64 options;
213 };
214 
215 int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io,
216 			 u32 cmd_flags,
217 			 u16 token,
218 			 u16 if_id,
219 			 struct dpsw_link_cfg *cfg);
220 /**
221  * struct dpsw_link_state - Structure representing DPSW link state
222  * @rate: Rate
223  * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values
224  * @up: 0 - covers two cases: down and disconnected, 1 - up
225  */
226 struct dpsw_link_state {
227 	u32 rate;
228 	u64 options;
229 	u8 up;
230 };
231 
232 int dpsw_if_get_link_state(struct fsl_mc_io *mc_io,
233 			   u32 cmd_flags,
234 			   u16 token,
235 			   u16 if_id,
236 			   struct dpsw_link_state *state);
237 
238 int dpsw_if_set_flooding(struct fsl_mc_io *mc_io,
239 			 u32 cmd_flags,
240 			 u16 token,
241 			 u16 if_id,
242 			 u8 en);
243 
244 int dpsw_if_set_broadcast(struct fsl_mc_io *mc_io,
245 			  u32 cmd_flags,
246 			  u16 token,
247 			  u16 if_id,
248 			  u8 en);
249 
250 /**
251  * struct dpsw_tci_cfg - Tag Control Information (TCI) configuration
252  * @pcp: Priority Code Point (PCP): a 3-bit field which refers
253  *		 to the IEEE 802.1p priority
254  * @dei: Drop Eligible Indicator (DEI): a 1-bit field. May be used
255  *		 separately or in conjunction with PCP to indicate frames
256  *		 eligible to be dropped in the presence of congestion
257  * @vlan_id: VLAN Identifier (VID): a 12-bit field specifying the VLAN
258  *			to which the frame belongs. The hexadecimal values
259  *			of 0x000 and 0xFFF are reserved;
260  *			all other values may be used as VLAN identifiers,
261  *			allowing up to 4,094 VLANs
262  */
263 struct dpsw_tci_cfg {
264 	u8 pcp;
265 	u8 dei;
266 	u16 vlan_id;
267 };
268 
269 int dpsw_if_set_tci(struct fsl_mc_io *mc_io,
270 		    u32 cmd_flags,
271 		    u16 token,
272 		    u16 if_id,
273 		    const struct dpsw_tci_cfg *cfg);
274 
275 int dpsw_if_get_tci(struct fsl_mc_io *mc_io,
276 		    u32 cmd_flags,
277 		    u16 token,
278 		    u16 if_id,
279 		    struct dpsw_tci_cfg *cfg);
280 
281 /**
282  * enum dpsw_stp_state - Spanning Tree Protocol (STP) states
283  * @DPSW_STP_STATE_BLOCKING: Blocking state
284  * @DPSW_STP_STATE_LISTENING: Listening state
285  * @DPSW_STP_STATE_LEARNING: Learning state
286  * @DPSW_STP_STATE_FORWARDING: Forwarding state
287  *
288  */
289 enum dpsw_stp_state {
290 	DPSW_STP_STATE_DISABLED = 0,
291 	DPSW_STP_STATE_LISTENING = 1,
292 	DPSW_STP_STATE_LEARNING = 2,
293 	DPSW_STP_STATE_FORWARDING = 3,
294 	DPSW_STP_STATE_BLOCKING = 0
295 };
296 
297 /**
298  * struct dpsw_stp_cfg - Spanning Tree Protocol (STP) Configuration
299  * @vlan_id: VLAN ID STP state
300  * @state: STP state
301  */
302 struct dpsw_stp_cfg {
303 	u16 vlan_id;
304 	enum dpsw_stp_state state;
305 };
306 
307 int dpsw_if_set_stp(struct fsl_mc_io *mc_io,
308 		    u32 cmd_flags,
309 		    u16 token,
310 		    u16 if_id,
311 		    const struct dpsw_stp_cfg *cfg);
312 
313 /**
314  * enum dpsw_accepted_frames - Types of frames to accept
315  * @DPSW_ADMIT_ALL: The device accepts VLAN tagged, untagged and
316  *			priority tagged frames
317  * @DPSW_ADMIT_ONLY_VLAN_TAGGED: The device discards untagged frames or
318  *			Priority-Tagged frames received on this interface.
319  *
320  */
321 enum dpsw_accepted_frames {
322 	DPSW_ADMIT_ALL = 1,
323 	DPSW_ADMIT_ONLY_VLAN_TAGGED = 3
324 };
325 
326 /**
327  * enum dpsw_counter  - Counters types
328  * @DPSW_CNT_ING_FRAME: Counts ingress frames
329  * @DPSW_CNT_ING_BYTE: Counts ingress bytes
330  * @DPSW_CNT_ING_FLTR_FRAME: Counts filtered ingress frames
331  * @DPSW_CNT_ING_FRAME_DISCARD: Counts discarded ingress frame
332  * @DPSW_CNT_ING_MCAST_FRAME: Counts ingress multicast frames
333  * @DPSW_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes
334  * @DPSW_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames
335  * @DPSW_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes
336  * @DPSW_CNT_EGR_FRAME: Counts egress frames
337  * @DPSW_CNT_EGR_BYTE: Counts eEgress bytes
338  * @DPSW_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames
339  * @DPSW_CNT_EGR_STP_FRAME_DISCARD: Counts egress STP discarded frames
340  */
341 enum dpsw_counter {
342 	DPSW_CNT_ING_FRAME = 0x0,
343 	DPSW_CNT_ING_BYTE = 0x1,
344 	DPSW_CNT_ING_FLTR_FRAME = 0x2,
345 	DPSW_CNT_ING_FRAME_DISCARD = 0x3,
346 	DPSW_CNT_ING_MCAST_FRAME = 0x4,
347 	DPSW_CNT_ING_MCAST_BYTE = 0x5,
348 	DPSW_CNT_ING_BCAST_FRAME = 0x6,
349 	DPSW_CNT_ING_BCAST_BYTES = 0x7,
350 	DPSW_CNT_EGR_FRAME = 0x8,
351 	DPSW_CNT_EGR_BYTE = 0x9,
352 	DPSW_CNT_EGR_FRAME_DISCARD = 0xa,
353 	DPSW_CNT_EGR_STP_FRAME_DISCARD = 0xb
354 };
355 
356 int dpsw_if_get_counter(struct fsl_mc_io *mc_io,
357 			u32 cmd_flags,
358 			u16 token,
359 			u16 if_id,
360 			enum dpsw_counter type,
361 			u64 *counter);
362 
363 int dpsw_if_enable(struct fsl_mc_io *mc_io,
364 		   u32 cmd_flags,
365 		   u16 token,
366 		   u16 if_id);
367 
368 int dpsw_if_disable(struct fsl_mc_io *mc_io,
369 		    u32 cmd_flags,
370 		    u16 token,
371 		    u16 if_id);
372 
373 int dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io,
374 				 u32 cmd_flags,
375 				 u16 token,
376 				 u16 if_id,
377 				 u16 frame_length);
378 
379 /**
380  * struct dpsw_vlan_cfg - VLAN Configuration
381  * @fdb_id: Forwarding Data Base
382  */
383 struct dpsw_vlan_cfg {
384 	u16 fdb_id;
385 };
386 
387 int dpsw_vlan_add(struct fsl_mc_io *mc_io,
388 		  u32 cmd_flags,
389 		  u16 token,
390 		  u16 vlan_id,
391 		  const struct dpsw_vlan_cfg *cfg);
392 
393 /**
394  * struct dpsw_vlan_if_cfg - Set of VLAN Interfaces
395  * @num_ifs: The number of interfaces that are assigned to the egress
396  *		list for this VLAN
397  * @if_id: The set of interfaces that are
398  *		assigned to the egress list for this VLAN
399  */
400 struct dpsw_vlan_if_cfg {
401 	u16 num_ifs;
402 	u16 if_id[DPSW_MAX_IF];
403 };
404 
405 int dpsw_vlan_add_if(struct fsl_mc_io *mc_io,
406 		     u32 cmd_flags,
407 		     u16 token,
408 		     u16 vlan_id,
409 		     const struct dpsw_vlan_if_cfg *cfg);
410 
411 int dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io,
412 			      u32 cmd_flags,
413 			      u16 token,
414 			      u16 vlan_id,
415 			      const struct dpsw_vlan_if_cfg *cfg);
416 
417 int dpsw_vlan_remove_if(struct fsl_mc_io *mc_io,
418 			u32 cmd_flags,
419 			u16 token,
420 			u16 vlan_id,
421 			const struct dpsw_vlan_if_cfg *cfg);
422 
423 int dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io,
424 				 u32 cmd_flags,
425 				 u16 token,
426 				 u16 vlan_id,
427 				 const struct dpsw_vlan_if_cfg *cfg);
428 
429 int dpsw_vlan_remove(struct fsl_mc_io *mc_io,
430 		     u32 cmd_flags,
431 		     u16 token,
432 		     u16 vlan_id);
433 
434 /**
435  * enum dpsw_fdb_entry_type - FDB Entry type - Static/Dynamic
436  * @DPSW_FDB_ENTRY_STATIC: Static entry
437  * @DPSW_FDB_ENTRY_DINAMIC: Dynamic entry
438  */
439 enum dpsw_fdb_entry_type {
440 	DPSW_FDB_ENTRY_STATIC = 0,
441 	DPSW_FDB_ENTRY_DINAMIC = 1
442 };
443 
444 /**
445  * struct dpsw_fdb_unicast_cfg - Unicast entry configuration
446  * @type: Select static or dynamic entry
447  * @mac_addr: MAC address
448  * @if_egress: Egress interface ID
449  */
450 struct dpsw_fdb_unicast_cfg {
451 	enum dpsw_fdb_entry_type type;
452 	u8 mac_addr[6];
453 	u16 if_egress;
454 };
455 
456 int dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io,
457 			 u32 cmd_flags,
458 			 u16 token,
459 			 u16 fdb_id,
460 			 const struct dpsw_fdb_unicast_cfg *cfg);
461 
462 int dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io,
463 			    u32 cmd_flags,
464 			    u16 token,
465 			    u16 fdb_id,
466 			    const struct dpsw_fdb_unicast_cfg *cfg);
467 
468 #define DPSW_FDB_ENTRY_TYPE_DYNAMIC  BIT(0)
469 #define DPSW_FDB_ENTRY_TYPE_UNICAST  BIT(1)
470 
471 /**
472  * struct fdb_dump_entry - fdb snapshot entry
473  * @mac_addr: MAC address
474  * @type: bit0 - DINAMIC(1)/STATIC(0), bit1 - UNICAST(1)/MULTICAST(0)
475  * @if_info: unicast - egress interface, multicast - number of egress interfaces
476  * @if_mask: multicast - egress interface mask
477  */
478 struct fdb_dump_entry {
479 	u8 mac_addr[6];
480 	u8 type;
481 	u8 if_info;
482 	u8 if_mask[8];
483 };
484 
485 int dpsw_fdb_dump(struct fsl_mc_io *mc_io,
486 		  u32 cmd_flags,
487 		  u16 token,
488 		  u16 fdb_id,
489 		  u64 iova_addr,
490 		  u32 iova_size,
491 		  u16 *num_entries);
492 
493 /**
494  * struct dpsw_fdb_multicast_cfg - Multi-cast entry configuration
495  * @type: Select static or dynamic entry
496  * @mac_addr: MAC address
497  * @num_ifs: Number of external and internal interfaces
498  * @if_id: Egress interface IDs
499  */
500 struct dpsw_fdb_multicast_cfg {
501 	enum dpsw_fdb_entry_type type;
502 	u8 mac_addr[6];
503 	u16 num_ifs;
504 	u16 if_id[DPSW_MAX_IF];
505 };
506 
507 int dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io,
508 			   u32 cmd_flags,
509 			   u16 token,
510 			   u16 fdb_id,
511 			   const struct dpsw_fdb_multicast_cfg *cfg);
512 
513 int dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io,
514 			      u32 cmd_flags,
515 			      u16 token,
516 			      u16 fdb_id,
517 			      const struct dpsw_fdb_multicast_cfg *cfg);
518 
519 /**
520  * enum dpsw_fdb_learning_mode - Auto-learning modes
521  * @DPSW_FDB_LEARNING_MODE_DIS: Disable Auto-learning
522  * @DPSW_FDB_LEARNING_MODE_HW: Enable HW auto-Learning
523  * @DPSW_FDB_LEARNING_MODE_NON_SECURE: Enable None secure learning by CPU
524  * @DPSW_FDB_LEARNING_MODE_SECURE: Enable secure learning by CPU
525  *
526  *	NONE - SECURE LEARNING
527  *	SMAC found	DMAC found	CTLU Action
528  *	v		v	Forward frame to
529  *						1.  DMAC destination
530  *	-		v	Forward frame to
531  *						1.  DMAC destination
532  *						2.  Control interface
533  *	v		-	Forward frame to
534  *						1.  Flooding list of interfaces
535  *	-		-	Forward frame to
536  *						1.  Flooding list of interfaces
537  *						2.  Control interface
538  *	SECURE LEARING
539  *	SMAC found	DMAC found	CTLU Action
540  *	v		v		Forward frame to
541  *						1.  DMAC destination
542  *	-		v		Forward frame to
543  *						1.  Control interface
544  *	v		-		Forward frame to
545  *						1.  Flooding list of interfaces
546  *	-		-		Forward frame to
547  *						1.  Control interface
548  */
549 enum dpsw_fdb_learning_mode {
550 	DPSW_FDB_LEARNING_MODE_DIS = 0,
551 	DPSW_FDB_LEARNING_MODE_HW = 1,
552 	DPSW_FDB_LEARNING_MODE_NON_SECURE = 2,
553 	DPSW_FDB_LEARNING_MODE_SECURE = 3
554 };
555 
556 int dpsw_fdb_set_learning_mode(struct fsl_mc_io *mc_io,
557 			       u32 cmd_flags,
558 			       u16 token,
559 			       u16 fdb_id,
560 			       enum dpsw_fdb_learning_mode mode);
561 
562 /**
563  * struct dpsw_fdb_attr - FDB Attributes
564  * @max_fdb_entries: Number of FDB entries
565  * @fdb_aging_time: Aging time in seconds
566  * @learning_mode: Learning mode
567  * @num_fdb_mc_groups: Current number of multicast groups
568  * @max_fdb_mc_groups: Maximum number of multicast groups
569  */
570 struct dpsw_fdb_attr {
571 	u16 max_fdb_entries;
572 	u16 fdb_aging_time;
573 	enum dpsw_fdb_learning_mode learning_mode;
574 	u16 num_fdb_mc_groups;
575 	u16 max_fdb_mc_groups;
576 };
577 
578 int dpsw_get_api_version(struct fsl_mc_io *mc_io,
579 			 u32 cmd_flags,
580 			 u16 *major_ver,
581 			 u16 *minor_ver);
582 
583 int dpsw_if_get_port_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
584 			      u16 if_id, u8 mac_addr[6]);
585 
586 int dpsw_if_get_primary_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags,
587 				 u16 token, u16 if_id, u8 mac_addr[6]);
588 
589 int dpsw_if_set_primary_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags,
590 				 u16 token, u16 if_id, u8 mac_addr[6]);
591 
592 #endif /* __FSL_DPSW_H */
593