root/drivers/staging/fsl-dpaa2/ethsw/dpsw.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */