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 | |