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 int dpsw_if_get_port_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 584 u16 if_id, u8 mac_addr[6]); 585 586 int dpsw_if_get_primary_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, 587 u16 token, u16 if_id, u8 mac_addr[6]); 588 589 int dpsw_if_set_primary_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, 590 u16 token, u16 if_id, u8 mac_addr[6]); 591 592 #endif /* __FSL_DPSW_H */ 593