linux/drivers/net/ethernet/freescale/dpaa2/dpsw.h
<<
>>
Prefs
   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
  15struct fsl_mc_io;
  16
  17/* DPSW general definitions */
  18
  19#define DPSW_MAX_PRIORITIES     8
  20
  21#define DPSW_MAX_IF             64
  22
  23int dpsw_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpsw_id, u16 *token);
  24
  25int 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 */
  51enum 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 */
  67enum 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 */
  80enum dpsw_broadcast_cfg {
  81        DPSW_BROADCAST_PER_OBJECT = 0,
  82        DPSW_BROADCAST_PER_FDB,
  83};
  84
  85int dpsw_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
  86
  87int dpsw_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
  88
  89int 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 */
 112struct dpsw_irq_cfg {
 113        u64 addr;
 114        u32 val;
 115        int irq_num;
 116};
 117
 118int dpsw_set_irq_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
 119                        u8 irq_index, u8 en);
 120
 121int dpsw_set_irq_mask(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
 122                      u8 irq_index, u32 mask);
 123
 124int dpsw_get_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
 125                        u8 irq_index, u32 *status);
 126
 127int 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 */
 151struct 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
 169int 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 */
 178struct dpsw_ctrl_if_attr {
 179        u32 rx_fqid;
 180        u32 rx_err_fqid;
 181        u32 tx_err_conf_fqid;
 182};
 183
 184int dpsw_ctrl_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
 185                                u16 token, struct dpsw_ctrl_if_attr *attr);
 186
 187enum 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 */
 204struct 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
 213int 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
 219enum dpsw_ctrl_if_dest {
 220        DPSW_CTRL_IF_DEST_NONE = 0,
 221        DPSW_CTRL_IF_DEST_DPIO = 1,
 222};
 223
 224struct dpsw_ctrl_if_dest_cfg {
 225        enum dpsw_ctrl_if_dest dest_type;
 226        int dest_id;
 227        u8 priority;
 228};
 229
 230struct dpsw_ctrl_if_queue_cfg {
 231        u32 options;
 232        u64 user_ctx;
 233        struct dpsw_ctrl_if_dest_cfg dest_cfg;
 234};
 235
 236int 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
 240int dpsw_ctrl_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
 241
 242int 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 */
 249enum 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 */
 264struct dpsw_link_cfg {
 265        u32 rate;
 266        u64 options;
 267};
 268
 269int 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 */
 278struct dpsw_link_state {
 279        u32 rate;
 280        u64 options;
 281        u8 up;
 282};
 283
 284int 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 */
 300struct dpsw_tci_cfg {
 301        u8 pcp;
 302        u8 dei;
 303        u16 vlan_id;
 304};
 305
 306int 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
 309int 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 */
 321enum 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 */
 334struct dpsw_stp_cfg {
 335        u16 vlan_id;
 336        enum dpsw_stp_state state;
 337};
 338
 339int 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 */
 350enum 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 */
 371enum 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
 387int 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
 390int dpsw_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id);
 391
 392int 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 */
 409struct 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
 419int 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
 422int 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 */
 429struct dpsw_vlan_cfg {
 430        u16 fdb_id;
 431};
 432
 433int 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 */
 449struct dpsw_vlan_if_cfg {
 450        u16 num_ifs;
 451        u16 options;
 452        u16 if_id[DPSW_MAX_IF];
 453        u16 fdb_id;
 454};
 455
 456int 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
 459int 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
 462int 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
 465int 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
 468int 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 */
 476enum 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 */
 487struct dpsw_fdb_unicast_cfg {
 488        enum dpsw_fdb_entry_type type;
 489        u8 mac_addr[6];
 490        u16 if_egress;
 491};
 492
 493int 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
 496int 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 */
 509struct fdb_dump_entry {
 510        u8 mac_addr[6];
 511        u8 type;
 512        u8 if_info;
 513        u8 if_mask[8];
 514};
 515
 516int 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 */
 526struct 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
 533int 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
 536int 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 */
 569enum 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 */
 584struct 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
 592int dpsw_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
 593                         u16 *major_ver, u16 *minor_ver);
 594
 595int 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 */
 603struct dpsw_fdb_cfg {
 604        u16 num_fdb_entries;
 605        u16 fdb_ageing_time;
 606};
 607
 608int 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
 611int 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 */
 618enum dpsw_flood_type {
 619        DPSW_BROADCAST = 0,
 620        DPSW_FLOODING,
 621};
 622
 623struct 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
 630int dpsw_set_egress_flood(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
 631                          const struct dpsw_egress_flood_cfg *cfg);
 632
 633int 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 */
 640struct dpsw_acl_cfg {
 641        u16 max_entries;
 642};
 643
 644int 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
 647int 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 */
 655struct dpsw_acl_if_cfg {
 656        u16 num_ifs;
 657        u16 if_id[DPSW_MAX_IF];
 658};
 659
 660int 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
 663int 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 */
 687struct 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 */
 707struct 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 */
 719enum 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 */
 732struct 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 */
 746struct dpsw_acl_entry_cfg {
 747        u64 key_iova;
 748        struct dpsw_acl_result result;
 749        int precedence;
 750};
 751
 752void dpsw_acl_prepare_entry_cfg(const struct dpsw_acl_key *key,
 753                                u8 *entry_cfg_buf);
 754
 755int 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
 758int 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 */
 768enum 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 */
 778struct dpsw_reflection_cfg {
 779        enum dpsw_reflection_filter filter;
 780        u16 vlan_id;
 781};
 782
 783int dpsw_set_reflection_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
 784                           u16 if_id);
 785
 786int 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
 789int 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