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