1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright 2014-2016 Freescale Semiconductor Inc. 4 * Copyright 2017-2021 NXP 5 * 6 */ 7 8 #ifndef __FSL_DPSW_H 9 #define __FSL_DPSW_H 10 11 /* Data Path L2-Switch API 12 * Contains API for handling DPSW topology and functionality 13 */ 14 15 struct fsl_mc_io; 16 17 /* DPSW general definitions */ 18 19 #define DPSW_MAX_PRIORITIES 8 20 21 #define DPSW_MAX_IF 64 22 23 int dpsw_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpsw_id, u16 *token); 24 25 int dpsw_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 26 27 /* DPSW options */ 28 29 /** 30 * DPSW_OPT_FLOODING_DIS - Flooding was disabled at device create 31 */ 32 #define DPSW_OPT_FLOODING_DIS 0x0000000000000001ULL 33 /** 34 * DPSW_OPT_MULTICAST_DIS - Multicast was disabled at device create 35 */ 36 #define DPSW_OPT_MULTICAST_DIS 0x0000000000000004ULL 37 /** 38 * DPSW_OPT_CTRL_IF_DIS - Control interface support is disabled 39 */ 40 #define DPSW_OPT_CTRL_IF_DIS 0x0000000000000010ULL 41 42 /** 43 * enum dpsw_component_type - component type of a bridge 44 * @DPSW_COMPONENT_TYPE_C_VLAN: A C-VLAN component of an 45 * enterprise VLAN bridge or of a Provider Bridge used 46 * to process C-tagged frames 47 * @DPSW_COMPONENT_TYPE_S_VLAN: An S-VLAN component of a 48 * Provider Bridge 49 * 50 */ 51 enum dpsw_component_type { 52 DPSW_COMPONENT_TYPE_C_VLAN = 0, 53 DPSW_COMPONENT_TYPE_S_VLAN 54 }; 55 56 /** 57 * enum dpsw_flooding_cfg - flooding configuration requested 58 * @DPSW_FLOODING_PER_VLAN: Flooding replicators are allocated per VLAN and 59 * interfaces present in each of them can be configured using 60 * dpsw_vlan_add_if_flooding()/dpsw_vlan_remove_if_flooding(). 61 * This is the default configuration. 62 * 63 * @DPSW_FLOODING_PER_FDB: Flooding replicators are allocated per FDB and 64 * interfaces present in each of them can be configured using 65 * dpsw_set_egress_flood(). 66 */ 67 enum dpsw_flooding_cfg { 68 DPSW_FLOODING_PER_VLAN = 0, 69 DPSW_FLOODING_PER_FDB, 70 }; 71 72 /** 73 * enum dpsw_broadcast_cfg - broadcast configuration requested 74 * @DPSW_BROADCAST_PER_OBJECT: There is only one broadcast replicator per DPSW 75 * object. This is the default configuration. 76 * @DPSW_BROADCAST_PER_FDB: Broadcast replicators are allocated per FDB and 77 * interfaces present in each of them can be configured using 78 * dpsw_set_egress_flood(). 79 */ 80 enum dpsw_broadcast_cfg { 81 DPSW_BROADCAST_PER_OBJECT = 0, 82 DPSW_BROADCAST_PER_FDB, 83 }; 84 85 int dpsw_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 86 87 int dpsw_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 88 89 int dpsw_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 90 91 /* DPSW IRQ Index and Events */ 92 93 #define DPSW_IRQ_INDEX_IF 0x0000 94 #define DPSW_IRQ_INDEX_L2SW 0x0001 95 96 /** 97 * DPSW_IRQ_EVENT_LINK_CHANGED - Indicates that the link state changed 98 */ 99 #define DPSW_IRQ_EVENT_LINK_CHANGED 0x0001 100 101 /** 102 * struct dpsw_irq_cfg - IRQ configuration 103 * @addr: Address that must be written to signal a message-based interrupt 104 * @val: Value to write into irq_addr address 105 * @irq_num: A user defined number associated with this IRQ 106 */ 107 struct dpsw_irq_cfg { 108 u64 addr; 109 u32 val; 110 int irq_num; 111 }; 112 113 int dpsw_set_irq_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 114 u8 irq_index, u8 en); 115 116 int dpsw_set_irq_mask(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 117 u8 irq_index, u32 mask); 118 119 int dpsw_get_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 120 u8 irq_index, u32 *status); 121 122 int dpsw_clear_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 123 u8 irq_index, u32 status); 124 125 /** 126 * struct dpsw_attr - Structure representing DPSW attributes 127 * @id: DPSW object ID 128 * @options: Enable/Disable DPSW features 129 * @max_vlans: Maximum Number of VLANs 130 * @max_meters_per_if: Number of meters per interface 131 * @max_fdbs: Maximum Number of FDBs 132 * @max_fdb_entries: Number of FDB entries for default FDB table; 133 * 0 - indicates default 1024 entries. 134 * @fdb_aging_time: Default FDB aging time for default FDB table; 135 * 0 - indicates default 300 seconds 136 * @max_fdb_mc_groups: Number of multicast groups in each FDB table; 137 * 0 - indicates default 32 138 * @mem_size: DPSW frame storage memory size 139 * @num_ifs: Number of interfaces 140 * @num_vlans: Current number of VLANs 141 * @num_fdbs: Current number of FDBs 142 * @component_type: Component type of this bridge 143 * @flooding_cfg: Flooding configuration (PER_VLAN - default, PER_FDB) 144 * @broadcast_cfg: Broadcast configuration (PER_OBJECT - default, PER_FDB) 145 */ 146 struct dpsw_attr { 147 int id; 148 u64 options; 149 u16 max_vlans; 150 u8 max_meters_per_if; 151 u8 max_fdbs; 152 u16 max_fdb_entries; 153 u16 fdb_aging_time; 154 u16 max_fdb_mc_groups; 155 u16 num_ifs; 156 u16 mem_size; 157 u16 num_vlans; 158 u8 num_fdbs; 159 enum dpsw_component_type component_type; 160 enum dpsw_flooding_cfg flooding_cfg; 161 enum dpsw_broadcast_cfg broadcast_cfg; 162 }; 163 164 int dpsw_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 165 struct dpsw_attr *attr); 166 167 /** 168 * struct dpsw_ctrl_if_attr - Control interface attributes 169 * @rx_fqid: Receive FQID 170 * @rx_err_fqid: Receive error FQID 171 * @tx_err_conf_fqid: Transmit error and confirmation FQID 172 */ 173 struct dpsw_ctrl_if_attr { 174 u32 rx_fqid; 175 u32 rx_err_fqid; 176 u32 tx_err_conf_fqid; 177 }; 178 179 int dpsw_ctrl_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, 180 u16 token, struct dpsw_ctrl_if_attr *attr); 181 182 enum dpsw_queue_type { 183 DPSW_QUEUE_RX, 184 DPSW_QUEUE_TX_ERR_CONF, 185 DPSW_QUEUE_RX_ERR, 186 }; 187 188 #define DPSW_MAX_DPBP 8 189 190 /** 191 * struct dpsw_ctrl_if_pools_cfg - Control interface buffer pools configuration 192 * @num_dpbp: Number of DPBPs 193 * @pools: Array of buffer pools parameters; The number of valid entries 194 * must match 'num_dpbp' value 195 * @pools.dpbp_id: DPBP object ID 196 * @pools.buffer_size: Buffer size 197 * @pools.backup_pool: Backup pool 198 */ 199 struct dpsw_ctrl_if_pools_cfg { 200 u8 num_dpbp; 201 struct { 202 int dpbp_id; 203 u16 buffer_size; 204 int backup_pool; 205 } pools[DPSW_MAX_DPBP]; 206 }; 207 208 int dpsw_ctrl_if_set_pools(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 209 const struct dpsw_ctrl_if_pools_cfg *cfg); 210 211 #define DPSW_CTRL_IF_QUEUE_OPT_USER_CTX 0x00000001 212 #define DPSW_CTRL_IF_QUEUE_OPT_DEST 0x00000002 213 214 enum dpsw_ctrl_if_dest { 215 DPSW_CTRL_IF_DEST_NONE = 0, 216 DPSW_CTRL_IF_DEST_DPIO = 1, 217 }; 218 219 struct dpsw_ctrl_if_dest_cfg { 220 enum dpsw_ctrl_if_dest dest_type; 221 int dest_id; 222 u8 priority; 223 }; 224 225 struct dpsw_ctrl_if_queue_cfg { 226 u32 options; 227 u64 user_ctx; 228 struct dpsw_ctrl_if_dest_cfg dest_cfg; 229 }; 230 231 int dpsw_ctrl_if_set_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 232 enum dpsw_queue_type qtype, 233 const struct dpsw_ctrl_if_queue_cfg *cfg); 234 235 int dpsw_ctrl_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 236 237 int dpsw_ctrl_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 238 239 /** 240 * enum dpsw_action - Action selection for special/control frames 241 * @DPSW_ACTION_DROP: Drop frame 242 * @DPSW_ACTION_REDIRECT: Redirect frame to control port 243 */ 244 enum dpsw_action { 245 DPSW_ACTION_DROP = 0, 246 DPSW_ACTION_REDIRECT = 1 247 }; 248 249 #define DPSW_LINK_OPT_AUTONEG 0x0000000000000001ULL 250 #define DPSW_LINK_OPT_HALF_DUPLEX 0x0000000000000002ULL 251 #define DPSW_LINK_OPT_PAUSE 0x0000000000000004ULL 252 #define DPSW_LINK_OPT_ASYM_PAUSE 0x0000000000000008ULL 253 254 /** 255 * struct dpsw_link_cfg - Structure representing DPSW link configuration 256 * @rate: Rate 257 * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values 258 */ 259 struct dpsw_link_cfg { 260 u32 rate; 261 u64 options; 262 }; 263 264 int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 265 struct dpsw_link_cfg *cfg); 266 267 /** 268 * struct dpsw_link_state - Structure representing DPSW link state 269 * @rate: Rate 270 * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values 271 * @up: 0 - covers two cases: down and disconnected, 1 - up 272 */ 273 struct dpsw_link_state { 274 u32 rate; 275 u64 options; 276 u8 up; 277 }; 278 279 int dpsw_if_get_link_state(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 280 u16 if_id, struct dpsw_link_state *state); 281 282 /** 283 * struct dpsw_tci_cfg - Tag Control Information (TCI) configuration 284 * @pcp: Priority Code Point (PCP): a 3-bit field which refers 285 * to the IEEE 802.1p priority 286 * @dei: Drop Eligible Indicator (DEI): a 1-bit field. May be used 287 * separately or in conjunction with PCP to indicate frames 288 * eligible to be dropped in the presence of congestion 289 * @vlan_id: VLAN Identifier (VID): a 12-bit field specifying the VLAN 290 * to which the frame belongs. The hexadecimal values 291 * of 0x000 and 0xFFF are reserved; 292 * all other values may be used as VLAN identifiers, 293 * allowing up to 4,094 VLANs 294 */ 295 struct dpsw_tci_cfg { 296 u8 pcp; 297 u8 dei; 298 u16 vlan_id; 299 }; 300 301 int dpsw_if_set_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 302 const struct dpsw_tci_cfg *cfg); 303 304 int dpsw_if_get_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 305 struct dpsw_tci_cfg *cfg); 306 307 /** 308 * enum dpsw_stp_state - Spanning Tree Protocol (STP) states 309 * @DPSW_STP_STATE_DISABLED: Disabled state 310 * @DPSW_STP_STATE_LISTENING: Listening state 311 * @DPSW_STP_STATE_LEARNING: Learning state 312 * @DPSW_STP_STATE_FORWARDING: Forwarding state 313 * @DPSW_STP_STATE_BLOCKING: Blocking state 314 * 315 */ 316 enum dpsw_stp_state { 317 DPSW_STP_STATE_DISABLED = 0, 318 DPSW_STP_STATE_LISTENING = 1, 319 DPSW_STP_STATE_LEARNING = 2, 320 DPSW_STP_STATE_FORWARDING = 3, 321 DPSW_STP_STATE_BLOCKING = 0 322 }; 323 324 /** 325 * struct dpsw_stp_cfg - Spanning Tree Protocol (STP) Configuration 326 * @vlan_id: VLAN ID STP state 327 * @state: STP state 328 */ 329 struct dpsw_stp_cfg { 330 u16 vlan_id; 331 enum dpsw_stp_state state; 332 }; 333 334 int dpsw_if_set_stp(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id, 335 const struct dpsw_stp_cfg *cfg); 336 337 /** 338 * enum dpsw_accepted_frames - Types of frames to accept 339 * @DPSW_ADMIT_ALL: The device accepts VLAN tagged, untagged and 340 * priority tagged frames 341 * @DPSW_ADMIT_ONLY_VLAN_TAGGED: The device discards untagged frames or 342 * Priority-Tagged frames received on this interface. 343 * 344 */ 345 enum dpsw_accepted_frames { 346 DPSW_ADMIT_ALL = 1, 347 DPSW_ADMIT_ONLY_VLAN_TAGGED = 3 348 }; 349 350 /** 351 * enum dpsw_counter - Counters types 352 * @DPSW_CNT_ING_FRAME: Counts ingress frames 353 * @DPSW_CNT_ING_BYTE: Counts ingress bytes 354 * @DPSW_CNT_ING_FLTR_FRAME: Counts filtered ingress frames 355 * @DPSW_CNT_ING_FRAME_DISCARD: Counts discarded ingress frame 356 * @DPSW_CNT_ING_MCAST_FRAME: Counts ingress multicast frames 357 * @DPSW_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes 358 * @DPSW_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames 359 * @DPSW_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes 360 * @DPSW_CNT_EGR_FRAME: Counts egress frames 361 * @DPSW_CNT_EGR_BYTE: Counts egress bytes 362 * @DPSW_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames 363 * @DPSW_CNT_EGR_STP_FRAME_DISCARD: Counts egress STP discarded frames 364 * @DPSW_CNT_ING_NO_BUFF_DISCARD: Counts ingress no buffer discarded frames 365 */ 366 enum dpsw_counter { 367 DPSW_CNT_ING_FRAME = 0x0, 368 DPSW_CNT_ING_BYTE = 0x1, 369 DPSW_CNT_ING_FLTR_FRAME = 0x2, 370 DPSW_CNT_ING_FRAME_DISCARD = 0x3, 371 DPSW_CNT_ING_MCAST_FRAME = 0x4, 372 DPSW_CNT_ING_MCAST_BYTE = 0x5, 373 DPSW_CNT_ING_BCAST_FRAME = 0x6, 374 DPSW_CNT_ING_BCAST_BYTES = 0x7, 375 DPSW_CNT_EGR_FRAME = 0x8, 376 DPSW_CNT_EGR_BYTE = 0x9, 377 DPSW_CNT_EGR_FRAME_DISCARD = 0xa, 378 DPSW_CNT_EGR_STP_FRAME_DISCARD = 0xb, 379 DPSW_CNT_ING_NO_BUFF_DISCARD = 0xc, 380 }; 381 382 int dpsw_if_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 383 u16 if_id, enum dpsw_counter type, u64 *counter); 384 385 int dpsw_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id); 386 387 int dpsw_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id); 388 389 /** 390 * struct dpsw_if_attr - Structure representing DPSW interface attributes 391 * @num_tcs: Number of traffic classes 392 * @rate: Transmit rate in bits per second 393 * @options: Interface configuration options (bitmap) 394 * @enabled: Indicates if interface is enabled 395 * @accept_all_vlan: The device discards/accepts incoming frames 396 * for VLANs that do not include this interface 397 * @admit_untagged: When set to 'DPSW_ADMIT_ONLY_VLAN_TAGGED', the device 398 * discards untagged frames or priority-tagged frames received on 399 * this interface; 400 * When set to 'DPSW_ADMIT_ALL', untagged frames or priority- 401 * tagged frames received on this interface are accepted 402 * @qdid: control frames transmit qdid 403 */ 404 struct dpsw_if_attr { 405 u8 num_tcs; 406 u32 rate; 407 u32 options; 408 int enabled; 409 int accept_all_vlan; 410 enum dpsw_accepted_frames admit_untagged; 411 u16 qdid; 412 }; 413 414 int dpsw_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 415 u16 if_id, struct dpsw_if_attr *attr); 416 417 int dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 418 u16 if_id, u16 frame_length); 419 420 /** 421 * struct dpsw_vlan_cfg - VLAN Configuration 422 * @fdb_id: Forwarding Data Base 423 */ 424 struct dpsw_vlan_cfg { 425 u16 fdb_id; 426 }; 427 428 int dpsw_vlan_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 429 u16 vlan_id, const struct dpsw_vlan_cfg *cfg); 430 431 #define DPSW_VLAN_ADD_IF_OPT_FDB_ID 0x0001 432 433 /** 434 * struct dpsw_vlan_if_cfg - Set of VLAN Interfaces 435 * @num_ifs: The number of interfaces that are assigned to the egress 436 * list for this VLAN 437 * @if_id: The set of interfaces that are 438 * assigned to the egress list for this VLAN 439 * @options: Options map for this command (DPSW_VLAN_ADD_IF_OPT_FDB_ID) 440 * @fdb_id: FDB id to be used by this VLAN on these specific interfaces 441 * (taken into account only if the DPSW_VLAN_ADD_IF_OPT_FDB_ID is 442 * specified in the options field) 443 */ 444 struct dpsw_vlan_if_cfg { 445 u16 num_ifs; 446 u16 options; 447 u16 if_id[DPSW_MAX_IF]; 448 u16 fdb_id; 449 }; 450 451 int dpsw_vlan_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 452 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg); 453 454 int dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 455 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg); 456 457 int dpsw_vlan_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 458 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg); 459 460 int dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 461 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg); 462 463 int dpsw_vlan_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 464 u16 vlan_id); 465 466 /** 467 * enum dpsw_fdb_entry_type - FDB Entry type - Static/Dynamic 468 * @DPSW_FDB_ENTRY_STATIC: Static entry 469 * @DPSW_FDB_ENTRY_DINAMIC: Dynamic entry 470 */ 471 enum dpsw_fdb_entry_type { 472 DPSW_FDB_ENTRY_STATIC = 0, 473 DPSW_FDB_ENTRY_DINAMIC = 1 474 }; 475 476 /** 477 * struct dpsw_fdb_unicast_cfg - Unicast entry configuration 478 * @type: Select static or dynamic entry 479 * @mac_addr: MAC address 480 * @if_egress: Egress interface ID 481 */ 482 struct dpsw_fdb_unicast_cfg { 483 enum dpsw_fdb_entry_type type; 484 u8 mac_addr[6]; 485 u16 if_egress; 486 }; 487 488 int dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 489 u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg); 490 491 int dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 492 u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg); 493 494 #define DPSW_FDB_ENTRY_TYPE_DYNAMIC BIT(0) 495 #define DPSW_FDB_ENTRY_TYPE_UNICAST BIT(1) 496 497 /** 498 * struct fdb_dump_entry - fdb snapshot entry 499 * @mac_addr: MAC address 500 * @type: bit0 - DINAMIC(1)/STATIC(0), bit1 - UNICAST(1)/MULTICAST(0) 501 * @if_info: unicast - egress interface, multicast - number of egress interfaces 502 * @if_mask: multicast - egress interface mask 503 */ 504 struct fdb_dump_entry { 505 u8 mac_addr[6]; 506 u8 type; 507 u8 if_info; 508 u8 if_mask[8]; 509 }; 510 511 int dpsw_fdb_dump(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id, 512 u64 iova_addr, u32 iova_size, u16 *num_entries); 513 514 /** 515 * struct dpsw_fdb_multicast_cfg - Multi-cast entry configuration 516 * @type: Select static or dynamic entry 517 * @mac_addr: MAC address 518 * @num_ifs: Number of external and internal interfaces 519 * @if_id: Egress interface IDs 520 */ 521 struct dpsw_fdb_multicast_cfg { 522 enum dpsw_fdb_entry_type type; 523 u8 mac_addr[6]; 524 u16 num_ifs; 525 u16 if_id[DPSW_MAX_IF]; 526 }; 527 528 int dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 529 u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg); 530 531 int dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 532 u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg); 533 534 /** 535 * enum dpsw_learning_mode - Auto-learning modes 536 * @DPSW_LEARNING_MODE_DIS: Disable Auto-learning 537 * @DPSW_LEARNING_MODE_HW: Enable HW auto-Learning 538 * @DPSW_LEARNING_MODE_NON_SECURE: Enable None secure learning by CPU 539 * @DPSW_LEARNING_MODE_SECURE: Enable secure learning by CPU 540 * 541 * NONE - SECURE LEARNING 542 * SMAC found DMAC found CTLU Action 543 * v v Forward frame to 544 * 1. DMAC destination 545 * - v Forward frame to 546 * 1. DMAC destination 547 * 2. Control interface 548 * v - Forward frame to 549 * 1. Flooding list of interfaces 550 * - - Forward frame to 551 * 1. Flooding list of interfaces 552 * 2. Control interface 553 * SECURE LEARING 554 * SMAC found DMAC found CTLU Action 555 * v v Forward frame to 556 * 1. DMAC destination 557 * - v Forward frame to 558 * 1. Control interface 559 * v - Forward frame to 560 * 1. Flooding list of interfaces 561 * - - Forward frame to 562 * 1. Control interface 563 */ 564 enum dpsw_learning_mode { 565 DPSW_LEARNING_MODE_DIS = 0, 566 DPSW_LEARNING_MODE_HW = 1, 567 DPSW_LEARNING_MODE_NON_SECURE = 2, 568 DPSW_LEARNING_MODE_SECURE = 3 569 }; 570 571 /** 572 * struct dpsw_fdb_attr - FDB Attributes 573 * @max_fdb_entries: Number of FDB entries 574 * @fdb_ageing_time: Ageing time in seconds 575 * @learning_mode: Learning mode 576 * @num_fdb_mc_groups: Current number of multicast groups 577 * @max_fdb_mc_groups: Maximum number of multicast groups 578 */ 579 struct dpsw_fdb_attr { 580 u16 max_fdb_entries; 581 u16 fdb_ageing_time; 582 enum dpsw_learning_mode learning_mode; 583 u16 num_fdb_mc_groups; 584 u16 max_fdb_mc_groups; 585 }; 586 587 int dpsw_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags, 588 u16 *major_ver, u16 *minor_ver); 589 590 int dpsw_if_get_port_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 591 u16 if_id, u8 mac_addr[6]); 592 593 /** 594 * struct dpsw_fdb_cfg - FDB Configuration 595 * @num_fdb_entries: Number of FDB entries 596 * @fdb_ageing_time: Ageing time in seconds 597 */ 598 struct dpsw_fdb_cfg { 599 u16 num_fdb_entries; 600 u16 fdb_ageing_time; 601 }; 602 603 int dpsw_fdb_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *fdb_id, 604 const struct dpsw_fdb_cfg *cfg); 605 606 int dpsw_fdb_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id); 607 608 /** 609 * enum dpsw_flood_type - Define the flood type of a DPSW object 610 * @DPSW_BROADCAST: Broadcast flooding 611 * @DPSW_FLOODING: Unknown flooding 612 */ 613 enum dpsw_flood_type { 614 DPSW_BROADCAST = 0, 615 DPSW_FLOODING, 616 }; 617 618 struct dpsw_egress_flood_cfg { 619 u16 fdb_id; 620 enum dpsw_flood_type flood_type; 621 u16 num_ifs; 622 u16 if_id[DPSW_MAX_IF]; 623 }; 624 625 int dpsw_set_egress_flood(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 626 const struct dpsw_egress_flood_cfg *cfg); 627 628 int dpsw_if_set_learning_mode(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 629 u16 if_id, enum dpsw_learning_mode mode); 630 631 /** 632 * struct dpsw_acl_cfg - ACL Configuration 633 * @max_entries: Number of ACL rules 634 */ 635 struct dpsw_acl_cfg { 636 u16 max_entries; 637 }; 638 639 int dpsw_acl_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *acl_id, 640 const struct dpsw_acl_cfg *cfg); 641 642 int dpsw_acl_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 643 u16 acl_id); 644 645 /** 646 * struct dpsw_acl_if_cfg - List of interfaces to associate with an ACL table 647 * @num_ifs: Number of interfaces 648 * @if_id: List of interfaces 649 */ 650 struct dpsw_acl_if_cfg { 651 u16 num_ifs; 652 u16 if_id[DPSW_MAX_IF]; 653 }; 654 655 int dpsw_acl_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 656 u16 acl_id, const struct dpsw_acl_if_cfg *cfg); 657 658 int dpsw_acl_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 659 u16 acl_id, const struct dpsw_acl_if_cfg *cfg); 660 661 /** 662 * struct dpsw_acl_fields - ACL fields. 663 * @l2_dest_mac: Destination MAC address: BPDU, Multicast, Broadcast, Unicast, 664 * slow protocols, MVRP, STP 665 * @l2_source_mac: Source MAC address 666 * @l2_tpid: Layer 2 (Ethernet) protocol type, used to identify the following 667 * protocols: MPLS, PTP, PFC, ARP, Jumbo frames, LLDP, IEEE802.1ae, 668 * Q-in-Q, IPv4, IPv6, PPPoE 669 * @l2_pcp_dei: indicate which protocol is encapsulated in the payload 670 * @l2_vlan_id: layer 2 VLAN ID 671 * @l2_ether_type: layer 2 Ethernet type 672 * @l3_dscp: Layer 3 differentiated services code point 673 * @l3_protocol: Tells the Network layer at the destination host, to which 674 * Protocol this packet belongs to. The following protocol are 675 * supported: ICMP, IGMP, IPv4 (encapsulation), TCP, IPv6 676 * (encapsulation), GRE, PTP 677 * @l3_source_ip: Source IPv4 IP 678 * @l3_dest_ip: Destination IPv4 IP 679 * @l4_source_port: Source TCP/UDP Port 680 * @l4_dest_port: Destination TCP/UDP Port 681 */ 682 struct dpsw_acl_fields { 683 u8 l2_dest_mac[6]; 684 u8 l2_source_mac[6]; 685 u16 l2_tpid; 686 u8 l2_pcp_dei; 687 u16 l2_vlan_id; 688 u16 l2_ether_type; 689 u8 l3_dscp; 690 u8 l3_protocol; 691 u32 l3_source_ip; 692 u32 l3_dest_ip; 693 u16 l4_source_port; 694 u16 l4_dest_port; 695 }; 696 697 /** 698 * struct dpsw_acl_key - ACL key 699 * @match: Match fields 700 * @mask: Mask: b'1 - valid, b'0 don't care 701 */ 702 struct dpsw_acl_key { 703 struct dpsw_acl_fields match; 704 struct dpsw_acl_fields mask; 705 }; 706 707 /** 708 * enum dpsw_acl_action - action to be run on the ACL rule match 709 * @DPSW_ACL_ACTION_DROP: Drop frame 710 * @DPSW_ACL_ACTION_REDIRECT: Redirect to certain port 711 * @DPSW_ACL_ACTION_ACCEPT: Accept frame 712 * @DPSW_ACL_ACTION_REDIRECT_TO_CTRL_IF: Redirect to control interface 713 */ 714 enum dpsw_acl_action { 715 DPSW_ACL_ACTION_DROP, 716 DPSW_ACL_ACTION_REDIRECT, 717 DPSW_ACL_ACTION_ACCEPT, 718 DPSW_ACL_ACTION_REDIRECT_TO_CTRL_IF 719 }; 720 721 /** 722 * struct dpsw_acl_result - ACL action 723 * @action: Action should be taken when ACL entry hit 724 * @if_id: Interface IDs to redirect frame. Valid only if redirect selected for 725 * action 726 */ 727 struct dpsw_acl_result { 728 enum dpsw_acl_action action; 729 u16 if_id; 730 }; 731 732 /** 733 * struct dpsw_acl_entry_cfg - ACL entry 734 * @key_iova: I/O virtual address of DMA-able memory filled with key after call 735 * to dpsw_acl_prepare_entry_cfg() 736 * @result: Required action when entry hit occurs 737 * @precedence: Precedence inside ACL 0 is lowest; This priority can not change 738 * during the lifetime of a Policy. It is user responsibility to 739 * space the priorities according to consequent rule additions. 740 */ 741 struct dpsw_acl_entry_cfg { 742 u64 key_iova; 743 struct dpsw_acl_result result; 744 int precedence; 745 }; 746 747 void dpsw_acl_prepare_entry_cfg(const struct dpsw_acl_key *key, 748 u8 *entry_cfg_buf); 749 750 int dpsw_acl_add_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 751 u16 acl_id, const struct dpsw_acl_entry_cfg *cfg); 752 753 int dpsw_acl_remove_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 754 u16 acl_id, const struct dpsw_acl_entry_cfg *cfg); 755 #endif /* __FSL_DPSW_H */ 756