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 #endif /* __FSL_DPSW_H */