123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright 2014-2016 Freescale Semiconductor Inc.
- * Copyright 2017-2021 NXP
- *
- */
- #ifndef __FSL_DPSW_H
- #define __FSL_DPSW_H
- /* Data Path L2-Switch API
- * Contains API for handling DPSW topology and functionality
- */
- struct fsl_mc_io;
- /* DPSW general definitions */
- #define DPSW_MAX_PRIORITIES 8
- #define DPSW_MAX_IF 64
- int dpsw_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpsw_id, u16 *token);
- int dpsw_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
- /* DPSW options */
- /**
- * DPSW_OPT_FLOODING_DIS - Flooding was disabled at device create
- */
- #define DPSW_OPT_FLOODING_DIS 0x0000000000000001ULL
- /**
- * DPSW_OPT_MULTICAST_DIS - Multicast was disabled at device create
- */
- #define DPSW_OPT_MULTICAST_DIS 0x0000000000000004ULL
- /**
- * DPSW_OPT_CTRL_IF_DIS - Control interface support is disabled
- */
- #define DPSW_OPT_CTRL_IF_DIS 0x0000000000000010ULL
- /**
- * enum dpsw_component_type - component type of a bridge
- * @DPSW_COMPONENT_TYPE_C_VLAN: A C-VLAN component of an
- * enterprise VLAN bridge or of a Provider Bridge used
- * to process C-tagged frames
- * @DPSW_COMPONENT_TYPE_S_VLAN: An S-VLAN component of a
- * Provider Bridge
- *
- */
- enum dpsw_component_type {
- DPSW_COMPONENT_TYPE_C_VLAN = 0,
- DPSW_COMPONENT_TYPE_S_VLAN
- };
- /**
- * enum dpsw_flooding_cfg - flooding configuration requested
- * @DPSW_FLOODING_PER_VLAN: Flooding replicators are allocated per VLAN and
- * interfaces present in each of them can be configured using
- * dpsw_vlan_add_if_flooding()/dpsw_vlan_remove_if_flooding().
- * This is the default configuration.
- *
- * @DPSW_FLOODING_PER_FDB: Flooding replicators are allocated per FDB and
- * interfaces present in each of them can be configured using
- * dpsw_set_egress_flood().
- */
- enum dpsw_flooding_cfg {
- DPSW_FLOODING_PER_VLAN = 0,
- DPSW_FLOODING_PER_FDB,
- };
- /**
- * enum dpsw_broadcast_cfg - broadcast configuration requested
- * @DPSW_BROADCAST_PER_OBJECT: There is only one broadcast replicator per DPSW
- * object. This is the default configuration.
- * @DPSW_BROADCAST_PER_FDB: Broadcast replicators are allocated per FDB and
- * interfaces present in each of them can be configured using
- * dpsw_set_egress_flood().
- */
- enum dpsw_broadcast_cfg {
- DPSW_BROADCAST_PER_OBJECT = 0,
- DPSW_BROADCAST_PER_FDB,
- };
- int dpsw_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
- int dpsw_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
- int dpsw_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
- /* DPSW IRQ Index and Events */
- #define DPSW_IRQ_INDEX_IF 0x0000
- #define DPSW_IRQ_INDEX_L2SW 0x0001
- /**
- * DPSW_IRQ_EVENT_LINK_CHANGED - Indicates that the link state changed
- */
- #define DPSW_IRQ_EVENT_LINK_CHANGED 0x0001
- /**
- * DPSW_IRQ_EVENT_ENDPOINT_CHANGED - Indicates a change in endpoint
- */
- #define DPSW_IRQ_EVENT_ENDPOINT_CHANGED 0x0002
- /**
- * struct dpsw_irq_cfg - IRQ configuration
- * @addr: Address that must be written to signal a message-based interrupt
- * @val: Value to write into irq_addr address
- * @irq_num: A user defined number associated with this IRQ
- */
- struct dpsw_irq_cfg {
- u64 addr;
- u32 val;
- int irq_num;
- };
- int dpsw_set_irq_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u8 irq_index, u8 en);
- int dpsw_set_irq_mask(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u8 irq_index, u32 mask);
- int dpsw_get_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u8 irq_index, u32 *status);
- int dpsw_clear_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u8 irq_index, u32 status);
- /**
- * struct dpsw_attr - Structure representing DPSW attributes
- * @id: DPSW object ID
- * @options: Enable/Disable DPSW features
- * @max_vlans: Maximum Number of VLANs
- * @max_meters_per_if: Number of meters per interface
- * @max_fdbs: Maximum Number of FDBs
- * @max_fdb_entries: Number of FDB entries for default FDB table;
- * 0 - indicates default 1024 entries.
- * @fdb_aging_time: Default FDB aging time for default FDB table;
- * 0 - indicates default 300 seconds
- * @max_fdb_mc_groups: Number of multicast groups in each FDB table;
- * 0 - indicates default 32
- * @mem_size: DPSW frame storage memory size
- * @num_ifs: Number of interfaces
- * @num_vlans: Current number of VLANs
- * @num_fdbs: Current number of FDBs
- * @component_type: Component type of this bridge
- * @flooding_cfg: Flooding configuration (PER_VLAN - default, PER_FDB)
- * @broadcast_cfg: Broadcast configuration (PER_OBJECT - default, PER_FDB)
- */
- struct dpsw_attr {
- int id;
- u64 options;
- u16 max_vlans;
- u8 max_meters_per_if;
- u8 max_fdbs;
- u16 max_fdb_entries;
- u16 fdb_aging_time;
- u16 max_fdb_mc_groups;
- u16 num_ifs;
- u16 mem_size;
- u16 num_vlans;
- u8 num_fdbs;
- enum dpsw_component_type component_type;
- enum dpsw_flooding_cfg flooding_cfg;
- enum dpsw_broadcast_cfg broadcast_cfg;
- };
- int dpsw_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- struct dpsw_attr *attr);
- /**
- * struct dpsw_ctrl_if_attr - Control interface attributes
- * @rx_fqid: Receive FQID
- * @rx_err_fqid: Receive error FQID
- * @tx_err_conf_fqid: Transmit error and confirmation FQID
- */
- struct dpsw_ctrl_if_attr {
- u32 rx_fqid;
- u32 rx_err_fqid;
- u32 tx_err_conf_fqid;
- };
- int dpsw_ctrl_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
- u16 token, struct dpsw_ctrl_if_attr *attr);
- enum dpsw_queue_type {
- DPSW_QUEUE_RX,
- DPSW_QUEUE_TX_ERR_CONF,
- DPSW_QUEUE_RX_ERR,
- };
- #define DPSW_MAX_DPBP 8
- /**
- * struct dpsw_ctrl_if_pools_cfg - Control interface buffer pools configuration
- * @num_dpbp: Number of DPBPs
- * @pools: Array of buffer pools parameters; The number of valid entries
- * must match 'num_dpbp' value
- * @pools.dpbp_id: DPBP object ID
- * @pools.buffer_size: Buffer size
- * @pools.backup_pool: Backup pool
- */
- struct dpsw_ctrl_if_pools_cfg {
- u8 num_dpbp;
- struct {
- int dpbp_id;
- u16 buffer_size;
- int backup_pool;
- } pools[DPSW_MAX_DPBP];
- };
- int dpsw_ctrl_if_set_pools(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- const struct dpsw_ctrl_if_pools_cfg *cfg);
- #define DPSW_CTRL_IF_QUEUE_OPT_USER_CTX 0x00000001
- #define DPSW_CTRL_IF_QUEUE_OPT_DEST 0x00000002
- enum dpsw_ctrl_if_dest {
- DPSW_CTRL_IF_DEST_NONE = 0,
- DPSW_CTRL_IF_DEST_DPIO = 1,
- };
- struct dpsw_ctrl_if_dest_cfg {
- enum dpsw_ctrl_if_dest dest_type;
- int dest_id;
- u8 priority;
- };
- struct dpsw_ctrl_if_queue_cfg {
- u32 options;
- u64 user_ctx;
- struct dpsw_ctrl_if_dest_cfg dest_cfg;
- };
- int dpsw_ctrl_if_set_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- enum dpsw_queue_type qtype,
- const struct dpsw_ctrl_if_queue_cfg *cfg);
- int dpsw_ctrl_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
- int dpsw_ctrl_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
- /**
- * enum dpsw_action - Action selection for special/control frames
- * @DPSW_ACTION_DROP: Drop frame
- * @DPSW_ACTION_REDIRECT: Redirect frame to control port
- */
- enum dpsw_action {
- DPSW_ACTION_DROP = 0,
- DPSW_ACTION_REDIRECT = 1
- };
- #define DPSW_LINK_OPT_AUTONEG 0x0000000000000001ULL
- #define DPSW_LINK_OPT_HALF_DUPLEX 0x0000000000000002ULL
- #define DPSW_LINK_OPT_PAUSE 0x0000000000000004ULL
- #define DPSW_LINK_OPT_ASYM_PAUSE 0x0000000000000008ULL
- /**
- * struct dpsw_link_cfg - Structure representing DPSW link configuration
- * @rate: Rate
- * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values
- */
- struct dpsw_link_cfg {
- u32 rate;
- u64 options;
- };
- int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
- struct dpsw_link_cfg *cfg);
- /**
- * struct dpsw_link_state - Structure representing DPSW link state
- * @rate: Rate
- * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values
- * @up: 0 - covers two cases: down and disconnected, 1 - up
- */
- struct dpsw_link_state {
- u32 rate;
- u64 options;
- u8 up;
- };
- int dpsw_if_get_link_state(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, struct dpsw_link_state *state);
- /**
- * struct dpsw_tci_cfg - Tag Control Information (TCI) configuration
- * @pcp: Priority Code Point (PCP): a 3-bit field which refers
- * to the IEEE 802.1p priority
- * @dei: Drop Eligible Indicator (DEI): a 1-bit field. May be used
- * separately or in conjunction with PCP to indicate frames
- * eligible to be dropped in the presence of congestion
- * @vlan_id: VLAN Identifier (VID): a 12-bit field specifying the VLAN
- * to which the frame belongs. The hexadecimal values
- * of 0x000 and 0xFFF are reserved;
- * all other values may be used as VLAN identifiers,
- * allowing up to 4,094 VLANs
- */
- struct dpsw_tci_cfg {
- u8 pcp;
- u8 dei;
- u16 vlan_id;
- };
- int dpsw_if_set_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
- const struct dpsw_tci_cfg *cfg);
- int dpsw_if_get_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
- struct dpsw_tci_cfg *cfg);
- /**
- * enum dpsw_stp_state - Spanning Tree Protocol (STP) states
- * @DPSW_STP_STATE_DISABLED: Disabled state
- * @DPSW_STP_STATE_LISTENING: Listening state
- * @DPSW_STP_STATE_LEARNING: Learning state
- * @DPSW_STP_STATE_FORWARDING: Forwarding state
- * @DPSW_STP_STATE_BLOCKING: Blocking state
- *
- */
- enum dpsw_stp_state {
- DPSW_STP_STATE_DISABLED = 0,
- DPSW_STP_STATE_LISTENING = 1,
- DPSW_STP_STATE_LEARNING = 2,
- DPSW_STP_STATE_FORWARDING = 3,
- DPSW_STP_STATE_BLOCKING = 0
- };
- /**
- * struct dpsw_stp_cfg - Spanning Tree Protocol (STP) Configuration
- * @vlan_id: VLAN ID STP state
- * @state: STP state
- */
- struct dpsw_stp_cfg {
- u16 vlan_id;
- enum dpsw_stp_state state;
- };
- int dpsw_if_set_stp(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
- const struct dpsw_stp_cfg *cfg);
- /**
- * enum dpsw_accepted_frames - Types of frames to accept
- * @DPSW_ADMIT_ALL: The device accepts VLAN tagged, untagged and
- * priority tagged frames
- * @DPSW_ADMIT_ONLY_VLAN_TAGGED: The device discards untagged frames or
- * Priority-Tagged frames received on this interface.
- *
- */
- enum dpsw_accepted_frames {
- DPSW_ADMIT_ALL = 1,
- DPSW_ADMIT_ONLY_VLAN_TAGGED = 3
- };
- /**
- * enum dpsw_counter - Counters types
- * @DPSW_CNT_ING_FRAME: Counts ingress frames
- * @DPSW_CNT_ING_BYTE: Counts ingress bytes
- * @DPSW_CNT_ING_FLTR_FRAME: Counts filtered ingress frames
- * @DPSW_CNT_ING_FRAME_DISCARD: Counts discarded ingress frame
- * @DPSW_CNT_ING_MCAST_FRAME: Counts ingress multicast frames
- * @DPSW_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes
- * @DPSW_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames
- * @DPSW_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes
- * @DPSW_CNT_EGR_FRAME: Counts egress frames
- * @DPSW_CNT_EGR_BYTE: Counts egress bytes
- * @DPSW_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames
- * @DPSW_CNT_EGR_STP_FRAME_DISCARD: Counts egress STP discarded frames
- * @DPSW_CNT_ING_NO_BUFF_DISCARD: Counts ingress no buffer discarded frames
- */
- enum dpsw_counter {
- DPSW_CNT_ING_FRAME = 0x0,
- DPSW_CNT_ING_BYTE = 0x1,
- DPSW_CNT_ING_FLTR_FRAME = 0x2,
- DPSW_CNT_ING_FRAME_DISCARD = 0x3,
- DPSW_CNT_ING_MCAST_FRAME = 0x4,
- DPSW_CNT_ING_MCAST_BYTE = 0x5,
- DPSW_CNT_ING_BCAST_FRAME = 0x6,
- DPSW_CNT_ING_BCAST_BYTES = 0x7,
- DPSW_CNT_EGR_FRAME = 0x8,
- DPSW_CNT_EGR_BYTE = 0x9,
- DPSW_CNT_EGR_FRAME_DISCARD = 0xa,
- DPSW_CNT_EGR_STP_FRAME_DISCARD = 0xb,
- DPSW_CNT_ING_NO_BUFF_DISCARD = 0xc,
- };
- int dpsw_if_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, enum dpsw_counter type, u64 *counter);
- int dpsw_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id);
- int dpsw_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id);
- /**
- * struct dpsw_if_attr - Structure representing DPSW interface attributes
- * @num_tcs: Number of traffic classes
- * @rate: Transmit rate in bits per second
- * @options: Interface configuration options (bitmap)
- * @enabled: Indicates if interface is enabled
- * @accept_all_vlan: The device discards/accepts incoming frames
- * for VLANs that do not include this interface
- * @admit_untagged: When set to 'DPSW_ADMIT_ONLY_VLAN_TAGGED', the device
- * discards untagged frames or priority-tagged frames received on
- * this interface;
- * When set to 'DPSW_ADMIT_ALL', untagged frames or priority-
- * tagged frames received on this interface are accepted
- * @qdid: control frames transmit qdid
- */
- struct dpsw_if_attr {
- u8 num_tcs;
- u32 rate;
- u32 options;
- int enabled;
- int accept_all_vlan;
- enum dpsw_accepted_frames admit_untagged;
- u16 qdid;
- };
- int dpsw_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, struct dpsw_if_attr *attr);
- int dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, u16 frame_length);
- /**
- * struct dpsw_vlan_cfg - VLAN Configuration
- * @fdb_id: Forwarding Data Base
- */
- struct dpsw_vlan_cfg {
- u16 fdb_id;
- };
- int dpsw_vlan_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 vlan_id, const struct dpsw_vlan_cfg *cfg);
- #define DPSW_VLAN_ADD_IF_OPT_FDB_ID 0x0001
- /**
- * struct dpsw_vlan_if_cfg - Set of VLAN Interfaces
- * @num_ifs: The number of interfaces that are assigned to the egress
- * list for this VLAN
- * @if_id: The set of interfaces that are
- * assigned to the egress list for this VLAN
- * @options: Options map for this command (DPSW_VLAN_ADD_IF_OPT_FDB_ID)
- * @fdb_id: FDB id to be used by this VLAN on these specific interfaces
- * (taken into account only if the DPSW_VLAN_ADD_IF_OPT_FDB_ID is
- * specified in the options field)
- */
- struct dpsw_vlan_if_cfg {
- u16 num_ifs;
- u16 options;
- u16 if_id[DPSW_MAX_IF];
- u16 fdb_id;
- };
- int dpsw_vlan_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
- int dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
- int dpsw_vlan_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
- int dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
- int dpsw_vlan_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 vlan_id);
- /**
- * enum dpsw_fdb_entry_type - FDB Entry type - Static/Dynamic
- * @DPSW_FDB_ENTRY_STATIC: Static entry
- * @DPSW_FDB_ENTRY_DINAMIC: Dynamic entry
- */
- enum dpsw_fdb_entry_type {
- DPSW_FDB_ENTRY_STATIC = 0,
- DPSW_FDB_ENTRY_DINAMIC = 1
- };
- /**
- * struct dpsw_fdb_unicast_cfg - Unicast entry configuration
- * @type: Select static or dynamic entry
- * @mac_addr: MAC address
- * @if_egress: Egress interface ID
- */
- struct dpsw_fdb_unicast_cfg {
- enum dpsw_fdb_entry_type type;
- u8 mac_addr[6];
- u16 if_egress;
- };
- int dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg);
- int dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg);
- #define DPSW_FDB_ENTRY_TYPE_DYNAMIC BIT(0)
- #define DPSW_FDB_ENTRY_TYPE_UNICAST BIT(1)
- /**
- * struct fdb_dump_entry - fdb snapshot entry
- * @mac_addr: MAC address
- * @type: bit0 - DINAMIC(1)/STATIC(0), bit1 - UNICAST(1)/MULTICAST(0)
- * @if_info: unicast - egress interface, multicast - number of egress interfaces
- * @if_mask: multicast - egress interface mask
- */
- struct fdb_dump_entry {
- u8 mac_addr[6];
- u8 type;
- u8 if_info;
- u8 if_mask[8];
- };
- int dpsw_fdb_dump(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id,
- u64 iova_addr, u32 iova_size, u16 *num_entries);
- /**
- * struct dpsw_fdb_multicast_cfg - Multi-cast entry configuration
- * @type: Select static or dynamic entry
- * @mac_addr: MAC address
- * @num_ifs: Number of external and internal interfaces
- * @if_id: Egress interface IDs
- */
- struct dpsw_fdb_multicast_cfg {
- enum dpsw_fdb_entry_type type;
- u8 mac_addr[6];
- u16 num_ifs;
- u16 if_id[DPSW_MAX_IF];
- };
- int dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg);
- int dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg);
- /**
- * enum dpsw_learning_mode - Auto-learning modes
- * @DPSW_LEARNING_MODE_DIS: Disable Auto-learning
- * @DPSW_LEARNING_MODE_HW: Enable HW auto-Learning
- * @DPSW_LEARNING_MODE_NON_SECURE: Enable None secure learning by CPU
- * @DPSW_LEARNING_MODE_SECURE: Enable secure learning by CPU
- *
- * NONE - SECURE LEARNING
- * SMAC found DMAC found CTLU Action
- * v v Forward frame to
- * 1. DMAC destination
- * - v Forward frame to
- * 1. DMAC destination
- * 2. Control interface
- * v - Forward frame to
- * 1. Flooding list of interfaces
- * - - Forward frame to
- * 1. Flooding list of interfaces
- * 2. Control interface
- * SECURE LEARING
- * SMAC found DMAC found CTLU Action
- * v v Forward frame to
- * 1. DMAC destination
- * - v Forward frame to
- * 1. Control interface
- * v - Forward frame to
- * 1. Flooding list of interfaces
- * - - Forward frame to
- * 1. Control interface
- */
- enum dpsw_learning_mode {
- DPSW_LEARNING_MODE_DIS = 0,
- DPSW_LEARNING_MODE_HW = 1,
- DPSW_LEARNING_MODE_NON_SECURE = 2,
- DPSW_LEARNING_MODE_SECURE = 3
- };
- /**
- * struct dpsw_fdb_attr - FDB Attributes
- * @max_fdb_entries: Number of FDB entries
- * @fdb_ageing_time: Ageing time in seconds
- * @learning_mode: Learning mode
- * @num_fdb_mc_groups: Current number of multicast groups
- * @max_fdb_mc_groups: Maximum number of multicast groups
- */
- struct dpsw_fdb_attr {
- u16 max_fdb_entries;
- u16 fdb_ageing_time;
- enum dpsw_learning_mode learning_mode;
- u16 num_fdb_mc_groups;
- u16 max_fdb_mc_groups;
- };
- int dpsw_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
- u16 *major_ver, u16 *minor_ver);
- int dpsw_if_get_port_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, u8 mac_addr[6]);
- /**
- * struct dpsw_fdb_cfg - FDB Configuration
- * @num_fdb_entries: Number of FDB entries
- * @fdb_ageing_time: Ageing time in seconds
- */
- struct dpsw_fdb_cfg {
- u16 num_fdb_entries;
- u16 fdb_ageing_time;
- };
- int dpsw_fdb_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *fdb_id,
- const struct dpsw_fdb_cfg *cfg);
- int dpsw_fdb_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id);
- /**
- * enum dpsw_flood_type - Define the flood type of a DPSW object
- * @DPSW_BROADCAST: Broadcast flooding
- * @DPSW_FLOODING: Unknown flooding
- */
- enum dpsw_flood_type {
- DPSW_BROADCAST = 0,
- DPSW_FLOODING,
- };
- struct dpsw_egress_flood_cfg {
- u16 fdb_id;
- enum dpsw_flood_type flood_type;
- u16 num_ifs;
- u16 if_id[DPSW_MAX_IF];
- };
- int dpsw_set_egress_flood(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- const struct dpsw_egress_flood_cfg *cfg);
- int dpsw_if_set_learning_mode(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, enum dpsw_learning_mode mode);
- /**
- * struct dpsw_acl_cfg - ACL Configuration
- * @max_entries: Number of ACL rules
- */
- struct dpsw_acl_cfg {
- u16 max_entries;
- };
- int dpsw_acl_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *acl_id,
- const struct dpsw_acl_cfg *cfg);
- int dpsw_acl_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 acl_id);
- /**
- * struct dpsw_acl_if_cfg - List of interfaces to associate with an ACL table
- * @num_ifs: Number of interfaces
- * @if_id: List of interfaces
- */
- struct dpsw_acl_if_cfg {
- u16 num_ifs;
- u16 if_id[DPSW_MAX_IF];
- };
- int dpsw_acl_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 acl_id, const struct dpsw_acl_if_cfg *cfg);
- int dpsw_acl_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 acl_id, const struct dpsw_acl_if_cfg *cfg);
- /**
- * struct dpsw_acl_fields - ACL fields.
- * @l2_dest_mac: Destination MAC address: BPDU, Multicast, Broadcast, Unicast,
- * slow protocols, MVRP, STP
- * @l2_source_mac: Source MAC address
- * @l2_tpid: Layer 2 (Ethernet) protocol type, used to identify the following
- * protocols: MPLS, PTP, PFC, ARP, Jumbo frames, LLDP, IEEE802.1ae,
- * Q-in-Q, IPv4, IPv6, PPPoE
- * @l2_pcp_dei: indicate which protocol is encapsulated in the payload
- * @l2_vlan_id: layer 2 VLAN ID
- * @l2_ether_type: layer 2 Ethernet type
- * @l3_dscp: Layer 3 differentiated services code point
- * @l3_protocol: Tells the Network layer at the destination host, to which
- * Protocol this packet belongs to. The following protocol are
- * supported: ICMP, IGMP, IPv4 (encapsulation), TCP, IPv6
- * (encapsulation), GRE, PTP
- * @l3_source_ip: Source IPv4 IP
- * @l3_dest_ip: Destination IPv4 IP
- * @l4_source_port: Source TCP/UDP Port
- * @l4_dest_port: Destination TCP/UDP Port
- */
- struct dpsw_acl_fields {
- u8 l2_dest_mac[6];
- u8 l2_source_mac[6];
- u16 l2_tpid;
- u8 l2_pcp_dei;
- u16 l2_vlan_id;
- u16 l2_ether_type;
- u8 l3_dscp;
- u8 l3_protocol;
- u32 l3_source_ip;
- u32 l3_dest_ip;
- u16 l4_source_port;
- u16 l4_dest_port;
- };
- /**
- * struct dpsw_acl_key - ACL key
- * @match: Match fields
- * @mask: Mask: b'1 - valid, b'0 don't care
- */
- struct dpsw_acl_key {
- struct dpsw_acl_fields match;
- struct dpsw_acl_fields mask;
- };
- /**
- * enum dpsw_acl_action - action to be run on the ACL rule match
- * @DPSW_ACL_ACTION_DROP: Drop frame
- * @DPSW_ACL_ACTION_REDIRECT: Redirect to certain port
- * @DPSW_ACL_ACTION_ACCEPT: Accept frame
- * @DPSW_ACL_ACTION_REDIRECT_TO_CTRL_IF: Redirect to control interface
- */
- enum dpsw_acl_action {
- DPSW_ACL_ACTION_DROP,
- DPSW_ACL_ACTION_REDIRECT,
- DPSW_ACL_ACTION_ACCEPT,
- DPSW_ACL_ACTION_REDIRECT_TO_CTRL_IF
- };
- /**
- * struct dpsw_acl_result - ACL action
- * @action: Action should be taken when ACL entry hit
- * @if_id: Interface IDs to redirect frame. Valid only if redirect selected for
- * action
- */
- struct dpsw_acl_result {
- enum dpsw_acl_action action;
- u16 if_id;
- };
- /**
- * struct dpsw_acl_entry_cfg - ACL entry
- * @key_iova: I/O virtual address of DMA-able memory filled with key after call
- * to dpsw_acl_prepare_entry_cfg()
- * @result: Required action when entry hit occurs
- * @precedence: Precedence inside ACL 0 is lowest; This priority can not change
- * during the lifetime of a Policy. It is user responsibility to
- * space the priorities according to consequent rule additions.
- */
- struct dpsw_acl_entry_cfg {
- u64 key_iova;
- struct dpsw_acl_result result;
- int precedence;
- };
- void dpsw_acl_prepare_entry_cfg(const struct dpsw_acl_key *key,
- u8 *entry_cfg_buf);
- int dpsw_acl_add_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 acl_id, const struct dpsw_acl_entry_cfg *cfg);
- int dpsw_acl_remove_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 acl_id, const struct dpsw_acl_entry_cfg *cfg);
- /**
- * enum dpsw_reflection_filter - Filter type for frames to be reflected
- * @DPSW_REFLECTION_FILTER_INGRESS_ALL: Reflect all frames
- * @DPSW_REFLECTION_FILTER_INGRESS_VLAN: Reflect only frames that belong to
- * the particular VLAN defined by vid parameter
- *
- */
- enum dpsw_reflection_filter {
- DPSW_REFLECTION_FILTER_INGRESS_ALL = 0,
- DPSW_REFLECTION_FILTER_INGRESS_VLAN = 1
- };
- /**
- * struct dpsw_reflection_cfg - Structure representing the mirroring config
- * @filter: Filter type for frames to be mirrored
- * @vlan_id: VLAN ID to mirror; valid only when the type is DPSW_INGRESS_VLAN
- */
- struct dpsw_reflection_cfg {
- enum dpsw_reflection_filter filter;
- u16 vlan_id;
- };
- int dpsw_set_reflection_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id);
- int dpsw_if_add_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, const struct dpsw_reflection_cfg *cfg);
- int dpsw_if_remove_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
- u16 if_id, const struct dpsw_reflection_cfg *cfg);
- #endif /* __FSL_DPSW_H */
|