Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'add-sparx5i-driver'

Steen Hegelund says:

====================
Adding the Sparx5i Switch Driver

This series provides the Microchip Sparx5i Switch Driver

The SparX-5 Enterprise Ethernet switch family provides a rich set of
Enterprise switching features such as advanced TCAM-based VLAN and QoS
processing enabling delivery of differentiated services, and security
through TCAMbased frame processing using versatile content aware processor
(VCAP). IPv4/IPv6 Layer 3 (L3) unicast and multicast routing is supported
with up to 18K IPv4/9K IPv6 unicast LPM entries and up to 9K IPv4/3K IPv6
(S,G) multicast groups. L3 security features include source guard and
reverse path forwarding (uRPF) tasks. Additional L3 features include
VRF-Lite and IP tunnels (IP over GRE/IP).

The SparX-5 switch family features a highly flexible set of Ethernet ports
with support for 10G and 25G aggregation links, QSGMII, USGMII, and
USXGMII. The device integrates a powerful 1 GHz dual-core ARM® Cortex®-A53
CPU enabling full management of the switch and advanced Enterprise
applications.

The SparX-5 switch family targets managed Layer 2 and Layer 3 equipment in
SMB, SME, and Enterprise where high port count 1G/2.5G/5G/10G switching
with 10G/25G aggregation links is required.

The SparX-5 switch family consists of following SKUs:

VSC7546 SparX-5-64 supports up to 64 Gbps of bandwidth with the following
primary port configurations.
- 6 ×10G
- 16 × 2.5G + 2 × 10G
- 24 × 1G + 4 × 10G

VSC7549 SparX-5-90 supports up to 90 Gbps of bandwidth with the following
primary port configurations.
- 9 × 10G
- 16 × 2.5G + 4 × 10G
- 48 × 1G + 4 × 10G

VSC7552 SparX-5-128 supports up to 128 Gbps of bandwidth with the
following primary port configurations.
- 12 × 10G
- 6 x 10G + 2 x 25G
- 16 × 2.5G + 8 × 10G
- 48 × 1G + 8 × 10G

VSC7556 SparX-5-160 supports up to 160 Gbps of bandwidth with the
following primary port configurations.
- 16 × 10G
- 10 × 10G + 2 × 25G
- 16 × 2.5G + 10 × 10G
- 48 × 1G + 10 × 10G

VSC7558 SparX-5-200 supports up to 200 Gbps of bandwidth with the
following primary port configurations.
- 20 × 10G
- 8 × 25G

In addition, the device supports one 10/100/1000/2500/5000 Mbps
SGMII/SerDes node processor interface (NPI) Ethernet port.

Time sensitive networking (TSN) is supported through a comprehensive set of
features including frame preemption, cut-through, frame replication and
elimination for reliability, enhanced scheduling: credit-based shaping,
time-aware shaping, cyclic queuing, and forwarding, and per-stream policing
and filtering.

Together with IEEE 1588 and IEEE 802.1AS support, this guarantees
low-latency deterministic networking for Industrial Ethernet.

The Sparx5i support is developed on the PCB134 and PCB135 evaluation boards.

- PCB134 main networking features:
- 12x SFP+ front 10G module slots (connected to Sparx5i through SFI).
- 8x SFP28 front 25G module slots (connected to Sparx5i through SFI high
speed).
- Optional, one additional 10/100/1000BASE-T (RJ45) Ethernet port
(on-board VSC8211 PHY connected to Sparx5i through SGMII).

- PCB135 main networking features:
- 48x1G (10/100/1000M) RJ45 front ports using 12xVSC8514 QuadPHY’s each
connected to VSC7558 through QSGMII.
- 4x10G (1G/2.5G/5G/10G) RJ45 front ports using the AQR407 10G QuadPHY
each port connects to VSC7558 through SFI.
- 4x SFP28 25G module slots on back connected to VSC7558 through SFI high
speed.
- Optional, one additional 1G (10/100/1000M) RJ45 port using an on-board
VSC8211 PHY, which can be connected to VSC7558 NPI port through SGMII
using a loopback add-on PCB)

This series provides support for:
- SFPs and DAC cables via PHYLINK with a number of 5G, 10G and 25G
devices and media types.
- Port module configuration for 10M to 25G speeds with SGMII, QSGMII,
1000BASEX, 2500BASEX and 10GBASER as appropriate for these modes.
- SerDes configuration via the Sparx5i SerDes driver (see below).
- Host mode providing register based injection and extraction.
- Switch mode providing MAC/VLAN table learning and Layer2 switching
offloaded to the Sparx5i switch.
- STP state, VLAN support, host/bridge port mode, Forwarding DB, and
configuration and statistics via ethtool.

More support will be added at a later stage.

The Sparx5i Chip Register Model can be browsed at this location:
https://github.com/microchip-ung/sparx-5_reginfo
and the datasheet is available here:
https://ww1.microchip.com/downloads/en/DeviceDoc/SparX-5_Family_L2L3_Enterprise_10G_Ethernet_Switches_Datasheet_00003822B.pdf

The series depends on the following series currently on their way
into the kernel:

- 25G Base-R phy mode
Link: https://lore.kernel.org/r/20210611125453.313308-1-steen.hegelund@microchip.com/
- Sparx5 Reset Driver
Link: https://lore.kernel.org/r/20210416084054.2922327-1-steen.hegelund@microchip.com/

ChangeLog:
v5:
- cover letter
- updated the description to match the latest data sheets
- basic driver
- added error message in case of reset controller error
- port struct: replacing has_sfp with inband, adding pause_adv
- host mode
- port cleanup: unregisters netdevs and then removes phylink etc
- checking for pause_adv when comparing port config changes
- getting duplex and pause state in the link_up callback.
- getting inband, autoneg and pause_adv config in the pcs_config
callback.
- port
- use only the pause_adv bits when getting aneg status
- use the inband state when updating the PCS and port config
v4:
- basic driver:
Using devm_reset_control_get_optional_shared to get the reset
control, and let the reset framework check if it is valid.
- host mode (phylink):
Use the PCS operations to get state and update configuration.
Removed the setting of interface modes. Let phylink control this.
Using the new 5gbase-r and 25gbase-r modes.
Using a helper function to check if one of the 3 base-r modes has
been selected.
Currently it will not be possible to change the interface mode by
changing the speed (e.g via ethtool). This will be added later.
v3:
- basic driver:
- removed unneeded braces
- release reference to ports node after use
- use dev_err_probe to handle DEFER
- update error value when bailing out (a few cases)
- updated formatting of port struct and grouping of bool values
- simplified the spx5_rmw and spx5_inst_rmw inline functions
- host mode (netdev):
- removed lockless flag
- added port timer init
- host mode (packet - manual injection):
- updated error counters in error situations
- implemented timer handling of watermark threshold: stop and
restart netif queues.
- fixed error message handling (rate limited)
- fixed comment style error
- used DIV_ROUND_UP macro
- removed a debug message for open ports

v2:
- Updated bindings:
- drop minItems for the reg property
- Statistics implementation:
- Reorganized statistics into ethtool groups:
eth-phy, eth-mac, eth-ctrl, rmon
as defined by the IEEE 802.3 categories and RFC 2819.
- The remaining statistics are provided by the classic ethtool
statistics command.
- Hostmode support:
- Removed netdev renaming
- Validate ethernet address in sparx5_set_mac_address()
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+12318 -84
+226
Documentation/devicetree/bindings/net/microchip,sparx5-switch.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/net/microchip,sparx5-switch.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Microchip Sparx5 Ethernet switch controller 8 + 9 + maintainers: 10 + - Steen Hegelund <steen.hegelund@microchip.com> 11 + - Lars Povlsen <lars.povlsen@microchip.com> 12 + 13 + description: | 14 + The SparX-5 Enterprise Ethernet switch family provides a rich set of 15 + Enterprise switching features such as advanced TCAM-based VLAN and 16 + QoS processing enabling delivery of differentiated services, and 17 + security through TCAM-based frame processing using versatile content 18 + aware processor (VCAP). 19 + 20 + IPv4/IPv6 Layer 3 (L3) unicast and multicast routing is supported 21 + with up to 18K IPv4/9K IPv6 unicast LPM entries and up to 9K IPv4/3K 22 + IPv6 (S,G) multicast groups. 23 + 24 + L3 security features include source guard and reverse path 25 + forwarding (uRPF) tasks. Additional L3 features include VRF-Lite and 26 + IP tunnels (IP over GRE/IP). 27 + 28 + The SparX-5 switch family targets managed Layer 2 and Layer 3 29 + equipment in SMB, SME, and Enterprise where high port count 30 + 1G/2.5G/5G/10G switching with 10G/25G aggregation links is required. 31 + 32 + properties: 33 + $nodename: 34 + pattern: "^switch@[0-9a-f]+$" 35 + 36 + compatible: 37 + const: microchip,sparx5-switch 38 + 39 + reg: 40 + items: 41 + - description: cpu target 42 + - description: devices target 43 + - description: general control block target 44 + 45 + reg-names: 46 + items: 47 + - const: cpu 48 + - const: devices 49 + - const: gcb 50 + 51 + interrupts: 52 + minItems: 1 53 + items: 54 + - description: register based extraction 55 + - description: frame dma based extraction 56 + 57 + interrupt-names: 58 + minItems: 1 59 + items: 60 + - const: xtr 61 + - const: fdma 62 + 63 + resets: 64 + items: 65 + - description: Reset controller used for switch core reset (soft reset) 66 + 67 + reset-names: 68 + items: 69 + - const: switch 70 + 71 + mac-address: true 72 + 73 + ethernet-ports: 74 + type: object 75 + patternProperties: 76 + "^port@[0-9a-f]+$": 77 + type: object 78 + 79 + properties: 80 + '#address-cells': 81 + const: 1 82 + '#size-cells': 83 + const: 0 84 + 85 + reg: 86 + description: Switch port number 87 + 88 + phys: 89 + maxItems: 1 90 + description: 91 + phandle of a Ethernet SerDes PHY. This defines which SerDes 92 + instance will handle the Ethernet traffic. 93 + 94 + phy-mode: 95 + description: 96 + This specifies the interface used by the Ethernet SerDes towards 97 + the PHY or SFP. 98 + 99 + microchip,bandwidth: 100 + description: Specifies bandwidth in Mbit/s allocated to the port. 101 + $ref: "/schemas/types.yaml#/definitions/uint32" 102 + maximum: 25000 103 + 104 + phy-handle: 105 + description: 106 + phandle of a Ethernet PHY. This is optional and if provided it 107 + points to the cuPHY used by the Ethernet SerDes. 108 + 109 + sfp: 110 + description: 111 + phandle of an SFP. This is optional and used when not specifying 112 + a cuPHY. It points to the SFP node that describes the SFP used by 113 + the Ethernet SerDes. 114 + 115 + managed: true 116 + 117 + microchip,sd-sgpio: 118 + description: 119 + Index of the ports Signal Detect SGPIO in the set of 384 SGPIOs 120 + This is optional, and only needed if the default used index is 121 + is not correct. 122 + $ref: "/schemas/types.yaml#/definitions/uint32" 123 + minimum: 0 124 + maximum: 383 125 + 126 + required: 127 + - reg 128 + - phys 129 + - phy-mode 130 + - microchip,bandwidth 131 + 132 + oneOf: 133 + - required: 134 + - phy-handle 135 + - required: 136 + - sfp 137 + - managed 138 + 139 + required: 140 + - compatible 141 + - reg 142 + - reg-names 143 + - interrupts 144 + - interrupt-names 145 + - resets 146 + - reset-names 147 + - ethernet-ports 148 + 149 + additionalProperties: false 150 + 151 + examples: 152 + - | 153 + #include <dt-bindings/interrupt-controller/arm-gic.h> 154 + switch: switch@600000000 { 155 + compatible = "microchip,sparx5-switch"; 156 + reg = <0 0x401000>, 157 + <0x10004000 0x7fc000>, 158 + <0x11010000 0xaf0000>; 159 + reg-names = "cpu", "devices", "gcb"; 160 + interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>; 161 + interrupt-names = "xtr"; 162 + resets = <&reset 0>; 163 + reset-names = "switch"; 164 + ethernet-ports { 165 + #address-cells = <1>; 166 + #size-cells = <0>; 167 + 168 + port0: port@0 { 169 + reg = <0>; 170 + microchip,bandwidth = <1000>; 171 + phys = <&serdes 13>; 172 + phy-handle = <&phy0>; 173 + phy-mode = "qsgmii"; 174 + }; 175 + /* ... */ 176 + /* Then the 25G interfaces */ 177 + port60: port@60 { 178 + reg = <60>; 179 + microchip,bandwidth = <25000>; 180 + phys = <&serdes 29>; 181 + phy-mode = "10gbase-r"; 182 + sfp = <&sfp_eth60>; 183 + managed = "in-band-status"; 184 + microchip,sd-sgpio = <365>; 185 + }; 186 + port61: port@61 { 187 + reg = <61>; 188 + microchip,bandwidth = <25000>; 189 + phys = <&serdes 30>; 190 + phy-mode = "10gbase-r"; 191 + sfp = <&sfp_eth61>; 192 + managed = "in-band-status"; 193 + microchip,sd-sgpio = <369>; 194 + }; 195 + port62: port@62 { 196 + reg = <62>; 197 + microchip,bandwidth = <25000>; 198 + phys = <&serdes 31>; 199 + phy-mode = "10gbase-r"; 200 + sfp = <&sfp_eth62>; 201 + managed = "in-band-status"; 202 + microchip,sd-sgpio = <373>; 203 + }; 204 + port63: port@63 { 205 + reg = <63>; 206 + microchip,bandwidth = <25000>; 207 + phys = <&serdes 32>; 208 + phy-mode = "10gbase-r"; 209 + sfp = <&sfp_eth63>; 210 + managed = "in-band-status"; 211 + microchip,sd-sgpio = <377>; 212 + }; 213 + /* Finally the Management interface */ 214 + port64: port@64 { 215 + reg = <64>; 216 + microchip,bandwidth = <1000>; 217 + phys = <&serdes 0>; 218 + phy-handle = <&phy64>; 219 + phy-mode = "sgmii"; 220 + mac-address = [ 00 00 00 01 02 03 ]; 221 + }; 222 + }; 223 + }; 224 + 225 + ... 226 + # vim: set ts=2 sw=2 sts=2 tw=80 et cc=80 ft=yaml :
+92 -2
arch/arm64/boot/dts/microchip/sparx5.dtsi
··· 135 135 }; 136 136 }; 137 137 138 - reset@611010008 { 139 - compatible = "microchip,sparx5-chip-reset"; 138 + reset: reset-controller@611010008 { 139 + compatible = "microchip,sparx5-switch-reset"; 140 140 reg = <0x6 0x11010008 0x4>; 141 + reg-names = "gcb"; 142 + #reset-cells = <1>; 143 + cpu-syscon = <&cpu_ctrl>; 141 144 }; 142 145 143 146 uart0: serial@600100000 { ··· 278 275 "GPIO_46", "GPIO_47"; 279 276 function = "emmc"; 280 277 }; 278 + 279 + miim1_pins: miim1-pins { 280 + pins = "GPIO_56", "GPIO_57"; 281 + function = "miim"; 282 + }; 283 + 284 + miim2_pins: miim2-pins { 285 + pins = "GPIO_58", "GPIO_59"; 286 + function = "miim"; 287 + }; 288 + 289 + miim3_pins: miim3-pins { 290 + pins = "GPIO_52", "GPIO_53"; 291 + function = "miim"; 292 + }; 281 293 }; 282 294 283 295 sgpio0: gpio@61101036c { ··· 303 285 clocks = <&sys_clk>; 304 286 pinctrl-0 = <&sgpio0_pins>; 305 287 pinctrl-names = "default"; 288 + resets = <&reset 0>; 289 + reset-names = "switch"; 306 290 reg = <0x6 0x1101036c 0x100>; 307 291 sgpio_in0: gpio@0 { 308 292 compatible = "microchip,sparx5-sgpio-bank"; ··· 312 292 gpio-controller; 313 293 #gpio-cells = <3>; 314 294 ngpios = <96>; 295 + interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>; 296 + interrupt-controller; 297 + #interrupt-cells = <3>; 315 298 }; 316 299 sgpio_out0: gpio@1 { 317 300 compatible = "microchip,sparx5-sgpio-bank"; ··· 333 310 clocks = <&sys_clk>; 334 311 pinctrl-0 = <&sgpio1_pins>; 335 312 pinctrl-names = "default"; 313 + resets = <&reset 0>; 314 + reset-names = "switch"; 336 315 reg = <0x6 0x11010484 0x100>; 337 316 sgpio_in1: gpio@0 { 338 317 compatible = "microchip,sparx5-sgpio-bank"; ··· 342 317 gpio-controller; 343 318 #gpio-cells = <3>; 344 319 ngpios = <96>; 320 + interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>; 321 + interrupt-controller; 322 + #interrupt-cells = <3>; 345 323 }; 346 324 sgpio_out1: gpio@1 { 347 325 compatible = "microchip,sparx5-sgpio-bank"; ··· 363 335 clocks = <&sys_clk>; 364 336 pinctrl-0 = <&sgpio2_pins>; 365 337 pinctrl-names = "default"; 338 + resets = <&reset 0>; 339 + reset-names = "switch"; 366 340 reg = <0x6 0x1101059c 0x100>; 367 341 sgpio_in2: gpio@0 { 368 342 reg = <0>; ··· 372 342 gpio-controller; 373 343 #gpio-cells = <3>; 374 344 ngpios = <96>; 345 + interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>; 346 + interrupt-controller; 347 + #interrupt-cells = <3>; 375 348 }; 376 349 sgpio_out2: gpio@1 { 377 350 compatible = "microchip,sparx5-sgpio-bank"; ··· 418 385 reg = <0x6 0x10508110 0xc>; 419 386 #thermal-sensor-cells = <0>; 420 387 clocks = <&ahb_clk>; 388 + }; 389 + 390 + mdio0: mdio@6110102b0 { 391 + compatible = "mscc,ocelot-miim"; 392 + status = "disabled"; 393 + #address-cells = <1>; 394 + #size-cells = <0>; 395 + reg = <0x6 0x110102b0 0x24>; 396 + }; 397 + 398 + mdio1: mdio@6110102d4 { 399 + compatible = "mscc,ocelot-miim"; 400 + status = "disabled"; 401 + pinctrl-0 = <&miim1_pins>; 402 + pinctrl-names = "default"; 403 + #address-cells = <1>; 404 + #size-cells = <0>; 405 + reg = <0x6 0x110102d4 0x24>; 406 + }; 407 + 408 + mdio2: mdio@6110102f8 { 409 + compatible = "mscc,ocelot-miim"; 410 + status = "disabled"; 411 + pinctrl-0 = <&miim2_pins>; 412 + pinctrl-names = "default"; 413 + #address-cells = <1>; 414 + #size-cells = <0>; 415 + reg = <0x6 0x110102d4 0x24>; 416 + }; 417 + 418 + mdio3: mdio@61101031c { 419 + compatible = "mscc,ocelot-miim"; 420 + status = "disabled"; 421 + pinctrl-0 = <&miim3_pins>; 422 + pinctrl-names = "default"; 423 + #address-cells = <1>; 424 + #size-cells = <0>; 425 + reg = <0x6 0x1101031c 0x24>; 426 + }; 427 + 428 + serdes: serdes@10808000 { 429 + compatible = "microchip,sparx5-serdes"; 430 + #phy-cells = <1>; 431 + clocks = <&sys_clk>; 432 + reg = <0x6 0x10808000 0x5d0000>; 433 + }; 434 + 435 + switch: switch@0x600000000 { 436 + compatible = "microchip,sparx5-switch"; 437 + reg = <0x6 0 0x401000>, 438 + <0x6 0x10004000 0x7fc000>, 439 + <0x6 0x11010000 0xaf0000>; 440 + reg-names = "cpu", "dev", "gcb"; 441 + interrupt-names = "xtr"; 442 + interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>; 443 + resets = <&reset 0>; 444 + reset-names = "switch"; 421 445 }; 422 446 }; 423 447 };
+423 -58
arch/arm64/boot/dts/microchip/sparx5_pcb134_board.dtsi
··· 7 7 #include "sparx5_pcb_common.dtsi" 8 8 9 9 /{ 10 - aliases { 11 - i2c0 = &i2c0; 12 - i2c100 = &i2c100; 13 - i2c101 = &i2c101; 14 - i2c102 = &i2c102; 15 - i2c103 = &i2c103; 16 - i2c104 = &i2c104; 17 - i2c105 = &i2c105; 18 - i2c106 = &i2c106; 19 - i2c107 = &i2c107; 20 - i2c108 = &i2c108; 21 - i2c109 = &i2c109; 22 - i2c110 = &i2c110; 23 - i2c111 = &i2c111; 24 - i2c112 = &i2c112; 25 - i2c113 = &i2c113; 26 - i2c114 = &i2c114; 27 - i2c115 = &i2c115; 28 - i2c116 = &i2c116; 29 - i2c117 = &i2c117; 30 - i2c118 = &i2c118; 31 - i2c119 = &i2c119; 32 - }; 33 - 34 10 gpio-restart { 35 11 compatible = "gpio-restart"; 36 12 gpios = <&gpio 37 GPIO_ACTIVE_LOW>; ··· 274 298 275 299 &spi0 { 276 300 status = "okay"; 277 - spi@0 { 278 - compatible = "spi-mux"; 279 - mux-controls = <&mux>; 280 - #address-cells = <1>; 281 - #size-cells = <0>; 282 - reg = <0>; /* CS0 */ 283 - spi-flash@9 { 284 - compatible = "jedec,spi-nor"; 285 - spi-max-frequency = <8000000>; 286 - reg = <0x9>; /* SPI */ 287 - }; 301 + spi-flash@0 { 302 + compatible = "jedec,spi-nor"; 303 + spi-max-frequency = <8000000>; 304 + reg = <0>; 288 305 }; 289 306 }; 290 307 ··· 295 326 reg = <0x9>; /* SPI */ 296 327 }; 297 328 }; 329 + }; 330 + 331 + &sgpio0 { 332 + status = "okay"; 333 + microchip,sgpio-port-ranges = <8 15>; 334 + gpio@0 { 335 + ngpios = <64>; 336 + }; 337 + gpio@1 { 338 + ngpios = <64>; 339 + }; 340 + }; 341 + 342 + &sgpio1 { 343 + status = "okay"; 344 + microchip,sgpio-port-ranges = <24 31>; 345 + gpio@0 { 346 + ngpios = <64>; 347 + }; 348 + gpio@1 { 349 + ngpios = <64>; 350 + }; 351 + }; 352 + 353 + &sgpio2 { 354 + status = "okay"; 355 + microchip,sgpio-port-ranges = <0 0>, <11 31>; 298 356 }; 299 357 300 358 &gpio { ··· 411 415 412 416 &i2c0_imux { 413 417 pinctrl-names = 414 - "i2c100", "i2c101", "i2c102", "i2c103", 415 - "i2c104", "i2c105", "i2c106", "i2c107", 416 - "i2c108", "i2c109", "i2c110", "i2c111", "idle"; 418 + "i2c_sfp1", "i2c_sfp2", "i2c_sfp3", "i2c_sfp4", 419 + "i2c_sfp5", "i2c_sfp6", "i2c_sfp7", "i2c_sfp8", 420 + "i2c_sfp9", "i2c_sfp10", "i2c_sfp11", "i2c_sfp12", "idle"; 417 421 pinctrl-0 = <&i2cmux_0>; 418 422 pinctrl-1 = <&i2cmux_1>; 419 423 pinctrl-2 = <&i2cmux_2>; ··· 427 431 pinctrl-10 = <&i2cmux_10>; 428 432 pinctrl-11 = <&i2cmux_11>; 429 433 pinctrl-12 = <&i2cmux_pins_i>; 430 - i2c100: i2c_sfp1 { 434 + i2c_sfp1: i2c_sfp1 { 431 435 reg = <0x0>; 432 436 #address-cells = <1>; 433 437 #size-cells = <0>; 434 438 }; 435 - i2c101: i2c_sfp2 { 439 + i2c_sfp2: i2c_sfp2 { 436 440 reg = <0x1>; 437 441 #address-cells = <1>; 438 442 #size-cells = <0>; 439 443 }; 440 - i2c102: i2c_sfp3 { 444 + i2c_sfp3: i2c_sfp3 { 441 445 reg = <0x2>; 442 446 #address-cells = <1>; 443 447 #size-cells = <0>; 444 448 }; 445 - i2c103: i2c_sfp4 { 449 + i2c_sfp4: i2c_sfp4 { 446 450 reg = <0x3>; 447 451 #address-cells = <1>; 448 452 #size-cells = <0>; 449 453 }; 450 - i2c104: i2c_sfp5 { 454 + i2c_sfp5: i2c_sfp5 { 451 455 reg = <0x4>; 452 456 #address-cells = <1>; 453 457 #size-cells = <0>; 454 458 }; 455 - i2c105: i2c_sfp6 { 459 + i2c_sfp6: i2c_sfp6 { 456 460 reg = <0x5>; 457 461 #address-cells = <1>; 458 462 #size-cells = <0>; 459 463 }; 460 - i2c106: i2c_sfp7 { 464 + i2c_sfp7: i2c_sfp7 { 461 465 reg = <0x6>; 462 466 #address-cells = <1>; 463 467 #size-cells = <0>; 464 468 }; 465 - i2c107: i2c_sfp8 { 469 + i2c_sfp8: i2c_sfp8 { 466 470 reg = <0x7>; 467 471 #address-cells = <1>; 468 472 #size-cells = <0>; 469 473 }; 470 - i2c108: i2c_sfp9 { 474 + i2c_sfp9: i2c_sfp9 { 471 475 reg = <0x8>; 472 476 #address-cells = <1>; 473 477 #size-cells = <0>; 474 478 }; 475 - i2c109: i2c_sfp10 { 479 + i2c_sfp10: i2c_sfp10 { 476 480 reg = <0x9>; 477 481 #address-cells = <1>; 478 482 #size-cells = <0>; 479 483 }; 480 - i2c110: i2c_sfp11 { 484 + i2c_sfp11: i2c_sfp11 { 481 485 reg = <0xa>; 482 486 #address-cells = <1>; 483 487 #size-cells = <0>; 484 488 }; 485 - i2c111: i2c_sfp12 { 489 + i2c_sfp12: i2c_sfp12 { 486 490 reg = <0xb>; 487 491 #address-cells = <1>; 488 492 #size-cells = <0>; ··· 495 499 &gpio 61 GPIO_ACTIVE_HIGH 496 500 &gpio 54 GPIO_ACTIVE_HIGH>; 497 501 idle-state = <0x8>; 498 - i2c112: i2c_sfp13 { 502 + i2c_sfp13: i2c_sfp13 { 499 503 reg = <0x0>; 500 504 #address-cells = <1>; 501 505 #size-cells = <0>; 502 506 }; 503 - i2c113: i2c_sfp14 { 507 + i2c_sfp14: i2c_sfp14 { 504 508 reg = <0x1>; 505 509 #address-cells = <1>; 506 510 #size-cells = <0>; 507 511 }; 508 - i2c114: i2c_sfp15 { 512 + i2c_sfp15: i2c_sfp15 { 509 513 reg = <0x2>; 510 514 #address-cells = <1>; 511 515 #size-cells = <0>; 512 516 }; 513 - i2c115: i2c_sfp16 { 517 + i2c_sfp16: i2c_sfp16 { 514 518 reg = <0x3>; 515 519 #address-cells = <1>; 516 520 #size-cells = <0>; 517 521 }; 518 - i2c116: i2c_sfp17 { 522 + i2c_sfp17: i2c_sfp17 { 519 523 reg = <0x4>; 520 524 #address-cells = <1>; 521 525 #size-cells = <0>; 522 526 }; 523 - i2c117: i2c_sfp18 { 527 + i2c_sfp18: i2c_sfp18 { 524 528 reg = <0x5>; 525 529 #address-cells = <1>; 526 530 #size-cells = <0>; 527 531 }; 528 - i2c118: i2c_sfp19 { 532 + i2c_sfp19: i2c_sfp19 { 529 533 reg = <0x6>; 530 534 #address-cells = <1>; 531 535 #size-cells = <0>; 532 536 }; 533 - i2c119: i2c_sfp20 { 537 + i2c_sfp20: i2c_sfp20 { 534 538 reg = <0x7>; 535 539 #address-cells = <1>; 536 540 #size-cells = <0>; 541 + }; 542 + }; 543 + 544 + &mdio3 { 545 + status = "ok"; 546 + phy64: ethernet-phy@64 { 547 + reg = <28>; 548 + }; 549 + }; 550 + 551 + &axi { 552 + sfp_eth12: sfp-eth12 { 553 + compatible = "sff,sfp"; 554 + i2c-bus = <&i2c_sfp1>; 555 + tx-disable-gpios = <&sgpio_out2 11 1 GPIO_ACTIVE_LOW>; 556 + los-gpios = <&sgpio_in2 11 1 GPIO_ACTIVE_HIGH>; 557 + mod-def0-gpios = <&sgpio_in2 11 2 GPIO_ACTIVE_LOW>; 558 + tx-fault-gpios = <&sgpio_in2 12 0 GPIO_ACTIVE_HIGH>; 559 + }; 560 + sfp_eth13: sfp-eth13 { 561 + compatible = "sff,sfp"; 562 + i2c-bus = <&i2c_sfp2>; 563 + tx-disable-gpios = <&sgpio_out2 12 1 GPIO_ACTIVE_LOW>; 564 + los-gpios = <&sgpio_in2 12 1 GPIO_ACTIVE_HIGH>; 565 + mod-def0-gpios = <&sgpio_in2 12 2 GPIO_ACTIVE_LOW>; 566 + tx-fault-gpios = <&sgpio_in2 13 0 GPIO_ACTIVE_HIGH>; 567 + }; 568 + sfp_eth14: sfp-eth14 { 569 + compatible = "sff,sfp"; 570 + i2c-bus = <&i2c_sfp3>; 571 + tx-disable-gpios = <&sgpio_out2 13 1 GPIO_ACTIVE_LOW>; 572 + los-gpios = <&sgpio_in2 13 1 GPIO_ACTIVE_HIGH>; 573 + mod-def0-gpios = <&sgpio_in2 13 2 GPIO_ACTIVE_LOW>; 574 + tx-fault-gpios = <&sgpio_in2 14 0 GPIO_ACTIVE_HIGH>; 575 + }; 576 + sfp_eth15: sfp-eth15 { 577 + compatible = "sff,sfp"; 578 + i2c-bus = <&i2c_sfp4>; 579 + tx-disable-gpios = <&sgpio_out2 14 1 GPIO_ACTIVE_LOW>; 580 + los-gpios = <&sgpio_in2 14 1 GPIO_ACTIVE_HIGH>; 581 + mod-def0-gpios = <&sgpio_in2 14 2 GPIO_ACTIVE_LOW>; 582 + tx-fault-gpios = <&sgpio_in2 15 0 GPIO_ACTIVE_HIGH>; 583 + }; 584 + sfp_eth48: sfp-eth48 { 585 + compatible = "sff,sfp"; 586 + i2c-bus = <&i2c_sfp5>; 587 + tx-disable-gpios = <&sgpio_out2 15 1 GPIO_ACTIVE_LOW>; 588 + los-gpios = <&sgpio_in2 15 1 GPIO_ACTIVE_HIGH>; 589 + mod-def0-gpios = <&sgpio_in2 15 2 GPIO_ACTIVE_LOW>; 590 + tx-fault-gpios = <&sgpio_in2 16 0 GPIO_ACTIVE_HIGH>; 591 + }; 592 + sfp_eth49: sfp-eth49 { 593 + compatible = "sff,sfp"; 594 + i2c-bus = <&i2c_sfp6>; 595 + tx-disable-gpios = <&sgpio_out2 16 1 GPIO_ACTIVE_LOW>; 596 + los-gpios = <&sgpio_in2 16 1 GPIO_ACTIVE_HIGH>; 597 + mod-def0-gpios = <&sgpio_in2 16 2 GPIO_ACTIVE_LOW>; 598 + tx-fault-gpios = <&sgpio_in2 17 0 GPIO_ACTIVE_HIGH>; 599 + }; 600 + sfp_eth50: sfp-eth50 { 601 + compatible = "sff,sfp"; 602 + i2c-bus = <&i2c_sfp7>; 603 + tx-disable-gpios = <&sgpio_out2 17 1 GPIO_ACTIVE_LOW>; 604 + los-gpios = <&sgpio_in2 17 1 GPIO_ACTIVE_HIGH>; 605 + mod-def0-gpios = <&sgpio_in2 17 2 GPIO_ACTIVE_LOW>; 606 + tx-fault-gpios = <&sgpio_in2 18 0 GPIO_ACTIVE_HIGH>; 607 + }; 608 + sfp_eth51: sfp-eth51 { 609 + compatible = "sff,sfp"; 610 + i2c-bus = <&i2c_sfp8>; 611 + tx-disable-gpios = <&sgpio_out2 18 1 GPIO_ACTIVE_LOW>; 612 + los-gpios = <&sgpio_in2 18 1 GPIO_ACTIVE_HIGH>; 613 + mod-def0-gpios = <&sgpio_in2 18 2 GPIO_ACTIVE_LOW>; 614 + tx-fault-gpios = <&sgpio_in2 19 0 GPIO_ACTIVE_HIGH>; 615 + }; 616 + sfp_eth52: sfp-eth52 { 617 + compatible = "sff,sfp"; 618 + i2c-bus = <&i2c_sfp9>; 619 + tx-disable-gpios = <&sgpio_out2 19 1 GPIO_ACTIVE_LOW>; 620 + los-gpios = <&sgpio_in2 19 1 GPIO_ACTIVE_HIGH>; 621 + mod-def0-gpios = <&sgpio_in2 19 2 GPIO_ACTIVE_LOW>; 622 + tx-fault-gpios = <&sgpio_in2 20 0 GPIO_ACTIVE_HIGH>; 623 + }; 624 + sfp_eth53: sfp-eth53 { 625 + compatible = "sff,sfp"; 626 + i2c-bus = <&i2c_sfp10>; 627 + tx-disable-gpios = <&sgpio_out2 20 1 GPIO_ACTIVE_LOW>; 628 + los-gpios = <&sgpio_in2 20 1 GPIO_ACTIVE_HIGH>; 629 + mod-def0-gpios = <&sgpio_in2 20 2 GPIO_ACTIVE_LOW>; 630 + tx-fault-gpios = <&sgpio_in2 21 0 GPIO_ACTIVE_HIGH>; 631 + }; 632 + sfp_eth54: sfp-eth54 { 633 + compatible = "sff,sfp"; 634 + i2c-bus = <&i2c_sfp11>; 635 + tx-disable-gpios = <&sgpio_out2 21 1 GPIO_ACTIVE_LOW>; 636 + los-gpios = <&sgpio_in2 21 1 GPIO_ACTIVE_HIGH>; 637 + mod-def0-gpios = <&sgpio_in2 21 2 GPIO_ACTIVE_LOW>; 638 + tx-fault-gpios = <&sgpio_in2 22 0 GPIO_ACTIVE_HIGH>; 639 + }; 640 + sfp_eth55: sfp-eth55 { 641 + compatible = "sff,sfp"; 642 + i2c-bus = <&i2c_sfp12>; 643 + tx-disable-gpios = <&sgpio_out2 22 1 GPIO_ACTIVE_LOW>; 644 + los-gpios = <&sgpio_in2 22 1 GPIO_ACTIVE_HIGH>; 645 + mod-def0-gpios = <&sgpio_in2 22 2 GPIO_ACTIVE_LOW>; 646 + tx-fault-gpios = <&sgpio_in2 23 0 GPIO_ACTIVE_HIGH>; 647 + }; 648 + sfp_eth56: sfp-eth56 { 649 + compatible = "sff,sfp"; 650 + i2c-bus = <&i2c_sfp13>; 651 + tx-disable-gpios = <&sgpio_out2 23 1 GPIO_ACTIVE_LOW>; 652 + los-gpios = <&sgpio_in2 23 1 GPIO_ACTIVE_HIGH>; 653 + mod-def0-gpios = <&sgpio_in2 23 2 GPIO_ACTIVE_LOW>; 654 + tx-fault-gpios = <&sgpio_in2 24 0 GPIO_ACTIVE_HIGH>; 655 + }; 656 + sfp_eth57: sfp-eth57 { 657 + compatible = "sff,sfp"; 658 + i2c-bus = <&i2c_sfp14>; 659 + tx-disable-gpios = <&sgpio_out2 24 1 GPIO_ACTIVE_LOW>; 660 + los-gpios = <&sgpio_in2 24 1 GPIO_ACTIVE_HIGH>; 661 + mod-def0-gpios = <&sgpio_in2 24 2 GPIO_ACTIVE_LOW>; 662 + tx-fault-gpios = <&sgpio_in2 25 0 GPIO_ACTIVE_HIGH>; 663 + }; 664 + sfp_eth58: sfp-eth58 { 665 + compatible = "sff,sfp"; 666 + i2c-bus = <&i2c_sfp15>; 667 + tx-disable-gpios = <&sgpio_out2 25 1 GPIO_ACTIVE_LOW>; 668 + los-gpios = <&sgpio_in2 25 1 GPIO_ACTIVE_HIGH>; 669 + mod-def0-gpios = <&sgpio_in2 25 2 GPIO_ACTIVE_LOW>; 670 + tx-fault-gpios = <&sgpio_in2 26 0 GPIO_ACTIVE_HIGH>; 671 + }; 672 + sfp_eth59: sfp-eth59 { 673 + compatible = "sff,sfp"; 674 + i2c-bus = <&i2c_sfp16>; 675 + tx-disable-gpios = <&sgpio_out2 26 1 GPIO_ACTIVE_LOW>; 676 + los-gpios = <&sgpio_in2 26 1 GPIO_ACTIVE_HIGH>; 677 + mod-def0-gpios = <&sgpio_in2 26 2 GPIO_ACTIVE_LOW>; 678 + tx-fault-gpios = <&sgpio_in2 27 0 GPIO_ACTIVE_HIGH>; 679 + }; 680 + sfp_eth60: sfp-eth60 { 681 + compatible = "sff,sfp"; 682 + i2c-bus = <&i2c_sfp17>; 683 + tx-disable-gpios = <&sgpio_out2 27 1 GPIO_ACTIVE_LOW>; 684 + los-gpios = <&sgpio_in2 27 1 GPIO_ACTIVE_HIGH>; 685 + mod-def0-gpios = <&sgpio_in2 27 2 GPIO_ACTIVE_LOW>; 686 + tx-fault-gpios = <&sgpio_in2 28 0 GPIO_ACTIVE_HIGH>; 687 + }; 688 + sfp_eth61: sfp-eth61 { 689 + compatible = "sff,sfp"; 690 + i2c-bus = <&i2c_sfp18>; 691 + tx-disable-gpios = <&sgpio_out2 28 1 GPIO_ACTIVE_LOW>; 692 + los-gpios = <&sgpio_in2 28 1 GPIO_ACTIVE_HIGH>; 693 + mod-def0-gpios = <&sgpio_in2 28 2 GPIO_ACTIVE_LOW>; 694 + tx-fault-gpios = <&sgpio_in2 29 0 GPIO_ACTIVE_HIGH>; 695 + }; 696 + sfp_eth62: sfp-eth62 { 697 + compatible = "sff,sfp"; 698 + i2c-bus = <&i2c_sfp19>; 699 + tx-disable-gpios = <&sgpio_out2 29 1 GPIO_ACTIVE_LOW>; 700 + los-gpios = <&sgpio_in2 29 1 GPIO_ACTIVE_HIGH>; 701 + mod-def0-gpios = <&sgpio_in2 29 2 GPIO_ACTIVE_LOW>; 702 + tx-fault-gpios = <&sgpio_in2 30 0 GPIO_ACTIVE_HIGH>; 703 + }; 704 + sfp_eth63: sfp-eth63 { 705 + compatible = "sff,sfp"; 706 + i2c-bus = <&i2c_sfp20>; 707 + tx-disable-gpios = <&sgpio_out2 30 1 GPIO_ACTIVE_LOW>; 708 + los-gpios = <&sgpio_in2 30 1 GPIO_ACTIVE_HIGH>; 709 + mod-def0-gpios = <&sgpio_in2 30 2 GPIO_ACTIVE_LOW>; 710 + tx-fault-gpios = <&sgpio_in2 31 0 GPIO_ACTIVE_HIGH>; 711 + }; 712 + }; 713 + 714 + &switch { 715 + ethernet-ports { 716 + #address-cells = <1>; 717 + #size-cells = <0>; 718 + 719 + /* 10G SFPs */ 720 + port12: port@12 { 721 + reg = <12>; 722 + microchip,bandwidth = <10000>; 723 + phys = <&serdes 13>; 724 + phy-mode = "10gbase-r"; 725 + sfp = <&sfp_eth12>; 726 + microchip,sd-sgpio = <301>; 727 + managed = "in-band-status"; 728 + }; 729 + port13: port@13 { 730 + reg = <13>; 731 + /* Example: CU SFP, 1G speed */ 732 + microchip,bandwidth = <10000>; 733 + phys = <&serdes 14>; 734 + phy-mode = "10gbase-r"; 735 + sfp = <&sfp_eth13>; 736 + microchip,sd-sgpio = <305>; 737 + managed = "in-band-status"; 738 + }; 739 + port14: port@14 { 740 + reg = <14>; 741 + microchip,bandwidth = <10000>; 742 + phys = <&serdes 15>; 743 + phy-mode = "10gbase-r"; 744 + sfp = <&sfp_eth14>; 745 + microchip,sd-sgpio = <309>; 746 + managed = "in-band-status"; 747 + }; 748 + port15: port@15 { 749 + reg = <15>; 750 + microchip,bandwidth = <10000>; 751 + phys = <&serdes 16>; 752 + phy-mode = "10gbase-r"; 753 + sfp = <&sfp_eth15>; 754 + microchip,sd-sgpio = <313>; 755 + managed = "in-band-status"; 756 + }; 757 + port48: port@48 { 758 + reg = <48>; 759 + microchip,bandwidth = <10000>; 760 + phys = <&serdes 17>; 761 + phy-mode = "10gbase-r"; 762 + sfp = <&sfp_eth48>; 763 + microchip,sd-sgpio = <317>; 764 + managed = "in-band-status"; 765 + }; 766 + port49: port@49 { 767 + reg = <49>; 768 + microchip,bandwidth = <10000>; 769 + phys = <&serdes 18>; 770 + phy-mode = "10gbase-r"; 771 + sfp = <&sfp_eth49>; 772 + microchip,sd-sgpio = <321>; 773 + managed = "in-band-status"; 774 + }; 775 + port50: port@50 { 776 + reg = <50>; 777 + microchip,bandwidth = <10000>; 778 + phys = <&serdes 19>; 779 + phy-mode = "10gbase-r"; 780 + sfp = <&sfp_eth50>; 781 + microchip,sd-sgpio = <325>; 782 + managed = "in-band-status"; 783 + }; 784 + port51: port@51 { 785 + reg = <51>; 786 + microchip,bandwidth = <10000>; 787 + phys = <&serdes 20>; 788 + phy-mode = "10gbase-r"; 789 + sfp = <&sfp_eth51>; 790 + microchip,sd-sgpio = <329>; 791 + managed = "in-band-status"; 792 + }; 793 + port52: port@52 { 794 + reg = <52>; 795 + microchip,bandwidth = <10000>; 796 + phys = <&serdes 21>; 797 + phy-mode = "10gbase-r"; 798 + sfp = <&sfp_eth52>; 799 + microchip,sd-sgpio = <333>; 800 + managed = "in-band-status"; 801 + }; 802 + port53: port@53 { 803 + reg = <53>; 804 + microchip,bandwidth = <10000>; 805 + phys = <&serdes 22>; 806 + phy-mode = "10gbase-r"; 807 + sfp = <&sfp_eth53>; 808 + microchip,sd-sgpio = <337>; 809 + managed = "in-band-status"; 810 + }; 811 + port54: port@54 { 812 + reg = <54>; 813 + microchip,bandwidth = <10000>; 814 + phys = <&serdes 23>; 815 + phy-mode = "10gbase-r"; 816 + sfp = <&sfp_eth54>; 817 + microchip,sd-sgpio = <341>; 818 + managed = "in-band-status"; 819 + }; 820 + port55: port@55 { 821 + reg = <55>; 822 + microchip,bandwidth = <10000>; 823 + phys = <&serdes 24>; 824 + phy-mode = "10gbase-r"; 825 + sfp = <&sfp_eth55>; 826 + microchip,sd-sgpio = <345>; 827 + managed = "in-band-status"; 828 + }; 829 + /* 25G SFPs */ 830 + port56: port@56 { 831 + reg = <56>; 832 + microchip,bandwidth = <10000>; 833 + phys = <&serdes 25>; 834 + phy-mode = "10gbase-r"; 835 + sfp = <&sfp_eth56>; 836 + microchip,sd-sgpio = <349>; 837 + managed = "in-band-status"; 838 + }; 839 + port57: port@57 { 840 + reg = <57>; 841 + microchip,bandwidth = <10000>; 842 + phys = <&serdes 26>; 843 + phy-mode = "10gbase-r"; 844 + sfp = <&sfp_eth57>; 845 + microchip,sd-sgpio = <353>; 846 + managed = "in-band-status"; 847 + }; 848 + port58: port@58 { 849 + reg = <58>; 850 + microchip,bandwidth = <10000>; 851 + phys = <&serdes 27>; 852 + phy-mode = "10gbase-r"; 853 + sfp = <&sfp_eth58>; 854 + microchip,sd-sgpio = <357>; 855 + managed = "in-band-status"; 856 + }; 857 + port59: port@59 { 858 + reg = <59>; 859 + microchip,bandwidth = <10000>; 860 + phys = <&serdes 28>; 861 + phy-mode = "10gbase-r"; 862 + sfp = <&sfp_eth59>; 863 + microchip,sd-sgpio = <361>; 864 + managed = "in-band-status"; 865 + }; 866 + port60: port@60 { 867 + reg = <60>; 868 + microchip,bandwidth = <10000>; 869 + phys = <&serdes 29>; 870 + phy-mode = "10gbase-r"; 871 + sfp = <&sfp_eth60>; 872 + microchip,sd-sgpio = <365>; 873 + managed = "in-band-status"; 874 + }; 875 + port61: port@61 { 876 + reg = <61>; 877 + microchip,bandwidth = <10000>; 878 + phys = <&serdes 30>; 879 + phy-mode = "10gbase-r"; 880 + sfp = <&sfp_eth61>; 881 + microchip,sd-sgpio = <369>; 882 + managed = "in-band-status"; 883 + }; 884 + port62: port@62 { 885 + reg = <62>; 886 + microchip,bandwidth = <10000>; 887 + phys = <&serdes 31>; 888 + phy-mode = "10gbase-r"; 889 + sfp = <&sfp_eth62>; 890 + microchip,sd-sgpio = <373>; 891 + managed = "in-band-status"; 892 + }; 893 + port63: port@63 { 894 + reg = <63>; 895 + microchip,bandwidth = <10000>; 896 + phys = <&serdes 32>; 897 + phy-mode = "10gbase-r"; 898 + sfp = <&sfp_eth63>; 899 + microchip,sd-sgpio = <377>; 900 + managed = "in-band-status"; 901 + }; 902 + /* Finally the Management interface */ 903 + port64: port@64 { 904 + reg = <64>; 905 + microchip,bandwidth = <1000>; 906 + phys = <&serdes 0>; 907 + phy-handle = <&phy64>; 908 + phy-mode = "sgmii"; 909 + }; 537 910 }; 538 911 };
+597 -24
arch/arm64/boot/dts/microchip/sparx5_pcb135_board.dtsi
··· 7 7 #include "sparx5_pcb_common.dtsi" 8 8 9 9 /{ 10 - aliases { 11 - i2c0 = &i2c0; 12 - i2c152 = &i2c152; 13 - i2c153 = &i2c153; 14 - i2c154 = &i2c154; 15 - i2c155 = &i2c155; 16 - }; 17 - 18 10 gpio-restart { 19 11 compatible = "gpio-restart"; 20 12 gpios = <&gpio 37 GPIO_ACTIVE_LOW>; ··· 89 97 90 98 &spi0 { 91 99 status = "okay"; 92 - spi@0 { 93 - compatible = "spi-mux"; 94 - mux-controls = <&mux>; 95 - #address-cells = <1>; 96 - #size-cells = <0>; 97 - reg = <0>; /* CS0 */ 98 - spi-flash@9 { 99 - compatible = "jedec,spi-nor"; 100 - spi-max-frequency = <8000000>; 101 - reg = <0x9>; /* SPI */ 102 - }; 100 + spi-flash@0 { 101 + compatible = "jedec,spi-nor"; 102 + spi-max-frequency = <8000000>; 103 + reg = <0>; 103 104 }; 104 105 }; 105 106 ··· 123 138 }; 124 139 }; 125 140 141 + &sgpio2 { 142 + status = "okay"; 143 + microchip,sgpio-port-ranges = <0 0>, <16 18>, <28 31>; 144 + }; 145 + 126 146 &axi { 127 147 i2c0_imux: i2c0-imux@0 { 128 148 compatible = "i2c-mux-pinctrl"; ··· 139 149 140 150 &i2c0_imux { 141 151 pinctrl-names = 142 - "i2c152", "i2c153", "i2c154", "i2c155", 152 + "i2c_sfp1", "i2c_sfp2", "i2c_sfp3", "i2c_sfp4", 143 153 "idle"; 144 154 pinctrl-0 = <&i2cmux_s29>; 145 155 pinctrl-1 = <&i2cmux_s30>; 146 156 pinctrl-2 = <&i2cmux_s31>; 147 157 pinctrl-3 = <&i2cmux_s32>; 148 158 pinctrl-4 = <&i2cmux_pins_i>; 149 - i2c152: i2c_sfp1 { 159 + i2c_sfp1: i2c_sfp1 { 150 160 reg = <0x0>; 151 161 #address-cells = <1>; 152 162 #size-cells = <0>; 153 163 }; 154 - i2c153: i2c_sfp2 { 164 + i2c_sfp2: i2c_sfp2 { 155 165 reg = <0x1>; 156 166 #address-cells = <1>; 157 167 #size-cells = <0>; 158 168 }; 159 - i2c154: i2c_sfp3 { 169 + i2c_sfp3: i2c_sfp3 { 160 170 reg = <0x2>; 161 171 #address-cells = <1>; 162 172 #size-cells = <0>; 163 173 }; 164 - i2c155: i2c_sfp4 { 174 + i2c_sfp4: i2c_sfp4 { 165 175 reg = <0x3>; 166 176 #address-cells = <1>; 167 177 #size-cells = <0>; 178 + }; 179 + }; 180 + 181 + &axi { 182 + sfp_eth60: sfp-eth60 { 183 + compatible = "sff,sfp"; 184 + i2c-bus = <&i2c_sfp1>; 185 + tx-disable-gpios = <&sgpio_out2 28 0 GPIO_ACTIVE_LOW>; 186 + rate-select0-gpios = <&sgpio_out2 28 1 GPIO_ACTIVE_HIGH>; 187 + los-gpios = <&sgpio_in2 28 0 GPIO_ACTIVE_HIGH>; 188 + mod-def0-gpios = <&sgpio_in2 28 1 GPIO_ACTIVE_LOW>; 189 + tx-fault-gpios = <&sgpio_in2 28 2 GPIO_ACTIVE_HIGH>; 190 + }; 191 + sfp_eth61: sfp-eth61 { 192 + compatible = "sff,sfp"; 193 + i2c-bus = <&i2c_sfp2>; 194 + tx-disable-gpios = <&sgpio_out2 29 0 GPIO_ACTIVE_LOW>; 195 + rate-select0-gpios = <&sgpio_out2 29 1 GPIO_ACTIVE_HIGH>; 196 + los-gpios = <&sgpio_in2 29 0 GPIO_ACTIVE_HIGH>; 197 + mod-def0-gpios = <&sgpio_in2 29 1 GPIO_ACTIVE_LOW>; 198 + tx-fault-gpios = <&sgpio_in2 29 2 GPIO_ACTIVE_HIGH>; 199 + }; 200 + sfp_eth62: sfp-eth62 { 201 + compatible = "sff,sfp"; 202 + i2c-bus = <&i2c_sfp3>; 203 + tx-disable-gpios = <&sgpio_out2 30 0 GPIO_ACTIVE_LOW>; 204 + rate-select0-gpios = <&sgpio_out2 30 1 GPIO_ACTIVE_HIGH>; 205 + los-gpios = <&sgpio_in2 30 0 GPIO_ACTIVE_HIGH>; 206 + mod-def0-gpios = <&sgpio_in2 30 1 GPIO_ACTIVE_LOW>; 207 + tx-fault-gpios = <&sgpio_in2 30 2 GPIO_ACTIVE_HIGH>; 208 + }; 209 + sfp_eth63: sfp-eth63 { 210 + compatible = "sff,sfp"; 211 + i2c-bus = <&i2c_sfp4>; 212 + tx-disable-gpios = <&sgpio_out2 31 0 GPIO_ACTIVE_LOW>; 213 + rate-select0-gpios = <&sgpio_out2 31 1 GPIO_ACTIVE_HIGH>; 214 + los-gpios = <&sgpio_in2 31 0 GPIO_ACTIVE_HIGH>; 215 + mod-def0-gpios = <&sgpio_in2 31 1 GPIO_ACTIVE_LOW>; 216 + tx-fault-gpios = <&sgpio_in2 31 2 GPIO_ACTIVE_HIGH>; 217 + }; 218 + }; 219 + 220 + &mdio0 { 221 + status = "ok"; 222 + phy0: ethernet-phy@0 { 223 + reg = <0>; 224 + }; 225 + phy1: ethernet-phy@1 { 226 + reg = <1>; 227 + }; 228 + phy2: ethernet-phy@2 { 229 + reg = <2>; 230 + }; 231 + phy3: ethernet-phy@3 { 232 + reg = <3>; 233 + }; 234 + phy4: ethernet-phy@4 { 235 + reg = <4>; 236 + }; 237 + phy5: ethernet-phy@5 { 238 + reg = <5>; 239 + }; 240 + phy6: ethernet-phy@6 { 241 + reg = <6>; 242 + }; 243 + phy7: ethernet-phy@7 { 244 + reg = <7>; 245 + }; 246 + phy8: ethernet-phy@8 { 247 + reg = <8>; 248 + }; 249 + phy9: ethernet-phy@9 { 250 + reg = <9>; 251 + }; 252 + phy10: ethernet-phy@10 { 253 + reg = <10>; 254 + }; 255 + phy11: ethernet-phy@11 { 256 + reg = <11>; 257 + }; 258 + phy12: ethernet-phy@12 { 259 + reg = <12>; 260 + }; 261 + phy13: ethernet-phy@13 { 262 + reg = <13>; 263 + }; 264 + phy14: ethernet-phy@14 { 265 + reg = <14>; 266 + }; 267 + phy15: ethernet-phy@15 { 268 + reg = <15>; 269 + }; 270 + phy16: ethernet-phy@16 { 271 + reg = <16>; 272 + }; 273 + phy17: ethernet-phy@17 { 274 + reg = <17>; 275 + }; 276 + phy18: ethernet-phy@18 { 277 + reg = <18>; 278 + }; 279 + phy19: ethernet-phy@19 { 280 + reg = <19>; 281 + }; 282 + phy20: ethernet-phy@20 { 283 + reg = <20>; 284 + }; 285 + phy21: ethernet-phy@21 { 286 + reg = <21>; 287 + }; 288 + phy22: ethernet-phy@22 { 289 + reg = <22>; 290 + }; 291 + phy23: ethernet-phy@23 { 292 + reg = <23>; 293 + }; 294 + }; 295 + 296 + &mdio1 { 297 + status = "ok"; 298 + phy24: ethernet-phy@24 { 299 + reg = <0>; 300 + }; 301 + phy25: ethernet-phy@25 { 302 + reg = <1>; 303 + }; 304 + phy26: ethernet-phy@26 { 305 + reg = <2>; 306 + }; 307 + phy27: ethernet-phy@27 { 308 + reg = <3>; 309 + }; 310 + phy28: ethernet-phy@28 { 311 + reg = <4>; 312 + }; 313 + phy29: ethernet-phy@29 { 314 + reg = <5>; 315 + }; 316 + phy30: ethernet-phy@30 { 317 + reg = <6>; 318 + }; 319 + phy31: ethernet-phy@31 { 320 + reg = <7>; 321 + }; 322 + phy32: ethernet-phy@32 { 323 + reg = <8>; 324 + }; 325 + phy33: ethernet-phy@33 { 326 + reg = <9>; 327 + }; 328 + phy34: ethernet-phy@34 { 329 + reg = <10>; 330 + }; 331 + phy35: ethernet-phy@35 { 332 + reg = <11>; 333 + }; 334 + phy36: ethernet-phy@36 { 335 + reg = <12>; 336 + }; 337 + phy37: ethernet-phy@37 { 338 + reg = <13>; 339 + }; 340 + phy38: ethernet-phy@38 { 341 + reg = <14>; 342 + }; 343 + phy39: ethernet-phy@39 { 344 + reg = <15>; 345 + }; 346 + phy40: ethernet-phy@40 { 347 + reg = <16>; 348 + }; 349 + phy41: ethernet-phy@41 { 350 + reg = <17>; 351 + }; 352 + phy42: ethernet-phy@42 { 353 + reg = <18>; 354 + }; 355 + phy43: ethernet-phy@43 { 356 + reg = <19>; 357 + }; 358 + phy44: ethernet-phy@44 { 359 + reg = <20>; 360 + }; 361 + phy45: ethernet-phy@45 { 362 + reg = <21>; 363 + }; 364 + phy46: ethernet-phy@46 { 365 + reg = <22>; 366 + }; 367 + phy47: ethernet-phy@47 { 368 + reg = <23>; 369 + }; 370 + }; 371 + 372 + &mdio3 { 373 + status = "ok"; 374 + phy64: ethernet-phy@64 { 375 + reg = <28>; 376 + }; 377 + }; 378 + 379 + &switch { 380 + ethernet-ports { 381 + #address-cells = <1>; 382 + #size-cells = <0>; 383 + 384 + port0: port@0 { 385 + reg = <0>; 386 + microchip,bandwidth = <1000>; 387 + phys = <&serdes 13>; 388 + phy-handle = <&phy0>; 389 + phy-mode = "qsgmii"; 390 + }; 391 + port1: port@1 { 392 + reg = <1>; 393 + microchip,bandwidth = <1000>; 394 + phys = <&serdes 13>; 395 + phy-handle = <&phy1>; 396 + phy-mode = "qsgmii"; 397 + }; 398 + port2: port@2 { 399 + reg = <2>; 400 + microchip,bandwidth = <1000>; 401 + phys = <&serdes 13>; 402 + phy-handle = <&phy2>; 403 + phy-mode = "qsgmii"; 404 + }; 405 + port3: port@3 { 406 + reg = <3>; 407 + microchip,bandwidth = <1000>; 408 + phys = <&serdes 13>; 409 + phy-handle = <&phy3>; 410 + phy-mode = "qsgmii"; 411 + }; 412 + port4: port@4 { 413 + reg = <4>; 414 + microchip,bandwidth = <1000>; 415 + phys = <&serdes 14>; 416 + phy-handle = <&phy4>; 417 + phy-mode = "qsgmii"; 418 + }; 419 + port5: port@5 { 420 + reg = <5>; 421 + microchip,bandwidth = <1000>; 422 + phys = <&serdes 14>; 423 + phy-handle = <&phy5>; 424 + phy-mode = "qsgmii"; 425 + }; 426 + port6: port@6 { 427 + reg = <6>; 428 + microchip,bandwidth = <1000>; 429 + phys = <&serdes 14>; 430 + phy-handle = <&phy6>; 431 + phy-mode = "qsgmii"; 432 + }; 433 + port7: port@7 { 434 + reg = <7>; 435 + microchip,bandwidth = <1000>; 436 + phys = <&serdes 14>; 437 + phy-handle = <&phy7>; 438 + phy-mode = "qsgmii"; 439 + }; 440 + port8: port@8 { 441 + reg = <8>; 442 + microchip,bandwidth = <1000>; 443 + phys = <&serdes 15>; 444 + phy-handle = <&phy8>; 445 + phy-mode = "qsgmii"; 446 + }; 447 + port9: port@9 { 448 + reg = <9>; 449 + microchip,bandwidth = <1000>; 450 + phys = <&serdes 15>; 451 + phy-handle = <&phy9>; 452 + phy-mode = "qsgmii"; 453 + }; 454 + port10: port@10 { 455 + reg = <10>; 456 + microchip,bandwidth = <1000>; 457 + phys = <&serdes 15>; 458 + phy-handle = <&phy10>; 459 + phy-mode = "qsgmii"; 460 + }; 461 + port11: port@11 { 462 + reg = <11>; 463 + microchip,bandwidth = <1000>; 464 + phys = <&serdes 15>; 465 + phy-handle = <&phy11>; 466 + phy-mode = "qsgmii"; 467 + }; 468 + port12: port@12 { 469 + reg = <12>; 470 + microchip,bandwidth = <1000>; 471 + phys = <&serdes 16>; 472 + phy-handle = <&phy12>; 473 + phy-mode = "qsgmii"; 474 + }; 475 + port13: port@13 { 476 + reg = <13>; 477 + microchip,bandwidth = <1000>; 478 + phys = <&serdes 16>; 479 + phy-handle = <&phy13>; 480 + phy-mode = "qsgmii"; 481 + }; 482 + port14: port@14 { 483 + reg = <14>; 484 + microchip,bandwidth = <1000>; 485 + phys = <&serdes 16>; 486 + phy-handle = <&phy14>; 487 + phy-mode = "qsgmii"; 488 + }; 489 + port15: port@15 { 490 + reg = <15>; 491 + microchip,bandwidth = <1000>; 492 + phys = <&serdes 16>; 493 + phy-handle = <&phy15>; 494 + phy-mode = "qsgmii"; 495 + }; 496 + port16: port@16 { 497 + reg = <16>; 498 + microchip,bandwidth = <1000>; 499 + phys = <&serdes 17>; 500 + phy-handle = <&phy16>; 501 + phy-mode = "qsgmii"; 502 + }; 503 + port17: port@17 { 504 + reg = <17>; 505 + microchip,bandwidth = <1000>; 506 + phys = <&serdes 17>; 507 + phy-handle = <&phy17>; 508 + phy-mode = "qsgmii"; 509 + }; 510 + port18: port@18 { 511 + reg = <18>; 512 + microchip,bandwidth = <1000>; 513 + phys = <&serdes 17>; 514 + phy-handle = <&phy18>; 515 + phy-mode = "qsgmii"; 516 + }; 517 + port19: port@19 { 518 + reg = <19>; 519 + microchip,bandwidth = <1000>; 520 + phys = <&serdes 17>; 521 + phy-handle = <&phy19>; 522 + phy-mode = "qsgmii"; 523 + }; 524 + port20: port@20 { 525 + reg = <20>; 526 + microchip,bandwidth = <1000>; 527 + phys = <&serdes 18>; 528 + phy-handle = <&phy20>; 529 + phy-mode = "qsgmii"; 530 + }; 531 + port21: port@21 { 532 + reg = <21>; 533 + microchip,bandwidth = <1000>; 534 + phys = <&serdes 18>; 535 + phy-handle = <&phy21>; 536 + phy-mode = "qsgmii"; 537 + }; 538 + port22: port@22 { 539 + reg = <22>; 540 + microchip,bandwidth = <1000>; 541 + phys = <&serdes 18>; 542 + phy-handle = <&phy22>; 543 + phy-mode = "qsgmii"; 544 + }; 545 + port23: port@23 { 546 + reg = <23>; 547 + microchip,bandwidth = <1000>; 548 + phys = <&serdes 18>; 549 + phy-handle = <&phy23>; 550 + phy-mode = "qsgmii"; 551 + }; 552 + port24: port@24 { 553 + reg = <24>; 554 + microchip,bandwidth = <1000>; 555 + phys = <&serdes 19>; 556 + phy-handle = <&phy24>; 557 + phy-mode = "qsgmii"; 558 + }; 559 + port25: port@25 { 560 + reg = <25>; 561 + microchip,bandwidth = <1000>; 562 + phys = <&serdes 19>; 563 + phy-handle = <&phy25>; 564 + phy-mode = "qsgmii"; 565 + }; 566 + port26: port@26 { 567 + reg = <26>; 568 + microchip,bandwidth = <1000>; 569 + phys = <&serdes 19>; 570 + phy-handle = <&phy26>; 571 + phy-mode = "qsgmii"; 572 + }; 573 + port27: port@27 { 574 + reg = <27>; 575 + microchip,bandwidth = <1000>; 576 + phys = <&serdes 19>; 577 + phy-handle = <&phy27>; 578 + phy-mode = "qsgmii"; 579 + }; 580 + port28: port@28 { 581 + reg = <28>; 582 + microchip,bandwidth = <1000>; 583 + phys = <&serdes 20>; 584 + phy-handle = <&phy28>; 585 + phy-mode = "qsgmii"; 586 + }; 587 + port29: port@29 { 588 + reg = <29>; 589 + microchip,bandwidth = <1000>; 590 + phys = <&serdes 20>; 591 + phy-handle = <&phy29>; 592 + phy-mode = "qsgmii"; 593 + }; 594 + port30: port@30 { 595 + reg = <30>; 596 + microchip,bandwidth = <1000>; 597 + phys = <&serdes 20>; 598 + phy-handle = <&phy30>; 599 + phy-mode = "qsgmii"; 600 + }; 601 + port31: port@31 { 602 + reg = <31>; 603 + microchip,bandwidth = <1000>; 604 + phys = <&serdes 20>; 605 + phy-handle = <&phy31>; 606 + phy-mode = "qsgmii"; 607 + }; 608 + port32: port@32 { 609 + reg = <32>; 610 + microchip,bandwidth = <1000>; 611 + phys = <&serdes 21>; 612 + phy-handle = <&phy32>; 613 + phy-mode = "qsgmii"; 614 + }; 615 + port33: port@33 { 616 + reg = <33>; 617 + microchip,bandwidth = <1000>; 618 + phys = <&serdes 21>; 619 + phy-handle = <&phy33>; 620 + phy-mode = "qsgmii"; 621 + }; 622 + port34: port@34 { 623 + reg = <34>; 624 + microchip,bandwidth = <1000>; 625 + phys = <&serdes 21>; 626 + phy-handle = <&phy34>; 627 + phy-mode = "qsgmii"; 628 + }; 629 + port35: port@35 { 630 + reg = <35>; 631 + microchip,bandwidth = <1000>; 632 + phys = <&serdes 21>; 633 + phy-handle = <&phy35>; 634 + phy-mode = "qsgmii"; 635 + }; 636 + port36: port@36 { 637 + reg = <36>; 638 + microchip,bandwidth = <1000>; 639 + phys = <&serdes 22>; 640 + phy-handle = <&phy36>; 641 + phy-mode = "qsgmii"; 642 + }; 643 + port37: port@37 { 644 + reg = <37>; 645 + microchip,bandwidth = <1000>; 646 + phys = <&serdes 22>; 647 + phy-handle = <&phy37>; 648 + phy-mode = "qsgmii"; 649 + }; 650 + port38: port@38 { 651 + reg = <38>; 652 + microchip,bandwidth = <1000>; 653 + phys = <&serdes 22>; 654 + phy-handle = <&phy38>; 655 + phy-mode = "qsgmii"; 656 + }; 657 + port39: port@39 { 658 + reg = <39>; 659 + microchip,bandwidth = <1000>; 660 + phys = <&serdes 22>; 661 + phy-handle = <&phy39>; 662 + phy-mode = "qsgmii"; 663 + }; 664 + port40: port@40 { 665 + reg = <40>; 666 + microchip,bandwidth = <1000>; 667 + phys = <&serdes 23>; 668 + phy-handle = <&phy40>; 669 + phy-mode = "qsgmii"; 670 + }; 671 + port41: port@41 { 672 + reg = <41>; 673 + microchip,bandwidth = <1000>; 674 + phys = <&serdes 23>; 675 + phy-handle = <&phy41>; 676 + phy-mode = "qsgmii"; 677 + }; 678 + port42: port@42 { 679 + reg = <42>; 680 + microchip,bandwidth = <1000>; 681 + phys = <&serdes 23>; 682 + phy-handle = <&phy42>; 683 + phy-mode = "qsgmii"; 684 + }; 685 + port43: port@43 { 686 + reg = <43>; 687 + microchip,bandwidth = <1000>; 688 + phys = <&serdes 23>; 689 + phy-handle = <&phy43>; 690 + phy-mode = "qsgmii"; 691 + }; 692 + port44: port@44 { 693 + reg = <44>; 694 + microchip,bandwidth = <1000>; 695 + phys = <&serdes 24>; 696 + phy-handle = <&phy44>; 697 + phy-mode = "qsgmii"; 698 + }; 699 + port45: port@45 { 700 + reg = <45>; 701 + microchip,bandwidth = <1000>; 702 + phys = <&serdes 24>; 703 + phy-handle = <&phy45>; 704 + phy-mode = "qsgmii"; 705 + }; 706 + port46: port@46 { 707 + reg = <46>; 708 + microchip,bandwidth = <1000>; 709 + phys = <&serdes 24>; 710 + phy-handle = <&phy46>; 711 + phy-mode = "qsgmii"; 712 + }; 713 + port47: port@47 { 714 + reg = <47>; 715 + microchip,bandwidth = <1000>; 716 + phys = <&serdes 24>; 717 + phy-handle = <&phy47>; 718 + phy-mode = "qsgmii"; 719 + }; 720 + /* Then the 25G interfaces */ 721 + port60: port@60 { 722 + reg = <60>; 723 + microchip,bandwidth = <25000>; 724 + phys = <&serdes 29>; 725 + phy-mode = "10gbase-r"; 726 + sfp = <&sfp_eth60>; 727 + managed = "in-band-status"; 728 + }; 729 + port61: port@61 { 730 + reg = <61>; 731 + microchip,bandwidth = <25000>; 732 + phys = <&serdes 30>; 733 + phy-mode = "10gbase-r"; 734 + sfp = <&sfp_eth61>; 735 + managed = "in-band-status"; 736 + }; 737 + port62: port@62 { 738 + reg = <62>; 739 + microchip,bandwidth = <25000>; 740 + phys = <&serdes 31>; 741 + phy-mode = "10gbase-r"; 742 + sfp = <&sfp_eth62>; 743 + managed = "in-band-status"; 744 + }; 745 + port63: port@63 { 746 + reg = <63>; 747 + microchip,bandwidth = <25000>; 748 + phys = <&serdes 32>; 749 + phy-mode = "10gbase-r"; 750 + sfp = <&sfp_eth63>; 751 + managed = "in-band-status"; 752 + }; 753 + /* Finally the Management interface */ 754 + port64: port@64 { 755 + reg = <64>; 756 + microchip,bandwidth = <1000>; 757 + phys = <&serdes 0>; 758 + phy-handle = <&phy64>; 759 + phy-mode = "sgmii"; 760 + }; 168 761 }; 169 762 };
+2
drivers/net/ethernet/microchip/Kconfig
··· 54 54 To compile this driver as a module, choose M here. The module will be 55 55 called lan743x. 56 56 57 + source "drivers/net/ethernet/microchip/sparx5/Kconfig" 58 + 57 59 endif # NET_VENDOR_MICROCHIP
+2
drivers/net/ethernet/microchip/Makefile
··· 8 8 obj-$(CONFIG_LAN743X) += lan743x.o 9 9 10 10 lan743x-objs := lan743x_main.o lan743x_ethtool.o lan743x_ptp.o 11 + 12 + obj-$(CONFIG_SPARX5_SWITCH) += sparx5/
+9
drivers/net/ethernet/microchip/sparx5/Kconfig
··· 1 + config SPARX5_SWITCH 2 + tristate "Sparx5 switch driver" 3 + depends on NET_SWITCHDEV 4 + depends on HAS_IOMEM 5 + select PHYLINK 6 + select PHY_SPARX5_SERDES 7 + select RESET_CONTROLLER 8 + help 9 + This driver supports the Sparx5 network switch device.
+10
drivers/net/ethernet/microchip/sparx5/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + # 3 + # Makefile for the Microchip Sparx5 network device drivers. 4 + # 5 + 6 + obj-$(CONFIG_SPARX5_SWITCH) += sparx5-switch.o 7 + 8 + sparx5-switch-objs := sparx5_main.o sparx5_packet.o \ 9 + sparx5_netdev.o sparx5_phylink.o sparx5_port.o sparx5_mactable.o sparx5_vlan.o \ 10 + sparx5_switchdev.o sparx5_calendar.o sparx5_ethtool.o
+596
drivers/net/ethernet/microchip/sparx5/sparx5_calendar.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include <linux/module.h> 8 + #include <linux/device.h> 9 + 10 + #include "sparx5_main_regs.h" 11 + #include "sparx5_main.h" 12 + 13 + /* QSYS calendar information */ 14 + #define SPX5_PORTS_PER_CALREG 10 /* Ports mapped in a calendar register */ 15 + #define SPX5_CALBITS_PER_PORT 3 /* Bit per port in calendar register */ 16 + 17 + /* DSM calendar information */ 18 + #define SPX5_DSM_CAL_LEN 64 19 + #define SPX5_DSM_CAL_EMPTY 0xFFFF 20 + #define SPX5_DSM_CAL_MAX_DEVS_PER_TAXI 13 21 + #define SPX5_DSM_CAL_TAXIS 8 22 + #define SPX5_DSM_CAL_BW_LOSS 553 23 + 24 + #define SPX5_TAXI_PORT_MAX 70 25 + 26 + #define SPEED_12500 12500 27 + 28 + /* Maps from taxis to port numbers */ 29 + static u32 sparx5_taxi_ports[SPX5_DSM_CAL_TAXIS][SPX5_DSM_CAL_MAX_DEVS_PER_TAXI] = { 30 + {57, 12, 0, 1, 2, 16, 17, 18, 19, 20, 21, 22, 23}, 31 + {58, 13, 3, 4, 5, 24, 25, 26, 27, 28, 29, 30, 31}, 32 + {59, 14, 6, 7, 8, 32, 33, 34, 35, 36, 37, 38, 39}, 33 + {60, 15, 9, 10, 11, 40, 41, 42, 43, 44, 45, 46, 47}, 34 + {61, 48, 49, 50, 99, 99, 99, 99, 99, 99, 99, 99, 99}, 35 + {62, 51, 52, 53, 99, 99, 99, 99, 99, 99, 99, 99, 99}, 36 + {56, 63, 54, 55, 99, 99, 99, 99, 99, 99, 99, 99, 99}, 37 + {64, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}, 38 + }; 39 + 40 + struct sparx5_calendar_data { 41 + u32 schedule[SPX5_DSM_CAL_LEN]; 42 + u32 avg_dist[SPX5_DSM_CAL_MAX_DEVS_PER_TAXI]; 43 + u32 taxi_ports[SPX5_DSM_CAL_MAX_DEVS_PER_TAXI]; 44 + u32 taxi_speeds[SPX5_DSM_CAL_MAX_DEVS_PER_TAXI]; 45 + u32 dev_slots[SPX5_DSM_CAL_MAX_DEVS_PER_TAXI]; 46 + u32 new_slots[SPX5_DSM_CAL_LEN]; 47 + u32 temp_sched[SPX5_DSM_CAL_LEN]; 48 + u32 indices[SPX5_DSM_CAL_LEN]; 49 + u32 short_list[SPX5_DSM_CAL_LEN]; 50 + u32 long_list[SPX5_DSM_CAL_LEN]; 51 + }; 52 + 53 + static u32 sparx5_target_bandwidth(struct sparx5 *sparx5) 54 + { 55 + switch (sparx5->target_ct) { 56 + case SPX5_TARGET_CT_7546: 57 + case SPX5_TARGET_CT_7546TSN: 58 + return 65000; 59 + case SPX5_TARGET_CT_7549: 60 + case SPX5_TARGET_CT_7549TSN: 61 + return 91000; 62 + case SPX5_TARGET_CT_7552: 63 + case SPX5_TARGET_CT_7552TSN: 64 + return 129000; 65 + case SPX5_TARGET_CT_7556: 66 + case SPX5_TARGET_CT_7556TSN: 67 + return 161000; 68 + case SPX5_TARGET_CT_7558: 69 + case SPX5_TARGET_CT_7558TSN: 70 + return 201000; 71 + default: 72 + return 0; 73 + } 74 + } 75 + 76 + /* This is used in calendar configuration */ 77 + enum sparx5_cal_bw { 78 + SPX5_CAL_SPEED_NONE = 0, 79 + SPX5_CAL_SPEED_1G = 1, 80 + SPX5_CAL_SPEED_2G5 = 2, 81 + SPX5_CAL_SPEED_5G = 3, 82 + SPX5_CAL_SPEED_10G = 4, 83 + SPX5_CAL_SPEED_25G = 5, 84 + SPX5_CAL_SPEED_0G5 = 6, 85 + SPX5_CAL_SPEED_12G5 = 7 86 + }; 87 + 88 + static u32 sparx5_clk_to_bandwidth(enum sparx5_core_clockfreq cclock) 89 + { 90 + switch (cclock) { 91 + case SPX5_CORE_CLOCK_250MHZ: return 83000; /* 250000 / 3 */ 92 + case SPX5_CORE_CLOCK_500MHZ: return 166000; /* 500000 / 3 */ 93 + case SPX5_CORE_CLOCK_625MHZ: return 208000; /* 625000 / 3 */ 94 + default: return 0; 95 + } 96 + return 0; 97 + } 98 + 99 + static u32 sparx5_cal_speed_to_value(enum sparx5_cal_bw speed) 100 + { 101 + switch (speed) { 102 + case SPX5_CAL_SPEED_1G: return 1000; 103 + case SPX5_CAL_SPEED_2G5: return 2500; 104 + case SPX5_CAL_SPEED_5G: return 5000; 105 + case SPX5_CAL_SPEED_10G: return 10000; 106 + case SPX5_CAL_SPEED_25G: return 25000; 107 + case SPX5_CAL_SPEED_0G5: return 500; 108 + case SPX5_CAL_SPEED_12G5: return 12500; 109 + default: return 0; 110 + } 111 + } 112 + 113 + static u32 sparx5_bandwidth_to_calendar(u32 bw) 114 + { 115 + switch (bw) { 116 + case SPEED_10: return SPX5_CAL_SPEED_0G5; 117 + case SPEED_100: return SPX5_CAL_SPEED_0G5; 118 + case SPEED_1000: return SPX5_CAL_SPEED_1G; 119 + case SPEED_2500: return SPX5_CAL_SPEED_2G5; 120 + case SPEED_5000: return SPX5_CAL_SPEED_5G; 121 + case SPEED_10000: return SPX5_CAL_SPEED_10G; 122 + case SPEED_12500: return SPX5_CAL_SPEED_12G5; 123 + case SPEED_25000: return SPX5_CAL_SPEED_25G; 124 + case SPEED_UNKNOWN: return SPX5_CAL_SPEED_1G; 125 + default: return SPX5_CAL_SPEED_NONE; 126 + } 127 + } 128 + 129 + static enum sparx5_cal_bw sparx5_get_port_cal_speed(struct sparx5 *sparx5, 130 + u32 portno) 131 + { 132 + struct sparx5_port *port; 133 + 134 + if (portno >= SPX5_PORTS) { 135 + /* Internal ports */ 136 + if (portno == SPX5_PORT_CPU_0 || portno == SPX5_PORT_CPU_1) { 137 + /* Equals 1.25G */ 138 + return SPX5_CAL_SPEED_2G5; 139 + } else if (portno == SPX5_PORT_VD0) { 140 + /* IPMC only idle BW */ 141 + return SPX5_CAL_SPEED_NONE; 142 + } else if (portno == SPX5_PORT_VD1) { 143 + /* OAM only idle BW */ 144 + return SPX5_CAL_SPEED_NONE; 145 + } else if (portno == SPX5_PORT_VD2) { 146 + /* IPinIP gets only idle BW */ 147 + return SPX5_CAL_SPEED_NONE; 148 + } 149 + /* not in port map */ 150 + return SPX5_CAL_SPEED_NONE; 151 + } 152 + /* Front ports - may be used */ 153 + port = sparx5->ports[portno]; 154 + if (!port) 155 + return SPX5_CAL_SPEED_NONE; 156 + return sparx5_bandwidth_to_calendar(port->conf.bandwidth); 157 + } 158 + 159 + /* Auto configure the QSYS calendar based on port configuration */ 160 + int sparx5_config_auto_calendar(struct sparx5 *sparx5) 161 + { 162 + u32 cal[7], value, idx, portno; 163 + u32 max_core_bw; 164 + u32 total_bw = 0, used_port_bw = 0; 165 + int err = 0; 166 + enum sparx5_cal_bw spd; 167 + 168 + memset(cal, 0, sizeof(cal)); 169 + 170 + max_core_bw = sparx5_clk_to_bandwidth(sparx5->coreclock); 171 + if (max_core_bw == 0) { 172 + dev_err(sparx5->dev, "Core clock not supported"); 173 + return -EINVAL; 174 + } 175 + 176 + /* Setup the calendar with the bandwidth to each port */ 177 + for (portno = 0; portno < SPX5_PORTS_ALL; portno++) { 178 + u64 reg, offset, this_bw; 179 + 180 + spd = sparx5_get_port_cal_speed(sparx5, portno); 181 + if (spd == SPX5_CAL_SPEED_NONE) 182 + continue; 183 + 184 + this_bw = sparx5_cal_speed_to_value(spd); 185 + if (portno < SPX5_PORTS) 186 + used_port_bw += this_bw; 187 + else 188 + /* Internal ports are granted half the value */ 189 + this_bw = this_bw / 2; 190 + total_bw += this_bw; 191 + reg = portno; 192 + offset = do_div(reg, SPX5_PORTS_PER_CALREG); 193 + cal[reg] |= spd << (offset * SPX5_CALBITS_PER_PORT); 194 + } 195 + 196 + if (used_port_bw > sparx5_target_bandwidth(sparx5)) { 197 + dev_err(sparx5->dev, 198 + "Port BW %u above target BW %u\n", 199 + used_port_bw, sparx5_target_bandwidth(sparx5)); 200 + return -EINVAL; 201 + } 202 + 203 + if (total_bw > max_core_bw) { 204 + dev_err(sparx5->dev, 205 + "Total BW %u above switch core BW %u\n", 206 + total_bw, max_core_bw); 207 + return -EINVAL; 208 + } 209 + 210 + /* Halt the calendar while changing it */ 211 + spx5_rmw(QSYS_CAL_CTRL_CAL_MODE_SET(10), 212 + QSYS_CAL_CTRL_CAL_MODE, 213 + sparx5, QSYS_CAL_CTRL); 214 + 215 + /* Assign port bandwidth to auto calendar */ 216 + for (idx = 0; idx < ARRAY_SIZE(cal); idx++) 217 + spx5_wr(cal[idx], sparx5, QSYS_CAL_AUTO(idx)); 218 + 219 + /* Increase grant rate of all ports to account for 220 + * core clock ppm deviations 221 + */ 222 + spx5_rmw(QSYS_CAL_CTRL_CAL_AUTO_GRANT_RATE_SET(671), /* 672->671 */ 223 + QSYS_CAL_CTRL_CAL_AUTO_GRANT_RATE, 224 + sparx5, 225 + QSYS_CAL_CTRL); 226 + 227 + /* Grant idle usage to VD 0-2 */ 228 + for (idx = 2; idx < 5; idx++) 229 + spx5_wr(HSCH_OUTB_SHARE_ENA_OUTB_SHARE_ENA_SET(12), 230 + sparx5, 231 + HSCH_OUTB_SHARE_ENA(idx)); 232 + 233 + /* Enable Auto mode */ 234 + spx5_rmw(QSYS_CAL_CTRL_CAL_MODE_SET(8), 235 + QSYS_CAL_CTRL_CAL_MODE, 236 + sparx5, QSYS_CAL_CTRL); 237 + 238 + /* Verify successful calendar config */ 239 + value = spx5_rd(sparx5, QSYS_CAL_CTRL); 240 + if (QSYS_CAL_CTRL_CAL_AUTO_ERROR_GET(value)) { 241 + dev_err(sparx5->dev, "QSYS calendar error\n"); 242 + err = -EINVAL; 243 + } 244 + return err; 245 + } 246 + 247 + static u32 sparx5_dsm_exb_gcd(u32 a, u32 b) 248 + { 249 + if (b == 0) 250 + return a; 251 + return sparx5_dsm_exb_gcd(b, a % b); 252 + } 253 + 254 + static u32 sparx5_dsm_cal_len(u32 *cal) 255 + { 256 + u32 idx = 0, len = 0; 257 + 258 + while (idx < SPX5_DSM_CAL_LEN) { 259 + if (cal[idx] != SPX5_DSM_CAL_EMPTY) 260 + len++; 261 + idx++; 262 + } 263 + return len; 264 + } 265 + 266 + static u32 sparx5_dsm_cp_cal(u32 *sched) 267 + { 268 + u32 idx = 0, tmp; 269 + 270 + while (idx < SPX5_DSM_CAL_LEN) { 271 + if (sched[idx] != SPX5_DSM_CAL_EMPTY) { 272 + tmp = sched[idx]; 273 + sched[idx] = SPX5_DSM_CAL_EMPTY; 274 + return tmp; 275 + } 276 + idx++; 277 + } 278 + return SPX5_DSM_CAL_EMPTY; 279 + } 280 + 281 + static int sparx5_dsm_calendar_calc(struct sparx5 *sparx5, u32 taxi, 282 + struct sparx5_calendar_data *data) 283 + { 284 + bool slow_mode; 285 + u32 gcd, idx, sum, min, factor; 286 + u32 num_of_slots, slot_spd, empty_slots; 287 + u32 taxi_bw, clk_period_ps; 288 + 289 + clk_period_ps = sparx5_clk_period(sparx5->coreclock); 290 + taxi_bw = 128 * 1000000 / clk_period_ps; 291 + slow_mode = !!(clk_period_ps > 2000); 292 + memcpy(data->taxi_ports, &sparx5_taxi_ports[taxi], 293 + sizeof(data->taxi_ports)); 294 + 295 + for (idx = 0; idx < SPX5_DSM_CAL_LEN; idx++) { 296 + data->new_slots[idx] = SPX5_DSM_CAL_EMPTY; 297 + data->schedule[idx] = SPX5_DSM_CAL_EMPTY; 298 + data->temp_sched[idx] = SPX5_DSM_CAL_EMPTY; 299 + } 300 + /* Default empty calendar */ 301 + data->schedule[0] = SPX5_DSM_CAL_MAX_DEVS_PER_TAXI; 302 + 303 + /* Map ports to taxi positions */ 304 + for (idx = 0; idx < SPX5_DSM_CAL_MAX_DEVS_PER_TAXI; idx++) { 305 + u32 portno = data->taxi_ports[idx]; 306 + 307 + if (portno < SPX5_TAXI_PORT_MAX) { 308 + data->taxi_speeds[idx] = sparx5_cal_speed_to_value 309 + (sparx5_get_port_cal_speed(sparx5, portno)); 310 + } else { 311 + data->taxi_speeds[idx] = 0; 312 + } 313 + } 314 + 315 + sum = 0; 316 + min = 25000; 317 + for (idx = 0; idx < ARRAY_SIZE(data->taxi_speeds); idx++) { 318 + u32 jdx; 319 + 320 + sum += data->taxi_speeds[idx]; 321 + if (data->taxi_speeds[idx] && data->taxi_speeds[idx] < min) 322 + min = data->taxi_speeds[idx]; 323 + gcd = min; 324 + for (jdx = 0; jdx < ARRAY_SIZE(data->taxi_speeds); jdx++) 325 + gcd = sparx5_dsm_exb_gcd(gcd, data->taxi_speeds[jdx]); 326 + } 327 + if (sum == 0) /* Empty calendar */ 328 + return 0; 329 + /* Make room for overhead traffic */ 330 + factor = 100 * 100 * 1000 / (100 * 100 - SPX5_DSM_CAL_BW_LOSS); 331 + 332 + if (sum * factor > (taxi_bw * 1000)) { 333 + dev_err(sparx5->dev, 334 + "Taxi %u, Requested BW %u above available BW %u\n", 335 + taxi, sum, taxi_bw); 336 + return -EINVAL; 337 + } 338 + for (idx = 0; idx < 4; idx++) { 339 + u32 raw_spd; 340 + 341 + if (idx == 0) 342 + raw_spd = gcd / 5; 343 + else if (idx == 1) 344 + raw_spd = gcd / 2; 345 + else if (idx == 2) 346 + raw_spd = gcd; 347 + else 348 + raw_spd = min; 349 + slot_spd = raw_spd * factor / 1000; 350 + num_of_slots = taxi_bw / slot_spd; 351 + if (num_of_slots <= 64) 352 + break; 353 + } 354 + 355 + num_of_slots = num_of_slots > 64 ? 64 : num_of_slots; 356 + slot_spd = taxi_bw / num_of_slots; 357 + 358 + sum = 0; 359 + for (idx = 0; idx < ARRAY_SIZE(data->taxi_speeds); idx++) { 360 + u32 spd = data->taxi_speeds[idx]; 361 + u32 adjusted_speed = data->taxi_speeds[idx] * factor / 1000; 362 + 363 + if (adjusted_speed > 0) { 364 + data->avg_dist[idx] = (128 * 1000000 * 10) / 365 + (adjusted_speed * clk_period_ps); 366 + } else { 367 + data->avg_dist[idx] = -1; 368 + } 369 + data->dev_slots[idx] = ((spd * factor / slot_spd) + 999) / 1000; 370 + if (spd != 25000 && (spd != 10000 || !slow_mode)) { 371 + if (num_of_slots < (5 * data->dev_slots[idx])) { 372 + dev_err(sparx5->dev, 373 + "Taxi %u, speed %u, Low slot sep.\n", 374 + taxi, spd); 375 + return -EINVAL; 376 + } 377 + } 378 + sum += data->dev_slots[idx]; 379 + if (sum > num_of_slots) { 380 + dev_err(sparx5->dev, 381 + "Taxi %u with overhead factor %u\n", 382 + taxi, factor); 383 + return -EINVAL; 384 + } 385 + } 386 + 387 + empty_slots = num_of_slots - sum; 388 + 389 + for (idx = 0; idx < empty_slots; idx++) 390 + data->schedule[idx] = SPX5_DSM_CAL_MAX_DEVS_PER_TAXI; 391 + 392 + for (idx = 1; idx < num_of_slots; idx++) { 393 + u32 indices_len = 0; 394 + u32 slot, jdx, kdx, ts; 395 + s32 cnt; 396 + u32 num_of_old_slots, num_of_new_slots, tgt_score; 397 + 398 + for (slot = 0; slot < ARRAY_SIZE(data->dev_slots); slot++) { 399 + if (data->dev_slots[slot] == idx) { 400 + data->indices[indices_len] = slot; 401 + indices_len++; 402 + } 403 + } 404 + if (indices_len == 0) 405 + continue; 406 + kdx = 0; 407 + for (slot = 0; slot < idx; slot++) { 408 + for (jdx = 0; jdx < indices_len; jdx++, kdx++) 409 + data->new_slots[kdx] = data->indices[jdx]; 410 + } 411 + 412 + for (slot = 0; slot < SPX5_DSM_CAL_LEN; slot++) { 413 + if (data->schedule[slot] == SPX5_DSM_CAL_EMPTY) 414 + break; 415 + } 416 + 417 + num_of_old_slots = slot; 418 + num_of_new_slots = kdx; 419 + cnt = 0; 420 + ts = 0; 421 + 422 + if (num_of_new_slots > num_of_old_slots) { 423 + memcpy(data->short_list, data->schedule, 424 + sizeof(data->short_list)); 425 + memcpy(data->long_list, data->new_slots, 426 + sizeof(data->long_list)); 427 + tgt_score = 100000 * num_of_old_slots / 428 + num_of_new_slots; 429 + } else { 430 + memcpy(data->short_list, data->new_slots, 431 + sizeof(data->short_list)); 432 + memcpy(data->long_list, data->schedule, 433 + sizeof(data->long_list)); 434 + tgt_score = 100000 * num_of_new_slots / 435 + num_of_old_slots; 436 + } 437 + 438 + while (sparx5_dsm_cal_len(data->short_list) > 0 || 439 + sparx5_dsm_cal_len(data->long_list) > 0) { 440 + u32 act = 0; 441 + 442 + if (sparx5_dsm_cal_len(data->short_list) > 0) { 443 + data->temp_sched[ts] = 444 + sparx5_dsm_cp_cal(data->short_list); 445 + ts++; 446 + cnt += 100000; 447 + act = 1; 448 + } 449 + while (sparx5_dsm_cal_len(data->long_list) > 0 && 450 + cnt > 0) { 451 + data->temp_sched[ts] = 452 + sparx5_dsm_cp_cal(data->long_list); 453 + ts++; 454 + cnt -= tgt_score; 455 + act = 1; 456 + } 457 + if (act == 0) { 458 + dev_err(sparx5->dev, 459 + "Error in DSM calendar calculation\n"); 460 + return -EINVAL; 461 + } 462 + } 463 + 464 + for (slot = 0; slot < SPX5_DSM_CAL_LEN; slot++) { 465 + if (data->temp_sched[slot] == SPX5_DSM_CAL_EMPTY) 466 + break; 467 + } 468 + for (slot = 0; slot < SPX5_DSM_CAL_LEN; slot++) { 469 + data->schedule[slot] = data->temp_sched[slot]; 470 + data->temp_sched[slot] = SPX5_DSM_CAL_EMPTY; 471 + data->new_slots[slot] = SPX5_DSM_CAL_EMPTY; 472 + } 473 + } 474 + return 0; 475 + } 476 + 477 + static int sparx5_dsm_calendar_check(struct sparx5 *sparx5, 478 + struct sparx5_calendar_data *data) 479 + { 480 + u32 num_of_slots, idx, port; 481 + int cnt, max_dist; 482 + u32 slot_indices[SPX5_DSM_CAL_LEN], distances[SPX5_DSM_CAL_LEN]; 483 + u32 cal_length = sparx5_dsm_cal_len(data->schedule); 484 + 485 + for (port = 0; port < SPX5_DSM_CAL_MAX_DEVS_PER_TAXI; port++) { 486 + num_of_slots = 0; 487 + max_dist = data->avg_dist[port]; 488 + for (idx = 0; idx < SPX5_DSM_CAL_LEN; idx++) { 489 + slot_indices[idx] = SPX5_DSM_CAL_EMPTY; 490 + distances[idx] = SPX5_DSM_CAL_EMPTY; 491 + } 492 + 493 + for (idx = 0; idx < cal_length; idx++) { 494 + if (data->schedule[idx] == port) { 495 + slot_indices[num_of_slots] = idx; 496 + num_of_slots++; 497 + } 498 + } 499 + 500 + slot_indices[num_of_slots] = slot_indices[0] + cal_length; 501 + 502 + for (idx = 0; idx < num_of_slots; idx++) { 503 + distances[idx] = (slot_indices[idx + 1] - 504 + slot_indices[idx]) * 10; 505 + } 506 + 507 + for (idx = 0; idx < num_of_slots; idx++) { 508 + u32 jdx, kdx; 509 + 510 + cnt = distances[idx] - max_dist; 511 + if (cnt < 0) 512 + cnt = -cnt; 513 + kdx = 0; 514 + for (jdx = (idx + 1) % num_of_slots; 515 + jdx != idx; 516 + jdx = (jdx + 1) % num_of_slots, kdx++) { 517 + cnt = cnt + distances[jdx] - max_dist; 518 + if (cnt < 0) 519 + cnt = -cnt; 520 + if (cnt > max_dist) 521 + goto check_err; 522 + } 523 + } 524 + } 525 + return 0; 526 + check_err: 527 + dev_err(sparx5->dev, 528 + "Port %u: distance %u above limit %d\n", 529 + port, cnt, max_dist); 530 + return -EINVAL; 531 + } 532 + 533 + static int sparx5_dsm_calendar_update(struct sparx5 *sparx5, u32 taxi, 534 + struct sparx5_calendar_data *data) 535 + { 536 + u32 idx; 537 + u32 cal_len = sparx5_dsm_cal_len(data->schedule), len; 538 + 539 + spx5_wr(DSM_TAXI_CAL_CFG_CAL_PGM_ENA_SET(1), 540 + sparx5, 541 + DSM_TAXI_CAL_CFG(taxi)); 542 + for (idx = 0; idx < cal_len; idx++) { 543 + spx5_rmw(DSM_TAXI_CAL_CFG_CAL_IDX_SET(idx), 544 + DSM_TAXI_CAL_CFG_CAL_IDX, 545 + sparx5, 546 + DSM_TAXI_CAL_CFG(taxi)); 547 + spx5_rmw(DSM_TAXI_CAL_CFG_CAL_PGM_VAL_SET(data->schedule[idx]), 548 + DSM_TAXI_CAL_CFG_CAL_PGM_VAL, 549 + sparx5, 550 + DSM_TAXI_CAL_CFG(taxi)); 551 + } 552 + spx5_wr(DSM_TAXI_CAL_CFG_CAL_PGM_ENA_SET(0), 553 + sparx5, 554 + DSM_TAXI_CAL_CFG(taxi)); 555 + len = DSM_TAXI_CAL_CFG_CAL_CUR_LEN_GET(spx5_rd(sparx5, 556 + DSM_TAXI_CAL_CFG(taxi))); 557 + if (len != cal_len - 1) 558 + goto update_err; 559 + return 0; 560 + update_err: 561 + dev_err(sparx5->dev, "Incorrect calendar length: %u\n", len); 562 + return -EINVAL; 563 + } 564 + 565 + /* Configure the DSM calendar based on port configuration */ 566 + int sparx5_config_dsm_calendar(struct sparx5 *sparx5) 567 + { 568 + int taxi; 569 + struct sparx5_calendar_data *data; 570 + int err = 0; 571 + 572 + data = kzalloc(sizeof(*data), GFP_KERNEL); 573 + if (!data) 574 + return -ENOMEM; 575 + 576 + for (taxi = 0; taxi < SPX5_DSM_CAL_TAXIS; ++taxi) { 577 + err = sparx5_dsm_calendar_calc(sparx5, taxi, data); 578 + if (err) { 579 + dev_err(sparx5->dev, "DSM calendar calculation failed\n"); 580 + goto cal_out; 581 + } 582 + err = sparx5_dsm_calendar_check(sparx5, data); 583 + if (err) { 584 + dev_err(sparx5->dev, "DSM calendar check failed\n"); 585 + goto cal_out; 586 + } 587 + err = sparx5_dsm_calendar_update(sparx5, taxi, data); 588 + if (err) { 589 + dev_err(sparx5->dev, "DSM calendar update failed\n"); 590 + goto cal_out; 591 + } 592 + } 593 + cal_out: 594 + kfree(data); 595 + return err; 596 + }
+1227
drivers/net/ethernet/microchip/sparx5/sparx5_ethtool.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include <linux/ethtool.h> 8 + 9 + #include "sparx5_main_regs.h" 10 + #include "sparx5_main.h" 11 + #include "sparx5_port.h" 12 + 13 + /* Index of ANA_AC port counters */ 14 + #define SPX5_PORT_POLICER_DROPS 0 15 + 16 + /* Add a potentially wrapping 32 bit value to a 64 bit counter */ 17 + static void sparx5_update_counter(u64 *cnt, u32 val) 18 + { 19 + if (val < (*cnt & U32_MAX)) 20 + *cnt += (u64)1 << 32; /* value has wrapped */ 21 + *cnt = (*cnt & ~(u64)U32_MAX) + val; 22 + } 23 + 24 + enum sparx5_stats_entry { 25 + spx5_stats_rx_symbol_err_cnt = 0, 26 + spx5_stats_pmac_rx_symbol_err_cnt = 1, 27 + spx5_stats_tx_uc_cnt = 2, 28 + spx5_stats_pmac_tx_uc_cnt = 3, 29 + spx5_stats_tx_mc_cnt = 4, 30 + spx5_stats_tx_bc_cnt = 5, 31 + spx5_stats_tx_backoff1_cnt = 6, 32 + spx5_stats_tx_multi_coll_cnt = 7, 33 + spx5_stats_rx_uc_cnt = 8, 34 + spx5_stats_pmac_rx_uc_cnt = 9, 35 + spx5_stats_rx_mc_cnt = 10, 36 + spx5_stats_rx_bc_cnt = 11, 37 + spx5_stats_rx_crc_err_cnt = 12, 38 + spx5_stats_pmac_rx_crc_err_cnt = 13, 39 + spx5_stats_rx_alignment_lost_cnt = 14, 40 + spx5_stats_pmac_rx_alignment_lost_cnt = 15, 41 + spx5_stats_tx_ok_bytes_cnt = 16, 42 + spx5_stats_pmac_tx_ok_bytes_cnt = 17, 43 + spx5_stats_tx_defer_cnt = 18, 44 + spx5_stats_tx_late_coll_cnt = 19, 45 + spx5_stats_tx_xcoll_cnt = 20, 46 + spx5_stats_tx_csense_cnt = 21, 47 + spx5_stats_rx_ok_bytes_cnt = 22, 48 + spx5_stats_pmac_rx_ok_bytes_cnt = 23, 49 + spx5_stats_pmac_tx_mc_cnt = 24, 50 + spx5_stats_pmac_tx_bc_cnt = 25, 51 + spx5_stats_tx_xdefer_cnt = 26, 52 + spx5_stats_pmac_rx_mc_cnt = 27, 53 + spx5_stats_pmac_rx_bc_cnt = 28, 54 + spx5_stats_rx_in_range_len_err_cnt = 29, 55 + spx5_stats_pmac_rx_in_range_len_err_cnt = 30, 56 + spx5_stats_rx_out_of_range_len_err_cnt = 31, 57 + spx5_stats_pmac_rx_out_of_range_len_err_cnt = 32, 58 + spx5_stats_rx_oversize_cnt = 33, 59 + spx5_stats_pmac_rx_oversize_cnt = 34, 60 + spx5_stats_tx_pause_cnt = 35, 61 + spx5_stats_pmac_tx_pause_cnt = 36, 62 + spx5_stats_rx_pause_cnt = 37, 63 + spx5_stats_pmac_rx_pause_cnt = 38, 64 + spx5_stats_rx_unsup_opcode_cnt = 39, 65 + spx5_stats_pmac_rx_unsup_opcode_cnt = 40, 66 + spx5_stats_rx_undersize_cnt = 41, 67 + spx5_stats_pmac_rx_undersize_cnt = 42, 68 + spx5_stats_rx_fragments_cnt = 43, 69 + spx5_stats_pmac_rx_fragments_cnt = 44, 70 + spx5_stats_rx_jabbers_cnt = 45, 71 + spx5_stats_pmac_rx_jabbers_cnt = 46, 72 + spx5_stats_rx_size64_cnt = 47, 73 + spx5_stats_pmac_rx_size64_cnt = 48, 74 + spx5_stats_rx_size65to127_cnt = 49, 75 + spx5_stats_pmac_rx_size65to127_cnt = 50, 76 + spx5_stats_rx_size128to255_cnt = 51, 77 + spx5_stats_pmac_rx_size128to255_cnt = 52, 78 + spx5_stats_rx_size256to511_cnt = 53, 79 + spx5_stats_pmac_rx_size256to511_cnt = 54, 80 + spx5_stats_rx_size512to1023_cnt = 55, 81 + spx5_stats_pmac_rx_size512to1023_cnt = 56, 82 + spx5_stats_rx_size1024to1518_cnt = 57, 83 + spx5_stats_pmac_rx_size1024to1518_cnt = 58, 84 + spx5_stats_rx_size1519tomax_cnt = 59, 85 + spx5_stats_pmac_rx_size1519tomax_cnt = 60, 86 + spx5_stats_tx_size64_cnt = 61, 87 + spx5_stats_pmac_tx_size64_cnt = 62, 88 + spx5_stats_tx_size65to127_cnt = 63, 89 + spx5_stats_pmac_tx_size65to127_cnt = 64, 90 + spx5_stats_tx_size128to255_cnt = 65, 91 + spx5_stats_pmac_tx_size128to255_cnt = 66, 92 + spx5_stats_tx_size256to511_cnt = 67, 93 + spx5_stats_pmac_tx_size256to511_cnt = 68, 94 + spx5_stats_tx_size512to1023_cnt = 69, 95 + spx5_stats_pmac_tx_size512to1023_cnt = 70, 96 + spx5_stats_tx_size1024to1518_cnt = 71, 97 + spx5_stats_pmac_tx_size1024to1518_cnt = 72, 98 + spx5_stats_tx_size1519tomax_cnt = 73, 99 + spx5_stats_pmac_tx_size1519tomax_cnt = 74, 100 + spx5_stats_mm_rx_assembly_err_cnt = 75, 101 + spx5_stats_mm_rx_assembly_ok_cnt = 76, 102 + spx5_stats_mm_rx_merge_frag_cnt = 77, 103 + spx5_stats_mm_rx_smd_err_cnt = 78, 104 + spx5_stats_mm_tx_pfragment_cnt = 79, 105 + spx5_stats_rx_bad_bytes_cnt = 80, 106 + spx5_stats_pmac_rx_bad_bytes_cnt = 81, 107 + spx5_stats_rx_in_bytes_cnt = 82, 108 + spx5_stats_rx_ipg_shrink_cnt = 83, 109 + spx5_stats_rx_sync_lost_err_cnt = 84, 110 + spx5_stats_rx_tagged_frms_cnt = 85, 111 + spx5_stats_rx_untagged_frms_cnt = 86, 112 + spx5_stats_tx_out_bytes_cnt = 87, 113 + spx5_stats_tx_tagged_frms_cnt = 88, 114 + spx5_stats_tx_untagged_frms_cnt = 89, 115 + spx5_stats_rx_hih_cksm_err_cnt = 90, 116 + spx5_stats_pmac_rx_hih_cksm_err_cnt = 91, 117 + spx5_stats_rx_xgmii_prot_err_cnt = 92, 118 + spx5_stats_pmac_rx_xgmii_prot_err_cnt = 93, 119 + spx5_stats_ana_ac_port_stat_lsb_cnt = 94, 120 + spx5_stats_green_p0_rx_fwd = 95, 121 + spx5_stats_green_p0_rx_port_drop = 111, 122 + spx5_stats_green_p0_tx_port = 127, 123 + spx5_stats_rx_local_drop = 143, 124 + spx5_stats_tx_local_drop = 144, 125 + spx5_stats_count = 145, 126 + }; 127 + 128 + static const char *const sparx5_stats_layout[] = { 129 + "mm_rx_assembly_err_cnt", 130 + "mm_rx_assembly_ok_cnt", 131 + "mm_rx_merge_frag_cnt", 132 + "mm_rx_smd_err_cnt", 133 + "mm_tx_pfragment_cnt", 134 + "rx_bad_bytes_cnt", 135 + "pmac_rx_bad_bytes_cnt", 136 + "rx_in_bytes_cnt", 137 + "rx_ipg_shrink_cnt", 138 + "rx_sync_lost_err_cnt", 139 + "rx_tagged_frms_cnt", 140 + "rx_untagged_frms_cnt", 141 + "tx_out_bytes_cnt", 142 + "tx_tagged_frms_cnt", 143 + "tx_untagged_frms_cnt", 144 + "rx_hih_cksm_err_cnt", 145 + "pmac_rx_hih_cksm_err_cnt", 146 + "rx_xgmii_prot_err_cnt", 147 + "pmac_rx_xgmii_prot_err_cnt", 148 + "rx_port_policer_drop", 149 + "rx_fwd_green_p0", 150 + "rx_fwd_green_p1", 151 + "rx_fwd_green_p2", 152 + "rx_fwd_green_p3", 153 + "rx_fwd_green_p4", 154 + "rx_fwd_green_p5", 155 + "rx_fwd_green_p6", 156 + "rx_fwd_green_p7", 157 + "rx_fwd_yellow_p0", 158 + "rx_fwd_yellow_p1", 159 + "rx_fwd_yellow_p2", 160 + "rx_fwd_yellow_p3", 161 + "rx_fwd_yellow_p4", 162 + "rx_fwd_yellow_p5", 163 + "rx_fwd_yellow_p6", 164 + "rx_fwd_yellow_p7", 165 + "rx_port_drop_green_p0", 166 + "rx_port_drop_green_p1", 167 + "rx_port_drop_green_p2", 168 + "rx_port_drop_green_p3", 169 + "rx_port_drop_green_p4", 170 + "rx_port_drop_green_p5", 171 + "rx_port_drop_green_p6", 172 + "rx_port_drop_green_p7", 173 + "rx_port_drop_yellow_p0", 174 + "rx_port_drop_yellow_p1", 175 + "rx_port_drop_yellow_p2", 176 + "rx_port_drop_yellow_p3", 177 + "rx_port_drop_yellow_p4", 178 + "rx_port_drop_yellow_p5", 179 + "rx_port_drop_yellow_p6", 180 + "rx_port_drop_yellow_p7", 181 + "tx_port_green_p0", 182 + "tx_port_green_p1", 183 + "tx_port_green_p2", 184 + "tx_port_green_p3", 185 + "tx_port_green_p4", 186 + "tx_port_green_p5", 187 + "tx_port_green_p6", 188 + "tx_port_green_p7", 189 + "tx_port_yellow_p0", 190 + "tx_port_yellow_p1", 191 + "tx_port_yellow_p2", 192 + "tx_port_yellow_p3", 193 + "tx_port_yellow_p4", 194 + "tx_port_yellow_p5", 195 + "tx_port_yellow_p6", 196 + "tx_port_yellow_p7", 197 + "rx_local_drop", 198 + "tx_local_drop", 199 + }; 200 + 201 + static void sparx5_get_queue_sys_stats(struct sparx5 *sparx5, int portno) 202 + { 203 + u64 *portstats; 204 + u64 *stats; 205 + u32 addr; 206 + int idx; 207 + 208 + portstats = &sparx5->stats[portno * sparx5->num_stats]; 209 + mutex_lock(&sparx5->queue_stats_lock); 210 + spx5_wr(XQS_STAT_CFG_STAT_VIEW_SET(portno), sparx5, XQS_STAT_CFG); 211 + addr = 0; 212 + stats = &portstats[spx5_stats_green_p0_rx_fwd]; 213 + for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++addr, ++stats) 214 + sparx5_update_counter(stats, spx5_rd(sparx5, XQS_CNT(addr))); 215 + addr = 16; 216 + stats = &portstats[spx5_stats_green_p0_rx_port_drop]; 217 + for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++addr, ++stats) 218 + sparx5_update_counter(stats, spx5_rd(sparx5, XQS_CNT(addr))); 219 + addr = 256; 220 + stats = &portstats[spx5_stats_green_p0_tx_port]; 221 + for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++addr, ++stats) 222 + sparx5_update_counter(stats, spx5_rd(sparx5, XQS_CNT(addr))); 223 + sparx5_update_counter(&portstats[spx5_stats_rx_local_drop], 224 + spx5_rd(sparx5, XQS_CNT(32))); 225 + sparx5_update_counter(&portstats[spx5_stats_tx_local_drop], 226 + spx5_rd(sparx5, XQS_CNT(272))); 227 + mutex_unlock(&sparx5->queue_stats_lock); 228 + } 229 + 230 + static void sparx5_get_ana_ac_stats_stats(struct sparx5 *sparx5, int portno) 231 + { 232 + u64 *portstats = &sparx5->stats[portno * sparx5->num_stats]; 233 + 234 + sparx5_update_counter(&portstats[spx5_stats_ana_ac_port_stat_lsb_cnt], 235 + spx5_rd(sparx5, ANA_AC_PORT_STAT_LSB_CNT(portno, 236 + SPX5_PORT_POLICER_DROPS))); 237 + } 238 + 239 + static void sparx5_get_dev_phy_stats(u64 *portstats, void __iomem *inst, u32 240 + tinst) 241 + { 242 + sparx5_update_counter(&portstats[spx5_stats_rx_symbol_err_cnt], 243 + spx5_inst_rd(inst, 244 + DEV5G_RX_SYMBOL_ERR_CNT(tinst))); 245 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_symbol_err_cnt], 246 + spx5_inst_rd(inst, 247 + DEV5G_PMAC_RX_SYMBOL_ERR_CNT(tinst))); 248 + } 249 + 250 + static void sparx5_get_dev_mac_stats(u64 *portstats, void __iomem *inst, u32 251 + tinst) 252 + { 253 + sparx5_update_counter(&portstats[spx5_stats_tx_uc_cnt], 254 + spx5_inst_rd(inst, DEV5G_TX_UC_CNT(tinst))); 255 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_uc_cnt], 256 + spx5_inst_rd(inst, DEV5G_PMAC_TX_UC_CNT(tinst))); 257 + sparx5_update_counter(&portstats[spx5_stats_tx_mc_cnt], 258 + spx5_inst_rd(inst, DEV5G_TX_MC_CNT(tinst))); 259 + sparx5_update_counter(&portstats[spx5_stats_tx_bc_cnt], 260 + spx5_inst_rd(inst, DEV5G_TX_BC_CNT(tinst))); 261 + sparx5_update_counter(&portstats[spx5_stats_rx_uc_cnt], 262 + spx5_inst_rd(inst, DEV5G_RX_UC_CNT(tinst))); 263 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_uc_cnt], 264 + spx5_inst_rd(inst, DEV5G_PMAC_RX_UC_CNT(tinst))); 265 + sparx5_update_counter(&portstats[spx5_stats_rx_mc_cnt], 266 + spx5_inst_rd(inst, DEV5G_RX_MC_CNT(tinst))); 267 + sparx5_update_counter(&portstats[spx5_stats_rx_bc_cnt], 268 + spx5_inst_rd(inst, DEV5G_RX_BC_CNT(tinst))); 269 + sparx5_update_counter(&portstats[spx5_stats_rx_crc_err_cnt], 270 + spx5_inst_rd(inst, DEV5G_RX_CRC_ERR_CNT(tinst))); 271 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_crc_err_cnt], 272 + spx5_inst_rd(inst, 273 + DEV5G_PMAC_RX_CRC_ERR_CNT(tinst))); 274 + sparx5_update_counter(&portstats[spx5_stats_rx_alignment_lost_cnt], 275 + spx5_inst_rd(inst, 276 + DEV5G_RX_ALIGNMENT_LOST_CNT(tinst))); 277 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_alignment_lost_cnt], 278 + spx5_inst_rd(inst, 279 + DEV5G_PMAC_RX_ALIGNMENT_LOST_CNT(tinst))); 280 + sparx5_update_counter(&portstats[spx5_stats_tx_ok_bytes_cnt], 281 + spx5_inst_rd(inst, DEV5G_TX_OK_BYTES_CNT(tinst))); 282 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_ok_bytes_cnt], 283 + spx5_inst_rd(inst, 284 + DEV5G_PMAC_TX_OK_BYTES_CNT(tinst))); 285 + sparx5_update_counter(&portstats[spx5_stats_rx_ok_bytes_cnt], 286 + spx5_inst_rd(inst, DEV5G_RX_OK_BYTES_CNT(tinst))); 287 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_ok_bytes_cnt], 288 + spx5_inst_rd(inst, 289 + DEV5G_PMAC_RX_OK_BYTES_CNT(tinst))); 290 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_mc_cnt], 291 + spx5_inst_rd(inst, DEV5G_PMAC_TX_MC_CNT(tinst))); 292 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_bc_cnt], 293 + spx5_inst_rd(inst, DEV5G_PMAC_TX_BC_CNT(tinst))); 294 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_mc_cnt], 295 + spx5_inst_rd(inst, DEV5G_PMAC_RX_MC_CNT(tinst))); 296 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bc_cnt], 297 + spx5_inst_rd(inst, DEV5G_PMAC_RX_BC_CNT(tinst))); 298 + sparx5_update_counter(&portstats[spx5_stats_rx_in_range_len_err_cnt], 299 + spx5_inst_rd(inst, 300 + DEV5G_RX_IN_RANGE_LEN_ERR_CNT(tinst))); 301 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_in_range_len_err_cnt], 302 + spx5_inst_rd(inst, 303 + DEV5G_PMAC_RX_IN_RANGE_LEN_ERR_CNT(tinst))); 304 + sparx5_update_counter(&portstats[spx5_stats_rx_out_of_range_len_err_cnt], 305 + spx5_inst_rd(inst, 306 + DEV5G_RX_OUT_OF_RANGE_LEN_ERR_CNT(tinst))); 307 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt], 308 + spx5_inst_rd(inst, 309 + DEV5G_PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT(tinst))); 310 + sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 311 + spx5_inst_rd(inst, DEV5G_RX_OVERSIZE_CNT(tinst))); 312 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 313 + spx5_inst_rd(inst, 314 + DEV5G_PMAC_RX_OVERSIZE_CNT(tinst))); 315 + } 316 + 317 + static void sparx5_get_dev_mac_ctrl_stats(u64 *portstats, void __iomem *inst, 318 + u32 tinst) 319 + { 320 + sparx5_update_counter(&portstats[spx5_stats_tx_pause_cnt], 321 + spx5_inst_rd(inst, DEV5G_TX_PAUSE_CNT(tinst))); 322 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_pause_cnt], 323 + spx5_inst_rd(inst, 324 + DEV5G_PMAC_TX_PAUSE_CNT(tinst))); 325 + sparx5_update_counter(&portstats[spx5_stats_rx_pause_cnt], 326 + spx5_inst_rd(inst, DEV5G_RX_PAUSE_CNT(tinst))); 327 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_pause_cnt], 328 + spx5_inst_rd(inst, 329 + DEV5G_PMAC_RX_PAUSE_CNT(tinst))); 330 + sparx5_update_counter(&portstats[spx5_stats_rx_unsup_opcode_cnt], 331 + spx5_inst_rd(inst, 332 + DEV5G_RX_UNSUP_OPCODE_CNT(tinst))); 333 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_unsup_opcode_cnt], 334 + spx5_inst_rd(inst, 335 + DEV5G_PMAC_RX_UNSUP_OPCODE_CNT(tinst))); 336 + } 337 + 338 + static void sparx5_get_dev_rmon_stats(u64 *portstats, void __iomem *inst, u32 339 + tinst) 340 + { 341 + sparx5_update_counter(&portstats[spx5_stats_rx_undersize_cnt], 342 + spx5_inst_rd(inst, 343 + DEV5G_RX_UNDERSIZE_CNT(tinst))); 344 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_undersize_cnt], 345 + spx5_inst_rd(inst, 346 + DEV5G_PMAC_RX_UNDERSIZE_CNT(tinst))); 347 + sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 348 + spx5_inst_rd(inst, DEV5G_RX_OVERSIZE_CNT(tinst))); 349 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 350 + spx5_inst_rd(inst, 351 + DEV5G_PMAC_RX_OVERSIZE_CNT(tinst))); 352 + sparx5_update_counter(&portstats[spx5_stats_rx_fragments_cnt], 353 + spx5_inst_rd(inst, 354 + DEV5G_RX_FRAGMENTS_CNT(tinst))); 355 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_fragments_cnt], 356 + spx5_inst_rd(inst, 357 + DEV5G_PMAC_RX_FRAGMENTS_CNT(tinst))); 358 + sparx5_update_counter(&portstats[spx5_stats_rx_jabbers_cnt], 359 + spx5_inst_rd(inst, DEV5G_RX_JABBERS_CNT(tinst))); 360 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_jabbers_cnt], 361 + spx5_inst_rd(inst, 362 + DEV5G_PMAC_RX_JABBERS_CNT(tinst))); 363 + sparx5_update_counter(&portstats[spx5_stats_rx_size64_cnt], 364 + spx5_inst_rd(inst, DEV5G_RX_SIZE64_CNT(tinst))); 365 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size64_cnt], 366 + spx5_inst_rd(inst, 367 + DEV5G_PMAC_RX_SIZE64_CNT(tinst))); 368 + sparx5_update_counter(&portstats[spx5_stats_rx_size65to127_cnt], 369 + spx5_inst_rd(inst, 370 + DEV5G_RX_SIZE65TO127_CNT(tinst))); 371 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size65to127_cnt], 372 + spx5_inst_rd(inst, 373 + DEV5G_PMAC_RX_SIZE65TO127_CNT(tinst))); 374 + sparx5_update_counter(&portstats[spx5_stats_rx_size128to255_cnt], 375 + spx5_inst_rd(inst, 376 + DEV5G_RX_SIZE128TO255_CNT(tinst))); 377 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size128to255_cnt], 378 + spx5_inst_rd(inst, 379 + DEV5G_PMAC_RX_SIZE128TO255_CNT(tinst))); 380 + sparx5_update_counter(&portstats[spx5_stats_rx_size256to511_cnt], 381 + spx5_inst_rd(inst, 382 + DEV5G_RX_SIZE256TO511_CNT(tinst))); 383 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size256to511_cnt], 384 + spx5_inst_rd(inst, 385 + DEV5G_PMAC_RX_SIZE256TO511_CNT(tinst))); 386 + sparx5_update_counter(&portstats[spx5_stats_rx_size512to1023_cnt], 387 + spx5_inst_rd(inst, 388 + DEV5G_RX_SIZE512TO1023_CNT(tinst))); 389 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size512to1023_cnt], 390 + spx5_inst_rd(inst, 391 + DEV5G_PMAC_RX_SIZE512TO1023_CNT(tinst))); 392 + sparx5_update_counter(&portstats[spx5_stats_rx_size1024to1518_cnt], 393 + spx5_inst_rd(inst, 394 + DEV5G_RX_SIZE1024TO1518_CNT(tinst))); 395 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1024to1518_cnt], 396 + spx5_inst_rd(inst, 397 + DEV5G_PMAC_RX_SIZE1024TO1518_CNT(tinst))); 398 + sparx5_update_counter(&portstats[spx5_stats_rx_size1519tomax_cnt], 399 + spx5_inst_rd(inst, 400 + DEV5G_RX_SIZE1519TOMAX_CNT(tinst))); 401 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1519tomax_cnt], 402 + spx5_inst_rd(inst, 403 + DEV5G_PMAC_RX_SIZE1519TOMAX_CNT(tinst))); 404 + sparx5_update_counter(&portstats[spx5_stats_tx_size64_cnt], 405 + spx5_inst_rd(inst, DEV5G_TX_SIZE64_CNT(tinst))); 406 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size64_cnt], 407 + spx5_inst_rd(inst, 408 + DEV5G_PMAC_TX_SIZE64_CNT(tinst))); 409 + sparx5_update_counter(&portstats[spx5_stats_tx_size65to127_cnt], 410 + spx5_inst_rd(inst, 411 + DEV5G_TX_SIZE65TO127_CNT(tinst))); 412 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size65to127_cnt], 413 + spx5_inst_rd(inst, 414 + DEV5G_PMAC_TX_SIZE65TO127_CNT(tinst))); 415 + sparx5_update_counter(&portstats[spx5_stats_tx_size128to255_cnt], 416 + spx5_inst_rd(inst, 417 + DEV5G_TX_SIZE128TO255_CNT(tinst))); 418 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size128to255_cnt], 419 + spx5_inst_rd(inst, 420 + DEV5G_PMAC_TX_SIZE128TO255_CNT(tinst))); 421 + sparx5_update_counter(&portstats[spx5_stats_tx_size256to511_cnt], 422 + spx5_inst_rd(inst, 423 + DEV5G_TX_SIZE256TO511_CNT(tinst))); 424 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size256to511_cnt], 425 + spx5_inst_rd(inst, 426 + DEV5G_PMAC_TX_SIZE256TO511_CNT(tinst))); 427 + sparx5_update_counter(&portstats[spx5_stats_tx_size512to1023_cnt], 428 + spx5_inst_rd(inst, 429 + DEV5G_TX_SIZE512TO1023_CNT(tinst))); 430 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size512to1023_cnt], 431 + spx5_inst_rd(inst, 432 + DEV5G_PMAC_TX_SIZE512TO1023_CNT(tinst))); 433 + sparx5_update_counter(&portstats[spx5_stats_tx_size1024to1518_cnt], 434 + spx5_inst_rd(inst, 435 + DEV5G_TX_SIZE1024TO1518_CNT(tinst))); 436 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1024to1518_cnt], 437 + spx5_inst_rd(inst, 438 + DEV5G_PMAC_TX_SIZE1024TO1518_CNT(tinst))); 439 + sparx5_update_counter(&portstats[spx5_stats_tx_size1519tomax_cnt], 440 + spx5_inst_rd(inst, 441 + DEV5G_TX_SIZE1519TOMAX_CNT(tinst))); 442 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1519tomax_cnt], 443 + spx5_inst_rd(inst, 444 + DEV5G_PMAC_TX_SIZE1519TOMAX_CNT(tinst))); 445 + } 446 + 447 + static void sparx5_get_dev_misc_stats(u64 *portstats, void __iomem *inst, u32 448 + tinst) 449 + { 450 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_err_cnt], 451 + spx5_inst_rd(inst, 452 + DEV5G_MM_RX_ASSEMBLY_ERR_CNT(tinst))); 453 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_ok_cnt], 454 + spx5_inst_rd(inst, 455 + DEV5G_MM_RX_ASSEMBLY_OK_CNT(tinst))); 456 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_merge_frag_cnt], 457 + spx5_inst_rd(inst, 458 + DEV5G_MM_RX_MERGE_FRAG_CNT(tinst))); 459 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_smd_err_cnt], 460 + spx5_inst_rd(inst, 461 + DEV5G_MM_RX_SMD_ERR_CNT(tinst))); 462 + sparx5_update_counter(&portstats[spx5_stats_mm_tx_pfragment_cnt], 463 + spx5_inst_rd(inst, 464 + DEV5G_MM_TX_PFRAGMENT_CNT(tinst))); 465 + sparx5_update_counter(&portstats[spx5_stats_rx_bad_bytes_cnt], 466 + spx5_inst_rd(inst, 467 + DEV5G_RX_BAD_BYTES_CNT(tinst))); 468 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bad_bytes_cnt], 469 + spx5_inst_rd(inst, 470 + DEV5G_PMAC_RX_BAD_BYTES_CNT(tinst))); 471 + sparx5_update_counter(&portstats[spx5_stats_rx_in_bytes_cnt], 472 + spx5_inst_rd(inst, DEV5G_RX_IN_BYTES_CNT(tinst))); 473 + sparx5_update_counter(&portstats[spx5_stats_rx_ipg_shrink_cnt], 474 + spx5_inst_rd(inst, 475 + DEV5G_RX_IPG_SHRINK_CNT(tinst))); 476 + sparx5_update_counter(&portstats[spx5_stats_rx_tagged_frms_cnt], 477 + spx5_inst_rd(inst, 478 + DEV5G_RX_TAGGED_FRMS_CNT(tinst))); 479 + sparx5_update_counter(&portstats[spx5_stats_rx_untagged_frms_cnt], 480 + spx5_inst_rd(inst, 481 + DEV5G_RX_UNTAGGED_FRMS_CNT(tinst))); 482 + sparx5_update_counter(&portstats[spx5_stats_tx_out_bytes_cnt], 483 + spx5_inst_rd(inst, 484 + DEV5G_TX_OUT_BYTES_CNT(tinst))); 485 + sparx5_update_counter(&portstats[spx5_stats_tx_tagged_frms_cnt], 486 + spx5_inst_rd(inst, 487 + DEV5G_TX_TAGGED_FRMS_CNT(tinst))); 488 + sparx5_update_counter(&portstats[spx5_stats_tx_untagged_frms_cnt], 489 + spx5_inst_rd(inst, 490 + DEV5G_TX_UNTAGGED_FRMS_CNT(tinst))); 491 + sparx5_update_counter(&portstats[spx5_stats_rx_hih_cksm_err_cnt], 492 + spx5_inst_rd(inst, 493 + DEV5G_RX_HIH_CKSM_ERR_CNT(tinst))); 494 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_hih_cksm_err_cnt], 495 + spx5_inst_rd(inst, 496 + DEV5G_PMAC_RX_HIH_CKSM_ERR_CNT(tinst))); 497 + sparx5_update_counter(&portstats[spx5_stats_rx_xgmii_prot_err_cnt], 498 + spx5_inst_rd(inst, 499 + DEV5G_RX_XGMII_PROT_ERR_CNT(tinst))); 500 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_xgmii_prot_err_cnt], 501 + spx5_inst_rd(inst, 502 + DEV5G_PMAC_RX_XGMII_PROT_ERR_CNT(tinst))); 503 + } 504 + 505 + static void sparx5_get_device_stats(struct sparx5 *sparx5, int portno) 506 + { 507 + u64 *portstats = &sparx5->stats[portno * sparx5->num_stats]; 508 + u32 tinst = sparx5_port_dev_index(portno); 509 + u32 dev = sparx5_to_high_dev(portno); 510 + void __iomem *inst; 511 + 512 + inst = spx5_inst_get(sparx5, dev, tinst); 513 + sparx5_get_dev_phy_stats(portstats, inst, tinst); 514 + sparx5_get_dev_mac_stats(portstats, inst, tinst); 515 + sparx5_get_dev_mac_ctrl_stats(portstats, inst, tinst); 516 + sparx5_get_dev_rmon_stats(portstats, inst, tinst); 517 + sparx5_get_dev_misc_stats(portstats, inst, tinst); 518 + } 519 + 520 + static void sparx5_get_asm_phy_stats(u64 *portstats, void __iomem *inst, int 521 + portno) 522 + { 523 + sparx5_update_counter(&portstats[spx5_stats_rx_symbol_err_cnt], 524 + spx5_inst_rd(inst, 525 + ASM_RX_SYMBOL_ERR_CNT(portno))); 526 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_symbol_err_cnt], 527 + spx5_inst_rd(inst, 528 + ASM_PMAC_RX_SYMBOL_ERR_CNT(portno))); 529 + } 530 + 531 + static void sparx5_get_asm_mac_stats(u64 *portstats, void __iomem *inst, int 532 + portno) 533 + { 534 + sparx5_update_counter(&portstats[spx5_stats_tx_uc_cnt], 535 + spx5_inst_rd(inst, ASM_TX_UC_CNT(portno))); 536 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_uc_cnt], 537 + spx5_inst_rd(inst, ASM_PMAC_TX_UC_CNT(portno))); 538 + sparx5_update_counter(&portstats[spx5_stats_tx_mc_cnt], 539 + spx5_inst_rd(inst, ASM_TX_MC_CNT(portno))); 540 + sparx5_update_counter(&portstats[spx5_stats_tx_bc_cnt], 541 + spx5_inst_rd(inst, ASM_TX_BC_CNT(portno))); 542 + sparx5_update_counter(&portstats[spx5_stats_tx_backoff1_cnt], 543 + spx5_inst_rd(inst, ASM_TX_BACKOFF1_CNT(portno))); 544 + sparx5_update_counter(&portstats[spx5_stats_tx_multi_coll_cnt], 545 + spx5_inst_rd(inst, 546 + ASM_TX_MULTI_COLL_CNT(portno))); 547 + sparx5_update_counter(&portstats[spx5_stats_rx_uc_cnt], 548 + spx5_inst_rd(inst, ASM_RX_UC_CNT(portno))); 549 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_uc_cnt], 550 + spx5_inst_rd(inst, ASM_PMAC_RX_UC_CNT(portno))); 551 + sparx5_update_counter(&portstats[spx5_stats_rx_mc_cnt], 552 + spx5_inst_rd(inst, ASM_RX_MC_CNT(portno))); 553 + sparx5_update_counter(&portstats[spx5_stats_rx_bc_cnt], 554 + spx5_inst_rd(inst, ASM_RX_BC_CNT(portno))); 555 + sparx5_update_counter(&portstats[spx5_stats_rx_crc_err_cnt], 556 + spx5_inst_rd(inst, ASM_RX_CRC_ERR_CNT(portno))); 557 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_crc_err_cnt], 558 + spx5_inst_rd(inst, 559 + ASM_PMAC_RX_CRC_ERR_CNT(portno))); 560 + sparx5_update_counter(&portstats[spx5_stats_rx_alignment_lost_cnt], 561 + spx5_inst_rd(inst, 562 + ASM_RX_ALIGNMENT_LOST_CNT(portno))); 563 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_alignment_lost_cnt], 564 + spx5_inst_rd(inst, 565 + ASM_PMAC_RX_ALIGNMENT_LOST_CNT(portno))); 566 + sparx5_update_counter(&portstats[spx5_stats_tx_ok_bytes_cnt], 567 + spx5_inst_rd(inst, ASM_TX_OK_BYTES_CNT(portno))); 568 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_ok_bytes_cnt], 569 + spx5_inst_rd(inst, 570 + ASM_PMAC_TX_OK_BYTES_CNT(portno))); 571 + sparx5_update_counter(&portstats[spx5_stats_tx_defer_cnt], 572 + spx5_inst_rd(inst, ASM_TX_DEFER_CNT(portno))); 573 + sparx5_update_counter(&portstats[spx5_stats_tx_late_coll_cnt], 574 + spx5_inst_rd(inst, ASM_TX_LATE_COLL_CNT(portno))); 575 + sparx5_update_counter(&portstats[spx5_stats_tx_xcoll_cnt], 576 + spx5_inst_rd(inst, ASM_TX_XCOLL_CNT(portno))); 577 + sparx5_update_counter(&portstats[spx5_stats_tx_csense_cnt], 578 + spx5_inst_rd(inst, ASM_TX_CSENSE_CNT(portno))); 579 + sparx5_update_counter(&portstats[spx5_stats_rx_ok_bytes_cnt], 580 + spx5_inst_rd(inst, ASM_RX_OK_BYTES_CNT(portno))); 581 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_ok_bytes_cnt], 582 + spx5_inst_rd(inst, 583 + ASM_PMAC_RX_OK_BYTES_CNT(portno))); 584 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_mc_cnt], 585 + spx5_inst_rd(inst, ASM_PMAC_TX_MC_CNT(portno))); 586 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_bc_cnt], 587 + spx5_inst_rd(inst, ASM_PMAC_TX_BC_CNT(portno))); 588 + sparx5_update_counter(&portstats[spx5_stats_tx_xdefer_cnt], 589 + spx5_inst_rd(inst, ASM_TX_XDEFER_CNT(portno))); 590 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_mc_cnt], 591 + spx5_inst_rd(inst, ASM_PMAC_RX_MC_CNT(portno))); 592 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bc_cnt], 593 + spx5_inst_rd(inst, ASM_PMAC_RX_BC_CNT(portno))); 594 + sparx5_update_counter(&portstats[spx5_stats_rx_in_range_len_err_cnt], 595 + spx5_inst_rd(inst, 596 + ASM_RX_IN_RANGE_LEN_ERR_CNT(portno))); 597 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_in_range_len_err_cnt], 598 + spx5_inst_rd(inst, 599 + ASM_PMAC_RX_IN_RANGE_LEN_ERR_CNT(portno))); 600 + sparx5_update_counter(&portstats[spx5_stats_rx_out_of_range_len_err_cnt], 601 + spx5_inst_rd(inst, 602 + ASM_RX_OUT_OF_RANGE_LEN_ERR_CNT(portno))); 603 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt], 604 + spx5_inst_rd(inst, 605 + ASM_PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT(portno))); 606 + sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 607 + spx5_inst_rd(inst, ASM_RX_OVERSIZE_CNT(portno))); 608 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 609 + spx5_inst_rd(inst, 610 + ASM_PMAC_RX_OVERSIZE_CNT(portno))); 611 + } 612 + 613 + static void sparx5_get_asm_mac_ctrl_stats(u64 *portstats, void __iomem *inst, 614 + int portno) 615 + { 616 + sparx5_update_counter(&portstats[spx5_stats_tx_pause_cnt], 617 + spx5_inst_rd(inst, ASM_TX_PAUSE_CNT(portno))); 618 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_pause_cnt], 619 + spx5_inst_rd(inst, 620 + ASM_PMAC_TX_PAUSE_CNT(portno))); 621 + sparx5_update_counter(&portstats[spx5_stats_rx_pause_cnt], 622 + spx5_inst_rd(inst, ASM_RX_PAUSE_CNT(portno))); 623 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_pause_cnt], 624 + spx5_inst_rd(inst, 625 + ASM_PMAC_RX_PAUSE_CNT(portno))); 626 + sparx5_update_counter(&portstats[spx5_stats_rx_unsup_opcode_cnt], 627 + spx5_inst_rd(inst, 628 + ASM_RX_UNSUP_OPCODE_CNT(portno))); 629 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_unsup_opcode_cnt], 630 + spx5_inst_rd(inst, 631 + ASM_PMAC_RX_UNSUP_OPCODE_CNT(portno))); 632 + } 633 + 634 + static void sparx5_get_asm_rmon_stats(u64 *portstats, void __iomem *inst, int 635 + portno) 636 + { 637 + sparx5_update_counter(&portstats[spx5_stats_rx_undersize_cnt], 638 + spx5_inst_rd(inst, ASM_RX_UNDERSIZE_CNT(portno))); 639 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_undersize_cnt], 640 + spx5_inst_rd(inst, 641 + ASM_PMAC_RX_UNDERSIZE_CNT(portno))); 642 + sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 643 + spx5_inst_rd(inst, ASM_RX_OVERSIZE_CNT(portno))); 644 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 645 + spx5_inst_rd(inst, 646 + ASM_PMAC_RX_OVERSIZE_CNT(portno))); 647 + sparx5_update_counter(&portstats[spx5_stats_rx_fragments_cnt], 648 + spx5_inst_rd(inst, ASM_RX_FRAGMENTS_CNT(portno))); 649 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_fragments_cnt], 650 + spx5_inst_rd(inst, 651 + ASM_PMAC_RX_FRAGMENTS_CNT(portno))); 652 + sparx5_update_counter(&portstats[spx5_stats_rx_jabbers_cnt], 653 + spx5_inst_rd(inst, ASM_RX_JABBERS_CNT(portno))); 654 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_jabbers_cnt], 655 + spx5_inst_rd(inst, 656 + ASM_PMAC_RX_JABBERS_CNT(portno))); 657 + sparx5_update_counter(&portstats[spx5_stats_rx_size64_cnt], 658 + spx5_inst_rd(inst, ASM_RX_SIZE64_CNT(portno))); 659 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size64_cnt], 660 + spx5_inst_rd(inst, 661 + ASM_PMAC_RX_SIZE64_CNT(portno))); 662 + sparx5_update_counter(&portstats[spx5_stats_rx_size65to127_cnt], 663 + spx5_inst_rd(inst, 664 + ASM_RX_SIZE65TO127_CNT(portno))); 665 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size65to127_cnt], 666 + spx5_inst_rd(inst, 667 + ASM_PMAC_RX_SIZE65TO127_CNT(portno))); 668 + sparx5_update_counter(&portstats[spx5_stats_rx_size128to255_cnt], 669 + spx5_inst_rd(inst, 670 + ASM_RX_SIZE128TO255_CNT(portno))); 671 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size128to255_cnt], 672 + spx5_inst_rd(inst, 673 + ASM_PMAC_RX_SIZE128TO255_CNT(portno))); 674 + sparx5_update_counter(&portstats[spx5_stats_rx_size256to511_cnt], 675 + spx5_inst_rd(inst, 676 + ASM_RX_SIZE256TO511_CNT(portno))); 677 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size256to511_cnt], 678 + spx5_inst_rd(inst, 679 + ASM_PMAC_RX_SIZE256TO511_CNT(portno))); 680 + sparx5_update_counter(&portstats[spx5_stats_rx_size512to1023_cnt], 681 + spx5_inst_rd(inst, 682 + ASM_RX_SIZE512TO1023_CNT(portno))); 683 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size512to1023_cnt], 684 + spx5_inst_rd(inst, 685 + ASM_PMAC_RX_SIZE512TO1023_CNT(portno))); 686 + sparx5_update_counter(&portstats[spx5_stats_rx_size1024to1518_cnt], 687 + spx5_inst_rd(inst, 688 + ASM_RX_SIZE1024TO1518_CNT(portno))); 689 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1024to1518_cnt], 690 + spx5_inst_rd(inst, 691 + ASM_PMAC_RX_SIZE1024TO1518_CNT(portno))); 692 + sparx5_update_counter(&portstats[spx5_stats_rx_size1519tomax_cnt], 693 + spx5_inst_rd(inst, 694 + ASM_RX_SIZE1519TOMAX_CNT(portno))); 695 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1519tomax_cnt], 696 + spx5_inst_rd(inst, 697 + ASM_PMAC_RX_SIZE1519TOMAX_CNT(portno))); 698 + sparx5_update_counter(&portstats[spx5_stats_tx_size64_cnt], 699 + spx5_inst_rd(inst, ASM_TX_SIZE64_CNT(portno))); 700 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size64_cnt], 701 + spx5_inst_rd(inst, 702 + ASM_PMAC_TX_SIZE64_CNT(portno))); 703 + sparx5_update_counter(&portstats[spx5_stats_tx_size65to127_cnt], 704 + spx5_inst_rd(inst, 705 + ASM_TX_SIZE65TO127_CNT(portno))); 706 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size65to127_cnt], 707 + spx5_inst_rd(inst, 708 + ASM_PMAC_TX_SIZE65TO127_CNT(portno))); 709 + sparx5_update_counter(&portstats[spx5_stats_tx_size128to255_cnt], 710 + spx5_inst_rd(inst, 711 + ASM_TX_SIZE128TO255_CNT(portno))); 712 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size128to255_cnt], 713 + spx5_inst_rd(inst, 714 + ASM_PMAC_TX_SIZE128TO255_CNT(portno))); 715 + sparx5_update_counter(&portstats[spx5_stats_tx_size256to511_cnt], 716 + spx5_inst_rd(inst, 717 + ASM_TX_SIZE256TO511_CNT(portno))); 718 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size256to511_cnt], 719 + spx5_inst_rd(inst, 720 + ASM_PMAC_TX_SIZE256TO511_CNT(portno))); 721 + sparx5_update_counter(&portstats[spx5_stats_tx_size512to1023_cnt], 722 + spx5_inst_rd(inst, 723 + ASM_TX_SIZE512TO1023_CNT(portno))); 724 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size512to1023_cnt], 725 + spx5_inst_rd(inst, 726 + ASM_PMAC_TX_SIZE512TO1023_CNT(portno))); 727 + sparx5_update_counter(&portstats[spx5_stats_tx_size1024to1518_cnt], 728 + spx5_inst_rd(inst, 729 + ASM_TX_SIZE1024TO1518_CNT(portno))); 730 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1024to1518_cnt], 731 + spx5_inst_rd(inst, 732 + ASM_PMAC_TX_SIZE1024TO1518_CNT(portno))); 733 + sparx5_update_counter(&portstats[spx5_stats_tx_size1519tomax_cnt], 734 + spx5_inst_rd(inst, 735 + ASM_TX_SIZE1519TOMAX_CNT(portno))); 736 + sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1519tomax_cnt], 737 + spx5_inst_rd(inst, 738 + ASM_PMAC_TX_SIZE1519TOMAX_CNT(portno))); 739 + } 740 + 741 + static void sparx5_get_asm_misc_stats(u64 *portstats, void __iomem *inst, int 742 + portno) 743 + { 744 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_err_cnt], 745 + spx5_inst_rd(inst, 746 + ASM_MM_RX_ASSEMBLY_ERR_CNT(portno))); 747 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_ok_cnt], 748 + spx5_inst_rd(inst, 749 + ASM_MM_RX_ASSEMBLY_OK_CNT(portno))); 750 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_merge_frag_cnt], 751 + spx5_inst_rd(inst, 752 + ASM_MM_RX_MERGE_FRAG_CNT(portno))); 753 + sparx5_update_counter(&portstats[spx5_stats_mm_rx_smd_err_cnt], 754 + spx5_inst_rd(inst, 755 + ASM_MM_RX_SMD_ERR_CNT(portno))); 756 + sparx5_update_counter(&portstats[spx5_stats_mm_tx_pfragment_cnt], 757 + spx5_inst_rd(inst, 758 + ASM_MM_TX_PFRAGMENT_CNT(portno))); 759 + sparx5_update_counter(&portstats[spx5_stats_rx_bad_bytes_cnt], 760 + spx5_inst_rd(inst, ASM_RX_BAD_BYTES_CNT(portno))); 761 + sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bad_bytes_cnt], 762 + spx5_inst_rd(inst, 763 + ASM_PMAC_RX_BAD_BYTES_CNT(portno))); 764 + sparx5_update_counter(&portstats[spx5_stats_rx_in_bytes_cnt], 765 + spx5_inst_rd(inst, ASM_RX_IN_BYTES_CNT(portno))); 766 + sparx5_update_counter(&portstats[spx5_stats_rx_ipg_shrink_cnt], 767 + spx5_inst_rd(inst, 768 + ASM_RX_IPG_SHRINK_CNT(portno))); 769 + sparx5_update_counter(&portstats[spx5_stats_rx_sync_lost_err_cnt], 770 + spx5_inst_rd(inst, 771 + ASM_RX_SYNC_LOST_ERR_CNT(portno))); 772 + sparx5_update_counter(&portstats[spx5_stats_rx_tagged_frms_cnt], 773 + spx5_inst_rd(inst, 774 + ASM_RX_TAGGED_FRMS_CNT(portno))); 775 + sparx5_update_counter(&portstats[spx5_stats_rx_untagged_frms_cnt], 776 + spx5_inst_rd(inst, 777 + ASM_RX_UNTAGGED_FRMS_CNT(portno))); 778 + sparx5_update_counter(&portstats[spx5_stats_tx_out_bytes_cnt], 779 + spx5_inst_rd(inst, ASM_TX_OUT_BYTES_CNT(portno))); 780 + sparx5_update_counter(&portstats[spx5_stats_tx_tagged_frms_cnt], 781 + spx5_inst_rd(inst, 782 + ASM_TX_TAGGED_FRMS_CNT(portno))); 783 + sparx5_update_counter(&portstats[spx5_stats_tx_untagged_frms_cnt], 784 + spx5_inst_rd(inst, 785 + ASM_TX_UNTAGGED_FRMS_CNT(portno))); 786 + } 787 + 788 + static void sparx5_get_asm_stats(struct sparx5 *sparx5, int portno) 789 + { 790 + u64 *portstats = &sparx5->stats[portno * sparx5->num_stats]; 791 + void __iomem *inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 792 + 793 + sparx5_get_asm_phy_stats(portstats, inst, portno); 794 + sparx5_get_asm_mac_stats(portstats, inst, portno); 795 + sparx5_get_asm_mac_ctrl_stats(portstats, inst, portno); 796 + sparx5_get_asm_rmon_stats(portstats, inst, portno); 797 + sparx5_get_asm_misc_stats(portstats, inst, portno); 798 + } 799 + 800 + static const struct ethtool_rmon_hist_range sparx5_rmon_ranges[] = { 801 + { 0, 64 }, 802 + { 65, 127 }, 803 + { 128, 255 }, 804 + { 256, 511 }, 805 + { 512, 1023 }, 806 + { 1024, 1518 }, 807 + { 1519, 10239 }, 808 + {} 809 + }; 810 + 811 + static void sparx5_get_eth_phy_stats(struct net_device *ndev, 812 + struct ethtool_eth_phy_stats *phy_stats) 813 + { 814 + struct sparx5_port *port = netdev_priv(ndev); 815 + struct sparx5 *sparx5 = port->sparx5; 816 + int portno = port->portno; 817 + void __iomem *inst; 818 + u64 *portstats; 819 + 820 + portstats = &sparx5->stats[portno * sparx5->num_stats]; 821 + if (sparx5_is_baser(port->conf.portmode)) { 822 + u32 tinst = sparx5_port_dev_index(portno); 823 + u32 dev = sparx5_to_high_dev(portno); 824 + 825 + inst = spx5_inst_get(sparx5, dev, tinst); 826 + sparx5_get_dev_phy_stats(portstats, inst, tinst); 827 + } else { 828 + inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 829 + sparx5_get_asm_phy_stats(portstats, inst, portno); 830 + } 831 + phy_stats->SymbolErrorDuringCarrier = 832 + portstats[spx5_stats_rx_symbol_err_cnt] + 833 + portstats[spx5_stats_pmac_rx_symbol_err_cnt]; 834 + } 835 + 836 + static void sparx5_get_eth_mac_stats(struct net_device *ndev, 837 + struct ethtool_eth_mac_stats *mac_stats) 838 + { 839 + struct sparx5_port *port = netdev_priv(ndev); 840 + struct sparx5 *sparx5 = port->sparx5; 841 + int portno = port->portno; 842 + void __iomem *inst; 843 + u64 *portstats; 844 + 845 + portstats = &sparx5->stats[portno * sparx5->num_stats]; 846 + if (sparx5_is_baser(port->conf.portmode)) { 847 + u32 tinst = sparx5_port_dev_index(portno); 848 + u32 dev = sparx5_to_high_dev(portno); 849 + 850 + inst = spx5_inst_get(sparx5, dev, tinst); 851 + sparx5_get_dev_mac_stats(portstats, inst, tinst); 852 + } else { 853 + inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 854 + sparx5_get_asm_mac_stats(portstats, inst, portno); 855 + } 856 + mac_stats->FramesTransmittedOK = portstats[spx5_stats_tx_uc_cnt] + 857 + portstats[spx5_stats_pmac_tx_uc_cnt] + 858 + portstats[spx5_stats_tx_mc_cnt] + 859 + portstats[spx5_stats_tx_bc_cnt]; 860 + mac_stats->SingleCollisionFrames = 861 + portstats[spx5_stats_tx_backoff1_cnt]; 862 + mac_stats->MultipleCollisionFrames = 863 + portstats[spx5_stats_tx_multi_coll_cnt]; 864 + mac_stats->FramesReceivedOK = portstats[spx5_stats_rx_uc_cnt] + 865 + portstats[spx5_stats_pmac_rx_uc_cnt] + 866 + portstats[spx5_stats_rx_mc_cnt] + 867 + portstats[spx5_stats_rx_bc_cnt]; 868 + mac_stats->FrameCheckSequenceErrors = 869 + portstats[spx5_stats_rx_crc_err_cnt] + 870 + portstats[spx5_stats_pmac_rx_crc_err_cnt]; 871 + mac_stats->AlignmentErrors = portstats[spx5_stats_rx_alignment_lost_cnt] 872 + + portstats[spx5_stats_pmac_rx_alignment_lost_cnt]; 873 + mac_stats->OctetsTransmittedOK = portstats[spx5_stats_tx_ok_bytes_cnt] + 874 + portstats[spx5_stats_pmac_tx_ok_bytes_cnt]; 875 + mac_stats->FramesWithDeferredXmissions = 876 + portstats[spx5_stats_tx_defer_cnt]; 877 + mac_stats->LateCollisions = 878 + portstats[spx5_stats_tx_late_coll_cnt]; 879 + mac_stats->FramesAbortedDueToXSColls = 880 + portstats[spx5_stats_tx_xcoll_cnt]; 881 + mac_stats->CarrierSenseErrors = portstats[spx5_stats_tx_csense_cnt]; 882 + mac_stats->OctetsReceivedOK = portstats[spx5_stats_rx_ok_bytes_cnt] + 883 + portstats[spx5_stats_pmac_rx_ok_bytes_cnt]; 884 + mac_stats->MulticastFramesXmittedOK = portstats[spx5_stats_tx_mc_cnt] + 885 + portstats[spx5_stats_pmac_tx_mc_cnt]; 886 + mac_stats->BroadcastFramesXmittedOK = portstats[spx5_stats_tx_bc_cnt] + 887 + portstats[spx5_stats_pmac_tx_bc_cnt]; 888 + mac_stats->FramesWithExcessiveDeferral = 889 + portstats[spx5_stats_tx_xdefer_cnt]; 890 + mac_stats->MulticastFramesReceivedOK = portstats[spx5_stats_rx_mc_cnt] + 891 + portstats[spx5_stats_pmac_rx_mc_cnt]; 892 + mac_stats->BroadcastFramesReceivedOK = portstats[spx5_stats_rx_bc_cnt] + 893 + portstats[spx5_stats_pmac_rx_bc_cnt]; 894 + mac_stats->InRangeLengthErrors = 895 + portstats[spx5_stats_rx_in_range_len_err_cnt] + 896 + portstats[spx5_stats_pmac_rx_in_range_len_err_cnt]; 897 + mac_stats->OutOfRangeLengthField = 898 + portstats[spx5_stats_rx_out_of_range_len_err_cnt] + 899 + portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt]; 900 + mac_stats->FrameTooLongErrors = portstats[spx5_stats_rx_oversize_cnt] + 901 + portstats[spx5_stats_pmac_rx_oversize_cnt]; 902 + } 903 + 904 + static void sparx5_get_eth_mac_ctrl_stats(struct net_device *ndev, 905 + struct ethtool_eth_ctrl_stats *mac_ctrl_stats) 906 + { 907 + struct sparx5_port *port = netdev_priv(ndev); 908 + struct sparx5 *sparx5 = port->sparx5; 909 + int portno = port->portno; 910 + void __iomem *inst; 911 + u64 *portstats; 912 + 913 + portstats = &sparx5->stats[portno * sparx5->num_stats]; 914 + if (sparx5_is_baser(port->conf.portmode)) { 915 + u32 tinst = sparx5_port_dev_index(portno); 916 + u32 dev = sparx5_to_high_dev(portno); 917 + 918 + inst = spx5_inst_get(sparx5, dev, tinst); 919 + sparx5_get_dev_mac_ctrl_stats(portstats, inst, tinst); 920 + } else { 921 + inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 922 + sparx5_get_asm_mac_ctrl_stats(portstats, inst, portno); 923 + } 924 + mac_ctrl_stats->MACControlFramesTransmitted = 925 + portstats[spx5_stats_tx_pause_cnt] + 926 + portstats[spx5_stats_pmac_tx_pause_cnt]; 927 + mac_ctrl_stats->MACControlFramesReceived = 928 + portstats[spx5_stats_rx_pause_cnt] + 929 + portstats[spx5_stats_pmac_rx_pause_cnt]; 930 + mac_ctrl_stats->UnsupportedOpcodesReceived = 931 + portstats[spx5_stats_rx_unsup_opcode_cnt] + 932 + portstats[spx5_stats_pmac_rx_unsup_opcode_cnt]; 933 + } 934 + 935 + static void sparx5_get_eth_rmon_stats(struct net_device *ndev, 936 + struct ethtool_rmon_stats *rmon_stats, 937 + const struct ethtool_rmon_hist_range **ranges) 938 + { 939 + struct sparx5_port *port = netdev_priv(ndev); 940 + struct sparx5 *sparx5 = port->sparx5; 941 + int portno = port->portno; 942 + void __iomem *inst; 943 + u64 *portstats; 944 + 945 + portstats = &sparx5->stats[portno * sparx5->num_stats]; 946 + if (sparx5_is_baser(port->conf.portmode)) { 947 + u32 tinst = sparx5_port_dev_index(portno); 948 + u32 dev = sparx5_to_high_dev(portno); 949 + 950 + inst = spx5_inst_get(sparx5, dev, tinst); 951 + sparx5_get_dev_rmon_stats(portstats, inst, tinst); 952 + } else { 953 + inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 954 + sparx5_get_asm_rmon_stats(portstats, inst, portno); 955 + } 956 + rmon_stats->undersize_pkts = portstats[spx5_stats_rx_undersize_cnt] + 957 + portstats[spx5_stats_pmac_rx_undersize_cnt]; 958 + rmon_stats->oversize_pkts = portstats[spx5_stats_rx_oversize_cnt] + 959 + portstats[spx5_stats_pmac_rx_oversize_cnt]; 960 + rmon_stats->fragments = portstats[spx5_stats_rx_fragments_cnt] + 961 + portstats[spx5_stats_pmac_rx_fragments_cnt]; 962 + rmon_stats->jabbers = portstats[spx5_stats_rx_jabbers_cnt] + 963 + portstats[spx5_stats_pmac_rx_jabbers_cnt]; 964 + rmon_stats->hist[0] = portstats[spx5_stats_rx_size64_cnt] + 965 + portstats[spx5_stats_pmac_rx_size64_cnt]; 966 + rmon_stats->hist[1] = portstats[spx5_stats_rx_size65to127_cnt] + 967 + portstats[spx5_stats_pmac_rx_size65to127_cnt]; 968 + rmon_stats->hist[2] = portstats[spx5_stats_rx_size128to255_cnt] + 969 + portstats[spx5_stats_pmac_rx_size128to255_cnt]; 970 + rmon_stats->hist[3] = portstats[spx5_stats_rx_size256to511_cnt] + 971 + portstats[spx5_stats_pmac_rx_size256to511_cnt]; 972 + rmon_stats->hist[4] = portstats[spx5_stats_rx_size512to1023_cnt] + 973 + portstats[spx5_stats_pmac_rx_size512to1023_cnt]; 974 + rmon_stats->hist[5] = portstats[spx5_stats_rx_size1024to1518_cnt] + 975 + portstats[spx5_stats_pmac_rx_size1024to1518_cnt]; 976 + rmon_stats->hist[6] = portstats[spx5_stats_rx_size1519tomax_cnt] + 977 + portstats[spx5_stats_pmac_rx_size1519tomax_cnt]; 978 + rmon_stats->hist_tx[0] = portstats[spx5_stats_tx_size64_cnt] + 979 + portstats[spx5_stats_pmac_tx_size64_cnt]; 980 + rmon_stats->hist_tx[1] = portstats[spx5_stats_tx_size65to127_cnt] + 981 + portstats[spx5_stats_pmac_tx_size65to127_cnt]; 982 + rmon_stats->hist_tx[2] = portstats[spx5_stats_tx_size128to255_cnt] + 983 + portstats[spx5_stats_pmac_tx_size128to255_cnt]; 984 + rmon_stats->hist_tx[3] = portstats[spx5_stats_tx_size256to511_cnt] + 985 + portstats[spx5_stats_pmac_tx_size256to511_cnt]; 986 + rmon_stats->hist_tx[4] = portstats[spx5_stats_tx_size512to1023_cnt] + 987 + portstats[spx5_stats_pmac_tx_size512to1023_cnt]; 988 + rmon_stats->hist_tx[5] = portstats[spx5_stats_tx_size1024to1518_cnt] + 989 + portstats[spx5_stats_pmac_tx_size1024to1518_cnt]; 990 + rmon_stats->hist_tx[6] = portstats[spx5_stats_tx_size1519tomax_cnt] + 991 + portstats[spx5_stats_pmac_tx_size1519tomax_cnt]; 992 + *ranges = sparx5_rmon_ranges; 993 + } 994 + 995 + static int sparx5_get_sset_count(struct net_device *ndev, int sset) 996 + { 997 + struct sparx5_port *port = netdev_priv(ndev); 998 + struct sparx5 *sparx5 = port->sparx5; 999 + 1000 + if (sset != ETH_SS_STATS) 1001 + return -EOPNOTSUPP; 1002 + return sparx5->num_ethtool_stats; 1003 + } 1004 + 1005 + static void sparx5_get_sset_strings(struct net_device *ndev, u32 sset, u8 *data) 1006 + { 1007 + struct sparx5_port *port = netdev_priv(ndev); 1008 + struct sparx5 *sparx5 = port->sparx5; 1009 + int idx; 1010 + 1011 + if (sset != ETH_SS_STATS) 1012 + return; 1013 + 1014 + for (idx = 0; idx < sparx5->num_ethtool_stats; idx++) 1015 + strncpy(data + idx * ETH_GSTRING_LEN, 1016 + sparx5->stats_layout[idx], ETH_GSTRING_LEN); 1017 + } 1018 + 1019 + static void sparx5_get_sset_data(struct net_device *ndev, 1020 + struct ethtool_stats *stats, u64 *data) 1021 + { 1022 + struct sparx5_port *port = netdev_priv(ndev); 1023 + struct sparx5 *sparx5 = port->sparx5; 1024 + int portno = port->portno; 1025 + void __iomem *inst; 1026 + u64 *portstats; 1027 + int idx; 1028 + 1029 + portstats = &sparx5->stats[portno * sparx5->num_stats]; 1030 + if (sparx5_is_baser(port->conf.portmode)) { 1031 + u32 tinst = sparx5_port_dev_index(portno); 1032 + u32 dev = sparx5_to_high_dev(portno); 1033 + 1034 + inst = spx5_inst_get(sparx5, dev, tinst); 1035 + sparx5_get_dev_misc_stats(portstats, inst, tinst); 1036 + } else { 1037 + inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 1038 + sparx5_get_asm_misc_stats(portstats, inst, portno); 1039 + } 1040 + sparx5_get_ana_ac_stats_stats(sparx5, portno); 1041 + sparx5_get_queue_sys_stats(sparx5, portno); 1042 + /* Copy port counters to the ethtool buffer */ 1043 + for (idx = spx5_stats_mm_rx_assembly_err_cnt; 1044 + idx < spx5_stats_mm_rx_assembly_err_cnt + 1045 + sparx5->num_ethtool_stats; idx++) 1046 + *data++ = portstats[idx]; 1047 + } 1048 + 1049 + void sparx5_get_stats64(struct net_device *ndev, 1050 + struct rtnl_link_stats64 *stats) 1051 + { 1052 + struct sparx5_port *port = netdev_priv(ndev); 1053 + struct sparx5 *sparx5 = port->sparx5; 1054 + u64 *portstats; 1055 + int idx; 1056 + 1057 + if (!sparx5->stats) 1058 + return; /* Not initialized yet */ 1059 + 1060 + portstats = &sparx5->stats[port->portno * sparx5->num_stats]; 1061 + 1062 + stats->rx_packets = portstats[spx5_stats_rx_uc_cnt] + 1063 + portstats[spx5_stats_pmac_rx_uc_cnt] + 1064 + portstats[spx5_stats_rx_mc_cnt] + 1065 + portstats[spx5_stats_rx_bc_cnt]; 1066 + stats->tx_packets = portstats[spx5_stats_tx_uc_cnt] + 1067 + portstats[spx5_stats_pmac_tx_uc_cnt] + 1068 + portstats[spx5_stats_tx_mc_cnt] + 1069 + portstats[spx5_stats_tx_bc_cnt]; 1070 + stats->rx_bytes = portstats[spx5_stats_rx_ok_bytes_cnt] + 1071 + portstats[spx5_stats_pmac_rx_ok_bytes_cnt]; 1072 + stats->tx_bytes = portstats[spx5_stats_tx_ok_bytes_cnt] + 1073 + portstats[spx5_stats_pmac_tx_ok_bytes_cnt]; 1074 + stats->rx_errors = portstats[spx5_stats_rx_in_range_len_err_cnt] + 1075 + portstats[spx5_stats_pmac_rx_in_range_len_err_cnt] + 1076 + portstats[spx5_stats_rx_out_of_range_len_err_cnt] + 1077 + portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt] + 1078 + portstats[spx5_stats_rx_oversize_cnt] + 1079 + portstats[spx5_stats_pmac_rx_oversize_cnt] + 1080 + portstats[spx5_stats_rx_crc_err_cnt] + 1081 + portstats[spx5_stats_pmac_rx_crc_err_cnt] + 1082 + portstats[spx5_stats_rx_alignment_lost_cnt] + 1083 + portstats[spx5_stats_pmac_rx_alignment_lost_cnt]; 1084 + stats->tx_errors = portstats[spx5_stats_tx_xcoll_cnt] + 1085 + portstats[spx5_stats_tx_csense_cnt] + 1086 + portstats[spx5_stats_tx_late_coll_cnt]; 1087 + stats->multicast = portstats[spx5_stats_rx_mc_cnt] + 1088 + portstats[spx5_stats_pmac_rx_mc_cnt]; 1089 + stats->collisions = portstats[spx5_stats_tx_late_coll_cnt] + 1090 + portstats[spx5_stats_tx_xcoll_cnt] + 1091 + portstats[spx5_stats_tx_backoff1_cnt]; 1092 + stats->rx_length_errors = portstats[spx5_stats_rx_in_range_len_err_cnt] + 1093 + portstats[spx5_stats_pmac_rx_in_range_len_err_cnt] + 1094 + portstats[spx5_stats_rx_out_of_range_len_err_cnt] + 1095 + portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt] + 1096 + portstats[spx5_stats_rx_oversize_cnt] + 1097 + portstats[spx5_stats_pmac_rx_oversize_cnt]; 1098 + stats->rx_crc_errors = portstats[spx5_stats_rx_crc_err_cnt] + 1099 + portstats[spx5_stats_pmac_rx_crc_err_cnt]; 1100 + stats->rx_frame_errors = portstats[spx5_stats_rx_alignment_lost_cnt] + 1101 + portstats[spx5_stats_pmac_rx_alignment_lost_cnt]; 1102 + stats->tx_aborted_errors = portstats[spx5_stats_tx_xcoll_cnt]; 1103 + stats->tx_carrier_errors = portstats[spx5_stats_tx_csense_cnt]; 1104 + stats->tx_window_errors = portstats[spx5_stats_tx_late_coll_cnt]; 1105 + stats->rx_dropped = portstats[spx5_stats_ana_ac_port_stat_lsb_cnt]; 1106 + for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++stats) 1107 + stats->rx_dropped += portstats[spx5_stats_green_p0_rx_port_drop 1108 + + idx]; 1109 + stats->tx_dropped = portstats[spx5_stats_tx_local_drop]; 1110 + } 1111 + 1112 + static void sparx5_update_port_stats(struct sparx5 *sparx5, int portno) 1113 + { 1114 + if (sparx5_is_baser(sparx5->ports[portno]->conf.portmode)) 1115 + sparx5_get_device_stats(sparx5, portno); 1116 + else 1117 + sparx5_get_asm_stats(sparx5, portno); 1118 + sparx5_get_ana_ac_stats_stats(sparx5, portno); 1119 + sparx5_get_queue_sys_stats(sparx5, portno); 1120 + } 1121 + 1122 + static void sparx5_update_stats(struct sparx5 *sparx5) 1123 + { 1124 + int idx; 1125 + 1126 + for (idx = 0; idx < SPX5_PORTS; idx++) 1127 + if (sparx5->ports[idx]) 1128 + sparx5_update_port_stats(sparx5, idx); 1129 + } 1130 + 1131 + static void sparx5_check_stats_work(struct work_struct *work) 1132 + { 1133 + struct delayed_work *dwork = to_delayed_work(work); 1134 + struct sparx5 *sparx5 = container_of(dwork, 1135 + struct sparx5, 1136 + stats_work); 1137 + 1138 + sparx5_update_stats(sparx5); 1139 + 1140 + queue_delayed_work(sparx5->stats_queue, &sparx5->stats_work, 1141 + SPX5_STATS_CHECK_DELAY); 1142 + } 1143 + 1144 + static int sparx5_get_link_settings(struct net_device *ndev, 1145 + struct ethtool_link_ksettings *cmd) 1146 + { 1147 + struct sparx5_port *port = netdev_priv(ndev); 1148 + 1149 + return phylink_ethtool_ksettings_get(port->phylink, cmd); 1150 + } 1151 + 1152 + static int sparx5_set_link_settings(struct net_device *ndev, 1153 + const struct ethtool_link_ksettings *cmd) 1154 + { 1155 + struct sparx5_port *port = netdev_priv(ndev); 1156 + 1157 + return phylink_ethtool_ksettings_set(port->phylink, cmd); 1158 + } 1159 + 1160 + static void sparx5_config_stats(struct sparx5 *sparx5) 1161 + { 1162 + /* Enable global events for port policer drops */ 1163 + spx5_rmw(ANA_AC_PORT_SGE_CFG_MASK_SET(0xf0f0), 1164 + ANA_AC_PORT_SGE_CFG_MASK, 1165 + sparx5, 1166 + ANA_AC_PORT_SGE_CFG(SPX5_PORT_POLICER_DROPS)); 1167 + } 1168 + 1169 + static void sparx5_config_port_stats(struct sparx5 *sparx5, int portno) 1170 + { 1171 + /* Clear Queue System counters */ 1172 + spx5_wr(XQS_STAT_CFG_STAT_VIEW_SET(portno) | 1173 + XQS_STAT_CFG_STAT_CLEAR_SHOT_SET(3), sparx5, 1174 + XQS_STAT_CFG); 1175 + 1176 + /* Use counter for port policer drop count */ 1177 + spx5_rmw(ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE_SET(1) | 1178 + ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE_SET(0) | 1179 + ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK_SET(0xff), 1180 + ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE | 1181 + ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE | 1182 + ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK, 1183 + sparx5, ANA_AC_PORT_STAT_CFG(portno, SPX5_PORT_POLICER_DROPS)); 1184 + } 1185 + 1186 + const struct ethtool_ops sparx5_ethtool_ops = { 1187 + .get_sset_count = sparx5_get_sset_count, 1188 + .get_strings = sparx5_get_sset_strings, 1189 + .get_ethtool_stats = sparx5_get_sset_data, 1190 + .get_link_ksettings = sparx5_get_link_settings, 1191 + .set_link_ksettings = sparx5_set_link_settings, 1192 + .get_link = ethtool_op_get_link, 1193 + .get_eth_phy_stats = sparx5_get_eth_phy_stats, 1194 + .get_eth_mac_stats = sparx5_get_eth_mac_stats, 1195 + .get_eth_ctrl_stats = sparx5_get_eth_mac_ctrl_stats, 1196 + .get_rmon_stats = sparx5_get_eth_rmon_stats, 1197 + }; 1198 + 1199 + int sparx_stats_init(struct sparx5 *sparx5) 1200 + { 1201 + char queue_name[32]; 1202 + int portno; 1203 + 1204 + sparx5->stats_layout = sparx5_stats_layout; 1205 + sparx5->num_stats = spx5_stats_count; 1206 + sparx5->num_ethtool_stats = ARRAY_SIZE(sparx5_stats_layout); 1207 + sparx5->stats = devm_kcalloc(sparx5->dev, 1208 + SPX5_PORTS_ALL * sparx5->num_stats, 1209 + sizeof(u64), GFP_KERNEL); 1210 + if (!sparx5->stats) 1211 + return -ENOMEM; 1212 + 1213 + mutex_init(&sparx5->queue_stats_lock); 1214 + sparx5_config_stats(sparx5); 1215 + for (portno = 0; portno < SPX5_PORTS; portno++) 1216 + if (sparx5->ports[portno]) 1217 + sparx5_config_port_stats(sparx5, portno); 1218 + 1219 + snprintf(queue_name, sizeof(queue_name), "%s-stats", 1220 + dev_name(sparx5->dev)); 1221 + sparx5->stats_queue = create_singlethread_workqueue(queue_name); 1222 + INIT_DELAYED_WORK(&sparx5->stats_work, sparx5_check_stats_work); 1223 + queue_delayed_work(sparx5->stats_queue, &sparx5->stats_work, 1224 + SPX5_STATS_CHECK_DELAY); 1225 + 1226 + return 0; 1227 + }
+500
drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include <net/switchdev.h> 8 + #include <linux/if_bridge.h> 9 + #include <linux/iopoll.h> 10 + 11 + #include "sparx5_main_regs.h" 12 + #include "sparx5_main.h" 13 + 14 + /* Commands for Mac Table Command register */ 15 + #define MAC_CMD_LEARN 0 /* Insert (Learn) 1 entry */ 16 + #define MAC_CMD_UNLEARN 1 /* Unlearn (Forget) 1 entry */ 17 + #define MAC_CMD_LOOKUP 2 /* Look up 1 entry */ 18 + #define MAC_CMD_READ 3 /* Read entry at Mac Table Index */ 19 + #define MAC_CMD_WRITE 4 /* Write entry at Mac Table Index */ 20 + #define MAC_CMD_SCAN 5 /* Scan (Age or find next) */ 21 + #define MAC_CMD_FIND_SMALLEST 6 /* Get next entry */ 22 + #define MAC_CMD_CLEAR_ALL 7 /* Delete all entries in table */ 23 + 24 + /* Commands for MAC_ENTRY_ADDR_TYPE */ 25 + #define MAC_ENTRY_ADDR_TYPE_UPSID_PN 0 26 + #define MAC_ENTRY_ADDR_TYPE_UPSID_CPU_OR_INT 1 27 + #define MAC_ENTRY_ADDR_TYPE_GLAG 2 28 + #define MAC_ENTRY_ADDR_TYPE_MC_IDX 3 29 + 30 + #define TABLE_UPDATE_SLEEP_US 10 31 + #define TABLE_UPDATE_TIMEOUT_US 100000 32 + 33 + struct sparx5_mact_entry { 34 + struct list_head list; 35 + unsigned char mac[ETH_ALEN]; 36 + u32 flags; 37 + #define MAC_ENT_ALIVE BIT(0) 38 + #define MAC_ENT_MOVED BIT(1) 39 + #define MAC_ENT_LOCK BIT(2) 40 + u16 vid; 41 + u16 port; 42 + }; 43 + 44 + static int sparx5_mact_get_status(struct sparx5 *sparx5) 45 + { 46 + return spx5_rd(sparx5, LRN_COMMON_ACCESS_CTRL); 47 + } 48 + 49 + static int sparx5_mact_wait_for_completion(struct sparx5 *sparx5) 50 + { 51 + u32 val; 52 + 53 + return readx_poll_timeout(sparx5_mact_get_status, 54 + sparx5, val, 55 + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_GET(val) == 0, 56 + TABLE_UPDATE_SLEEP_US, TABLE_UPDATE_TIMEOUT_US); 57 + } 58 + 59 + static void sparx5_mact_select(struct sparx5 *sparx5, 60 + const unsigned char mac[ETH_ALEN], 61 + u16 vid) 62 + { 63 + u32 macl = 0, mach = 0; 64 + 65 + /* Set the MAC address to handle and the vlan associated in a format 66 + * understood by the hardware. 67 + */ 68 + mach |= vid << 16; 69 + mach |= mac[0] << 8; 70 + mach |= mac[1] << 0; 71 + macl |= mac[2] << 24; 72 + macl |= mac[3] << 16; 73 + macl |= mac[4] << 8; 74 + macl |= mac[5] << 0; 75 + 76 + spx5_wr(mach, sparx5, LRN_MAC_ACCESS_CFG_0); 77 + spx5_wr(macl, sparx5, LRN_MAC_ACCESS_CFG_1); 78 + } 79 + 80 + int sparx5_mact_learn(struct sparx5 *sparx5, int pgid, 81 + const unsigned char mac[ETH_ALEN], u16 vid) 82 + { 83 + int addr, type, ret; 84 + 85 + if (pgid < SPX5_PORTS) { 86 + type = MAC_ENTRY_ADDR_TYPE_UPSID_PN; 87 + addr = pgid % 32; 88 + addr += (pgid / 32) << 5; /* Add upsid */ 89 + } else { 90 + type = MAC_ENTRY_ADDR_TYPE_MC_IDX; 91 + addr = pgid - SPX5_PORTS; 92 + } 93 + 94 + mutex_lock(&sparx5->lock); 95 + 96 + sparx5_mact_select(sparx5, mac, vid); 97 + 98 + /* MAC entry properties */ 99 + spx5_wr(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_SET(addr) | 100 + LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_TYPE_SET(type) | 101 + LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD_SET(1) | 102 + LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_LOCKED_SET(1), 103 + sparx5, LRN_MAC_ACCESS_CFG_2); 104 + spx5_wr(0, sparx5, LRN_MAC_ACCESS_CFG_3); 105 + 106 + /* Insert/learn new entry */ 107 + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_LEARN) | 108 + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_SET(1), 109 + sparx5, LRN_COMMON_ACCESS_CTRL); 110 + 111 + ret = sparx5_mact_wait_for_completion(sparx5); 112 + 113 + mutex_unlock(&sparx5->lock); 114 + 115 + return ret; 116 + } 117 + 118 + int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr) 119 + { 120 + struct sparx5_port *port = netdev_priv(dev); 121 + struct sparx5 *sparx5 = port->sparx5; 122 + 123 + return sparx5_mact_forget(sparx5, addr, port->pvid); 124 + } 125 + 126 + int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) 127 + { 128 + struct sparx5_port *port = netdev_priv(dev); 129 + struct sparx5 *sparx5 = port->sparx5; 130 + 131 + return sparx5_mact_learn(sparx5, PGID_CPU, addr, port->pvid); 132 + } 133 + 134 + static int sparx5_mact_get(struct sparx5 *sparx5, 135 + unsigned char mac[ETH_ALEN], 136 + u16 *vid, u32 *pcfg2) 137 + { 138 + u32 mach, macl, cfg2; 139 + int ret = -ENOENT; 140 + 141 + cfg2 = spx5_rd(sparx5, LRN_MAC_ACCESS_CFG_2); 142 + if (LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD_GET(cfg2)) { 143 + mach = spx5_rd(sparx5, LRN_MAC_ACCESS_CFG_0); 144 + macl = spx5_rd(sparx5, LRN_MAC_ACCESS_CFG_1); 145 + mac[0] = ((mach >> 8) & 0xff); 146 + mac[1] = ((mach >> 0) & 0xff); 147 + mac[2] = ((macl >> 24) & 0xff); 148 + mac[3] = ((macl >> 16) & 0xff); 149 + mac[4] = ((macl >> 8) & 0xff); 150 + mac[5] = ((macl >> 0) & 0xff); 151 + *vid = mach >> 16; 152 + *pcfg2 = cfg2; 153 + ret = 0; 154 + } 155 + 156 + return ret; 157 + } 158 + 159 + bool sparx5_mact_getnext(struct sparx5 *sparx5, 160 + unsigned char mac[ETH_ALEN], u16 *vid, u32 *pcfg2) 161 + { 162 + u32 cfg2; 163 + int ret; 164 + 165 + mutex_lock(&sparx5->lock); 166 + 167 + sparx5_mact_select(sparx5, mac, *vid); 168 + 169 + spx5_wr(LRN_SCAN_NEXT_CFG_SCAN_NEXT_IGNORE_LOCKED_ENA_SET(1) | 170 + LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA_SET(1), 171 + sparx5, LRN_SCAN_NEXT_CFG); 172 + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET 173 + (MAC_CMD_FIND_SMALLEST) | 174 + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_SET(1), 175 + sparx5, LRN_COMMON_ACCESS_CTRL); 176 + 177 + ret = sparx5_mact_wait_for_completion(sparx5); 178 + if (ret == 0) { 179 + ret = sparx5_mact_get(sparx5, mac, vid, &cfg2); 180 + if (ret == 0) 181 + *pcfg2 = cfg2; 182 + } 183 + 184 + mutex_unlock(&sparx5->lock); 185 + 186 + return ret == 0; 187 + } 188 + 189 + static int sparx5_mact_lookup(struct sparx5 *sparx5, 190 + const unsigned char mac[ETH_ALEN], 191 + u16 vid) 192 + { 193 + int ret; 194 + 195 + mutex_lock(&sparx5->lock); 196 + 197 + sparx5_mact_select(sparx5, mac, vid); 198 + 199 + /* Issue a lookup command */ 200 + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_LOOKUP) | 201 + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_SET(1), 202 + sparx5, LRN_COMMON_ACCESS_CTRL); 203 + 204 + ret = sparx5_mact_wait_for_completion(sparx5); 205 + if (ret) 206 + goto out; 207 + 208 + ret = LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD_GET 209 + (spx5_rd(sparx5, LRN_MAC_ACCESS_CFG_2)); 210 + 211 + out: 212 + mutex_unlock(&sparx5->lock); 213 + 214 + return ret; 215 + } 216 + 217 + int sparx5_mact_forget(struct sparx5 *sparx5, 218 + const unsigned char mac[ETH_ALEN], u16 vid) 219 + { 220 + int ret; 221 + 222 + mutex_lock(&sparx5->lock); 223 + 224 + sparx5_mact_select(sparx5, mac, vid); 225 + 226 + /* Issue an unlearn command */ 227 + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_UNLEARN) | 228 + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_SET(1), 229 + sparx5, LRN_COMMON_ACCESS_CTRL); 230 + 231 + ret = sparx5_mact_wait_for_completion(sparx5); 232 + 233 + mutex_unlock(&sparx5->lock); 234 + 235 + return ret; 236 + } 237 + 238 + static struct sparx5_mact_entry *alloc_mact_entry(struct sparx5 *sparx5, 239 + const unsigned char *mac, 240 + u16 vid, u16 port_index) 241 + { 242 + struct sparx5_mact_entry *mact_entry; 243 + 244 + mact_entry = devm_kzalloc(sparx5->dev, 245 + sizeof(*mact_entry), GFP_ATOMIC); 246 + if (!mact_entry) 247 + return NULL; 248 + 249 + memcpy(mact_entry->mac, mac, ETH_ALEN); 250 + mact_entry->vid = vid; 251 + mact_entry->port = port_index; 252 + return mact_entry; 253 + } 254 + 255 + static struct sparx5_mact_entry *find_mact_entry(struct sparx5 *sparx5, 256 + const unsigned char *mac, 257 + u16 vid, u16 port_index) 258 + { 259 + struct sparx5_mact_entry *mact_entry; 260 + struct sparx5_mact_entry *res = NULL; 261 + 262 + mutex_lock(&sparx5->mact_lock); 263 + list_for_each_entry(mact_entry, &sparx5->mact_entries, list) { 264 + if (mact_entry->vid == vid && 265 + ether_addr_equal(mac, mact_entry->mac) && 266 + mact_entry->port == port_index) { 267 + res = mact_entry; 268 + break; 269 + } 270 + } 271 + mutex_unlock(&sparx5->mact_lock); 272 + 273 + return res; 274 + } 275 + 276 + static void sparx5_fdb_call_notifiers(enum switchdev_notifier_type type, 277 + const char *mac, u16 vid, 278 + struct net_device *dev, bool offloaded) 279 + { 280 + struct switchdev_notifier_fdb_info info; 281 + 282 + info.addr = mac; 283 + info.vid = vid; 284 + info.offloaded = offloaded; 285 + call_switchdev_notifiers(type, dev, &info.info, NULL); 286 + } 287 + 288 + int sparx5_add_mact_entry(struct sparx5 *sparx5, 289 + struct sparx5_port *port, 290 + const unsigned char *addr, u16 vid) 291 + { 292 + struct sparx5_mact_entry *mact_entry; 293 + int ret; 294 + 295 + ret = sparx5_mact_lookup(sparx5, addr, vid); 296 + if (ret) 297 + return 0; 298 + 299 + /* In case the entry already exists, don't add it again to SW, 300 + * just update HW, but we need to look in the actual HW because 301 + * it is possible for an entry to be learn by HW and before the 302 + * mact thread to start the frame will reach CPU and the CPU will 303 + * add the entry but without the extern_learn flag. 304 + */ 305 + mact_entry = find_mact_entry(sparx5, addr, vid, port->portno); 306 + if (mact_entry) 307 + goto update_hw; 308 + 309 + /* Add the entry in SW MAC table not to get the notification when 310 + * SW is pulling again 311 + */ 312 + mact_entry = alloc_mact_entry(sparx5, addr, vid, port->portno); 313 + if (!mact_entry) 314 + return -ENOMEM; 315 + 316 + mutex_lock(&sparx5->mact_lock); 317 + list_add_tail(&mact_entry->list, &sparx5->mact_entries); 318 + mutex_unlock(&sparx5->mact_lock); 319 + 320 + update_hw: 321 + ret = sparx5_mact_learn(sparx5, port->portno, addr, vid); 322 + 323 + /* New entry? */ 324 + if (mact_entry->flags == 0) { 325 + mact_entry->flags |= MAC_ENT_LOCK; /* Don't age this */ 326 + sparx5_fdb_call_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, addr, vid, 327 + port->ndev, true); 328 + } 329 + 330 + return ret; 331 + } 332 + 333 + int sparx5_del_mact_entry(struct sparx5 *sparx5, 334 + const unsigned char *addr, 335 + u16 vid) 336 + { 337 + struct sparx5_mact_entry *mact_entry, *tmp; 338 + 339 + /* Delete the entry in SW MAC table not to get the notification when 340 + * SW is pulling again 341 + */ 342 + mutex_lock(&sparx5->mact_lock); 343 + list_for_each_entry_safe(mact_entry, tmp, &sparx5->mact_entries, 344 + list) { 345 + if ((vid == 0 || mact_entry->vid == vid) && 346 + ether_addr_equal(addr, mact_entry->mac)) { 347 + list_del(&mact_entry->list); 348 + devm_kfree(sparx5->dev, mact_entry); 349 + 350 + sparx5_mact_forget(sparx5, addr, mact_entry->vid); 351 + } 352 + } 353 + mutex_unlock(&sparx5->mact_lock); 354 + 355 + return 0; 356 + } 357 + 358 + static void sparx5_mact_handle_entry(struct sparx5 *sparx5, 359 + unsigned char mac[ETH_ALEN], 360 + u16 vid, u32 cfg2) 361 + { 362 + struct sparx5_mact_entry *mact_entry; 363 + bool found = false; 364 + u16 port; 365 + 366 + if (LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_TYPE_GET(cfg2) != 367 + MAC_ENTRY_ADDR_TYPE_UPSID_PN) 368 + return; 369 + 370 + port = LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_GET(cfg2); 371 + if (port >= SPX5_PORTS) 372 + return; 373 + 374 + if (!test_bit(port, sparx5->bridge_mask)) 375 + return; 376 + 377 + mutex_lock(&sparx5->mact_lock); 378 + list_for_each_entry(mact_entry, &sparx5->mact_entries, list) { 379 + if (mact_entry->vid == vid && 380 + ether_addr_equal(mac, mact_entry->mac)) { 381 + found = true; 382 + mact_entry->flags |= MAC_ENT_ALIVE; 383 + if (mact_entry->port != port) { 384 + dev_warn(sparx5->dev, "Entry move: %d -> %d\n", 385 + mact_entry->port, port); 386 + mact_entry->port = port; 387 + mact_entry->flags |= MAC_ENT_MOVED; 388 + } 389 + /* Entry handled */ 390 + break; 391 + } 392 + } 393 + mutex_unlock(&sparx5->mact_lock); 394 + 395 + if (found && !(mact_entry->flags & MAC_ENT_MOVED)) 396 + /* Present, not moved */ 397 + return; 398 + 399 + if (!found) { 400 + /* Entry not found - now add */ 401 + mact_entry = alloc_mact_entry(sparx5, mac, vid, port); 402 + if (!mact_entry) 403 + return; 404 + 405 + mact_entry->flags |= MAC_ENT_ALIVE; 406 + mutex_lock(&sparx5->mact_lock); 407 + list_add_tail(&mact_entry->list, &sparx5->mact_entries); 408 + mutex_unlock(&sparx5->mact_lock); 409 + } 410 + 411 + /* New or moved entry - notify bridge */ 412 + sparx5_fdb_call_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, 413 + mac, vid, sparx5->ports[port]->ndev, 414 + true); 415 + } 416 + 417 + void sparx5_mact_pull_work(struct work_struct *work) 418 + { 419 + struct delayed_work *del_work = to_delayed_work(work); 420 + struct sparx5 *sparx5 = container_of(del_work, struct sparx5, 421 + mact_work); 422 + struct sparx5_mact_entry *mact_entry, *tmp; 423 + unsigned char mac[ETH_ALEN]; 424 + u32 cfg2; 425 + u16 vid; 426 + int ret; 427 + 428 + /* Reset MAC entry flags */ 429 + mutex_lock(&sparx5->mact_lock); 430 + list_for_each_entry(mact_entry, &sparx5->mact_entries, list) 431 + mact_entry->flags &= MAC_ENT_LOCK; 432 + mutex_unlock(&sparx5->mact_lock); 433 + 434 + /* MAIN mac address processing loop */ 435 + vid = 0; 436 + memset(mac, 0, sizeof(mac)); 437 + do { 438 + mutex_lock(&sparx5->lock); 439 + sparx5_mact_select(sparx5, mac, vid); 440 + spx5_wr(LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA_SET(1), 441 + sparx5, LRN_SCAN_NEXT_CFG); 442 + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET 443 + (MAC_CMD_FIND_SMALLEST) | 444 + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_SET(1), 445 + sparx5, LRN_COMMON_ACCESS_CTRL); 446 + ret = sparx5_mact_wait_for_completion(sparx5); 447 + if (ret == 0) 448 + ret = sparx5_mact_get(sparx5, mac, &vid, &cfg2); 449 + mutex_unlock(&sparx5->lock); 450 + if (ret == 0) 451 + sparx5_mact_handle_entry(sparx5, mac, vid, cfg2); 452 + } while (ret == 0); 453 + 454 + mutex_lock(&sparx5->mact_lock); 455 + list_for_each_entry_safe(mact_entry, tmp, &sparx5->mact_entries, 456 + list) { 457 + /* If the entry is in HW or permanent, then skip */ 458 + if (mact_entry->flags & (MAC_ENT_ALIVE | MAC_ENT_LOCK)) 459 + continue; 460 + 461 + sparx5_fdb_call_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, 462 + mact_entry->mac, mact_entry->vid, 463 + sparx5->ports[mact_entry->port]->ndev, 464 + true); 465 + 466 + list_del(&mact_entry->list); 467 + devm_kfree(sparx5->dev, mact_entry); 468 + } 469 + mutex_unlock(&sparx5->mact_lock); 470 + 471 + queue_delayed_work(sparx5->mact_queue, &sparx5->mact_work, 472 + SPX5_MACT_PULL_DELAY); 473 + } 474 + 475 + void sparx5_set_ageing(struct sparx5 *sparx5, int msecs) 476 + { 477 + int value = max(1, msecs / 10); /* unit 10 ms */ 478 + 479 + spx5_rmw(LRN_AUTOAGE_CFG_UNIT_SIZE_SET(2) | /* 10 ms */ 480 + LRN_AUTOAGE_CFG_PERIOD_VAL_SET(value / 2), /* one bit ageing */ 481 + LRN_AUTOAGE_CFG_UNIT_SIZE | 482 + LRN_AUTOAGE_CFG_PERIOD_VAL, 483 + sparx5, 484 + LRN_AUTOAGE_CFG(0)); 485 + } 486 + 487 + void sparx5_mact_init(struct sparx5 *sparx5) 488 + { 489 + mutex_init(&sparx5->lock); 490 + 491 + /* Flush MAC table */ 492 + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_CLEAR_ALL) | 493 + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_SET(1), 494 + sparx5, LRN_COMMON_ACCESS_CTRL); 495 + 496 + if (sparx5_mact_wait_for_completion(sparx5) != 0) 497 + dev_warn(sparx5->dev, "MAC flush error\n"); 498 + 499 + sparx5_set_ageing(sparx5, BR_DEFAULT_AGEING_TIME / HZ * 1000); 500 + }
+852
drivers/net/ethernet/microchip/sparx5/sparx5_main.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + * 6 + * The Sparx5 Chip Register Model can be browsed at this location: 7 + * https://github.com/microchip-ung/sparx-5_reginfo 8 + */ 9 + #include <linux/module.h> 10 + #include <linux/device.h> 11 + #include <linux/netdevice.h> 12 + #include <linux/platform_device.h> 13 + #include <linux/interrupt.h> 14 + #include <linux/of.h> 15 + #include <linux/of_net.h> 16 + #include <linux/of_mdio.h> 17 + #include <net/switchdev.h> 18 + #include <linux/etherdevice.h> 19 + #include <linux/io.h> 20 + #include <linux/printk.h> 21 + #include <linux/iopoll.h> 22 + #include <linux/mfd/syscon.h> 23 + #include <linux/regmap.h> 24 + #include <linux/types.h> 25 + #include <linux/reset.h> 26 + 27 + #include "sparx5_main_regs.h" 28 + #include "sparx5_main.h" 29 + #include "sparx5_port.h" 30 + 31 + #define QLIM_WM(fraction) \ 32 + ((SPX5_BUFFER_MEMORY / SPX5_BUFFER_CELL_SZ - 100) * (fraction) / 100) 33 + #define IO_RANGES 3 34 + 35 + struct initial_port_config { 36 + u32 portno; 37 + struct device_node *node; 38 + struct sparx5_port_config conf; 39 + struct phy *serdes; 40 + }; 41 + 42 + struct sparx5_ram_config { 43 + void __iomem *init_reg; 44 + u32 init_val; 45 + }; 46 + 47 + struct sparx5_main_io_resource { 48 + enum sparx5_target id; 49 + phys_addr_t offset; 50 + int range; 51 + }; 52 + 53 + static const struct sparx5_main_io_resource sparx5_main_iomap[] = { 54 + { TARGET_CPU, 0, 0 }, /* 0x600000000 */ 55 + { TARGET_FDMA, 0x80000, 0 }, /* 0x600080000 */ 56 + { TARGET_PCEP, 0x400000, 0 }, /* 0x600400000 */ 57 + { TARGET_DEV2G5, 0x10004000, 1 }, /* 0x610004000 */ 58 + { TARGET_DEV5G, 0x10008000, 1 }, /* 0x610008000 */ 59 + { TARGET_PCS5G_BR, 0x1000c000, 1 }, /* 0x61000c000 */ 60 + { TARGET_DEV2G5 + 1, 0x10010000, 1 }, /* 0x610010000 */ 61 + { TARGET_DEV5G + 1, 0x10014000, 1 }, /* 0x610014000 */ 62 + { TARGET_PCS5G_BR + 1, 0x10018000, 1 }, /* 0x610018000 */ 63 + { TARGET_DEV2G5 + 2, 0x1001c000, 1 }, /* 0x61001c000 */ 64 + { TARGET_DEV5G + 2, 0x10020000, 1 }, /* 0x610020000 */ 65 + { TARGET_PCS5G_BR + 2, 0x10024000, 1 }, /* 0x610024000 */ 66 + { TARGET_DEV2G5 + 6, 0x10028000, 1 }, /* 0x610028000 */ 67 + { TARGET_DEV5G + 6, 0x1002c000, 1 }, /* 0x61002c000 */ 68 + { TARGET_PCS5G_BR + 6, 0x10030000, 1 }, /* 0x610030000 */ 69 + { TARGET_DEV2G5 + 7, 0x10034000, 1 }, /* 0x610034000 */ 70 + { TARGET_DEV5G + 7, 0x10038000, 1 }, /* 0x610038000 */ 71 + { TARGET_PCS5G_BR + 7, 0x1003c000, 1 }, /* 0x61003c000 */ 72 + { TARGET_DEV2G5 + 8, 0x10040000, 1 }, /* 0x610040000 */ 73 + { TARGET_DEV5G + 8, 0x10044000, 1 }, /* 0x610044000 */ 74 + { TARGET_PCS5G_BR + 8, 0x10048000, 1 }, /* 0x610048000 */ 75 + { TARGET_DEV2G5 + 9, 0x1004c000, 1 }, /* 0x61004c000 */ 76 + { TARGET_DEV5G + 9, 0x10050000, 1 }, /* 0x610050000 */ 77 + { TARGET_PCS5G_BR + 9, 0x10054000, 1 }, /* 0x610054000 */ 78 + { TARGET_DEV2G5 + 10, 0x10058000, 1 }, /* 0x610058000 */ 79 + { TARGET_DEV5G + 10, 0x1005c000, 1 }, /* 0x61005c000 */ 80 + { TARGET_PCS5G_BR + 10, 0x10060000, 1 }, /* 0x610060000 */ 81 + { TARGET_DEV2G5 + 11, 0x10064000, 1 }, /* 0x610064000 */ 82 + { TARGET_DEV5G + 11, 0x10068000, 1 }, /* 0x610068000 */ 83 + { TARGET_PCS5G_BR + 11, 0x1006c000, 1 }, /* 0x61006c000 */ 84 + { TARGET_DEV2G5 + 12, 0x10070000, 1 }, /* 0x610070000 */ 85 + { TARGET_DEV10G, 0x10074000, 1 }, /* 0x610074000 */ 86 + { TARGET_PCS10G_BR, 0x10078000, 1 }, /* 0x610078000 */ 87 + { TARGET_DEV2G5 + 14, 0x1007c000, 1 }, /* 0x61007c000 */ 88 + { TARGET_DEV10G + 2, 0x10080000, 1 }, /* 0x610080000 */ 89 + { TARGET_PCS10G_BR + 2, 0x10084000, 1 }, /* 0x610084000 */ 90 + { TARGET_DEV2G5 + 15, 0x10088000, 1 }, /* 0x610088000 */ 91 + { TARGET_DEV10G + 3, 0x1008c000, 1 }, /* 0x61008c000 */ 92 + { TARGET_PCS10G_BR + 3, 0x10090000, 1 }, /* 0x610090000 */ 93 + { TARGET_DEV2G5 + 16, 0x10094000, 1 }, /* 0x610094000 */ 94 + { TARGET_DEV2G5 + 17, 0x10098000, 1 }, /* 0x610098000 */ 95 + { TARGET_DEV2G5 + 18, 0x1009c000, 1 }, /* 0x61009c000 */ 96 + { TARGET_DEV2G5 + 19, 0x100a0000, 1 }, /* 0x6100a0000 */ 97 + { TARGET_DEV2G5 + 20, 0x100a4000, 1 }, /* 0x6100a4000 */ 98 + { TARGET_DEV2G5 + 21, 0x100a8000, 1 }, /* 0x6100a8000 */ 99 + { TARGET_DEV2G5 + 22, 0x100ac000, 1 }, /* 0x6100ac000 */ 100 + { TARGET_DEV2G5 + 23, 0x100b0000, 1 }, /* 0x6100b0000 */ 101 + { TARGET_DEV2G5 + 32, 0x100b4000, 1 }, /* 0x6100b4000 */ 102 + { TARGET_DEV2G5 + 33, 0x100b8000, 1 }, /* 0x6100b8000 */ 103 + { TARGET_DEV2G5 + 34, 0x100bc000, 1 }, /* 0x6100bc000 */ 104 + { TARGET_DEV2G5 + 35, 0x100c0000, 1 }, /* 0x6100c0000 */ 105 + { TARGET_DEV2G5 + 36, 0x100c4000, 1 }, /* 0x6100c4000 */ 106 + { TARGET_DEV2G5 + 37, 0x100c8000, 1 }, /* 0x6100c8000 */ 107 + { TARGET_DEV2G5 + 38, 0x100cc000, 1 }, /* 0x6100cc000 */ 108 + { TARGET_DEV2G5 + 39, 0x100d0000, 1 }, /* 0x6100d0000 */ 109 + { TARGET_DEV2G5 + 40, 0x100d4000, 1 }, /* 0x6100d4000 */ 110 + { TARGET_DEV2G5 + 41, 0x100d8000, 1 }, /* 0x6100d8000 */ 111 + { TARGET_DEV2G5 + 42, 0x100dc000, 1 }, /* 0x6100dc000 */ 112 + { TARGET_DEV2G5 + 43, 0x100e0000, 1 }, /* 0x6100e0000 */ 113 + { TARGET_DEV2G5 + 44, 0x100e4000, 1 }, /* 0x6100e4000 */ 114 + { TARGET_DEV2G5 + 45, 0x100e8000, 1 }, /* 0x6100e8000 */ 115 + { TARGET_DEV2G5 + 46, 0x100ec000, 1 }, /* 0x6100ec000 */ 116 + { TARGET_DEV2G5 + 47, 0x100f0000, 1 }, /* 0x6100f0000 */ 117 + { TARGET_DEV2G5 + 57, 0x100f4000, 1 }, /* 0x6100f4000 */ 118 + { TARGET_DEV25G + 1, 0x100f8000, 1 }, /* 0x6100f8000 */ 119 + { TARGET_PCS25G_BR + 1, 0x100fc000, 1 }, /* 0x6100fc000 */ 120 + { TARGET_DEV2G5 + 59, 0x10104000, 1 }, /* 0x610104000 */ 121 + { TARGET_DEV25G + 3, 0x10108000, 1 }, /* 0x610108000 */ 122 + { TARGET_PCS25G_BR + 3, 0x1010c000, 1 }, /* 0x61010c000 */ 123 + { TARGET_DEV2G5 + 60, 0x10114000, 1 }, /* 0x610114000 */ 124 + { TARGET_DEV25G + 4, 0x10118000, 1 }, /* 0x610118000 */ 125 + { TARGET_PCS25G_BR + 4, 0x1011c000, 1 }, /* 0x61011c000 */ 126 + { TARGET_DEV2G5 + 64, 0x10124000, 1 }, /* 0x610124000 */ 127 + { TARGET_DEV5G + 12, 0x10128000, 1 }, /* 0x610128000 */ 128 + { TARGET_PCS5G_BR + 12, 0x1012c000, 1 }, /* 0x61012c000 */ 129 + { TARGET_PORT_CONF, 0x10130000, 1 }, /* 0x610130000 */ 130 + { TARGET_DEV2G5 + 3, 0x10404000, 1 }, /* 0x610404000 */ 131 + { TARGET_DEV5G + 3, 0x10408000, 1 }, /* 0x610408000 */ 132 + { TARGET_PCS5G_BR + 3, 0x1040c000, 1 }, /* 0x61040c000 */ 133 + { TARGET_DEV2G5 + 4, 0x10410000, 1 }, /* 0x610410000 */ 134 + { TARGET_DEV5G + 4, 0x10414000, 1 }, /* 0x610414000 */ 135 + { TARGET_PCS5G_BR + 4, 0x10418000, 1 }, /* 0x610418000 */ 136 + { TARGET_DEV2G5 + 5, 0x1041c000, 1 }, /* 0x61041c000 */ 137 + { TARGET_DEV5G + 5, 0x10420000, 1 }, /* 0x610420000 */ 138 + { TARGET_PCS5G_BR + 5, 0x10424000, 1 }, /* 0x610424000 */ 139 + { TARGET_DEV2G5 + 13, 0x10428000, 1 }, /* 0x610428000 */ 140 + { TARGET_DEV10G + 1, 0x1042c000, 1 }, /* 0x61042c000 */ 141 + { TARGET_PCS10G_BR + 1, 0x10430000, 1 }, /* 0x610430000 */ 142 + { TARGET_DEV2G5 + 24, 0x10434000, 1 }, /* 0x610434000 */ 143 + { TARGET_DEV2G5 + 25, 0x10438000, 1 }, /* 0x610438000 */ 144 + { TARGET_DEV2G5 + 26, 0x1043c000, 1 }, /* 0x61043c000 */ 145 + { TARGET_DEV2G5 + 27, 0x10440000, 1 }, /* 0x610440000 */ 146 + { TARGET_DEV2G5 + 28, 0x10444000, 1 }, /* 0x610444000 */ 147 + { TARGET_DEV2G5 + 29, 0x10448000, 1 }, /* 0x610448000 */ 148 + { TARGET_DEV2G5 + 30, 0x1044c000, 1 }, /* 0x61044c000 */ 149 + { TARGET_DEV2G5 + 31, 0x10450000, 1 }, /* 0x610450000 */ 150 + { TARGET_DEV2G5 + 48, 0x10454000, 1 }, /* 0x610454000 */ 151 + { TARGET_DEV10G + 4, 0x10458000, 1 }, /* 0x610458000 */ 152 + { TARGET_PCS10G_BR + 4, 0x1045c000, 1 }, /* 0x61045c000 */ 153 + { TARGET_DEV2G5 + 49, 0x10460000, 1 }, /* 0x610460000 */ 154 + { TARGET_DEV10G + 5, 0x10464000, 1 }, /* 0x610464000 */ 155 + { TARGET_PCS10G_BR + 5, 0x10468000, 1 }, /* 0x610468000 */ 156 + { TARGET_DEV2G5 + 50, 0x1046c000, 1 }, /* 0x61046c000 */ 157 + { TARGET_DEV10G + 6, 0x10470000, 1 }, /* 0x610470000 */ 158 + { TARGET_PCS10G_BR + 6, 0x10474000, 1 }, /* 0x610474000 */ 159 + { TARGET_DEV2G5 + 51, 0x10478000, 1 }, /* 0x610478000 */ 160 + { TARGET_DEV10G + 7, 0x1047c000, 1 }, /* 0x61047c000 */ 161 + { TARGET_PCS10G_BR + 7, 0x10480000, 1 }, /* 0x610480000 */ 162 + { TARGET_DEV2G5 + 52, 0x10484000, 1 }, /* 0x610484000 */ 163 + { TARGET_DEV10G + 8, 0x10488000, 1 }, /* 0x610488000 */ 164 + { TARGET_PCS10G_BR + 8, 0x1048c000, 1 }, /* 0x61048c000 */ 165 + { TARGET_DEV2G5 + 53, 0x10490000, 1 }, /* 0x610490000 */ 166 + { TARGET_DEV10G + 9, 0x10494000, 1 }, /* 0x610494000 */ 167 + { TARGET_PCS10G_BR + 9, 0x10498000, 1 }, /* 0x610498000 */ 168 + { TARGET_DEV2G5 + 54, 0x1049c000, 1 }, /* 0x61049c000 */ 169 + { TARGET_DEV10G + 10, 0x104a0000, 1 }, /* 0x6104a0000 */ 170 + { TARGET_PCS10G_BR + 10, 0x104a4000, 1 }, /* 0x6104a4000 */ 171 + { TARGET_DEV2G5 + 55, 0x104a8000, 1 }, /* 0x6104a8000 */ 172 + { TARGET_DEV10G + 11, 0x104ac000, 1 }, /* 0x6104ac000 */ 173 + { TARGET_PCS10G_BR + 11, 0x104b0000, 1 }, /* 0x6104b0000 */ 174 + { TARGET_DEV2G5 + 56, 0x104b4000, 1 }, /* 0x6104b4000 */ 175 + { TARGET_DEV25G, 0x104b8000, 1 }, /* 0x6104b8000 */ 176 + { TARGET_PCS25G_BR, 0x104bc000, 1 }, /* 0x6104bc000 */ 177 + { TARGET_DEV2G5 + 58, 0x104c4000, 1 }, /* 0x6104c4000 */ 178 + { TARGET_DEV25G + 2, 0x104c8000, 1 }, /* 0x6104c8000 */ 179 + { TARGET_PCS25G_BR + 2, 0x104cc000, 1 }, /* 0x6104cc000 */ 180 + { TARGET_DEV2G5 + 61, 0x104d4000, 1 }, /* 0x6104d4000 */ 181 + { TARGET_DEV25G + 5, 0x104d8000, 1 }, /* 0x6104d8000 */ 182 + { TARGET_PCS25G_BR + 5, 0x104dc000, 1 }, /* 0x6104dc000 */ 183 + { TARGET_DEV2G5 + 62, 0x104e4000, 1 }, /* 0x6104e4000 */ 184 + { TARGET_DEV25G + 6, 0x104e8000, 1 }, /* 0x6104e8000 */ 185 + { TARGET_PCS25G_BR + 6, 0x104ec000, 1 }, /* 0x6104ec000 */ 186 + { TARGET_DEV2G5 + 63, 0x104f4000, 1 }, /* 0x6104f4000 */ 187 + { TARGET_DEV25G + 7, 0x104f8000, 1 }, /* 0x6104f8000 */ 188 + { TARGET_PCS25G_BR + 7, 0x104fc000, 1 }, /* 0x6104fc000 */ 189 + { TARGET_DSM, 0x10504000, 1 }, /* 0x610504000 */ 190 + { TARGET_ASM, 0x10600000, 1 }, /* 0x610600000 */ 191 + { TARGET_GCB, 0x11010000, 2 }, /* 0x611010000 */ 192 + { TARGET_QS, 0x11030000, 2 }, /* 0x611030000 */ 193 + { TARGET_ANA_ACL, 0x11050000, 2 }, /* 0x611050000 */ 194 + { TARGET_LRN, 0x11060000, 2 }, /* 0x611060000 */ 195 + { TARGET_VCAP_SUPER, 0x11080000, 2 }, /* 0x611080000 */ 196 + { TARGET_QSYS, 0x110a0000, 2 }, /* 0x6110a0000 */ 197 + { TARGET_QFWD, 0x110b0000, 2 }, /* 0x6110b0000 */ 198 + { TARGET_XQS, 0x110c0000, 2 }, /* 0x6110c0000 */ 199 + { TARGET_CLKGEN, 0x11100000, 2 }, /* 0x611100000 */ 200 + { TARGET_ANA_AC_POL, 0x11200000, 2 }, /* 0x611200000 */ 201 + { TARGET_QRES, 0x11280000, 2 }, /* 0x611280000 */ 202 + { TARGET_EACL, 0x112c0000, 2 }, /* 0x6112c0000 */ 203 + { TARGET_ANA_CL, 0x11400000, 2 }, /* 0x611400000 */ 204 + { TARGET_ANA_L3, 0x11480000, 2 }, /* 0x611480000 */ 205 + { TARGET_HSCH, 0x11580000, 2 }, /* 0x611580000 */ 206 + { TARGET_REW, 0x11600000, 2 }, /* 0x611600000 */ 207 + { TARGET_ANA_L2, 0x11800000, 2 }, /* 0x611800000 */ 208 + { TARGET_ANA_AC, 0x11900000, 2 }, /* 0x611900000 */ 209 + { TARGET_VOP, 0x11a00000, 2 }, /* 0x611a00000 */ 210 + }; 211 + 212 + static int sparx5_create_targets(struct sparx5 *sparx5) 213 + { 214 + struct resource *iores[IO_RANGES]; 215 + void __iomem *iomem[IO_RANGES]; 216 + void __iomem *begin[IO_RANGES]; 217 + int range_id[IO_RANGES]; 218 + int idx, jdx; 219 + 220 + for (idx = 0, jdx = 0; jdx < ARRAY_SIZE(sparx5_main_iomap); jdx++) { 221 + const struct sparx5_main_io_resource *iomap = &sparx5_main_iomap[jdx]; 222 + 223 + if (idx == iomap->range) { 224 + range_id[idx] = jdx; 225 + idx++; 226 + } 227 + } 228 + for (idx = 0; idx < IO_RANGES; idx++) { 229 + iores[idx] = platform_get_resource(sparx5->pdev, IORESOURCE_MEM, 230 + idx); 231 + iomem[idx] = devm_ioremap(sparx5->dev, 232 + iores[idx]->start, 233 + iores[idx]->end - iores[idx]->start 234 + + 1); 235 + if (IS_ERR(iomem[idx])) { 236 + dev_err(sparx5->dev, "Unable to get switch registers: %s\n", 237 + iores[idx]->name); 238 + return PTR_ERR(iomem[idx]); 239 + } 240 + begin[idx] = iomem[idx] - sparx5_main_iomap[range_id[idx]].offset; 241 + } 242 + for (jdx = 0; jdx < ARRAY_SIZE(sparx5_main_iomap); jdx++) { 243 + const struct sparx5_main_io_resource *iomap = &sparx5_main_iomap[jdx]; 244 + 245 + sparx5->regs[iomap->id] = begin[iomap->range] + iomap->offset; 246 + } 247 + return 0; 248 + } 249 + 250 + static int sparx5_create_port(struct sparx5 *sparx5, 251 + struct initial_port_config *config) 252 + { 253 + struct sparx5_port *spx5_port; 254 + struct net_device *ndev; 255 + struct phylink *phylink; 256 + int err; 257 + 258 + ndev = sparx5_create_netdev(sparx5, config->portno); 259 + if (IS_ERR(ndev)) { 260 + dev_err(sparx5->dev, "Could not create net device: %02u\n", 261 + config->portno); 262 + return PTR_ERR(ndev); 263 + } 264 + spx5_port = netdev_priv(ndev); 265 + spx5_port->of_node = config->node; 266 + spx5_port->serdes = config->serdes; 267 + spx5_port->pvid = NULL_VID; 268 + spx5_port->signd_internal = true; 269 + spx5_port->signd_active_high = true; 270 + spx5_port->signd_enable = true; 271 + spx5_port->max_vlan_tags = SPX5_PORT_MAX_TAGS_NONE; 272 + spx5_port->vlan_type = SPX5_VLAN_PORT_TYPE_UNAWARE; 273 + spx5_port->custom_etype = 0x8880; /* Vitesse */ 274 + spx5_port->phylink_pcs.poll = true; 275 + spx5_port->phylink_pcs.ops = &sparx5_phylink_pcs_ops; 276 + sparx5->ports[config->portno] = spx5_port; 277 + 278 + err = sparx5_port_init(sparx5, spx5_port, &config->conf); 279 + if (err) { 280 + dev_err(sparx5->dev, "port init failed\n"); 281 + return err; 282 + } 283 + spx5_port->conf = config->conf; 284 + 285 + /* Setup VLAN */ 286 + sparx5_vlan_port_setup(sparx5, spx5_port->portno); 287 + 288 + /* Create a phylink for PHY management. Also handles SFPs */ 289 + spx5_port->phylink_config.dev = &spx5_port->ndev->dev; 290 + spx5_port->phylink_config.type = PHYLINK_NETDEV; 291 + spx5_port->phylink_config.pcs_poll = true; 292 + 293 + phylink = phylink_create(&spx5_port->phylink_config, 294 + of_fwnode_handle(config->node), 295 + config->conf.phy_mode, 296 + &sparx5_phylink_mac_ops); 297 + if (IS_ERR(phylink)) 298 + return PTR_ERR(phylink); 299 + 300 + spx5_port->phylink = phylink; 301 + phylink_set_pcs(phylink, &spx5_port->phylink_pcs); 302 + 303 + return 0; 304 + } 305 + 306 + static int sparx5_init_ram(struct sparx5 *s5) 307 + { 308 + const struct sparx5_ram_config spx5_ram_cfg[] = { 309 + {spx5_reg_get(s5, ANA_AC_STAT_RESET), ANA_AC_STAT_RESET_RESET}, 310 + {spx5_reg_get(s5, ASM_STAT_CFG), ASM_STAT_CFG_STAT_CNT_CLR_SHOT}, 311 + {spx5_reg_get(s5, QSYS_RAM_INIT), QSYS_RAM_INIT_RAM_INIT}, 312 + {spx5_reg_get(s5, REW_RAM_INIT), QSYS_RAM_INIT_RAM_INIT}, 313 + {spx5_reg_get(s5, VOP_RAM_INIT), QSYS_RAM_INIT_RAM_INIT}, 314 + {spx5_reg_get(s5, ANA_AC_RAM_INIT), QSYS_RAM_INIT_RAM_INIT}, 315 + {spx5_reg_get(s5, ASM_RAM_INIT), QSYS_RAM_INIT_RAM_INIT}, 316 + {spx5_reg_get(s5, EACL_RAM_INIT), QSYS_RAM_INIT_RAM_INIT}, 317 + {spx5_reg_get(s5, VCAP_SUPER_RAM_INIT), QSYS_RAM_INIT_RAM_INIT}, 318 + {spx5_reg_get(s5, DSM_RAM_INIT), QSYS_RAM_INIT_RAM_INIT} 319 + }; 320 + const struct sparx5_ram_config *cfg; 321 + u32 value, pending, jdx, idx; 322 + 323 + for (jdx = 0; jdx < 10; jdx++) { 324 + pending = ARRAY_SIZE(spx5_ram_cfg); 325 + for (idx = 0; idx < ARRAY_SIZE(spx5_ram_cfg); idx++) { 326 + cfg = &spx5_ram_cfg[idx]; 327 + if (jdx == 0) { 328 + writel(cfg->init_val, cfg->init_reg); 329 + } else { 330 + value = readl(cfg->init_reg); 331 + if ((value & cfg->init_val) != cfg->init_val) 332 + pending--; 333 + } 334 + } 335 + if (!pending) 336 + break; 337 + usleep_range(USEC_PER_MSEC, 2 * USEC_PER_MSEC); 338 + } 339 + 340 + if (pending > 0) { 341 + /* Still initializing, should be complete in 342 + * less than 1ms 343 + */ 344 + dev_err(s5->dev, "Memory initialization error\n"); 345 + return -EINVAL; 346 + } 347 + return 0; 348 + } 349 + 350 + static int sparx5_init_switchcore(struct sparx5 *sparx5) 351 + { 352 + u32 value; 353 + int err = 0; 354 + 355 + spx5_rmw(EACL_POL_EACL_CFG_EACL_FORCE_INIT_SET(1), 356 + EACL_POL_EACL_CFG_EACL_FORCE_INIT, 357 + sparx5, 358 + EACL_POL_EACL_CFG); 359 + 360 + spx5_rmw(EACL_POL_EACL_CFG_EACL_FORCE_INIT_SET(0), 361 + EACL_POL_EACL_CFG_EACL_FORCE_INIT, 362 + sparx5, 363 + EACL_POL_EACL_CFG); 364 + 365 + /* Initialize memories, if not done already */ 366 + value = spx5_rd(sparx5, HSCH_RESET_CFG); 367 + if (!(value & HSCH_RESET_CFG_CORE_ENA)) { 368 + err = sparx5_init_ram(sparx5); 369 + if (err) 370 + return err; 371 + } 372 + 373 + /* Reset counters */ 374 + spx5_wr(ANA_AC_STAT_RESET_RESET_SET(1), sparx5, ANA_AC_STAT_RESET); 375 + spx5_wr(ASM_STAT_CFG_STAT_CNT_CLR_SHOT_SET(1), sparx5, ASM_STAT_CFG); 376 + 377 + /* Enable switch-core and queue system */ 378 + spx5_wr(HSCH_RESET_CFG_CORE_ENA_SET(1), sparx5, HSCH_RESET_CFG); 379 + 380 + return 0; 381 + } 382 + 383 + static int sparx5_init_coreclock(struct sparx5 *sparx5) 384 + { 385 + enum sparx5_core_clockfreq freq = sparx5->coreclock; 386 + u32 clk_div, clk_period, pol_upd_int, idx; 387 + 388 + /* Verify if core clock frequency is supported on target. 389 + * If 'VTSS_CORE_CLOCK_DEFAULT' then the highest supported 390 + * freq. is used 391 + */ 392 + switch (sparx5->target_ct) { 393 + case SPX5_TARGET_CT_7546: 394 + if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) 395 + freq = SPX5_CORE_CLOCK_250MHZ; 396 + else if (sparx5->coreclock != SPX5_CORE_CLOCK_250MHZ) 397 + freq = 0; /* Not supported */ 398 + break; 399 + case SPX5_TARGET_CT_7549: 400 + case SPX5_TARGET_CT_7552: 401 + case SPX5_TARGET_CT_7556: 402 + if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) 403 + freq = SPX5_CORE_CLOCK_500MHZ; 404 + else if (sparx5->coreclock != SPX5_CORE_CLOCK_500MHZ) 405 + freq = 0; /* Not supported */ 406 + break; 407 + case SPX5_TARGET_CT_7558: 408 + case SPX5_TARGET_CT_7558TSN: 409 + if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) 410 + freq = SPX5_CORE_CLOCK_625MHZ; 411 + else if (sparx5->coreclock != SPX5_CORE_CLOCK_625MHZ) 412 + freq = 0; /* Not supported */ 413 + break; 414 + case SPX5_TARGET_CT_7546TSN: 415 + if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) 416 + freq = SPX5_CORE_CLOCK_625MHZ; 417 + break; 418 + case SPX5_TARGET_CT_7549TSN: 419 + case SPX5_TARGET_CT_7552TSN: 420 + case SPX5_TARGET_CT_7556TSN: 421 + if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) 422 + freq = SPX5_CORE_CLOCK_625MHZ; 423 + else if (sparx5->coreclock == SPX5_CORE_CLOCK_250MHZ) 424 + freq = 0; /* Not supported */ 425 + break; 426 + default: 427 + dev_err(sparx5->dev, "Target (%#04x) not supported\n", 428 + sparx5->target_ct); 429 + return -ENODEV; 430 + } 431 + 432 + switch (freq) { 433 + case SPX5_CORE_CLOCK_250MHZ: 434 + clk_div = 10; 435 + pol_upd_int = 312; 436 + break; 437 + case SPX5_CORE_CLOCK_500MHZ: 438 + clk_div = 5; 439 + pol_upd_int = 624; 440 + break; 441 + case SPX5_CORE_CLOCK_625MHZ: 442 + clk_div = 4; 443 + pol_upd_int = 780; 444 + break; 445 + default: 446 + dev_err(sparx5->dev, "%d coreclock not supported on (%#04x)\n", 447 + sparx5->coreclock, sparx5->target_ct); 448 + return -EINVAL; 449 + } 450 + 451 + /* Update state with chosen frequency */ 452 + sparx5->coreclock = freq; 453 + 454 + /* Configure the LCPLL */ 455 + spx5_rmw(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_DIV_SET(clk_div) | 456 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_PRE_DIV_SET(0) | 457 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_DIR_SET(0) | 458 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_SEL_SET(0) | 459 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_ENA_SET(0) | 460 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_ENA_SET(1), 461 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_DIV | 462 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_PRE_DIV | 463 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_DIR | 464 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_SEL | 465 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_ENA | 466 + CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_ENA, 467 + sparx5, 468 + CLKGEN_LCPLL1_CORE_CLK_CFG); 469 + 470 + clk_period = sparx5_clk_period(freq); 471 + 472 + spx5_rmw(HSCH_SYS_CLK_PER_SYS_CLK_PER_100PS_SET(clk_period / 100), 473 + HSCH_SYS_CLK_PER_SYS_CLK_PER_100PS, 474 + sparx5, 475 + HSCH_SYS_CLK_PER); 476 + 477 + spx5_rmw(ANA_AC_POL_BDLB_DLB_CTRL_CLK_PERIOD_01NS_SET(clk_period / 100), 478 + ANA_AC_POL_BDLB_DLB_CTRL_CLK_PERIOD_01NS, 479 + sparx5, 480 + ANA_AC_POL_BDLB_DLB_CTRL); 481 + 482 + spx5_rmw(ANA_AC_POL_SLB_DLB_CTRL_CLK_PERIOD_01NS_SET(clk_period / 100), 483 + ANA_AC_POL_SLB_DLB_CTRL_CLK_PERIOD_01NS, 484 + sparx5, 485 + ANA_AC_POL_SLB_DLB_CTRL); 486 + 487 + spx5_rmw(LRN_AUTOAGE_CFG_1_CLK_PERIOD_01NS_SET(clk_period / 100), 488 + LRN_AUTOAGE_CFG_1_CLK_PERIOD_01NS, 489 + sparx5, 490 + LRN_AUTOAGE_CFG_1); 491 + 492 + for (idx = 0; idx < 3; idx++) 493 + spx5_rmw(GCB_SIO_CLOCK_SYS_CLK_PERIOD_SET(clk_period / 100), 494 + GCB_SIO_CLOCK_SYS_CLK_PERIOD, 495 + sparx5, 496 + GCB_SIO_CLOCK(idx)); 497 + 498 + spx5_rmw(HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY_SET 499 + ((256 * 1000) / clk_period), 500 + HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY, 501 + sparx5, 502 + HSCH_TAS_STATEMACHINE_CFG); 503 + 504 + spx5_rmw(ANA_AC_POL_POL_UPD_INT_CFG_POL_UPD_INT_SET(pol_upd_int), 505 + ANA_AC_POL_POL_UPD_INT_CFG_POL_UPD_INT, 506 + sparx5, 507 + ANA_AC_POL_POL_UPD_INT_CFG); 508 + 509 + return 0; 510 + } 511 + 512 + static int sparx5_qlim_set(struct sparx5 *sparx5) 513 + { 514 + u32 res, dp, prio; 515 + 516 + for (res = 0; res < 2; res++) { 517 + for (prio = 0; prio < 8; prio++) 518 + spx5_wr(0xFFF, sparx5, 519 + QRES_RES_CFG(prio + 630 + res * 1024)); 520 + 521 + for (dp = 0; dp < 4; dp++) 522 + spx5_wr(0xFFF, sparx5, 523 + QRES_RES_CFG(dp + 638 + res * 1024)); 524 + } 525 + 526 + /* Set 80,90,95,100% of memory size for top watermarks */ 527 + spx5_wr(QLIM_WM(80), sparx5, XQS_QLIMIT_SHR_QLIM_CFG(0)); 528 + spx5_wr(QLIM_WM(90), sparx5, XQS_QLIMIT_SHR_CTOP_CFG(0)); 529 + spx5_wr(QLIM_WM(95), sparx5, XQS_QLIMIT_SHR_ATOP_CFG(0)); 530 + spx5_wr(QLIM_WM(100), sparx5, XQS_QLIMIT_SHR_TOP_CFG(0)); 531 + 532 + return 0; 533 + } 534 + 535 + /* Some boards needs to map the SGPIO for signal detect explicitly to the 536 + * port module 537 + */ 538 + static void sparx5_board_init(struct sparx5 *sparx5) 539 + { 540 + int idx; 541 + 542 + if (!sparx5->sd_sgpio_remapping) 543 + return; 544 + 545 + /* Enable SGPIO Signal Detect remapping */ 546 + spx5_rmw(GCB_HW_SGPIO_SD_CFG_SD_MAP_SEL, 547 + GCB_HW_SGPIO_SD_CFG_SD_MAP_SEL, 548 + sparx5, 549 + GCB_HW_SGPIO_SD_CFG); 550 + 551 + /* Refer to LOS SGPIO */ 552 + for (idx = 0; idx < SPX5_PORTS; idx++) 553 + if (sparx5->ports[idx]) 554 + if (sparx5->ports[idx]->conf.sd_sgpio != ~0) 555 + spx5_wr(sparx5->ports[idx]->conf.sd_sgpio, 556 + sparx5, 557 + GCB_HW_SGPIO_TO_SD_MAP_CFG(idx)); 558 + } 559 + 560 + static int sparx5_start(struct sparx5 *sparx5) 561 + { 562 + u8 broadcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 563 + char queue_name[32]; 564 + u32 idx; 565 + int err; 566 + 567 + /* Setup own UPSIDs */ 568 + for (idx = 0; idx < 3; idx++) { 569 + spx5_wr(idx, sparx5, ANA_AC_OWN_UPSID(idx)); 570 + spx5_wr(idx, sparx5, ANA_CL_OWN_UPSID(idx)); 571 + spx5_wr(idx, sparx5, ANA_L2_OWN_UPSID(idx)); 572 + spx5_wr(idx, sparx5, REW_OWN_UPSID(idx)); 573 + } 574 + 575 + /* Enable CPU ports */ 576 + for (idx = SPX5_PORTS; idx < SPX5_PORTS_ALL; idx++) 577 + spx5_rmw(QFWD_SWITCH_PORT_MODE_PORT_ENA_SET(1), 578 + QFWD_SWITCH_PORT_MODE_PORT_ENA, 579 + sparx5, 580 + QFWD_SWITCH_PORT_MODE(idx)); 581 + 582 + /* Init masks */ 583 + sparx5_update_fwd(sparx5); 584 + 585 + /* CPU copy CPU pgids */ 586 + spx5_wr(ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA_SET(1), 587 + sparx5, ANA_AC_PGID_MISC_CFG(PGID_CPU)); 588 + spx5_wr(ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA_SET(1), 589 + sparx5, ANA_AC_PGID_MISC_CFG(PGID_BCAST)); 590 + 591 + /* Recalc injected frame FCS */ 592 + for (idx = SPX5_PORT_CPU_0; idx <= SPX5_PORT_CPU_1; idx++) 593 + spx5_rmw(ANA_CL_FILTER_CTRL_FORCE_FCS_UPDATE_ENA_SET(1), 594 + ANA_CL_FILTER_CTRL_FORCE_FCS_UPDATE_ENA, 595 + sparx5, ANA_CL_FILTER_CTRL(idx)); 596 + 597 + /* Init MAC table, ageing */ 598 + sparx5_mact_init(sparx5); 599 + 600 + /* Setup VLANs */ 601 + sparx5_vlan_init(sparx5); 602 + 603 + /* Add host mode BC address (points only to CPU) */ 604 + sparx5_mact_learn(sparx5, PGID_CPU, broadcast, NULL_VID); 605 + 606 + /* Enable queue limitation watermarks */ 607 + sparx5_qlim_set(sparx5); 608 + 609 + err = sparx5_config_auto_calendar(sparx5); 610 + if (err) 611 + return err; 612 + 613 + err = sparx5_config_dsm_calendar(sparx5); 614 + if (err) 615 + return err; 616 + 617 + /* Init stats */ 618 + err = sparx_stats_init(sparx5); 619 + if (err) 620 + return err; 621 + 622 + /* Init mact_sw struct */ 623 + mutex_init(&sparx5->mact_lock); 624 + INIT_LIST_HEAD(&sparx5->mact_entries); 625 + snprintf(queue_name, sizeof(queue_name), "%s-mact", 626 + dev_name(sparx5->dev)); 627 + sparx5->mact_queue = create_singlethread_workqueue(queue_name); 628 + INIT_DELAYED_WORK(&sparx5->mact_work, sparx5_mact_pull_work); 629 + queue_delayed_work(sparx5->mact_queue, &sparx5->mact_work, 630 + SPX5_MACT_PULL_DELAY); 631 + 632 + err = sparx5_register_netdevs(sparx5); 633 + if (err) 634 + return err; 635 + 636 + sparx5_board_init(sparx5); 637 + err = sparx5_register_notifier_blocks(sparx5); 638 + 639 + /* Start register based INJ/XTR */ 640 + err = -ENXIO; 641 + if (err && sparx5->xtr_irq >= 0) { 642 + err = devm_request_irq(sparx5->dev, sparx5->xtr_irq, 643 + sparx5_xtr_handler, IRQF_SHARED, 644 + "sparx5-xtr", sparx5); 645 + if (!err) 646 + err = sparx5_manual_injection_mode(sparx5); 647 + if (err) 648 + sparx5->xtr_irq = -ENXIO; 649 + } else { 650 + sparx5->xtr_irq = -ENXIO; 651 + } 652 + return err; 653 + } 654 + 655 + static void sparx5_cleanup_ports(struct sparx5 *sparx5) 656 + { 657 + sparx5_unregister_netdevs(sparx5); 658 + sparx5_destroy_netdevs(sparx5); 659 + } 660 + 661 + static int mchp_sparx5_probe(struct platform_device *pdev) 662 + { 663 + struct initial_port_config *configs, *config; 664 + struct device_node *np = pdev->dev.of_node; 665 + struct device_node *ports, *portnp; 666 + struct reset_control *reset; 667 + struct sparx5 *sparx5; 668 + int idx = 0, err = 0; 669 + u8 *mac_addr; 670 + 671 + if (!np && !pdev->dev.platform_data) 672 + return -ENODEV; 673 + 674 + sparx5 = devm_kzalloc(&pdev->dev, sizeof(*sparx5), GFP_KERNEL); 675 + if (!sparx5) 676 + return -ENOMEM; 677 + 678 + platform_set_drvdata(pdev, sparx5); 679 + sparx5->pdev = pdev; 680 + sparx5->dev = &pdev->dev; 681 + 682 + /* Do switch core reset if available */ 683 + reset = devm_reset_control_get_optional_shared(&pdev->dev, "switch"); 684 + if (IS_ERR(reset)) 685 + return dev_err_probe(&pdev->dev, PTR_ERR(reset), 686 + "Failed to get switch reset controller.\n"); 687 + reset_control_reset(reset); 688 + 689 + /* Default values, some from DT */ 690 + sparx5->coreclock = SPX5_CORE_CLOCK_DEFAULT; 691 + 692 + ports = of_get_child_by_name(np, "ethernet-ports"); 693 + if (!ports) { 694 + dev_err(sparx5->dev, "no ethernet-ports child node found\n"); 695 + return -ENODEV; 696 + } 697 + sparx5->port_count = of_get_child_count(ports); 698 + 699 + configs = kcalloc(sparx5->port_count, 700 + sizeof(struct initial_port_config), GFP_KERNEL); 701 + if (!configs) { 702 + err = -ENOMEM; 703 + goto cleanup_pnode; 704 + } 705 + 706 + for_each_available_child_of_node(ports, portnp) { 707 + struct sparx5_port_config *conf; 708 + struct phy *serdes; 709 + u32 portno; 710 + 711 + err = of_property_read_u32(portnp, "reg", &portno); 712 + if (err) { 713 + dev_err(sparx5->dev, "port reg property error\n"); 714 + continue; 715 + } 716 + config = &configs[idx]; 717 + conf = &config->conf; 718 + conf->speed = SPEED_UNKNOWN; 719 + conf->bandwidth = SPEED_UNKNOWN; 720 + err = of_get_phy_mode(portnp, &conf->phy_mode); 721 + if (err) { 722 + dev_err(sparx5->dev, "port %u: missing phy-mode\n", 723 + portno); 724 + continue; 725 + } 726 + err = of_property_read_u32(portnp, "microchip,bandwidth", 727 + &conf->bandwidth); 728 + if (err) { 729 + dev_err(sparx5->dev, "port %u: missing bandwidth\n", 730 + portno); 731 + continue; 732 + } 733 + err = of_property_read_u32(portnp, "microchip,sd-sgpio", &conf->sd_sgpio); 734 + if (err) 735 + conf->sd_sgpio = ~0; 736 + else 737 + sparx5->sd_sgpio_remapping = true; 738 + serdes = devm_of_phy_get(sparx5->dev, portnp, NULL); 739 + if (IS_ERR(serdes)) { 740 + err = dev_err_probe(sparx5->dev, PTR_ERR(serdes), 741 + "port %u: missing serdes\n", 742 + portno); 743 + goto cleanup_config; 744 + } 745 + config->portno = portno; 746 + config->node = portnp; 747 + config->serdes = serdes; 748 + 749 + conf->media = PHY_MEDIA_DAC; 750 + conf->serdes_reset = true; 751 + conf->portmode = conf->phy_mode; 752 + conf->power_down = true; 753 + idx++; 754 + } 755 + 756 + err = sparx5_create_targets(sparx5); 757 + if (err) 758 + goto cleanup_config; 759 + 760 + if (of_get_mac_address(np, mac_addr)) { 761 + dev_info(sparx5->dev, "MAC addr was not set, use random MAC\n"); 762 + eth_random_addr(sparx5->base_mac); 763 + sparx5->base_mac[5] = 0; 764 + } else { 765 + ether_addr_copy(sparx5->base_mac, mac_addr); 766 + } 767 + 768 + sparx5->xtr_irq = platform_get_irq_byname(sparx5->pdev, "xtr"); 769 + 770 + /* Read chip ID to check CPU interface */ 771 + sparx5->chip_id = spx5_rd(sparx5, GCB_CHIP_ID); 772 + 773 + sparx5->target_ct = (enum spx5_target_chiptype) 774 + GCB_CHIP_ID_PART_ID_GET(sparx5->chip_id); 775 + 776 + /* Initialize Switchcore and internal RAMs */ 777 + err = sparx5_init_switchcore(sparx5); 778 + if (err) { 779 + dev_err(sparx5->dev, "Switchcore initialization error\n"); 780 + goto cleanup_config; 781 + } 782 + 783 + /* Initialize the LC-PLL (core clock) and set affected registers */ 784 + err = sparx5_init_coreclock(sparx5); 785 + if (err) { 786 + dev_err(sparx5->dev, "LC-PLL initialization error\n"); 787 + goto cleanup_config; 788 + } 789 + 790 + for (idx = 0; idx < sparx5->port_count; ++idx) { 791 + config = &configs[idx]; 792 + if (!config->node) 793 + continue; 794 + 795 + err = sparx5_create_port(sparx5, config); 796 + if (err) { 797 + dev_err(sparx5->dev, "port create error\n"); 798 + goto cleanup_ports; 799 + } 800 + } 801 + 802 + err = sparx5_start(sparx5); 803 + if (err) { 804 + dev_err(sparx5->dev, "Start failed\n"); 805 + goto cleanup_ports; 806 + } 807 + goto cleanup_config; 808 + 809 + cleanup_ports: 810 + sparx5_cleanup_ports(sparx5); 811 + cleanup_config: 812 + kfree(configs); 813 + cleanup_pnode: 814 + of_node_put(ports); 815 + return err; 816 + } 817 + 818 + static int mchp_sparx5_remove(struct platform_device *pdev) 819 + { 820 + struct sparx5 *sparx5 = platform_get_drvdata(pdev); 821 + 822 + if (sparx5->xtr_irq) { 823 + disable_irq(sparx5->xtr_irq); 824 + sparx5->xtr_irq = -ENXIO; 825 + } 826 + sparx5_cleanup_ports(sparx5); 827 + /* Unregister netdevs */ 828 + sparx5_unregister_notifier_blocks(sparx5); 829 + 830 + return 0; 831 + } 832 + 833 + static const struct of_device_id mchp_sparx5_match[] = { 834 + { .compatible = "microchip,sparx5-switch" }, 835 + { } 836 + }; 837 + MODULE_DEVICE_TABLE(of, mchp_sparx5_match); 838 + 839 + static struct platform_driver mchp_sparx5_driver = { 840 + .probe = mchp_sparx5_probe, 841 + .remove = mchp_sparx5_remove, 842 + .driver = { 843 + .name = "sparx5-switch", 844 + .of_match_table = mchp_sparx5_match, 845 + }, 846 + }; 847 + 848 + module_platform_driver(mchp_sparx5_driver); 849 + 850 + MODULE_DESCRIPTION("Microchip Sparx5 switch driver"); 851 + MODULE_AUTHOR("Steen Hegelund <steen.hegelund@microchip.com>"); 852 + MODULE_LICENSE("Dual MIT/GPL");
+375
drivers/net/ethernet/microchip/sparx5/sparx5_main.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #ifndef __SPARX5_MAIN_H__ 8 + #define __SPARX5_MAIN_H__ 9 + 10 + #include <linux/types.h> 11 + #include <linux/phy/phy.h> 12 + #include <linux/netdevice.h> 13 + #include <linux/phy.h> 14 + #include <linux/if_vlan.h> 15 + #include <linux/bitmap.h> 16 + #include <linux/phylink.h> 17 + #include <linux/hrtimer.h> 18 + 19 + /* Target chip type */ 20 + enum spx5_target_chiptype { 21 + SPX5_TARGET_CT_7546 = 0x7546, /* SparX-5-64 Enterprise */ 22 + SPX5_TARGET_CT_7549 = 0x7549, /* SparX-5-90 Enterprise */ 23 + SPX5_TARGET_CT_7552 = 0x7552, /* SparX-5-128 Enterprise */ 24 + SPX5_TARGET_CT_7556 = 0x7556, /* SparX-5-160 Enterprise */ 25 + SPX5_TARGET_CT_7558 = 0x7558, /* SparX-5-200 Enterprise */ 26 + SPX5_TARGET_CT_7546TSN = 0x47546, /* SparX-5-64i Industrial */ 27 + SPX5_TARGET_CT_7549TSN = 0x47549, /* SparX-5-90i Industrial */ 28 + SPX5_TARGET_CT_7552TSN = 0x47552, /* SparX-5-128i Industrial */ 29 + SPX5_TARGET_CT_7556TSN = 0x47556, /* SparX-5-160i Industrial */ 30 + SPX5_TARGET_CT_7558TSN = 0x47558, /* SparX-5-200i Industrial */ 31 + }; 32 + 33 + enum sparx5_port_max_tags { 34 + SPX5_PORT_MAX_TAGS_NONE, /* No extra tags allowed */ 35 + SPX5_PORT_MAX_TAGS_ONE, /* Single tag allowed */ 36 + SPX5_PORT_MAX_TAGS_TWO /* Single and double tag allowed */ 37 + }; 38 + 39 + enum sparx5_vlan_port_type { 40 + SPX5_VLAN_PORT_TYPE_UNAWARE, /* VLAN unaware port */ 41 + SPX5_VLAN_PORT_TYPE_C, /* C-port */ 42 + SPX5_VLAN_PORT_TYPE_S, /* S-port */ 43 + SPX5_VLAN_PORT_TYPE_S_CUSTOM /* S-port using custom type */ 44 + }; 45 + 46 + #define SPX5_PORTS 65 47 + #define SPX5_PORT_CPU (SPX5_PORTS) /* Next port is CPU port */ 48 + #define SPX5_PORT_CPU_0 (SPX5_PORT_CPU + 0) /* CPU Port 65 */ 49 + #define SPX5_PORT_CPU_1 (SPX5_PORT_CPU + 1) /* CPU Port 66 */ 50 + #define SPX5_PORT_VD0 (SPX5_PORT_CPU + 2) /* VD0/Port 67 used for IPMC */ 51 + #define SPX5_PORT_VD1 (SPX5_PORT_CPU + 3) /* VD1/Port 68 used for AFI/OAM */ 52 + #define SPX5_PORT_VD2 (SPX5_PORT_CPU + 4) /* VD2/Port 69 used for IPinIP*/ 53 + #define SPX5_PORTS_ALL (SPX5_PORT_CPU + 5) /* Total number of ports */ 54 + 55 + #define PGID_BASE SPX5_PORTS /* Starts after port PGIDs */ 56 + #define PGID_UC_FLOOD (PGID_BASE + 0) 57 + #define PGID_MC_FLOOD (PGID_BASE + 1) 58 + #define PGID_IPV4_MC_DATA (PGID_BASE + 2) 59 + #define PGID_IPV4_MC_CTRL (PGID_BASE + 3) 60 + #define PGID_IPV6_MC_DATA (PGID_BASE + 4) 61 + #define PGID_IPV6_MC_CTRL (PGID_BASE + 5) 62 + #define PGID_BCAST (PGID_BASE + 6) 63 + #define PGID_CPU (PGID_BASE + 7) 64 + 65 + #define IFH_LEN 9 /* 36 bytes */ 66 + #define NULL_VID 0 67 + #define SPX5_MACT_PULL_DELAY (2 * HZ) 68 + #define SPX5_STATS_CHECK_DELAY (1 * HZ) 69 + #define SPX5_PRIOS 8 /* Number of priority queues */ 70 + #define SPX5_BUFFER_CELL_SZ 184 /* Cell size */ 71 + #define SPX5_BUFFER_MEMORY 4194280 /* 22795 words * 184 bytes */ 72 + 73 + #define XTR_QUEUE 0 74 + #define INJ_QUEUE 0 75 + 76 + struct sparx5; 77 + 78 + struct sparx5_port_config { 79 + phy_interface_t portmode; 80 + u32 bandwidth; 81 + int speed; 82 + int duplex; 83 + enum phy_media media; 84 + bool inband; 85 + bool power_down; 86 + bool autoneg; 87 + bool serdes_reset; 88 + u32 pause; 89 + u32 pause_adv; 90 + phy_interface_t phy_mode; 91 + u32 sd_sgpio; 92 + }; 93 + 94 + struct sparx5_port { 95 + struct net_device *ndev; 96 + struct sparx5 *sparx5; 97 + struct device_node *of_node; 98 + struct phy *serdes; 99 + struct sparx5_port_config conf; 100 + struct phylink_config phylink_config; 101 + struct phylink *phylink; 102 + struct phylink_pcs phylink_pcs; 103 + u16 portno; 104 + /* Ingress default VLAN (pvid) */ 105 + u16 pvid; 106 + /* Egress default VLAN (vid) */ 107 + u16 vid; 108 + bool signd_internal; 109 + bool signd_active_high; 110 + bool signd_enable; 111 + bool flow_control; 112 + enum sparx5_port_max_tags max_vlan_tags; 113 + enum sparx5_vlan_port_type vlan_type; 114 + u32 custom_etype; 115 + u32 ifh[IFH_LEN]; 116 + bool vlan_aware; 117 + struct hrtimer inj_timer; 118 + }; 119 + 120 + enum sparx5_core_clockfreq { 121 + SPX5_CORE_CLOCK_DEFAULT, /* Defaults to the highest supported frequency */ 122 + SPX5_CORE_CLOCK_250MHZ, /* 250MHZ core clock frequency */ 123 + SPX5_CORE_CLOCK_500MHZ, /* 500MHZ core clock frequency */ 124 + SPX5_CORE_CLOCK_625MHZ, /* 625MHZ core clock frequency */ 125 + }; 126 + 127 + struct sparx5 { 128 + struct platform_device *pdev; 129 + struct device *dev; 130 + u32 chip_id; 131 + enum spx5_target_chiptype target_ct; 132 + void __iomem *regs[NUM_TARGETS]; 133 + int port_count; 134 + struct mutex lock; /* MAC reg lock */ 135 + /* port structures are in net device */ 136 + struct sparx5_port *ports[SPX5_PORTS]; 137 + enum sparx5_core_clockfreq coreclock; 138 + /* Statistics */ 139 + u32 num_stats; 140 + u32 num_ethtool_stats; 141 + const char * const *stats_layout; 142 + u64 *stats; 143 + /* Workqueue for reading stats */ 144 + struct mutex queue_stats_lock; 145 + struct delayed_work stats_work; 146 + struct workqueue_struct *stats_queue; 147 + /* Notifiers */ 148 + struct notifier_block netdevice_nb; 149 + struct notifier_block switchdev_nb; 150 + struct notifier_block switchdev_blocking_nb; 151 + /* Switch state */ 152 + u8 base_mac[ETH_ALEN]; 153 + /* Associated bridge device (when bridged) */ 154 + struct net_device *hw_bridge_dev; 155 + /* Bridged interfaces */ 156 + DECLARE_BITMAP(bridge_mask, SPX5_PORTS); 157 + DECLARE_BITMAP(bridge_fwd_mask, SPX5_PORTS); 158 + DECLARE_BITMAP(bridge_lrn_mask, SPX5_PORTS); 159 + DECLARE_BITMAP(vlan_mask[VLAN_N_VID], SPX5_PORTS); 160 + /* SW MAC table */ 161 + struct list_head mact_entries; 162 + /* mac table list (mact_entries) mutex */ 163 + struct mutex mact_lock; 164 + struct delayed_work mact_work; 165 + struct workqueue_struct *mact_queue; 166 + /* Board specifics */ 167 + bool sd_sgpio_remapping; 168 + /* Register based inj/xtr */ 169 + int xtr_irq; 170 + }; 171 + 172 + /* sparx5_switchdev.c */ 173 + int sparx5_register_notifier_blocks(struct sparx5 *sparx5); 174 + void sparx5_unregister_notifier_blocks(struct sparx5 *sparx5); 175 + 176 + /* sparx5_packet.c */ 177 + irqreturn_t sparx5_xtr_handler(int irq, void *_priv); 178 + int sparx5_port_xmit_impl(struct sk_buff *skb, struct net_device *dev); 179 + int sparx5_manual_injection_mode(struct sparx5 *sparx5); 180 + void sparx5_port_inj_timer_setup(struct sparx5_port *port); 181 + 182 + /* sparx5_mactable.c */ 183 + void sparx5_mact_pull_work(struct work_struct *work); 184 + int sparx5_mact_learn(struct sparx5 *sparx5, int port, 185 + const unsigned char mac[ETH_ALEN], u16 vid); 186 + bool sparx5_mact_getnext(struct sparx5 *sparx5, 187 + unsigned char mac[ETH_ALEN], u16 *vid, u32 *pcfg2); 188 + int sparx5_mact_forget(struct sparx5 *sparx5, 189 + const unsigned char mac[ETH_ALEN], u16 vid); 190 + int sparx5_add_mact_entry(struct sparx5 *sparx5, 191 + struct sparx5_port *port, 192 + const unsigned char *addr, u16 vid); 193 + int sparx5_del_mact_entry(struct sparx5 *sparx5, 194 + const unsigned char *addr, 195 + u16 vid); 196 + int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr); 197 + int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr); 198 + void sparx5_set_ageing(struct sparx5 *sparx5, int msecs); 199 + void sparx5_mact_init(struct sparx5 *sparx5); 200 + 201 + /* sparx5_vlan.c */ 202 + void sparx5_pgid_update_mask(struct sparx5_port *port, int pgid, bool enable); 203 + void sparx5_update_fwd(struct sparx5 *sparx5); 204 + void sparx5_vlan_init(struct sparx5 *sparx5); 205 + void sparx5_vlan_port_setup(struct sparx5 *sparx5, int portno); 206 + int sparx5_vlan_vid_add(struct sparx5_port *port, u16 vid, bool pvid, 207 + bool untagged); 208 + int sparx5_vlan_vid_del(struct sparx5_port *port, u16 vid); 209 + void sparx5_vlan_port_apply(struct sparx5 *sparx5, struct sparx5_port *port); 210 + 211 + /* sparx5_calendar.c */ 212 + int sparx5_config_auto_calendar(struct sparx5 *sparx5); 213 + int sparx5_config_dsm_calendar(struct sparx5 *sparx5); 214 + 215 + /* sparx5_ethtool.c */ 216 + void sparx5_get_stats64(struct net_device *ndev, struct rtnl_link_stats64 *stats); 217 + int sparx_stats_init(struct sparx5 *sparx5); 218 + 219 + /* sparx5_netdev.c */ 220 + bool sparx5_netdevice_check(const struct net_device *dev); 221 + struct net_device *sparx5_create_netdev(struct sparx5 *sparx5, u32 portno); 222 + int sparx5_register_netdevs(struct sparx5 *sparx5); 223 + void sparx5_destroy_netdevs(struct sparx5 *sparx5); 224 + void sparx5_unregister_netdevs(struct sparx5 *sparx5); 225 + 226 + /* Clock period in picoseconds */ 227 + static inline u32 sparx5_clk_period(enum sparx5_core_clockfreq cclock) 228 + { 229 + switch (cclock) { 230 + case SPX5_CORE_CLOCK_250MHZ: 231 + return 4000; 232 + case SPX5_CORE_CLOCK_500MHZ: 233 + return 2000; 234 + case SPX5_CORE_CLOCK_625MHZ: 235 + default: 236 + return 1600; 237 + } 238 + } 239 + 240 + static inline bool sparx5_is_baser(phy_interface_t interface) 241 + { 242 + return interface == PHY_INTERFACE_MODE_5GBASER || 243 + interface == PHY_INTERFACE_MODE_10GBASER || 244 + interface == PHY_INTERFACE_MODE_25GBASER; 245 + } 246 + 247 + extern const struct phylink_mac_ops sparx5_phylink_mac_ops; 248 + extern const struct phylink_pcs_ops sparx5_phylink_pcs_ops; 249 + extern const struct ethtool_ops sparx5_ethtool_ops; 250 + 251 + /* Calculate raw offset */ 252 + static inline __pure int spx5_offset(int id, int tinst, int tcnt, 253 + int gbase, int ginst, 254 + int gcnt, int gwidth, 255 + int raddr, int rinst, 256 + int rcnt, int rwidth) 257 + { 258 + WARN_ON((tinst) >= tcnt); 259 + WARN_ON((ginst) >= gcnt); 260 + WARN_ON((rinst) >= rcnt); 261 + return gbase + ((ginst) * gwidth) + 262 + raddr + ((rinst) * rwidth); 263 + } 264 + 265 + /* Read, Write and modify registers content. 266 + * The register definition macros start at the id 267 + */ 268 + static inline void __iomem *spx5_addr(void __iomem *base[], 269 + int id, int tinst, int tcnt, 270 + int gbase, int ginst, 271 + int gcnt, int gwidth, 272 + int raddr, int rinst, 273 + int rcnt, int rwidth) 274 + { 275 + WARN_ON((tinst) >= tcnt); 276 + WARN_ON((ginst) >= gcnt); 277 + WARN_ON((rinst) >= rcnt); 278 + return base[id + (tinst)] + 279 + gbase + ((ginst) * gwidth) + 280 + raddr + ((rinst) * rwidth); 281 + } 282 + 283 + static inline void __iomem *spx5_inst_addr(void __iomem *base, 284 + int gbase, int ginst, 285 + int gcnt, int gwidth, 286 + int raddr, int rinst, 287 + int rcnt, int rwidth) 288 + { 289 + WARN_ON((ginst) >= gcnt); 290 + WARN_ON((rinst) >= rcnt); 291 + return base + 292 + gbase + ((ginst) * gwidth) + 293 + raddr + ((rinst) * rwidth); 294 + } 295 + 296 + static inline u32 spx5_rd(struct sparx5 *sparx5, int id, int tinst, int tcnt, 297 + int gbase, int ginst, int gcnt, int gwidth, 298 + int raddr, int rinst, int rcnt, int rwidth) 299 + { 300 + return readl(spx5_addr(sparx5->regs, id, tinst, tcnt, gbase, ginst, 301 + gcnt, gwidth, raddr, rinst, rcnt, rwidth)); 302 + } 303 + 304 + static inline u32 spx5_inst_rd(void __iomem *iomem, int id, int tinst, int tcnt, 305 + int gbase, int ginst, int gcnt, int gwidth, 306 + int raddr, int rinst, int rcnt, int rwidth) 307 + { 308 + return readl(spx5_inst_addr(iomem, gbase, ginst, 309 + gcnt, gwidth, raddr, rinst, rcnt, rwidth)); 310 + } 311 + 312 + static inline void spx5_wr(u32 val, struct sparx5 *sparx5, 313 + int id, int tinst, int tcnt, 314 + int gbase, int ginst, int gcnt, int gwidth, 315 + int raddr, int rinst, int rcnt, int rwidth) 316 + { 317 + writel(val, spx5_addr(sparx5->regs, id, tinst, tcnt, 318 + gbase, ginst, gcnt, gwidth, 319 + raddr, rinst, rcnt, rwidth)); 320 + } 321 + 322 + static inline void spx5_inst_wr(u32 val, void __iomem *iomem, 323 + int id, int tinst, int tcnt, 324 + int gbase, int ginst, int gcnt, int gwidth, 325 + int raddr, int rinst, int rcnt, int rwidth) 326 + { 327 + writel(val, spx5_inst_addr(iomem, 328 + gbase, ginst, gcnt, gwidth, 329 + raddr, rinst, rcnt, rwidth)); 330 + } 331 + 332 + static inline void spx5_rmw(u32 val, u32 mask, struct sparx5 *sparx5, 333 + int id, int tinst, int tcnt, 334 + int gbase, int ginst, int gcnt, int gwidth, 335 + int raddr, int rinst, int rcnt, int rwidth) 336 + { 337 + u32 nval; 338 + 339 + nval = readl(spx5_addr(sparx5->regs, id, tinst, tcnt, gbase, ginst, 340 + gcnt, gwidth, raddr, rinst, rcnt, rwidth)); 341 + nval = (nval & ~mask) | (val & mask); 342 + writel(nval, spx5_addr(sparx5->regs, id, tinst, tcnt, gbase, ginst, 343 + gcnt, gwidth, raddr, rinst, rcnt, rwidth)); 344 + } 345 + 346 + static inline void spx5_inst_rmw(u32 val, u32 mask, void __iomem *iomem, 347 + int id, int tinst, int tcnt, 348 + int gbase, int ginst, int gcnt, int gwidth, 349 + int raddr, int rinst, int rcnt, int rwidth) 350 + { 351 + u32 nval; 352 + 353 + nval = readl(spx5_inst_addr(iomem, gbase, ginst, gcnt, gwidth, raddr, 354 + rinst, rcnt, rwidth)); 355 + nval = (nval & ~mask) | (val & mask); 356 + writel(nval, spx5_inst_addr(iomem, gbase, ginst, gcnt, gwidth, raddr, 357 + rinst, rcnt, rwidth)); 358 + } 359 + 360 + static inline void __iomem *spx5_inst_get(struct sparx5 *sparx5, int id, int tinst) 361 + { 362 + return sparx5->regs[id + tinst]; 363 + } 364 + 365 + static inline void __iomem *spx5_reg_get(struct sparx5 *sparx5, 366 + int id, int tinst, int tcnt, 367 + int gbase, int ginst, int gcnt, int gwidth, 368 + int raddr, int rinst, int rcnt, int rwidth) 369 + { 370 + return spx5_addr(sparx5->regs, id, tinst, tcnt, 371 + gbase, ginst, gcnt, gwidth, 372 + raddr, rinst, rcnt, rwidth); 373 + } 374 + 375 + #endif /* __SPARX5_MAIN_H__ */
+4642
drivers/net/ethernet/microchip/sparx5/sparx5_main_regs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ 2 + * Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. 5 + */ 6 + 7 + /* This file is autogenerated by cml-utils 2021-05-06 13:06:37 +0200. 8 + * Commit ID: 9ae4ec441e25e4b9003f4e514df5cb12a36b84d3 9 + */ 10 + 11 + #ifndef _SPARX5_MAIN_REGS_H_ 12 + #define _SPARX5_MAIN_REGS_H_ 13 + 14 + #include <linux/bitfield.h> 15 + #include <linux/types.h> 16 + #include <linux/bug.h> 17 + 18 + enum sparx5_target { 19 + TARGET_ANA_AC = 1, 20 + TARGET_ANA_ACL = 2, 21 + TARGET_ANA_AC_POL = 4, 22 + TARGET_ANA_CL = 6, 23 + TARGET_ANA_L2 = 7, 24 + TARGET_ANA_L3 = 8, 25 + TARGET_ASM = 9, 26 + TARGET_CLKGEN = 11, 27 + TARGET_CPU = 12, 28 + TARGET_DEV10G = 17, 29 + TARGET_DEV25G = 29, 30 + TARGET_DEV2G5 = 37, 31 + TARGET_DEV5G = 102, 32 + TARGET_DSM = 115, 33 + TARGET_EACL = 116, 34 + TARGET_FDMA = 117, 35 + TARGET_GCB = 118, 36 + TARGET_HSCH = 119, 37 + TARGET_LRN = 122, 38 + TARGET_PCEP = 129, 39 + TARGET_PCS10G_BR = 132, 40 + TARGET_PCS25G_BR = 144, 41 + TARGET_PCS5G_BR = 160, 42 + TARGET_PORT_CONF = 173, 43 + TARGET_QFWD = 175, 44 + TARGET_QRES = 176, 45 + TARGET_QS = 177, 46 + TARGET_QSYS = 178, 47 + TARGET_REW = 179, 48 + TARGET_VCAP_SUPER = 326, 49 + TARGET_VOP = 327, 50 + TARGET_XQS = 331, 51 + NUM_TARGETS = 332 52 + }; 53 + 54 + #define __REG(...) __VA_ARGS__ 55 + 56 + /* ANA_AC:RAM_CTRL:RAM_INIT */ 57 + #define ANA_AC_RAM_INIT __REG(TARGET_ANA_AC, 0, 1, 839108, 0, 1, 4, 0, 0, 1, 4) 58 + 59 + #define ANA_AC_RAM_INIT_RAM_INIT BIT(1) 60 + #define ANA_AC_RAM_INIT_RAM_INIT_SET(x)\ 61 + FIELD_PREP(ANA_AC_RAM_INIT_RAM_INIT, x) 62 + #define ANA_AC_RAM_INIT_RAM_INIT_GET(x)\ 63 + FIELD_GET(ANA_AC_RAM_INIT_RAM_INIT, x) 64 + 65 + #define ANA_AC_RAM_INIT_RAM_CFG_HOOK BIT(0) 66 + #define ANA_AC_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 67 + FIELD_PREP(ANA_AC_RAM_INIT_RAM_CFG_HOOK, x) 68 + #define ANA_AC_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 69 + FIELD_GET(ANA_AC_RAM_INIT_RAM_CFG_HOOK, x) 70 + 71 + /* ANA_AC:PS_COMMON:OWN_UPSID */ 72 + #define ANA_AC_OWN_UPSID(r) __REG(TARGET_ANA_AC, 0, 1, 894472, 0, 1, 352, 52, r, 3, 4) 73 + 74 + #define ANA_AC_OWN_UPSID_OWN_UPSID GENMASK(4, 0) 75 + #define ANA_AC_OWN_UPSID_OWN_UPSID_SET(x)\ 76 + FIELD_PREP(ANA_AC_OWN_UPSID_OWN_UPSID, x) 77 + #define ANA_AC_OWN_UPSID_OWN_UPSID_GET(x)\ 78 + FIELD_GET(ANA_AC_OWN_UPSID_OWN_UPSID, x) 79 + 80 + /* ANA_AC:SRC:SRC_CFG */ 81 + #define ANA_AC_SRC_CFG(g) __REG(TARGET_ANA_AC, 0, 1, 849920, g, 102, 16, 0, 0, 1, 4) 82 + 83 + /* ANA_AC:SRC:SRC_CFG1 */ 84 + #define ANA_AC_SRC_CFG1(g) __REG(TARGET_ANA_AC, 0, 1, 849920, g, 102, 16, 4, 0, 1, 4) 85 + 86 + /* ANA_AC:SRC:SRC_CFG2 */ 87 + #define ANA_AC_SRC_CFG2(g) __REG(TARGET_ANA_AC, 0, 1, 849920, g, 102, 16, 8, 0, 1, 4) 88 + 89 + #define ANA_AC_SRC_CFG2_PORT_MASK2 BIT(0) 90 + #define ANA_AC_SRC_CFG2_PORT_MASK2_SET(x)\ 91 + FIELD_PREP(ANA_AC_SRC_CFG2_PORT_MASK2, x) 92 + #define ANA_AC_SRC_CFG2_PORT_MASK2_GET(x)\ 93 + FIELD_GET(ANA_AC_SRC_CFG2_PORT_MASK2, x) 94 + 95 + /* ANA_AC:PGID:PGID_CFG */ 96 + #define ANA_AC_PGID_CFG(g) __REG(TARGET_ANA_AC, 0, 1, 786432, g, 3290, 16, 0, 0, 1, 4) 97 + 98 + /* ANA_AC:PGID:PGID_CFG1 */ 99 + #define ANA_AC_PGID_CFG1(g) __REG(TARGET_ANA_AC, 0, 1, 786432, g, 3290, 16, 4, 0, 1, 4) 100 + 101 + /* ANA_AC:PGID:PGID_CFG2 */ 102 + #define ANA_AC_PGID_CFG2(g) __REG(TARGET_ANA_AC, 0, 1, 786432, g, 3290, 16, 8, 0, 1, 4) 103 + 104 + #define ANA_AC_PGID_CFG2_PORT_MASK2 BIT(0) 105 + #define ANA_AC_PGID_CFG2_PORT_MASK2_SET(x)\ 106 + FIELD_PREP(ANA_AC_PGID_CFG2_PORT_MASK2, x) 107 + #define ANA_AC_PGID_CFG2_PORT_MASK2_GET(x)\ 108 + FIELD_GET(ANA_AC_PGID_CFG2_PORT_MASK2, x) 109 + 110 + /* ANA_AC:PGID:PGID_MISC_CFG */ 111 + #define ANA_AC_PGID_MISC_CFG(g) __REG(TARGET_ANA_AC, 0, 1, 786432, g, 3290, 16, 12, 0, 1, 4) 112 + 113 + #define ANA_AC_PGID_MISC_CFG_PGID_CPU_QU GENMASK(6, 4) 114 + #define ANA_AC_PGID_MISC_CFG_PGID_CPU_QU_SET(x)\ 115 + FIELD_PREP(ANA_AC_PGID_MISC_CFG_PGID_CPU_QU, x) 116 + #define ANA_AC_PGID_MISC_CFG_PGID_CPU_QU_GET(x)\ 117 + FIELD_GET(ANA_AC_PGID_MISC_CFG_PGID_CPU_QU, x) 118 + 119 + #define ANA_AC_PGID_MISC_CFG_STACK_TYPE_ENA BIT(1) 120 + #define ANA_AC_PGID_MISC_CFG_STACK_TYPE_ENA_SET(x)\ 121 + FIELD_PREP(ANA_AC_PGID_MISC_CFG_STACK_TYPE_ENA, x) 122 + #define ANA_AC_PGID_MISC_CFG_STACK_TYPE_ENA_GET(x)\ 123 + FIELD_GET(ANA_AC_PGID_MISC_CFG_STACK_TYPE_ENA, x) 124 + 125 + #define ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA BIT(0) 126 + #define ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA_SET(x)\ 127 + FIELD_PREP(ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA, x) 128 + #define ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA_GET(x)\ 129 + FIELD_GET(ANA_AC_PGID_MISC_CFG_PGID_CPU_COPY_ENA, x) 130 + 131 + /* ANA_AC:STAT_GLOBAL_CFG_PORT:STAT_GLOBAL_EVENT_MASK */ 132 + #define ANA_AC_PORT_SGE_CFG(r) __REG(TARGET_ANA_AC, 0, 1, 851552, 0, 1, 20, 0, r, 4, 4) 133 + 134 + #define ANA_AC_PORT_SGE_CFG_MASK GENMASK(15, 0) 135 + #define ANA_AC_PORT_SGE_CFG_MASK_SET(x)\ 136 + FIELD_PREP(ANA_AC_PORT_SGE_CFG_MASK, x) 137 + #define ANA_AC_PORT_SGE_CFG_MASK_GET(x)\ 138 + FIELD_GET(ANA_AC_PORT_SGE_CFG_MASK, x) 139 + 140 + /* ANA_AC:STAT_GLOBAL_CFG_PORT:STAT_RESET */ 141 + #define ANA_AC_STAT_RESET __REG(TARGET_ANA_AC, 0, 1, 851552, 0, 1, 20, 16, 0, 1, 4) 142 + 143 + #define ANA_AC_STAT_RESET_RESET BIT(0) 144 + #define ANA_AC_STAT_RESET_RESET_SET(x)\ 145 + FIELD_PREP(ANA_AC_STAT_RESET_RESET, x) 146 + #define ANA_AC_STAT_RESET_RESET_GET(x)\ 147 + FIELD_GET(ANA_AC_STAT_RESET_RESET, x) 148 + 149 + /* ANA_AC:STAT_CNT_CFG_PORT:STAT_CFG */ 150 + #define ANA_AC_PORT_STAT_CFG(g, r) __REG(TARGET_ANA_AC, 0, 1, 843776, g, 70, 64, 4, r, 4, 4) 151 + 152 + #define ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK GENMASK(11, 4) 153 + #define ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK_SET(x)\ 154 + FIELD_PREP(ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK, x) 155 + #define ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK_GET(x)\ 156 + FIELD_GET(ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK, x) 157 + 158 + #define ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE GENMASK(3, 1) 159 + #define ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE_SET(x)\ 160 + FIELD_PREP(ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE, x) 161 + #define ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE_GET(x)\ 162 + FIELD_GET(ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE, x) 163 + 164 + #define ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE BIT(0) 165 + #define ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE_SET(x)\ 166 + FIELD_PREP(ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE, x) 167 + #define ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE_GET(x)\ 168 + FIELD_GET(ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE, x) 169 + 170 + /* ANA_AC:STAT_CNT_CFG_PORT:STAT_LSB_CNT */ 171 + #define ANA_AC_PORT_STAT_LSB_CNT(g, r) __REG(TARGET_ANA_AC, 0, 1, 843776, g, 70, 64, 20, r, 4, 4) 172 + 173 + /* ANA_ACL:COMMON:OWN_UPSID */ 174 + #define ANA_ACL_OWN_UPSID(r) __REG(TARGET_ANA_ACL, 0, 1, 32768, 0, 1, 592, 580, r, 3, 4) 175 + 176 + #define ANA_ACL_OWN_UPSID_OWN_UPSID GENMASK(4, 0) 177 + #define ANA_ACL_OWN_UPSID_OWN_UPSID_SET(x)\ 178 + FIELD_PREP(ANA_ACL_OWN_UPSID_OWN_UPSID, x) 179 + #define ANA_ACL_OWN_UPSID_OWN_UPSID_GET(x)\ 180 + FIELD_GET(ANA_ACL_OWN_UPSID_OWN_UPSID, x) 181 + 182 + /* ANA_AC_POL:POL_ALL_CFG:POL_UPD_INT_CFG */ 183 + #define ANA_AC_POL_POL_UPD_INT_CFG __REG(TARGET_ANA_AC_POL, 0, 1, 75968, 0, 1, 1160, 1148, 0, 1, 4) 184 + 185 + #define ANA_AC_POL_POL_UPD_INT_CFG_POL_UPD_INT GENMASK(9, 0) 186 + #define ANA_AC_POL_POL_UPD_INT_CFG_POL_UPD_INT_SET(x)\ 187 + FIELD_PREP(ANA_AC_POL_POL_UPD_INT_CFG_POL_UPD_INT, x) 188 + #define ANA_AC_POL_POL_UPD_INT_CFG_POL_UPD_INT_GET(x)\ 189 + FIELD_GET(ANA_AC_POL_POL_UPD_INT_CFG_POL_UPD_INT, x) 190 + 191 + /* ANA_AC_POL:COMMON_BDLB:DLB_CTRL */ 192 + #define ANA_AC_POL_BDLB_DLB_CTRL __REG(TARGET_ANA_AC_POL, 0, 1, 79048, 0, 1, 8, 0, 0, 1, 4) 193 + 194 + #define ANA_AC_POL_BDLB_DLB_CTRL_CLK_PERIOD_01NS GENMASK(26, 19) 195 + #define ANA_AC_POL_BDLB_DLB_CTRL_CLK_PERIOD_01NS_SET(x)\ 196 + FIELD_PREP(ANA_AC_POL_BDLB_DLB_CTRL_CLK_PERIOD_01NS, x) 197 + #define ANA_AC_POL_BDLB_DLB_CTRL_CLK_PERIOD_01NS_GET(x)\ 198 + FIELD_GET(ANA_AC_POL_BDLB_DLB_CTRL_CLK_PERIOD_01NS, x) 199 + 200 + #define ANA_AC_POL_BDLB_DLB_CTRL_BASE_TICK_CNT GENMASK(18, 4) 201 + #define ANA_AC_POL_BDLB_DLB_CTRL_BASE_TICK_CNT_SET(x)\ 202 + FIELD_PREP(ANA_AC_POL_BDLB_DLB_CTRL_BASE_TICK_CNT, x) 203 + #define ANA_AC_POL_BDLB_DLB_CTRL_BASE_TICK_CNT_GET(x)\ 204 + FIELD_GET(ANA_AC_POL_BDLB_DLB_CTRL_BASE_TICK_CNT, x) 205 + 206 + #define ANA_AC_POL_BDLB_DLB_CTRL_LEAK_ENA BIT(1) 207 + #define ANA_AC_POL_BDLB_DLB_CTRL_LEAK_ENA_SET(x)\ 208 + FIELD_PREP(ANA_AC_POL_BDLB_DLB_CTRL_LEAK_ENA, x) 209 + #define ANA_AC_POL_BDLB_DLB_CTRL_LEAK_ENA_GET(x)\ 210 + FIELD_GET(ANA_AC_POL_BDLB_DLB_CTRL_LEAK_ENA, x) 211 + 212 + #define ANA_AC_POL_BDLB_DLB_CTRL_DLB_ADD_ENA BIT(0) 213 + #define ANA_AC_POL_BDLB_DLB_CTRL_DLB_ADD_ENA_SET(x)\ 214 + FIELD_PREP(ANA_AC_POL_BDLB_DLB_CTRL_DLB_ADD_ENA, x) 215 + #define ANA_AC_POL_BDLB_DLB_CTRL_DLB_ADD_ENA_GET(x)\ 216 + FIELD_GET(ANA_AC_POL_BDLB_DLB_CTRL_DLB_ADD_ENA, x) 217 + 218 + /* ANA_AC_POL:COMMON_BUM_SLB:DLB_CTRL */ 219 + #define ANA_AC_POL_SLB_DLB_CTRL __REG(TARGET_ANA_AC_POL, 0, 1, 79056, 0, 1, 20, 0, 0, 1, 4) 220 + 221 + #define ANA_AC_POL_SLB_DLB_CTRL_CLK_PERIOD_01NS GENMASK(26, 19) 222 + #define ANA_AC_POL_SLB_DLB_CTRL_CLK_PERIOD_01NS_SET(x)\ 223 + FIELD_PREP(ANA_AC_POL_SLB_DLB_CTRL_CLK_PERIOD_01NS, x) 224 + #define ANA_AC_POL_SLB_DLB_CTRL_CLK_PERIOD_01NS_GET(x)\ 225 + FIELD_GET(ANA_AC_POL_SLB_DLB_CTRL_CLK_PERIOD_01NS, x) 226 + 227 + #define ANA_AC_POL_SLB_DLB_CTRL_BASE_TICK_CNT GENMASK(18, 4) 228 + #define ANA_AC_POL_SLB_DLB_CTRL_BASE_TICK_CNT_SET(x)\ 229 + FIELD_PREP(ANA_AC_POL_SLB_DLB_CTRL_BASE_TICK_CNT, x) 230 + #define ANA_AC_POL_SLB_DLB_CTRL_BASE_TICK_CNT_GET(x)\ 231 + FIELD_GET(ANA_AC_POL_SLB_DLB_CTRL_BASE_TICK_CNT, x) 232 + 233 + #define ANA_AC_POL_SLB_DLB_CTRL_LEAK_ENA BIT(1) 234 + #define ANA_AC_POL_SLB_DLB_CTRL_LEAK_ENA_SET(x)\ 235 + FIELD_PREP(ANA_AC_POL_SLB_DLB_CTRL_LEAK_ENA, x) 236 + #define ANA_AC_POL_SLB_DLB_CTRL_LEAK_ENA_GET(x)\ 237 + FIELD_GET(ANA_AC_POL_SLB_DLB_CTRL_LEAK_ENA, x) 238 + 239 + #define ANA_AC_POL_SLB_DLB_CTRL_DLB_ADD_ENA BIT(0) 240 + #define ANA_AC_POL_SLB_DLB_CTRL_DLB_ADD_ENA_SET(x)\ 241 + FIELD_PREP(ANA_AC_POL_SLB_DLB_CTRL_DLB_ADD_ENA, x) 242 + #define ANA_AC_POL_SLB_DLB_CTRL_DLB_ADD_ENA_GET(x)\ 243 + FIELD_GET(ANA_AC_POL_SLB_DLB_CTRL_DLB_ADD_ENA, x) 244 + 245 + /* ANA_CL:PORT:FILTER_CTRL */ 246 + #define ANA_CL_FILTER_CTRL(g) __REG(TARGET_ANA_CL, 0, 1, 131072, g, 70, 512, 4, 0, 1, 4) 247 + 248 + #define ANA_CL_FILTER_CTRL_FILTER_SMAC_MC_DIS BIT(2) 249 + #define ANA_CL_FILTER_CTRL_FILTER_SMAC_MC_DIS_SET(x)\ 250 + FIELD_PREP(ANA_CL_FILTER_CTRL_FILTER_SMAC_MC_DIS, x) 251 + #define ANA_CL_FILTER_CTRL_FILTER_SMAC_MC_DIS_GET(x)\ 252 + FIELD_GET(ANA_CL_FILTER_CTRL_FILTER_SMAC_MC_DIS, x) 253 + 254 + #define ANA_CL_FILTER_CTRL_FILTER_NULL_MAC_DIS BIT(1) 255 + #define ANA_CL_FILTER_CTRL_FILTER_NULL_MAC_DIS_SET(x)\ 256 + FIELD_PREP(ANA_CL_FILTER_CTRL_FILTER_NULL_MAC_DIS, x) 257 + #define ANA_CL_FILTER_CTRL_FILTER_NULL_MAC_DIS_GET(x)\ 258 + FIELD_GET(ANA_CL_FILTER_CTRL_FILTER_NULL_MAC_DIS, x) 259 + 260 + #define ANA_CL_FILTER_CTRL_FORCE_FCS_UPDATE_ENA BIT(0) 261 + #define ANA_CL_FILTER_CTRL_FORCE_FCS_UPDATE_ENA_SET(x)\ 262 + FIELD_PREP(ANA_CL_FILTER_CTRL_FORCE_FCS_UPDATE_ENA, x) 263 + #define ANA_CL_FILTER_CTRL_FORCE_FCS_UPDATE_ENA_GET(x)\ 264 + FIELD_GET(ANA_CL_FILTER_CTRL_FORCE_FCS_UPDATE_ENA, x) 265 + 266 + /* ANA_CL:PORT:VLAN_FILTER_CTRL */ 267 + #define ANA_CL_VLAN_FILTER_CTRL(g, r) __REG(TARGET_ANA_CL, 0, 1, 131072, g, 70, 512, 8, r, 3, 4) 268 + 269 + #define ANA_CL_VLAN_FILTER_CTRL_TAG_REQUIRED_ENA BIT(10) 270 + #define ANA_CL_VLAN_FILTER_CTRL_TAG_REQUIRED_ENA_SET(x)\ 271 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_TAG_REQUIRED_ENA, x) 272 + #define ANA_CL_VLAN_FILTER_CTRL_TAG_REQUIRED_ENA_GET(x)\ 273 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_TAG_REQUIRED_ENA, x) 274 + 275 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CTAG_DIS BIT(9) 276 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CTAG_DIS_SET(x)\ 277 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_PRIO_CTAG_DIS, x) 278 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CTAG_DIS_GET(x)\ 279 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_PRIO_CTAG_DIS, x) 280 + 281 + #define ANA_CL_VLAN_FILTER_CTRL_CTAG_DIS BIT(8) 282 + #define ANA_CL_VLAN_FILTER_CTRL_CTAG_DIS_SET(x)\ 283 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_CTAG_DIS, x) 284 + #define ANA_CL_VLAN_FILTER_CTRL_CTAG_DIS_GET(x)\ 285 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_CTAG_DIS, x) 286 + 287 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_STAG_DIS BIT(7) 288 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_STAG_DIS_SET(x)\ 289 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_PRIO_STAG_DIS, x) 290 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_STAG_DIS_GET(x)\ 291 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_PRIO_STAG_DIS, x) 292 + 293 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST1_STAG_DIS BIT(6) 294 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST1_STAG_DIS_SET(x)\ 295 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST1_STAG_DIS, x) 296 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST1_STAG_DIS_GET(x)\ 297 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST1_STAG_DIS, x) 298 + 299 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST2_STAG_DIS BIT(5) 300 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST2_STAG_DIS_SET(x)\ 301 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST2_STAG_DIS, x) 302 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST2_STAG_DIS_GET(x)\ 303 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST2_STAG_DIS, x) 304 + 305 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST3_STAG_DIS BIT(4) 306 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST3_STAG_DIS_SET(x)\ 307 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST3_STAG_DIS, x) 308 + #define ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST3_STAG_DIS_GET(x)\ 309 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_PRIO_CUST3_STAG_DIS, x) 310 + 311 + #define ANA_CL_VLAN_FILTER_CTRL_STAG_DIS BIT(3) 312 + #define ANA_CL_VLAN_FILTER_CTRL_STAG_DIS_SET(x)\ 313 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_STAG_DIS, x) 314 + #define ANA_CL_VLAN_FILTER_CTRL_STAG_DIS_GET(x)\ 315 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_STAG_DIS, x) 316 + 317 + #define ANA_CL_VLAN_FILTER_CTRL_CUST1_STAG_DIS BIT(2) 318 + #define ANA_CL_VLAN_FILTER_CTRL_CUST1_STAG_DIS_SET(x)\ 319 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_CUST1_STAG_DIS, x) 320 + #define ANA_CL_VLAN_FILTER_CTRL_CUST1_STAG_DIS_GET(x)\ 321 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_CUST1_STAG_DIS, x) 322 + 323 + #define ANA_CL_VLAN_FILTER_CTRL_CUST2_STAG_DIS BIT(1) 324 + #define ANA_CL_VLAN_FILTER_CTRL_CUST2_STAG_DIS_SET(x)\ 325 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_CUST2_STAG_DIS, x) 326 + #define ANA_CL_VLAN_FILTER_CTRL_CUST2_STAG_DIS_GET(x)\ 327 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_CUST2_STAG_DIS, x) 328 + 329 + #define ANA_CL_VLAN_FILTER_CTRL_CUST3_STAG_DIS BIT(0) 330 + #define ANA_CL_VLAN_FILTER_CTRL_CUST3_STAG_DIS_SET(x)\ 331 + FIELD_PREP(ANA_CL_VLAN_FILTER_CTRL_CUST3_STAG_DIS, x) 332 + #define ANA_CL_VLAN_FILTER_CTRL_CUST3_STAG_DIS_GET(x)\ 333 + FIELD_GET(ANA_CL_VLAN_FILTER_CTRL_CUST3_STAG_DIS, x) 334 + 335 + /* ANA_CL:PORT:ETAG_FILTER_CTRL */ 336 + #define ANA_CL_ETAG_FILTER_CTRL(g) __REG(TARGET_ANA_CL, 0, 1, 131072, g, 70, 512, 20, 0, 1, 4) 337 + 338 + #define ANA_CL_ETAG_FILTER_CTRL_ETAG_REQUIRED_ENA BIT(1) 339 + #define ANA_CL_ETAG_FILTER_CTRL_ETAG_REQUIRED_ENA_SET(x)\ 340 + FIELD_PREP(ANA_CL_ETAG_FILTER_CTRL_ETAG_REQUIRED_ENA, x) 341 + #define ANA_CL_ETAG_FILTER_CTRL_ETAG_REQUIRED_ENA_GET(x)\ 342 + FIELD_GET(ANA_CL_ETAG_FILTER_CTRL_ETAG_REQUIRED_ENA, x) 343 + 344 + #define ANA_CL_ETAG_FILTER_CTRL_ETAG_DIS BIT(0) 345 + #define ANA_CL_ETAG_FILTER_CTRL_ETAG_DIS_SET(x)\ 346 + FIELD_PREP(ANA_CL_ETAG_FILTER_CTRL_ETAG_DIS, x) 347 + #define ANA_CL_ETAG_FILTER_CTRL_ETAG_DIS_GET(x)\ 348 + FIELD_GET(ANA_CL_ETAG_FILTER_CTRL_ETAG_DIS, x) 349 + 350 + /* ANA_CL:PORT:VLAN_CTRL */ 351 + #define ANA_CL_VLAN_CTRL(g) __REG(TARGET_ANA_CL, 0, 1, 131072, g, 70, 512, 32, 0, 1, 4) 352 + 353 + #define ANA_CL_VLAN_CTRL_PORT_VOE_TPID_AWARE_DIS GENMASK(30, 26) 354 + #define ANA_CL_VLAN_CTRL_PORT_VOE_TPID_AWARE_DIS_SET(x)\ 355 + FIELD_PREP(ANA_CL_VLAN_CTRL_PORT_VOE_TPID_AWARE_DIS, x) 356 + #define ANA_CL_VLAN_CTRL_PORT_VOE_TPID_AWARE_DIS_GET(x)\ 357 + FIELD_GET(ANA_CL_VLAN_CTRL_PORT_VOE_TPID_AWARE_DIS, x) 358 + 359 + #define ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_PCP GENMASK(25, 23) 360 + #define ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_PCP_SET(x)\ 361 + FIELD_PREP(ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_PCP, x) 362 + #define ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_PCP_GET(x)\ 363 + FIELD_GET(ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_PCP, x) 364 + 365 + #define ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_DEI BIT(22) 366 + #define ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_DEI_SET(x)\ 367 + FIELD_PREP(ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_DEI, x) 368 + #define ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_DEI_GET(x)\ 369 + FIELD_GET(ANA_CL_VLAN_CTRL_PORT_VOE_DEFAULT_DEI, x) 370 + 371 + #define ANA_CL_VLAN_CTRL_VLAN_PCP_DEI_TRANS_ENA BIT(21) 372 + #define ANA_CL_VLAN_CTRL_VLAN_PCP_DEI_TRANS_ENA_SET(x)\ 373 + FIELD_PREP(ANA_CL_VLAN_CTRL_VLAN_PCP_DEI_TRANS_ENA, x) 374 + #define ANA_CL_VLAN_CTRL_VLAN_PCP_DEI_TRANS_ENA_GET(x)\ 375 + FIELD_GET(ANA_CL_VLAN_CTRL_VLAN_PCP_DEI_TRANS_ENA, x) 376 + 377 + #define ANA_CL_VLAN_CTRL_VLAN_TAG_SEL BIT(20) 378 + #define ANA_CL_VLAN_CTRL_VLAN_TAG_SEL_SET(x)\ 379 + FIELD_PREP(ANA_CL_VLAN_CTRL_VLAN_TAG_SEL, x) 380 + #define ANA_CL_VLAN_CTRL_VLAN_TAG_SEL_GET(x)\ 381 + FIELD_GET(ANA_CL_VLAN_CTRL_VLAN_TAG_SEL, x) 382 + 383 + #define ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA BIT(19) 384 + #define ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA_SET(x)\ 385 + FIELD_PREP(ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA, x) 386 + #define ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA_GET(x)\ 387 + FIELD_GET(ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA, x) 388 + 389 + #define ANA_CL_VLAN_CTRL_VLAN_POP_CNT GENMASK(18, 17) 390 + #define ANA_CL_VLAN_CTRL_VLAN_POP_CNT_SET(x)\ 391 + FIELD_PREP(ANA_CL_VLAN_CTRL_VLAN_POP_CNT, x) 392 + #define ANA_CL_VLAN_CTRL_VLAN_POP_CNT_GET(x)\ 393 + FIELD_GET(ANA_CL_VLAN_CTRL_VLAN_POP_CNT, x) 394 + 395 + #define ANA_CL_VLAN_CTRL_PORT_TAG_TYPE BIT(16) 396 + #define ANA_CL_VLAN_CTRL_PORT_TAG_TYPE_SET(x)\ 397 + FIELD_PREP(ANA_CL_VLAN_CTRL_PORT_TAG_TYPE, x) 398 + #define ANA_CL_VLAN_CTRL_PORT_TAG_TYPE_GET(x)\ 399 + FIELD_GET(ANA_CL_VLAN_CTRL_PORT_TAG_TYPE, x) 400 + 401 + #define ANA_CL_VLAN_CTRL_PORT_PCP GENMASK(15, 13) 402 + #define ANA_CL_VLAN_CTRL_PORT_PCP_SET(x)\ 403 + FIELD_PREP(ANA_CL_VLAN_CTRL_PORT_PCP, x) 404 + #define ANA_CL_VLAN_CTRL_PORT_PCP_GET(x)\ 405 + FIELD_GET(ANA_CL_VLAN_CTRL_PORT_PCP, x) 406 + 407 + #define ANA_CL_VLAN_CTRL_PORT_DEI BIT(12) 408 + #define ANA_CL_VLAN_CTRL_PORT_DEI_SET(x)\ 409 + FIELD_PREP(ANA_CL_VLAN_CTRL_PORT_DEI, x) 410 + #define ANA_CL_VLAN_CTRL_PORT_DEI_GET(x)\ 411 + FIELD_GET(ANA_CL_VLAN_CTRL_PORT_DEI, x) 412 + 413 + #define ANA_CL_VLAN_CTRL_PORT_VID GENMASK(11, 0) 414 + #define ANA_CL_VLAN_CTRL_PORT_VID_SET(x)\ 415 + FIELD_PREP(ANA_CL_VLAN_CTRL_PORT_VID, x) 416 + #define ANA_CL_VLAN_CTRL_PORT_VID_GET(x)\ 417 + FIELD_GET(ANA_CL_VLAN_CTRL_PORT_VID, x) 418 + 419 + /* ANA_CL:PORT:VLAN_CTRL_2 */ 420 + #define ANA_CL_VLAN_CTRL_2(g) __REG(TARGET_ANA_CL, 0, 1, 131072, g, 70, 512, 36, 0, 1, 4) 421 + 422 + #define ANA_CL_VLAN_CTRL_2_VLAN_PUSH_CNT GENMASK(1, 0) 423 + #define ANA_CL_VLAN_CTRL_2_VLAN_PUSH_CNT_SET(x)\ 424 + FIELD_PREP(ANA_CL_VLAN_CTRL_2_VLAN_PUSH_CNT, x) 425 + #define ANA_CL_VLAN_CTRL_2_VLAN_PUSH_CNT_GET(x)\ 426 + FIELD_GET(ANA_CL_VLAN_CTRL_2_VLAN_PUSH_CNT, x) 427 + 428 + /* ANA_CL:PORT:CAPTURE_BPDU_CFG */ 429 + #define ANA_CL_CAPTURE_BPDU_CFG(g) __REG(TARGET_ANA_CL, 0, 1, 131072, g, 70, 512, 196, 0, 1, 4) 430 + 431 + /* ANA_CL:COMMON:OWN_UPSID */ 432 + #define ANA_CL_OWN_UPSID(r) __REG(TARGET_ANA_CL, 0, 1, 166912, 0, 1, 756, 0, r, 3, 4) 433 + 434 + #define ANA_CL_OWN_UPSID_OWN_UPSID GENMASK(4, 0) 435 + #define ANA_CL_OWN_UPSID_OWN_UPSID_SET(x)\ 436 + FIELD_PREP(ANA_CL_OWN_UPSID_OWN_UPSID, x) 437 + #define ANA_CL_OWN_UPSID_OWN_UPSID_GET(x)\ 438 + FIELD_GET(ANA_CL_OWN_UPSID_OWN_UPSID, x) 439 + 440 + /* ANA_L2:COMMON:AUTO_LRN_CFG */ 441 + #define ANA_L2_AUTO_LRN_CFG __REG(TARGET_ANA_L2, 0, 1, 566024, 0, 1, 700, 24, 0, 1, 4) 442 + 443 + /* ANA_L2:COMMON:AUTO_LRN_CFG1 */ 444 + #define ANA_L2_AUTO_LRN_CFG1 __REG(TARGET_ANA_L2, 0, 1, 566024, 0, 1, 700, 28, 0, 1, 4) 445 + 446 + /* ANA_L2:COMMON:AUTO_LRN_CFG2 */ 447 + #define ANA_L2_AUTO_LRN_CFG2 __REG(TARGET_ANA_L2, 0, 1, 566024, 0, 1, 700, 32, 0, 1, 4) 448 + 449 + #define ANA_L2_AUTO_LRN_CFG2_AUTO_LRN_ENA2 BIT(0) 450 + #define ANA_L2_AUTO_LRN_CFG2_AUTO_LRN_ENA2_SET(x)\ 451 + FIELD_PREP(ANA_L2_AUTO_LRN_CFG2_AUTO_LRN_ENA2, x) 452 + #define ANA_L2_AUTO_LRN_CFG2_AUTO_LRN_ENA2_GET(x)\ 453 + FIELD_GET(ANA_L2_AUTO_LRN_CFG2_AUTO_LRN_ENA2, x) 454 + 455 + /* ANA_L2:COMMON:OWN_UPSID */ 456 + #define ANA_L2_OWN_UPSID(r) __REG(TARGET_ANA_L2, 0, 1, 566024, 0, 1, 700, 672, r, 3, 4) 457 + 458 + #define ANA_L2_OWN_UPSID_OWN_UPSID GENMASK(4, 0) 459 + #define ANA_L2_OWN_UPSID_OWN_UPSID_SET(x)\ 460 + FIELD_PREP(ANA_L2_OWN_UPSID_OWN_UPSID, x) 461 + #define ANA_L2_OWN_UPSID_OWN_UPSID_GET(x)\ 462 + FIELD_GET(ANA_L2_OWN_UPSID_OWN_UPSID, x) 463 + 464 + /* ANA_L3:COMMON:VLAN_CTRL */ 465 + #define ANA_L3_VLAN_CTRL __REG(TARGET_ANA_L3, 0, 1, 493632, 0, 1, 184, 4, 0, 1, 4) 466 + 467 + #define ANA_L3_VLAN_CTRL_VLAN_ENA BIT(0) 468 + #define ANA_L3_VLAN_CTRL_VLAN_ENA_SET(x)\ 469 + FIELD_PREP(ANA_L3_VLAN_CTRL_VLAN_ENA, x) 470 + #define ANA_L3_VLAN_CTRL_VLAN_ENA_GET(x)\ 471 + FIELD_GET(ANA_L3_VLAN_CTRL_VLAN_ENA, x) 472 + 473 + /* ANA_L3:VLAN:VLAN_CFG */ 474 + #define ANA_L3_VLAN_CFG(g) __REG(TARGET_ANA_L3, 0, 1, 0, g, 5120, 64, 8, 0, 1, 4) 475 + 476 + #define ANA_L3_VLAN_CFG_VLAN_MSTP_PTR GENMASK(30, 24) 477 + #define ANA_L3_VLAN_CFG_VLAN_MSTP_PTR_SET(x)\ 478 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_MSTP_PTR, x) 479 + #define ANA_L3_VLAN_CFG_VLAN_MSTP_PTR_GET(x)\ 480 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_MSTP_PTR, x) 481 + 482 + #define ANA_L3_VLAN_CFG_VLAN_FID GENMASK(20, 8) 483 + #define ANA_L3_VLAN_CFG_VLAN_FID_SET(x)\ 484 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_FID, x) 485 + #define ANA_L3_VLAN_CFG_VLAN_FID_GET(x)\ 486 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_FID, x) 487 + 488 + #define ANA_L3_VLAN_CFG_VLAN_IGR_FILTER_ENA BIT(6) 489 + #define ANA_L3_VLAN_CFG_VLAN_IGR_FILTER_ENA_SET(x)\ 490 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_IGR_FILTER_ENA, x) 491 + #define ANA_L3_VLAN_CFG_VLAN_IGR_FILTER_ENA_GET(x)\ 492 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_IGR_FILTER_ENA, x) 493 + 494 + #define ANA_L3_VLAN_CFG_VLAN_SEC_FWD_ENA BIT(5) 495 + #define ANA_L3_VLAN_CFG_VLAN_SEC_FWD_ENA_SET(x)\ 496 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_SEC_FWD_ENA, x) 497 + #define ANA_L3_VLAN_CFG_VLAN_SEC_FWD_ENA_GET(x)\ 498 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_SEC_FWD_ENA, x) 499 + 500 + #define ANA_L3_VLAN_CFG_VLAN_FLOOD_DIS BIT(4) 501 + #define ANA_L3_VLAN_CFG_VLAN_FLOOD_DIS_SET(x)\ 502 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_FLOOD_DIS, x) 503 + #define ANA_L3_VLAN_CFG_VLAN_FLOOD_DIS_GET(x)\ 504 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_FLOOD_DIS, x) 505 + 506 + #define ANA_L3_VLAN_CFG_VLAN_LRN_DIS BIT(3) 507 + #define ANA_L3_VLAN_CFG_VLAN_LRN_DIS_SET(x)\ 508 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_LRN_DIS, x) 509 + #define ANA_L3_VLAN_CFG_VLAN_LRN_DIS_GET(x)\ 510 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_LRN_DIS, x) 511 + 512 + #define ANA_L3_VLAN_CFG_VLAN_RLEG_ENA BIT(2) 513 + #define ANA_L3_VLAN_CFG_VLAN_RLEG_ENA_SET(x)\ 514 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_RLEG_ENA, x) 515 + #define ANA_L3_VLAN_CFG_VLAN_RLEG_ENA_GET(x)\ 516 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_RLEG_ENA, x) 517 + 518 + #define ANA_L3_VLAN_CFG_VLAN_PRIVATE_ENA BIT(1) 519 + #define ANA_L3_VLAN_CFG_VLAN_PRIVATE_ENA_SET(x)\ 520 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_PRIVATE_ENA, x) 521 + #define ANA_L3_VLAN_CFG_VLAN_PRIVATE_ENA_GET(x)\ 522 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_PRIVATE_ENA, x) 523 + 524 + #define ANA_L3_VLAN_CFG_VLAN_MIRROR_ENA BIT(0) 525 + #define ANA_L3_VLAN_CFG_VLAN_MIRROR_ENA_SET(x)\ 526 + FIELD_PREP(ANA_L3_VLAN_CFG_VLAN_MIRROR_ENA, x) 527 + #define ANA_L3_VLAN_CFG_VLAN_MIRROR_ENA_GET(x)\ 528 + FIELD_GET(ANA_L3_VLAN_CFG_VLAN_MIRROR_ENA, x) 529 + 530 + /* ANA_L3:VLAN:VLAN_MASK_CFG */ 531 + #define ANA_L3_VLAN_MASK_CFG(g) __REG(TARGET_ANA_L3, 0, 1, 0, g, 5120, 64, 16, 0, 1, 4) 532 + 533 + /* ANA_L3:VLAN:VLAN_MASK_CFG1 */ 534 + #define ANA_L3_VLAN_MASK_CFG1(g) __REG(TARGET_ANA_L3, 0, 1, 0, g, 5120, 64, 20, 0, 1, 4) 535 + 536 + /* ANA_L3:VLAN:VLAN_MASK_CFG2 */ 537 + #define ANA_L3_VLAN_MASK_CFG2(g) __REG(TARGET_ANA_L3, 0, 1, 0, g, 5120, 64, 24, 0, 1, 4) 538 + 539 + #define ANA_L3_VLAN_MASK_CFG2_VLAN_PORT_MASK2 BIT(0) 540 + #define ANA_L3_VLAN_MASK_CFG2_VLAN_PORT_MASK2_SET(x)\ 541 + FIELD_PREP(ANA_L3_VLAN_MASK_CFG2_VLAN_PORT_MASK2, x) 542 + #define ANA_L3_VLAN_MASK_CFG2_VLAN_PORT_MASK2_GET(x)\ 543 + FIELD_GET(ANA_L3_VLAN_MASK_CFG2_VLAN_PORT_MASK2, x) 544 + 545 + /* ASM:DEV_STATISTICS:RX_IN_BYTES_CNT */ 546 + #define ASM_RX_IN_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 0, 0, 1, 4) 547 + 548 + /* ASM:DEV_STATISTICS:RX_SYMBOL_ERR_CNT */ 549 + #define ASM_RX_SYMBOL_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 4, 0, 1, 4) 550 + 551 + /* ASM:DEV_STATISTICS:RX_PAUSE_CNT */ 552 + #define ASM_RX_PAUSE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 8, 0, 1, 4) 553 + 554 + /* ASM:DEV_STATISTICS:RX_UNSUP_OPCODE_CNT */ 555 + #define ASM_RX_UNSUP_OPCODE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 12, 0, 1, 4) 556 + 557 + /* ASM:DEV_STATISTICS:RX_OK_BYTES_CNT */ 558 + #define ASM_RX_OK_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 16, 0, 1, 4) 559 + 560 + /* ASM:DEV_STATISTICS:RX_BAD_BYTES_CNT */ 561 + #define ASM_RX_BAD_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 20, 0, 1, 4) 562 + 563 + /* ASM:DEV_STATISTICS:RX_UC_CNT */ 564 + #define ASM_RX_UC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 24, 0, 1, 4) 565 + 566 + /* ASM:DEV_STATISTICS:RX_MC_CNT */ 567 + #define ASM_RX_MC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 28, 0, 1, 4) 568 + 569 + /* ASM:DEV_STATISTICS:RX_BC_CNT */ 570 + #define ASM_RX_BC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 32, 0, 1, 4) 571 + 572 + /* ASM:DEV_STATISTICS:RX_CRC_ERR_CNT */ 573 + #define ASM_RX_CRC_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 36, 0, 1, 4) 574 + 575 + /* ASM:DEV_STATISTICS:RX_UNDERSIZE_CNT */ 576 + #define ASM_RX_UNDERSIZE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 40, 0, 1, 4) 577 + 578 + /* ASM:DEV_STATISTICS:RX_FRAGMENTS_CNT */ 579 + #define ASM_RX_FRAGMENTS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 44, 0, 1, 4) 580 + 581 + /* ASM:DEV_STATISTICS:RX_IN_RANGE_LEN_ERR_CNT */ 582 + #define ASM_RX_IN_RANGE_LEN_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 48, 0, 1, 4) 583 + 584 + /* ASM:DEV_STATISTICS:RX_OUT_OF_RANGE_LEN_ERR_CNT */ 585 + #define ASM_RX_OUT_OF_RANGE_LEN_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 52, 0, 1, 4) 586 + 587 + /* ASM:DEV_STATISTICS:RX_OVERSIZE_CNT */ 588 + #define ASM_RX_OVERSIZE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 56, 0, 1, 4) 589 + 590 + /* ASM:DEV_STATISTICS:RX_JABBERS_CNT */ 591 + #define ASM_RX_JABBERS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 60, 0, 1, 4) 592 + 593 + /* ASM:DEV_STATISTICS:RX_SIZE64_CNT */ 594 + #define ASM_RX_SIZE64_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 64, 0, 1, 4) 595 + 596 + /* ASM:DEV_STATISTICS:RX_SIZE65TO127_CNT */ 597 + #define ASM_RX_SIZE65TO127_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 68, 0, 1, 4) 598 + 599 + /* ASM:DEV_STATISTICS:RX_SIZE128TO255_CNT */ 600 + #define ASM_RX_SIZE128TO255_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 72, 0, 1, 4) 601 + 602 + /* ASM:DEV_STATISTICS:RX_SIZE256TO511_CNT */ 603 + #define ASM_RX_SIZE256TO511_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 76, 0, 1, 4) 604 + 605 + /* ASM:DEV_STATISTICS:RX_SIZE512TO1023_CNT */ 606 + #define ASM_RX_SIZE512TO1023_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 80, 0, 1, 4) 607 + 608 + /* ASM:DEV_STATISTICS:RX_SIZE1024TO1518_CNT */ 609 + #define ASM_RX_SIZE1024TO1518_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 84, 0, 1, 4) 610 + 611 + /* ASM:DEV_STATISTICS:RX_SIZE1519TOMAX_CNT */ 612 + #define ASM_RX_SIZE1519TOMAX_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 88, 0, 1, 4) 613 + 614 + /* ASM:DEV_STATISTICS:RX_IPG_SHRINK_CNT */ 615 + #define ASM_RX_IPG_SHRINK_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 92, 0, 1, 4) 616 + 617 + /* ASM:DEV_STATISTICS:TX_OUT_BYTES_CNT */ 618 + #define ASM_TX_OUT_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 96, 0, 1, 4) 619 + 620 + /* ASM:DEV_STATISTICS:TX_PAUSE_CNT */ 621 + #define ASM_TX_PAUSE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 100, 0, 1, 4) 622 + 623 + /* ASM:DEV_STATISTICS:TX_OK_BYTES_CNT */ 624 + #define ASM_TX_OK_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 104, 0, 1, 4) 625 + 626 + /* ASM:DEV_STATISTICS:TX_UC_CNT */ 627 + #define ASM_TX_UC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 108, 0, 1, 4) 628 + 629 + /* ASM:DEV_STATISTICS:TX_MC_CNT */ 630 + #define ASM_TX_MC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 112, 0, 1, 4) 631 + 632 + /* ASM:DEV_STATISTICS:TX_BC_CNT */ 633 + #define ASM_TX_BC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 116, 0, 1, 4) 634 + 635 + /* ASM:DEV_STATISTICS:TX_SIZE64_CNT */ 636 + #define ASM_TX_SIZE64_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 120, 0, 1, 4) 637 + 638 + /* ASM:DEV_STATISTICS:TX_SIZE65TO127_CNT */ 639 + #define ASM_TX_SIZE65TO127_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 124, 0, 1, 4) 640 + 641 + /* ASM:DEV_STATISTICS:TX_SIZE128TO255_CNT */ 642 + #define ASM_TX_SIZE128TO255_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 128, 0, 1, 4) 643 + 644 + /* ASM:DEV_STATISTICS:TX_SIZE256TO511_CNT */ 645 + #define ASM_TX_SIZE256TO511_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 132, 0, 1, 4) 646 + 647 + /* ASM:DEV_STATISTICS:TX_SIZE512TO1023_CNT */ 648 + #define ASM_TX_SIZE512TO1023_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 136, 0, 1, 4) 649 + 650 + /* ASM:DEV_STATISTICS:TX_SIZE1024TO1518_CNT */ 651 + #define ASM_TX_SIZE1024TO1518_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 140, 0, 1, 4) 652 + 653 + /* ASM:DEV_STATISTICS:TX_SIZE1519TOMAX_CNT */ 654 + #define ASM_TX_SIZE1519TOMAX_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 144, 0, 1, 4) 655 + 656 + /* ASM:DEV_STATISTICS:RX_ALIGNMENT_LOST_CNT */ 657 + #define ASM_RX_ALIGNMENT_LOST_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 148, 0, 1, 4) 658 + 659 + /* ASM:DEV_STATISTICS:RX_TAGGED_FRMS_CNT */ 660 + #define ASM_RX_TAGGED_FRMS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 152, 0, 1, 4) 661 + 662 + /* ASM:DEV_STATISTICS:RX_UNTAGGED_FRMS_CNT */ 663 + #define ASM_RX_UNTAGGED_FRMS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 156, 0, 1, 4) 664 + 665 + /* ASM:DEV_STATISTICS:TX_TAGGED_FRMS_CNT */ 666 + #define ASM_TX_TAGGED_FRMS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 160, 0, 1, 4) 667 + 668 + /* ASM:DEV_STATISTICS:TX_UNTAGGED_FRMS_CNT */ 669 + #define ASM_TX_UNTAGGED_FRMS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 164, 0, 1, 4) 670 + 671 + /* ASM:DEV_STATISTICS:PMAC_RX_SYMBOL_ERR_CNT */ 672 + #define ASM_PMAC_RX_SYMBOL_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 168, 0, 1, 4) 673 + 674 + /* ASM:DEV_STATISTICS:PMAC_RX_PAUSE_CNT */ 675 + #define ASM_PMAC_RX_PAUSE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 172, 0, 1, 4) 676 + 677 + /* ASM:DEV_STATISTICS:PMAC_RX_UNSUP_OPCODE_CNT */ 678 + #define ASM_PMAC_RX_UNSUP_OPCODE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 176, 0, 1, 4) 679 + 680 + /* ASM:DEV_STATISTICS:PMAC_RX_OK_BYTES_CNT */ 681 + #define ASM_PMAC_RX_OK_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 180, 0, 1, 4) 682 + 683 + /* ASM:DEV_STATISTICS:PMAC_RX_BAD_BYTES_CNT */ 684 + #define ASM_PMAC_RX_BAD_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 184, 0, 1, 4) 685 + 686 + /* ASM:DEV_STATISTICS:PMAC_RX_UC_CNT */ 687 + #define ASM_PMAC_RX_UC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 188, 0, 1, 4) 688 + 689 + /* ASM:DEV_STATISTICS:PMAC_RX_MC_CNT */ 690 + #define ASM_PMAC_RX_MC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 192, 0, 1, 4) 691 + 692 + /* ASM:DEV_STATISTICS:PMAC_RX_BC_CNT */ 693 + #define ASM_PMAC_RX_BC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 196, 0, 1, 4) 694 + 695 + /* ASM:DEV_STATISTICS:PMAC_RX_CRC_ERR_CNT */ 696 + #define ASM_PMAC_RX_CRC_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 200, 0, 1, 4) 697 + 698 + /* ASM:DEV_STATISTICS:PMAC_RX_UNDERSIZE_CNT */ 699 + #define ASM_PMAC_RX_UNDERSIZE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 204, 0, 1, 4) 700 + 701 + /* ASM:DEV_STATISTICS:PMAC_RX_FRAGMENTS_CNT */ 702 + #define ASM_PMAC_RX_FRAGMENTS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 208, 0, 1, 4) 703 + 704 + /* ASM:DEV_STATISTICS:PMAC_RX_IN_RANGE_LEN_ERR_CNT */ 705 + #define ASM_PMAC_RX_IN_RANGE_LEN_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 212, 0, 1, 4) 706 + 707 + /* ASM:DEV_STATISTICS:PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT */ 708 + #define ASM_PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 216, 0, 1, 4) 709 + 710 + /* ASM:DEV_STATISTICS:PMAC_RX_OVERSIZE_CNT */ 711 + #define ASM_PMAC_RX_OVERSIZE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 220, 0, 1, 4) 712 + 713 + /* ASM:DEV_STATISTICS:PMAC_RX_JABBERS_CNT */ 714 + #define ASM_PMAC_RX_JABBERS_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 224, 0, 1, 4) 715 + 716 + /* ASM:DEV_STATISTICS:PMAC_RX_SIZE64_CNT */ 717 + #define ASM_PMAC_RX_SIZE64_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 228, 0, 1, 4) 718 + 719 + /* ASM:DEV_STATISTICS:PMAC_RX_SIZE65TO127_CNT */ 720 + #define ASM_PMAC_RX_SIZE65TO127_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 232, 0, 1, 4) 721 + 722 + /* ASM:DEV_STATISTICS:PMAC_RX_SIZE128TO255_CNT */ 723 + #define ASM_PMAC_RX_SIZE128TO255_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 236, 0, 1, 4) 724 + 725 + /* ASM:DEV_STATISTICS:PMAC_RX_SIZE256TO511_CNT */ 726 + #define ASM_PMAC_RX_SIZE256TO511_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 240, 0, 1, 4) 727 + 728 + /* ASM:DEV_STATISTICS:PMAC_RX_SIZE512TO1023_CNT */ 729 + #define ASM_PMAC_RX_SIZE512TO1023_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 244, 0, 1, 4) 730 + 731 + /* ASM:DEV_STATISTICS:PMAC_RX_SIZE1024TO1518_CNT */ 732 + #define ASM_PMAC_RX_SIZE1024TO1518_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 248, 0, 1, 4) 733 + 734 + /* ASM:DEV_STATISTICS:PMAC_RX_SIZE1519TOMAX_CNT */ 735 + #define ASM_PMAC_RX_SIZE1519TOMAX_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 252, 0, 1, 4) 736 + 737 + /* ASM:DEV_STATISTICS:PMAC_TX_PAUSE_CNT */ 738 + #define ASM_PMAC_TX_PAUSE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 256, 0, 1, 4) 739 + 740 + /* ASM:DEV_STATISTICS:PMAC_TX_OK_BYTES_CNT */ 741 + #define ASM_PMAC_TX_OK_BYTES_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 260, 0, 1, 4) 742 + 743 + /* ASM:DEV_STATISTICS:PMAC_TX_UC_CNT */ 744 + #define ASM_PMAC_TX_UC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 264, 0, 1, 4) 745 + 746 + /* ASM:DEV_STATISTICS:PMAC_TX_MC_CNT */ 747 + #define ASM_PMAC_TX_MC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 268, 0, 1, 4) 748 + 749 + /* ASM:DEV_STATISTICS:PMAC_TX_BC_CNT */ 750 + #define ASM_PMAC_TX_BC_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 272, 0, 1, 4) 751 + 752 + /* ASM:DEV_STATISTICS:PMAC_TX_SIZE64_CNT */ 753 + #define ASM_PMAC_TX_SIZE64_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 276, 0, 1, 4) 754 + 755 + /* ASM:DEV_STATISTICS:PMAC_TX_SIZE65TO127_CNT */ 756 + #define ASM_PMAC_TX_SIZE65TO127_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 280, 0, 1, 4) 757 + 758 + /* ASM:DEV_STATISTICS:PMAC_TX_SIZE128TO255_CNT */ 759 + #define ASM_PMAC_TX_SIZE128TO255_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 284, 0, 1, 4) 760 + 761 + /* ASM:DEV_STATISTICS:PMAC_TX_SIZE256TO511_CNT */ 762 + #define ASM_PMAC_TX_SIZE256TO511_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 288, 0, 1, 4) 763 + 764 + /* ASM:DEV_STATISTICS:PMAC_TX_SIZE512TO1023_CNT */ 765 + #define ASM_PMAC_TX_SIZE512TO1023_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 292, 0, 1, 4) 766 + 767 + /* ASM:DEV_STATISTICS:PMAC_TX_SIZE1024TO1518_CNT */ 768 + #define ASM_PMAC_TX_SIZE1024TO1518_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 296, 0, 1, 4) 769 + 770 + /* ASM:DEV_STATISTICS:PMAC_TX_SIZE1519TOMAX_CNT */ 771 + #define ASM_PMAC_TX_SIZE1519TOMAX_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 300, 0, 1, 4) 772 + 773 + /* ASM:DEV_STATISTICS:PMAC_RX_ALIGNMENT_LOST_CNT */ 774 + #define ASM_PMAC_RX_ALIGNMENT_LOST_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 304, 0, 1, 4) 775 + 776 + /* ASM:DEV_STATISTICS:MM_RX_ASSEMBLY_ERR_CNT */ 777 + #define ASM_MM_RX_ASSEMBLY_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 308, 0, 1, 4) 778 + 779 + /* ASM:DEV_STATISTICS:MM_RX_SMD_ERR_CNT */ 780 + #define ASM_MM_RX_SMD_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 312, 0, 1, 4) 781 + 782 + /* ASM:DEV_STATISTICS:MM_RX_ASSEMBLY_OK_CNT */ 783 + #define ASM_MM_RX_ASSEMBLY_OK_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 316, 0, 1, 4) 784 + 785 + /* ASM:DEV_STATISTICS:MM_RX_MERGE_FRAG_CNT */ 786 + #define ASM_MM_RX_MERGE_FRAG_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 320, 0, 1, 4) 787 + 788 + /* ASM:DEV_STATISTICS:MM_TX_PFRAGMENT_CNT */ 789 + #define ASM_MM_TX_PFRAGMENT_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 324, 0, 1, 4) 790 + 791 + /* ASM:DEV_STATISTICS:TX_MULTI_COLL_CNT */ 792 + #define ASM_TX_MULTI_COLL_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 328, 0, 1, 4) 793 + 794 + /* ASM:DEV_STATISTICS:TX_LATE_COLL_CNT */ 795 + #define ASM_TX_LATE_COLL_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 332, 0, 1, 4) 796 + 797 + /* ASM:DEV_STATISTICS:TX_XCOLL_CNT */ 798 + #define ASM_TX_XCOLL_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 336, 0, 1, 4) 799 + 800 + /* ASM:DEV_STATISTICS:TX_DEFER_CNT */ 801 + #define ASM_TX_DEFER_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 340, 0, 1, 4) 802 + 803 + /* ASM:DEV_STATISTICS:TX_XDEFER_CNT */ 804 + #define ASM_TX_XDEFER_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 344, 0, 1, 4) 805 + 806 + /* ASM:DEV_STATISTICS:TX_BACKOFF1_CNT */ 807 + #define ASM_TX_BACKOFF1_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 348, 0, 1, 4) 808 + 809 + /* ASM:DEV_STATISTICS:TX_CSENSE_CNT */ 810 + #define ASM_TX_CSENSE_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 352, 0, 1, 4) 811 + 812 + /* ASM:DEV_STATISTICS:RX_IN_BYTES_MSB_CNT */ 813 + #define ASM_RX_IN_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 356, 0, 1, 4) 814 + 815 + #define ASM_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT GENMASK(3, 0) 816 + #define ASM_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT_SET(x)\ 817 + FIELD_PREP(ASM_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT, x) 818 + #define ASM_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT_GET(x)\ 819 + FIELD_GET(ASM_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT, x) 820 + 821 + /* ASM:DEV_STATISTICS:RX_OK_BYTES_MSB_CNT */ 822 + #define ASM_RX_OK_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 360, 0, 1, 4) 823 + 824 + #define ASM_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT GENMASK(3, 0) 825 + #define ASM_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT_SET(x)\ 826 + FIELD_PREP(ASM_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT, x) 827 + #define ASM_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT_GET(x)\ 828 + FIELD_GET(ASM_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT, x) 829 + 830 + /* ASM:DEV_STATISTICS:PMAC_RX_OK_BYTES_MSB_CNT */ 831 + #define ASM_PMAC_RX_OK_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 364, 0, 1, 4) 832 + 833 + #define ASM_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT GENMASK(3, 0) 834 + #define ASM_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT_SET(x)\ 835 + FIELD_PREP(ASM_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT, x) 836 + #define ASM_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT_GET(x)\ 837 + FIELD_GET(ASM_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT, x) 838 + 839 + /* ASM:DEV_STATISTICS:RX_BAD_BYTES_MSB_CNT */ 840 + #define ASM_RX_BAD_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 368, 0, 1, 4) 841 + 842 + #define ASM_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT GENMASK(3, 0) 843 + #define ASM_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT_SET(x)\ 844 + FIELD_PREP(ASM_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT, x) 845 + #define ASM_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT_GET(x)\ 846 + FIELD_GET(ASM_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT, x) 847 + 848 + /* ASM:DEV_STATISTICS:PMAC_RX_BAD_BYTES_MSB_CNT */ 849 + #define ASM_PMAC_RX_BAD_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 372, 0, 1, 4) 850 + 851 + #define ASM_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT GENMASK(3, 0) 852 + #define ASM_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT_SET(x)\ 853 + FIELD_PREP(ASM_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT, x) 854 + #define ASM_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT_GET(x)\ 855 + FIELD_GET(ASM_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT, x) 856 + 857 + /* ASM:DEV_STATISTICS:TX_OUT_BYTES_MSB_CNT */ 858 + #define ASM_TX_OUT_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 376, 0, 1, 4) 859 + 860 + #define ASM_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT GENMASK(3, 0) 861 + #define ASM_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT_SET(x)\ 862 + FIELD_PREP(ASM_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT, x) 863 + #define ASM_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT_GET(x)\ 864 + FIELD_GET(ASM_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT, x) 865 + 866 + /* ASM:DEV_STATISTICS:TX_OK_BYTES_MSB_CNT */ 867 + #define ASM_TX_OK_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 380, 0, 1, 4) 868 + 869 + #define ASM_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT GENMASK(3, 0) 870 + #define ASM_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT_SET(x)\ 871 + FIELD_PREP(ASM_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT, x) 872 + #define ASM_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT_GET(x)\ 873 + FIELD_GET(ASM_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT, x) 874 + 875 + /* ASM:DEV_STATISTICS:PMAC_TX_OK_BYTES_MSB_CNT */ 876 + #define ASM_PMAC_TX_OK_BYTES_MSB_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 384, 0, 1, 4) 877 + 878 + #define ASM_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT GENMASK(3, 0) 879 + #define ASM_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT_SET(x)\ 880 + FIELD_PREP(ASM_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT, x) 881 + #define ASM_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT_GET(x)\ 882 + FIELD_GET(ASM_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT, x) 883 + 884 + /* ASM:DEV_STATISTICS:RX_SYNC_LOST_ERR_CNT */ 885 + #define ASM_RX_SYNC_LOST_ERR_CNT(g) __REG(TARGET_ASM, 0, 1, 0, g, 65, 512, 388, 0, 1, 4) 886 + 887 + /* ASM:CFG:STAT_CFG */ 888 + #define ASM_STAT_CFG __REG(TARGET_ASM, 0, 1, 33280, 0, 1, 1088, 0, 0, 1, 4) 889 + 890 + #define ASM_STAT_CFG_STAT_CNT_CLR_SHOT BIT(0) 891 + #define ASM_STAT_CFG_STAT_CNT_CLR_SHOT_SET(x)\ 892 + FIELD_PREP(ASM_STAT_CFG_STAT_CNT_CLR_SHOT, x) 893 + #define ASM_STAT_CFG_STAT_CNT_CLR_SHOT_GET(x)\ 894 + FIELD_GET(ASM_STAT_CFG_STAT_CNT_CLR_SHOT, x) 895 + 896 + /* ASM:CFG:PORT_CFG */ 897 + #define ASM_PORT_CFG(r) __REG(TARGET_ASM, 0, 1, 33280, 0, 1, 1088, 540, r, 67, 4) 898 + 899 + #define ASM_PORT_CFG_CSC_STAT_DIS BIT(12) 900 + #define ASM_PORT_CFG_CSC_STAT_DIS_SET(x)\ 901 + FIELD_PREP(ASM_PORT_CFG_CSC_STAT_DIS, x) 902 + #define ASM_PORT_CFG_CSC_STAT_DIS_GET(x)\ 903 + FIELD_GET(ASM_PORT_CFG_CSC_STAT_DIS, x) 904 + 905 + #define ASM_PORT_CFG_HIH_AFTER_PREAMBLE_ENA BIT(11) 906 + #define ASM_PORT_CFG_HIH_AFTER_PREAMBLE_ENA_SET(x)\ 907 + FIELD_PREP(ASM_PORT_CFG_HIH_AFTER_PREAMBLE_ENA, x) 908 + #define ASM_PORT_CFG_HIH_AFTER_PREAMBLE_ENA_GET(x)\ 909 + FIELD_GET(ASM_PORT_CFG_HIH_AFTER_PREAMBLE_ENA, x) 910 + 911 + #define ASM_PORT_CFG_IGN_TAXI_ABORT_ENA BIT(10) 912 + #define ASM_PORT_CFG_IGN_TAXI_ABORT_ENA_SET(x)\ 913 + FIELD_PREP(ASM_PORT_CFG_IGN_TAXI_ABORT_ENA, x) 914 + #define ASM_PORT_CFG_IGN_TAXI_ABORT_ENA_GET(x)\ 915 + FIELD_GET(ASM_PORT_CFG_IGN_TAXI_ABORT_ENA, x) 916 + 917 + #define ASM_PORT_CFG_NO_PREAMBLE_ENA BIT(9) 918 + #define ASM_PORT_CFG_NO_PREAMBLE_ENA_SET(x)\ 919 + FIELD_PREP(ASM_PORT_CFG_NO_PREAMBLE_ENA, x) 920 + #define ASM_PORT_CFG_NO_PREAMBLE_ENA_GET(x)\ 921 + FIELD_GET(ASM_PORT_CFG_NO_PREAMBLE_ENA, x) 922 + 923 + #define ASM_PORT_CFG_SKIP_PREAMBLE_ENA BIT(8) 924 + #define ASM_PORT_CFG_SKIP_PREAMBLE_ENA_SET(x)\ 925 + FIELD_PREP(ASM_PORT_CFG_SKIP_PREAMBLE_ENA, x) 926 + #define ASM_PORT_CFG_SKIP_PREAMBLE_ENA_GET(x)\ 927 + FIELD_GET(ASM_PORT_CFG_SKIP_PREAMBLE_ENA, x) 928 + 929 + #define ASM_PORT_CFG_FRM_AGING_DIS BIT(7) 930 + #define ASM_PORT_CFG_FRM_AGING_DIS_SET(x)\ 931 + FIELD_PREP(ASM_PORT_CFG_FRM_AGING_DIS, x) 932 + #define ASM_PORT_CFG_FRM_AGING_DIS_GET(x)\ 933 + FIELD_GET(ASM_PORT_CFG_FRM_AGING_DIS, x) 934 + 935 + #define ASM_PORT_CFG_PAD_ENA BIT(6) 936 + #define ASM_PORT_CFG_PAD_ENA_SET(x)\ 937 + FIELD_PREP(ASM_PORT_CFG_PAD_ENA, x) 938 + #define ASM_PORT_CFG_PAD_ENA_GET(x)\ 939 + FIELD_GET(ASM_PORT_CFG_PAD_ENA, x) 940 + 941 + #define ASM_PORT_CFG_INJ_DISCARD_CFG GENMASK(5, 4) 942 + #define ASM_PORT_CFG_INJ_DISCARD_CFG_SET(x)\ 943 + FIELD_PREP(ASM_PORT_CFG_INJ_DISCARD_CFG, x) 944 + #define ASM_PORT_CFG_INJ_DISCARD_CFG_GET(x)\ 945 + FIELD_GET(ASM_PORT_CFG_INJ_DISCARD_CFG, x) 946 + 947 + #define ASM_PORT_CFG_INJ_FORMAT_CFG GENMASK(3, 2) 948 + #define ASM_PORT_CFG_INJ_FORMAT_CFG_SET(x)\ 949 + FIELD_PREP(ASM_PORT_CFG_INJ_FORMAT_CFG, x) 950 + #define ASM_PORT_CFG_INJ_FORMAT_CFG_GET(x)\ 951 + FIELD_GET(ASM_PORT_CFG_INJ_FORMAT_CFG, x) 952 + 953 + #define ASM_PORT_CFG_VSTAX2_AWR_ENA BIT(1) 954 + #define ASM_PORT_CFG_VSTAX2_AWR_ENA_SET(x)\ 955 + FIELD_PREP(ASM_PORT_CFG_VSTAX2_AWR_ENA, x) 956 + #define ASM_PORT_CFG_VSTAX2_AWR_ENA_GET(x)\ 957 + FIELD_GET(ASM_PORT_CFG_VSTAX2_AWR_ENA, x) 958 + 959 + #define ASM_PORT_CFG_PFRM_FLUSH BIT(0) 960 + #define ASM_PORT_CFG_PFRM_FLUSH_SET(x)\ 961 + FIELD_PREP(ASM_PORT_CFG_PFRM_FLUSH, x) 962 + #define ASM_PORT_CFG_PFRM_FLUSH_GET(x)\ 963 + FIELD_GET(ASM_PORT_CFG_PFRM_FLUSH, x) 964 + 965 + /* ASM:RAM_CTRL:RAM_INIT */ 966 + #define ASM_RAM_INIT __REG(TARGET_ASM, 0, 1, 34832, 0, 1, 4, 0, 0, 1, 4) 967 + 968 + #define ASM_RAM_INIT_RAM_INIT BIT(1) 969 + #define ASM_RAM_INIT_RAM_INIT_SET(x)\ 970 + FIELD_PREP(ASM_RAM_INIT_RAM_INIT, x) 971 + #define ASM_RAM_INIT_RAM_INIT_GET(x)\ 972 + FIELD_GET(ASM_RAM_INIT_RAM_INIT, x) 973 + 974 + #define ASM_RAM_INIT_RAM_CFG_HOOK BIT(0) 975 + #define ASM_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 976 + FIELD_PREP(ASM_RAM_INIT_RAM_CFG_HOOK, x) 977 + #define ASM_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 978 + FIELD_GET(ASM_RAM_INIT_RAM_CFG_HOOK, x) 979 + 980 + /* CLKGEN:LCPLL1:LCPLL1_CORE_CLK_CFG */ 981 + #define CLKGEN_LCPLL1_CORE_CLK_CFG __REG(TARGET_CLKGEN, 0, 1, 12, 0, 1, 36, 0, 0, 1, 4) 982 + 983 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_DIV GENMASK(7, 0) 984 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_DIV_SET(x)\ 985 + FIELD_PREP(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_DIV, x) 986 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_DIV_GET(x)\ 987 + FIELD_GET(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_DIV, x) 988 + 989 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_PRE_DIV GENMASK(10, 8) 990 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_PRE_DIV_SET(x)\ 991 + FIELD_PREP(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_PRE_DIV, x) 992 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_PRE_DIV_GET(x)\ 993 + FIELD_GET(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_PRE_DIV, x) 994 + 995 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_DIR BIT(11) 996 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_DIR_SET(x)\ 997 + FIELD_PREP(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_DIR, x) 998 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_DIR_GET(x)\ 999 + FIELD_GET(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_DIR, x) 1000 + 1001 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_SEL GENMASK(13, 12) 1002 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_SEL_SET(x)\ 1003 + FIELD_PREP(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_SEL, x) 1004 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_SEL_GET(x)\ 1005 + FIELD_GET(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_SEL, x) 1006 + 1007 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_ENA BIT(14) 1008 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_ENA_SET(x)\ 1009 + FIELD_PREP(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_ENA, x) 1010 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_ENA_GET(x)\ 1011 + FIELD_GET(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_ROT_ENA, x) 1012 + 1013 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_ENA BIT(15) 1014 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_ENA_SET(x)\ 1015 + FIELD_PREP(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_ENA, x) 1016 + #define CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_ENA_GET(x)\ 1017 + FIELD_GET(CLKGEN_LCPLL1_CORE_CLK_CFG_CORE_CLK_ENA, x) 1018 + 1019 + /* CPU:CPU_REGS:PROC_CTRL */ 1020 + #define CPU_PROC_CTRL __REG(TARGET_CPU, 0, 1, 0, 0, 1, 204, 176, 0, 1, 4) 1021 + 1022 + #define CPU_PROC_CTRL_AARCH64_MODE_ENA BIT(12) 1023 + #define CPU_PROC_CTRL_AARCH64_MODE_ENA_SET(x)\ 1024 + FIELD_PREP(CPU_PROC_CTRL_AARCH64_MODE_ENA, x) 1025 + #define CPU_PROC_CTRL_AARCH64_MODE_ENA_GET(x)\ 1026 + FIELD_GET(CPU_PROC_CTRL_AARCH64_MODE_ENA, x) 1027 + 1028 + #define CPU_PROC_CTRL_L2_RST_INVALIDATE_DIS BIT(11) 1029 + #define CPU_PROC_CTRL_L2_RST_INVALIDATE_DIS_SET(x)\ 1030 + FIELD_PREP(CPU_PROC_CTRL_L2_RST_INVALIDATE_DIS, x) 1031 + #define CPU_PROC_CTRL_L2_RST_INVALIDATE_DIS_GET(x)\ 1032 + FIELD_GET(CPU_PROC_CTRL_L2_RST_INVALIDATE_DIS, x) 1033 + 1034 + #define CPU_PROC_CTRL_L1_RST_INVALIDATE_DIS BIT(10) 1035 + #define CPU_PROC_CTRL_L1_RST_INVALIDATE_DIS_SET(x)\ 1036 + FIELD_PREP(CPU_PROC_CTRL_L1_RST_INVALIDATE_DIS, x) 1037 + #define CPU_PROC_CTRL_L1_RST_INVALIDATE_DIS_GET(x)\ 1038 + FIELD_GET(CPU_PROC_CTRL_L1_RST_INVALIDATE_DIS, x) 1039 + 1040 + #define CPU_PROC_CTRL_BE_EXCEP_MODE BIT(9) 1041 + #define CPU_PROC_CTRL_BE_EXCEP_MODE_SET(x)\ 1042 + FIELD_PREP(CPU_PROC_CTRL_BE_EXCEP_MODE, x) 1043 + #define CPU_PROC_CTRL_BE_EXCEP_MODE_GET(x)\ 1044 + FIELD_GET(CPU_PROC_CTRL_BE_EXCEP_MODE, x) 1045 + 1046 + #define CPU_PROC_CTRL_VINITHI BIT(8) 1047 + #define CPU_PROC_CTRL_VINITHI_SET(x)\ 1048 + FIELD_PREP(CPU_PROC_CTRL_VINITHI, x) 1049 + #define CPU_PROC_CTRL_VINITHI_GET(x)\ 1050 + FIELD_GET(CPU_PROC_CTRL_VINITHI, x) 1051 + 1052 + #define CPU_PROC_CTRL_CFGTE BIT(7) 1053 + #define CPU_PROC_CTRL_CFGTE_SET(x)\ 1054 + FIELD_PREP(CPU_PROC_CTRL_CFGTE, x) 1055 + #define CPU_PROC_CTRL_CFGTE_GET(x)\ 1056 + FIELD_GET(CPU_PROC_CTRL_CFGTE, x) 1057 + 1058 + #define CPU_PROC_CTRL_CP15S_DISABLE BIT(6) 1059 + #define CPU_PROC_CTRL_CP15S_DISABLE_SET(x)\ 1060 + FIELD_PREP(CPU_PROC_CTRL_CP15S_DISABLE, x) 1061 + #define CPU_PROC_CTRL_CP15S_DISABLE_GET(x)\ 1062 + FIELD_GET(CPU_PROC_CTRL_CP15S_DISABLE, x) 1063 + 1064 + #define CPU_PROC_CTRL_PROC_CRYPTO_DISABLE BIT(5) 1065 + #define CPU_PROC_CTRL_PROC_CRYPTO_DISABLE_SET(x)\ 1066 + FIELD_PREP(CPU_PROC_CTRL_PROC_CRYPTO_DISABLE, x) 1067 + #define CPU_PROC_CTRL_PROC_CRYPTO_DISABLE_GET(x)\ 1068 + FIELD_GET(CPU_PROC_CTRL_PROC_CRYPTO_DISABLE, x) 1069 + 1070 + #define CPU_PROC_CTRL_ACP_CACHE_FORCE_ENA BIT(4) 1071 + #define CPU_PROC_CTRL_ACP_CACHE_FORCE_ENA_SET(x)\ 1072 + FIELD_PREP(CPU_PROC_CTRL_ACP_CACHE_FORCE_ENA, x) 1073 + #define CPU_PROC_CTRL_ACP_CACHE_FORCE_ENA_GET(x)\ 1074 + FIELD_GET(CPU_PROC_CTRL_ACP_CACHE_FORCE_ENA, x) 1075 + 1076 + #define CPU_PROC_CTRL_ACP_AWCACHE BIT(3) 1077 + #define CPU_PROC_CTRL_ACP_AWCACHE_SET(x)\ 1078 + FIELD_PREP(CPU_PROC_CTRL_ACP_AWCACHE, x) 1079 + #define CPU_PROC_CTRL_ACP_AWCACHE_GET(x)\ 1080 + FIELD_GET(CPU_PROC_CTRL_ACP_AWCACHE, x) 1081 + 1082 + #define CPU_PROC_CTRL_ACP_ARCACHE BIT(2) 1083 + #define CPU_PROC_CTRL_ACP_ARCACHE_SET(x)\ 1084 + FIELD_PREP(CPU_PROC_CTRL_ACP_ARCACHE, x) 1085 + #define CPU_PROC_CTRL_ACP_ARCACHE_GET(x)\ 1086 + FIELD_GET(CPU_PROC_CTRL_ACP_ARCACHE, x) 1087 + 1088 + #define CPU_PROC_CTRL_L2_FLUSH_REQ BIT(1) 1089 + #define CPU_PROC_CTRL_L2_FLUSH_REQ_SET(x)\ 1090 + FIELD_PREP(CPU_PROC_CTRL_L2_FLUSH_REQ, x) 1091 + #define CPU_PROC_CTRL_L2_FLUSH_REQ_GET(x)\ 1092 + FIELD_GET(CPU_PROC_CTRL_L2_FLUSH_REQ, x) 1093 + 1094 + #define CPU_PROC_CTRL_ACP_DISABLE BIT(0) 1095 + #define CPU_PROC_CTRL_ACP_DISABLE_SET(x)\ 1096 + FIELD_PREP(CPU_PROC_CTRL_ACP_DISABLE, x) 1097 + #define CPU_PROC_CTRL_ACP_DISABLE_GET(x)\ 1098 + FIELD_GET(CPU_PROC_CTRL_ACP_DISABLE, x) 1099 + 1100 + /* DEV10G:MAC_CFG_STATUS:MAC_ENA_CFG */ 1101 + #define DEV10G_MAC_ENA_CFG(t) __REG(TARGET_DEV10G, t, 12, 0, 0, 1, 60, 0, 0, 1, 4) 1102 + 1103 + #define DEV10G_MAC_ENA_CFG_RX_ENA BIT(4) 1104 + #define DEV10G_MAC_ENA_CFG_RX_ENA_SET(x)\ 1105 + FIELD_PREP(DEV10G_MAC_ENA_CFG_RX_ENA, x) 1106 + #define DEV10G_MAC_ENA_CFG_RX_ENA_GET(x)\ 1107 + FIELD_GET(DEV10G_MAC_ENA_CFG_RX_ENA, x) 1108 + 1109 + #define DEV10G_MAC_ENA_CFG_TX_ENA BIT(0) 1110 + #define DEV10G_MAC_ENA_CFG_TX_ENA_SET(x)\ 1111 + FIELD_PREP(DEV10G_MAC_ENA_CFG_TX_ENA, x) 1112 + #define DEV10G_MAC_ENA_CFG_TX_ENA_GET(x)\ 1113 + FIELD_GET(DEV10G_MAC_ENA_CFG_TX_ENA, x) 1114 + 1115 + /* DEV10G:MAC_CFG_STATUS:MAC_MAXLEN_CFG */ 1116 + #define DEV10G_MAC_MAXLEN_CFG(t) __REG(TARGET_DEV10G, t, 12, 0, 0, 1, 60, 8, 0, 1, 4) 1117 + 1118 + #define DEV10G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK BIT(16) 1119 + #define DEV10G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK_SET(x)\ 1120 + FIELD_PREP(DEV10G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK, x) 1121 + #define DEV10G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK_GET(x)\ 1122 + FIELD_GET(DEV10G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK, x) 1123 + 1124 + #define DEV10G_MAC_MAXLEN_CFG_MAX_LEN GENMASK(15, 0) 1125 + #define DEV10G_MAC_MAXLEN_CFG_MAX_LEN_SET(x)\ 1126 + FIELD_PREP(DEV10G_MAC_MAXLEN_CFG_MAX_LEN, x) 1127 + #define DEV10G_MAC_MAXLEN_CFG_MAX_LEN_GET(x)\ 1128 + FIELD_GET(DEV10G_MAC_MAXLEN_CFG_MAX_LEN, x) 1129 + 1130 + /* DEV10G:MAC_CFG_STATUS:MAC_NUM_TAGS_CFG */ 1131 + #define DEV10G_MAC_NUM_TAGS_CFG(t) __REG(TARGET_DEV10G, t, 12, 0, 0, 1, 60, 12, 0, 1, 4) 1132 + 1133 + #define DEV10G_MAC_NUM_TAGS_CFG_NUM_TAGS GENMASK(1, 0) 1134 + #define DEV10G_MAC_NUM_TAGS_CFG_NUM_TAGS_SET(x)\ 1135 + FIELD_PREP(DEV10G_MAC_NUM_TAGS_CFG_NUM_TAGS, x) 1136 + #define DEV10G_MAC_NUM_TAGS_CFG_NUM_TAGS_GET(x)\ 1137 + FIELD_GET(DEV10G_MAC_NUM_TAGS_CFG_NUM_TAGS, x) 1138 + 1139 + /* DEV10G:MAC_CFG_STATUS:MAC_TAGS_CFG */ 1140 + #define DEV10G_MAC_TAGS_CFG(t, r) __REG(TARGET_DEV10G, t, 12, 0, 0, 1, 60, 16, r, 3, 4) 1141 + 1142 + #define DEV10G_MAC_TAGS_CFG_TAG_ID GENMASK(31, 16) 1143 + #define DEV10G_MAC_TAGS_CFG_TAG_ID_SET(x)\ 1144 + FIELD_PREP(DEV10G_MAC_TAGS_CFG_TAG_ID, x) 1145 + #define DEV10G_MAC_TAGS_CFG_TAG_ID_GET(x)\ 1146 + FIELD_GET(DEV10G_MAC_TAGS_CFG_TAG_ID, x) 1147 + 1148 + #define DEV10G_MAC_TAGS_CFG_TAG_ENA BIT(4) 1149 + #define DEV10G_MAC_TAGS_CFG_TAG_ENA_SET(x)\ 1150 + FIELD_PREP(DEV10G_MAC_TAGS_CFG_TAG_ENA, x) 1151 + #define DEV10G_MAC_TAGS_CFG_TAG_ENA_GET(x)\ 1152 + FIELD_GET(DEV10G_MAC_TAGS_CFG_TAG_ENA, x) 1153 + 1154 + /* DEV10G:MAC_CFG_STATUS:MAC_ADV_CHK_CFG */ 1155 + #define DEV10G_MAC_ADV_CHK_CFG(t) __REG(TARGET_DEV10G, t, 12, 0, 0, 1, 60, 28, 0, 1, 4) 1156 + 1157 + #define DEV10G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA BIT(24) 1158 + #define DEV10G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA_SET(x)\ 1159 + FIELD_PREP(DEV10G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA, x) 1160 + #define DEV10G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA_GET(x)\ 1161 + FIELD_GET(DEV10G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA, x) 1162 + 1163 + #define DEV10G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA BIT(20) 1164 + #define DEV10G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA_SET(x)\ 1165 + FIELD_PREP(DEV10G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA, x) 1166 + #define DEV10G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA_GET(x)\ 1167 + FIELD_GET(DEV10G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA, x) 1168 + 1169 + #define DEV10G_MAC_ADV_CHK_CFG_SFD_CHK_ENA BIT(16) 1170 + #define DEV10G_MAC_ADV_CHK_CFG_SFD_CHK_ENA_SET(x)\ 1171 + FIELD_PREP(DEV10G_MAC_ADV_CHK_CFG_SFD_CHK_ENA, x) 1172 + #define DEV10G_MAC_ADV_CHK_CFG_SFD_CHK_ENA_GET(x)\ 1173 + FIELD_GET(DEV10G_MAC_ADV_CHK_CFG_SFD_CHK_ENA, x) 1174 + 1175 + #define DEV10G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS BIT(12) 1176 + #define DEV10G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS_SET(x)\ 1177 + FIELD_PREP(DEV10G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS, x) 1178 + #define DEV10G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS_GET(x)\ 1179 + FIELD_GET(DEV10G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS, x) 1180 + 1181 + #define DEV10G_MAC_ADV_CHK_CFG_PRM_CHK_ENA BIT(8) 1182 + #define DEV10G_MAC_ADV_CHK_CFG_PRM_CHK_ENA_SET(x)\ 1183 + FIELD_PREP(DEV10G_MAC_ADV_CHK_CFG_PRM_CHK_ENA, x) 1184 + #define DEV10G_MAC_ADV_CHK_CFG_PRM_CHK_ENA_GET(x)\ 1185 + FIELD_GET(DEV10G_MAC_ADV_CHK_CFG_PRM_CHK_ENA, x) 1186 + 1187 + #define DEV10G_MAC_ADV_CHK_CFG_OOR_ERR_ENA BIT(4) 1188 + #define DEV10G_MAC_ADV_CHK_CFG_OOR_ERR_ENA_SET(x)\ 1189 + FIELD_PREP(DEV10G_MAC_ADV_CHK_CFG_OOR_ERR_ENA, x) 1190 + #define DEV10G_MAC_ADV_CHK_CFG_OOR_ERR_ENA_GET(x)\ 1191 + FIELD_GET(DEV10G_MAC_ADV_CHK_CFG_OOR_ERR_ENA, x) 1192 + 1193 + #define DEV10G_MAC_ADV_CHK_CFG_INR_ERR_ENA BIT(0) 1194 + #define DEV10G_MAC_ADV_CHK_CFG_INR_ERR_ENA_SET(x)\ 1195 + FIELD_PREP(DEV10G_MAC_ADV_CHK_CFG_INR_ERR_ENA, x) 1196 + #define DEV10G_MAC_ADV_CHK_CFG_INR_ERR_ENA_GET(x)\ 1197 + FIELD_GET(DEV10G_MAC_ADV_CHK_CFG_INR_ERR_ENA, x) 1198 + 1199 + /* DEV10G:MAC_CFG_STATUS:MAC_TX_MONITOR_STICKY */ 1200 + #define DEV10G_MAC_TX_MONITOR_STICKY(t) __REG(TARGET_DEV10G, t, 12, 0, 0, 1, 60, 48, 0, 1, 4) 1201 + 1202 + #define DEV10G_MAC_TX_MONITOR_STICKY_LOCAL_ERR_STATE_STICKY BIT(4) 1203 + #define DEV10G_MAC_TX_MONITOR_STICKY_LOCAL_ERR_STATE_STICKY_SET(x)\ 1204 + FIELD_PREP(DEV10G_MAC_TX_MONITOR_STICKY_LOCAL_ERR_STATE_STICKY, x) 1205 + #define DEV10G_MAC_TX_MONITOR_STICKY_LOCAL_ERR_STATE_STICKY_GET(x)\ 1206 + FIELD_GET(DEV10G_MAC_TX_MONITOR_STICKY_LOCAL_ERR_STATE_STICKY, x) 1207 + 1208 + #define DEV10G_MAC_TX_MONITOR_STICKY_REMOTE_ERR_STATE_STICKY BIT(3) 1209 + #define DEV10G_MAC_TX_MONITOR_STICKY_REMOTE_ERR_STATE_STICKY_SET(x)\ 1210 + FIELD_PREP(DEV10G_MAC_TX_MONITOR_STICKY_REMOTE_ERR_STATE_STICKY, x) 1211 + #define DEV10G_MAC_TX_MONITOR_STICKY_REMOTE_ERR_STATE_STICKY_GET(x)\ 1212 + FIELD_GET(DEV10G_MAC_TX_MONITOR_STICKY_REMOTE_ERR_STATE_STICKY, x) 1213 + 1214 + #define DEV10G_MAC_TX_MONITOR_STICKY_LINK_INTERRUPTION_STATE_STICKY BIT(2) 1215 + #define DEV10G_MAC_TX_MONITOR_STICKY_LINK_INTERRUPTION_STATE_STICKY_SET(x)\ 1216 + FIELD_PREP(DEV10G_MAC_TX_MONITOR_STICKY_LINK_INTERRUPTION_STATE_STICKY, x) 1217 + #define DEV10G_MAC_TX_MONITOR_STICKY_LINK_INTERRUPTION_STATE_STICKY_GET(x)\ 1218 + FIELD_GET(DEV10G_MAC_TX_MONITOR_STICKY_LINK_INTERRUPTION_STATE_STICKY, x) 1219 + 1220 + #define DEV10G_MAC_TX_MONITOR_STICKY_IDLE_STATE_STICKY BIT(1) 1221 + #define DEV10G_MAC_TX_MONITOR_STICKY_IDLE_STATE_STICKY_SET(x)\ 1222 + FIELD_PREP(DEV10G_MAC_TX_MONITOR_STICKY_IDLE_STATE_STICKY, x) 1223 + #define DEV10G_MAC_TX_MONITOR_STICKY_IDLE_STATE_STICKY_GET(x)\ 1224 + FIELD_GET(DEV10G_MAC_TX_MONITOR_STICKY_IDLE_STATE_STICKY, x) 1225 + 1226 + #define DEV10G_MAC_TX_MONITOR_STICKY_DIS_STATE_STICKY BIT(0) 1227 + #define DEV10G_MAC_TX_MONITOR_STICKY_DIS_STATE_STICKY_SET(x)\ 1228 + FIELD_PREP(DEV10G_MAC_TX_MONITOR_STICKY_DIS_STATE_STICKY, x) 1229 + #define DEV10G_MAC_TX_MONITOR_STICKY_DIS_STATE_STICKY_GET(x)\ 1230 + FIELD_GET(DEV10G_MAC_TX_MONITOR_STICKY_DIS_STATE_STICKY, x) 1231 + 1232 + /* DEV10G:DEV_CFG_STATUS:DEV_RST_CTRL */ 1233 + #define DEV10G_DEV_RST_CTRL(t) __REG(TARGET_DEV10G, t, 12, 436, 0, 1, 52, 0, 0, 1, 4) 1234 + 1235 + #define DEV10G_DEV_RST_CTRL_PARDET_MODE_ENA BIT(28) 1236 + #define DEV10G_DEV_RST_CTRL_PARDET_MODE_ENA_SET(x)\ 1237 + FIELD_PREP(DEV10G_DEV_RST_CTRL_PARDET_MODE_ENA, x) 1238 + #define DEV10G_DEV_RST_CTRL_PARDET_MODE_ENA_GET(x)\ 1239 + FIELD_GET(DEV10G_DEV_RST_CTRL_PARDET_MODE_ENA, x) 1240 + 1241 + #define DEV10G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS BIT(27) 1242 + #define DEV10G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_SET(x)\ 1243 + FIELD_PREP(DEV10G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 1244 + #define DEV10G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_GET(x)\ 1245 + FIELD_GET(DEV10G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 1246 + 1247 + #define DEV10G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS GENMASK(26, 25) 1248 + #define DEV10G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS_SET(x)\ 1249 + FIELD_PREP(DEV10G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS, x) 1250 + #define DEV10G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS_GET(x)\ 1251 + FIELD_GET(DEV10G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS, x) 1252 + 1253 + #define DEV10G_DEV_RST_CTRL_SERDES_SPEED_SEL GENMASK(24, 23) 1254 + #define DEV10G_DEV_RST_CTRL_SERDES_SPEED_SEL_SET(x)\ 1255 + FIELD_PREP(DEV10G_DEV_RST_CTRL_SERDES_SPEED_SEL, x) 1256 + #define DEV10G_DEV_RST_CTRL_SERDES_SPEED_SEL_GET(x)\ 1257 + FIELD_GET(DEV10G_DEV_RST_CTRL_SERDES_SPEED_SEL, x) 1258 + 1259 + #define DEV10G_DEV_RST_CTRL_SPEED_SEL GENMASK(22, 20) 1260 + #define DEV10G_DEV_RST_CTRL_SPEED_SEL_SET(x)\ 1261 + FIELD_PREP(DEV10G_DEV_RST_CTRL_SPEED_SEL, x) 1262 + #define DEV10G_DEV_RST_CTRL_SPEED_SEL_GET(x)\ 1263 + FIELD_GET(DEV10G_DEV_RST_CTRL_SPEED_SEL, x) 1264 + 1265 + #define DEV10G_DEV_RST_CTRL_PCS_TX_RST BIT(12) 1266 + #define DEV10G_DEV_RST_CTRL_PCS_TX_RST_SET(x)\ 1267 + FIELD_PREP(DEV10G_DEV_RST_CTRL_PCS_TX_RST, x) 1268 + #define DEV10G_DEV_RST_CTRL_PCS_TX_RST_GET(x)\ 1269 + FIELD_GET(DEV10G_DEV_RST_CTRL_PCS_TX_RST, x) 1270 + 1271 + #define DEV10G_DEV_RST_CTRL_PCS_RX_RST BIT(8) 1272 + #define DEV10G_DEV_RST_CTRL_PCS_RX_RST_SET(x)\ 1273 + FIELD_PREP(DEV10G_DEV_RST_CTRL_PCS_RX_RST, x) 1274 + #define DEV10G_DEV_RST_CTRL_PCS_RX_RST_GET(x)\ 1275 + FIELD_GET(DEV10G_DEV_RST_CTRL_PCS_RX_RST, x) 1276 + 1277 + #define DEV10G_DEV_RST_CTRL_MAC_TX_RST BIT(4) 1278 + #define DEV10G_DEV_RST_CTRL_MAC_TX_RST_SET(x)\ 1279 + FIELD_PREP(DEV10G_DEV_RST_CTRL_MAC_TX_RST, x) 1280 + #define DEV10G_DEV_RST_CTRL_MAC_TX_RST_GET(x)\ 1281 + FIELD_GET(DEV10G_DEV_RST_CTRL_MAC_TX_RST, x) 1282 + 1283 + #define DEV10G_DEV_RST_CTRL_MAC_RX_RST BIT(0) 1284 + #define DEV10G_DEV_RST_CTRL_MAC_RX_RST_SET(x)\ 1285 + FIELD_PREP(DEV10G_DEV_RST_CTRL_MAC_RX_RST, x) 1286 + #define DEV10G_DEV_RST_CTRL_MAC_RX_RST_GET(x)\ 1287 + FIELD_GET(DEV10G_DEV_RST_CTRL_MAC_RX_RST, x) 1288 + 1289 + /* DEV10G:PCS25G_CFG_STATUS:PCS25G_CFG */ 1290 + #define DEV10G_PCS25G_CFG(t) __REG(TARGET_DEV10G, t, 12, 488, 0, 1, 32, 0, 0, 1, 4) 1291 + 1292 + #define DEV10G_PCS25G_CFG_PCS25G_ENA BIT(0) 1293 + #define DEV10G_PCS25G_CFG_PCS25G_ENA_SET(x)\ 1294 + FIELD_PREP(DEV10G_PCS25G_CFG_PCS25G_ENA, x) 1295 + #define DEV10G_PCS25G_CFG_PCS25G_ENA_GET(x)\ 1296 + FIELD_GET(DEV10G_PCS25G_CFG_PCS25G_ENA, x) 1297 + 1298 + /* DEV10G:MAC_CFG_STATUS:MAC_ENA_CFG */ 1299 + #define DEV25G_MAC_ENA_CFG(t) __REG(TARGET_DEV25G, t, 8, 0, 0, 1, 60, 0, 0, 1, 4) 1300 + 1301 + #define DEV25G_MAC_ENA_CFG_RX_ENA BIT(4) 1302 + #define DEV25G_MAC_ENA_CFG_RX_ENA_SET(x)\ 1303 + FIELD_PREP(DEV25G_MAC_ENA_CFG_RX_ENA, x) 1304 + #define DEV25G_MAC_ENA_CFG_RX_ENA_GET(x)\ 1305 + FIELD_GET(DEV25G_MAC_ENA_CFG_RX_ENA, x) 1306 + 1307 + #define DEV25G_MAC_ENA_CFG_TX_ENA BIT(0) 1308 + #define DEV25G_MAC_ENA_CFG_TX_ENA_SET(x)\ 1309 + FIELD_PREP(DEV25G_MAC_ENA_CFG_TX_ENA, x) 1310 + #define DEV25G_MAC_ENA_CFG_TX_ENA_GET(x)\ 1311 + FIELD_GET(DEV25G_MAC_ENA_CFG_TX_ENA, x) 1312 + 1313 + /* DEV10G:MAC_CFG_STATUS:MAC_MAXLEN_CFG */ 1314 + #define DEV25G_MAC_MAXLEN_CFG(t) __REG(TARGET_DEV25G, t, 8, 0, 0, 1, 60, 8, 0, 1, 4) 1315 + 1316 + #define DEV25G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK BIT(16) 1317 + #define DEV25G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK_SET(x)\ 1318 + FIELD_PREP(DEV25G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK, x) 1319 + #define DEV25G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK_GET(x)\ 1320 + FIELD_GET(DEV25G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK, x) 1321 + 1322 + #define DEV25G_MAC_MAXLEN_CFG_MAX_LEN GENMASK(15, 0) 1323 + #define DEV25G_MAC_MAXLEN_CFG_MAX_LEN_SET(x)\ 1324 + FIELD_PREP(DEV25G_MAC_MAXLEN_CFG_MAX_LEN, x) 1325 + #define DEV25G_MAC_MAXLEN_CFG_MAX_LEN_GET(x)\ 1326 + FIELD_GET(DEV25G_MAC_MAXLEN_CFG_MAX_LEN, x) 1327 + 1328 + /* DEV10G:MAC_CFG_STATUS:MAC_ADV_CHK_CFG */ 1329 + #define DEV25G_MAC_ADV_CHK_CFG(t) __REG(TARGET_DEV25G, t, 8, 0, 0, 1, 60, 28, 0, 1, 4) 1330 + 1331 + #define DEV25G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA BIT(24) 1332 + #define DEV25G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA_SET(x)\ 1333 + FIELD_PREP(DEV25G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA, x) 1334 + #define DEV25G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA_GET(x)\ 1335 + FIELD_GET(DEV25G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA, x) 1336 + 1337 + #define DEV25G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA BIT(20) 1338 + #define DEV25G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA_SET(x)\ 1339 + FIELD_PREP(DEV25G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA, x) 1340 + #define DEV25G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA_GET(x)\ 1341 + FIELD_GET(DEV25G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA, x) 1342 + 1343 + #define DEV25G_MAC_ADV_CHK_CFG_SFD_CHK_ENA BIT(16) 1344 + #define DEV25G_MAC_ADV_CHK_CFG_SFD_CHK_ENA_SET(x)\ 1345 + FIELD_PREP(DEV25G_MAC_ADV_CHK_CFG_SFD_CHK_ENA, x) 1346 + #define DEV25G_MAC_ADV_CHK_CFG_SFD_CHK_ENA_GET(x)\ 1347 + FIELD_GET(DEV25G_MAC_ADV_CHK_CFG_SFD_CHK_ENA, x) 1348 + 1349 + #define DEV25G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS BIT(12) 1350 + #define DEV25G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS_SET(x)\ 1351 + FIELD_PREP(DEV25G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS, x) 1352 + #define DEV25G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS_GET(x)\ 1353 + FIELD_GET(DEV25G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS, x) 1354 + 1355 + #define DEV25G_MAC_ADV_CHK_CFG_PRM_CHK_ENA BIT(8) 1356 + #define DEV25G_MAC_ADV_CHK_CFG_PRM_CHK_ENA_SET(x)\ 1357 + FIELD_PREP(DEV25G_MAC_ADV_CHK_CFG_PRM_CHK_ENA, x) 1358 + #define DEV25G_MAC_ADV_CHK_CFG_PRM_CHK_ENA_GET(x)\ 1359 + FIELD_GET(DEV25G_MAC_ADV_CHK_CFG_PRM_CHK_ENA, x) 1360 + 1361 + #define DEV25G_MAC_ADV_CHK_CFG_OOR_ERR_ENA BIT(4) 1362 + #define DEV25G_MAC_ADV_CHK_CFG_OOR_ERR_ENA_SET(x)\ 1363 + FIELD_PREP(DEV25G_MAC_ADV_CHK_CFG_OOR_ERR_ENA, x) 1364 + #define DEV25G_MAC_ADV_CHK_CFG_OOR_ERR_ENA_GET(x)\ 1365 + FIELD_GET(DEV25G_MAC_ADV_CHK_CFG_OOR_ERR_ENA, x) 1366 + 1367 + #define DEV25G_MAC_ADV_CHK_CFG_INR_ERR_ENA BIT(0) 1368 + #define DEV25G_MAC_ADV_CHK_CFG_INR_ERR_ENA_SET(x)\ 1369 + FIELD_PREP(DEV25G_MAC_ADV_CHK_CFG_INR_ERR_ENA, x) 1370 + #define DEV25G_MAC_ADV_CHK_CFG_INR_ERR_ENA_GET(x)\ 1371 + FIELD_GET(DEV25G_MAC_ADV_CHK_CFG_INR_ERR_ENA, x) 1372 + 1373 + /* DEV10G:DEV_CFG_STATUS:DEV_RST_CTRL */ 1374 + #define DEV25G_DEV_RST_CTRL(t) __REG(TARGET_DEV25G, t, 8, 436, 0, 1, 52, 0, 0, 1, 4) 1375 + 1376 + #define DEV25G_DEV_RST_CTRL_PARDET_MODE_ENA BIT(28) 1377 + #define DEV25G_DEV_RST_CTRL_PARDET_MODE_ENA_SET(x)\ 1378 + FIELD_PREP(DEV25G_DEV_RST_CTRL_PARDET_MODE_ENA, x) 1379 + #define DEV25G_DEV_RST_CTRL_PARDET_MODE_ENA_GET(x)\ 1380 + FIELD_GET(DEV25G_DEV_RST_CTRL_PARDET_MODE_ENA, x) 1381 + 1382 + #define DEV25G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS BIT(27) 1383 + #define DEV25G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_SET(x)\ 1384 + FIELD_PREP(DEV25G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 1385 + #define DEV25G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_GET(x)\ 1386 + FIELD_GET(DEV25G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 1387 + 1388 + #define DEV25G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS GENMASK(26, 25) 1389 + #define DEV25G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS_SET(x)\ 1390 + FIELD_PREP(DEV25G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS, x) 1391 + #define DEV25G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS_GET(x)\ 1392 + FIELD_GET(DEV25G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS, x) 1393 + 1394 + #define DEV25G_DEV_RST_CTRL_SERDES_SPEED_SEL GENMASK(24, 23) 1395 + #define DEV25G_DEV_RST_CTRL_SERDES_SPEED_SEL_SET(x)\ 1396 + FIELD_PREP(DEV25G_DEV_RST_CTRL_SERDES_SPEED_SEL, x) 1397 + #define DEV25G_DEV_RST_CTRL_SERDES_SPEED_SEL_GET(x)\ 1398 + FIELD_GET(DEV25G_DEV_RST_CTRL_SERDES_SPEED_SEL, x) 1399 + 1400 + #define DEV25G_DEV_RST_CTRL_SPEED_SEL GENMASK(22, 20) 1401 + #define DEV25G_DEV_RST_CTRL_SPEED_SEL_SET(x)\ 1402 + FIELD_PREP(DEV25G_DEV_RST_CTRL_SPEED_SEL, x) 1403 + #define DEV25G_DEV_RST_CTRL_SPEED_SEL_GET(x)\ 1404 + FIELD_GET(DEV25G_DEV_RST_CTRL_SPEED_SEL, x) 1405 + 1406 + #define DEV25G_DEV_RST_CTRL_PCS_TX_RST BIT(12) 1407 + #define DEV25G_DEV_RST_CTRL_PCS_TX_RST_SET(x)\ 1408 + FIELD_PREP(DEV25G_DEV_RST_CTRL_PCS_TX_RST, x) 1409 + #define DEV25G_DEV_RST_CTRL_PCS_TX_RST_GET(x)\ 1410 + FIELD_GET(DEV25G_DEV_RST_CTRL_PCS_TX_RST, x) 1411 + 1412 + #define DEV25G_DEV_RST_CTRL_PCS_RX_RST BIT(8) 1413 + #define DEV25G_DEV_RST_CTRL_PCS_RX_RST_SET(x)\ 1414 + FIELD_PREP(DEV25G_DEV_RST_CTRL_PCS_RX_RST, x) 1415 + #define DEV25G_DEV_RST_CTRL_PCS_RX_RST_GET(x)\ 1416 + FIELD_GET(DEV25G_DEV_RST_CTRL_PCS_RX_RST, x) 1417 + 1418 + #define DEV25G_DEV_RST_CTRL_MAC_TX_RST BIT(4) 1419 + #define DEV25G_DEV_RST_CTRL_MAC_TX_RST_SET(x)\ 1420 + FIELD_PREP(DEV25G_DEV_RST_CTRL_MAC_TX_RST, x) 1421 + #define DEV25G_DEV_RST_CTRL_MAC_TX_RST_GET(x)\ 1422 + FIELD_GET(DEV25G_DEV_RST_CTRL_MAC_TX_RST, x) 1423 + 1424 + #define DEV25G_DEV_RST_CTRL_MAC_RX_RST BIT(0) 1425 + #define DEV25G_DEV_RST_CTRL_MAC_RX_RST_SET(x)\ 1426 + FIELD_PREP(DEV25G_DEV_RST_CTRL_MAC_RX_RST, x) 1427 + #define DEV25G_DEV_RST_CTRL_MAC_RX_RST_GET(x)\ 1428 + FIELD_GET(DEV25G_DEV_RST_CTRL_MAC_RX_RST, x) 1429 + 1430 + /* DEV10G:PCS25G_CFG_STATUS:PCS25G_CFG */ 1431 + #define DEV25G_PCS25G_CFG(t) __REG(TARGET_DEV25G, t, 8, 488, 0, 1, 32, 0, 0, 1, 4) 1432 + 1433 + #define DEV25G_PCS25G_CFG_PCS25G_ENA BIT(0) 1434 + #define DEV25G_PCS25G_CFG_PCS25G_ENA_SET(x)\ 1435 + FIELD_PREP(DEV25G_PCS25G_CFG_PCS25G_ENA, x) 1436 + #define DEV25G_PCS25G_CFG_PCS25G_ENA_GET(x)\ 1437 + FIELD_GET(DEV25G_PCS25G_CFG_PCS25G_ENA, x) 1438 + 1439 + /* DEV10G:PCS25G_CFG_STATUS:PCS25G_SD_CFG */ 1440 + #define DEV25G_PCS25G_SD_CFG(t) __REG(TARGET_DEV25G, t, 8, 488, 0, 1, 32, 4, 0, 1, 4) 1441 + 1442 + #define DEV25G_PCS25G_SD_CFG_SD_SEL BIT(8) 1443 + #define DEV25G_PCS25G_SD_CFG_SD_SEL_SET(x)\ 1444 + FIELD_PREP(DEV25G_PCS25G_SD_CFG_SD_SEL, x) 1445 + #define DEV25G_PCS25G_SD_CFG_SD_SEL_GET(x)\ 1446 + FIELD_GET(DEV25G_PCS25G_SD_CFG_SD_SEL, x) 1447 + 1448 + #define DEV25G_PCS25G_SD_CFG_SD_POL BIT(4) 1449 + #define DEV25G_PCS25G_SD_CFG_SD_POL_SET(x)\ 1450 + FIELD_PREP(DEV25G_PCS25G_SD_CFG_SD_POL, x) 1451 + #define DEV25G_PCS25G_SD_CFG_SD_POL_GET(x)\ 1452 + FIELD_GET(DEV25G_PCS25G_SD_CFG_SD_POL, x) 1453 + 1454 + #define DEV25G_PCS25G_SD_CFG_SD_ENA BIT(0) 1455 + #define DEV25G_PCS25G_SD_CFG_SD_ENA_SET(x)\ 1456 + FIELD_PREP(DEV25G_PCS25G_SD_CFG_SD_ENA, x) 1457 + #define DEV25G_PCS25G_SD_CFG_SD_ENA_GET(x)\ 1458 + FIELD_GET(DEV25G_PCS25G_SD_CFG_SD_ENA, x) 1459 + 1460 + /* DEV1G:DEV_CFG_STATUS:DEV_RST_CTRL */ 1461 + #define DEV2G5_DEV_RST_CTRL(t) __REG(TARGET_DEV2G5, t, 65, 0, 0, 1, 36, 0, 0, 1, 4) 1462 + 1463 + #define DEV2G5_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS BIT(23) 1464 + #define DEV2G5_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_SET(x)\ 1465 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 1466 + #define DEV2G5_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_GET(x)\ 1467 + FIELD_GET(DEV2G5_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 1468 + 1469 + #define DEV2G5_DEV_RST_CTRL_SPEED_SEL GENMASK(22, 20) 1470 + #define DEV2G5_DEV_RST_CTRL_SPEED_SEL_SET(x)\ 1471 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_SPEED_SEL, x) 1472 + #define DEV2G5_DEV_RST_CTRL_SPEED_SEL_GET(x)\ 1473 + FIELD_GET(DEV2G5_DEV_RST_CTRL_SPEED_SEL, x) 1474 + 1475 + #define DEV2G5_DEV_RST_CTRL_USX_PCS_TX_RST BIT(17) 1476 + #define DEV2G5_DEV_RST_CTRL_USX_PCS_TX_RST_SET(x)\ 1477 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_USX_PCS_TX_RST, x) 1478 + #define DEV2G5_DEV_RST_CTRL_USX_PCS_TX_RST_GET(x)\ 1479 + FIELD_GET(DEV2G5_DEV_RST_CTRL_USX_PCS_TX_RST, x) 1480 + 1481 + #define DEV2G5_DEV_RST_CTRL_USX_PCS_RX_RST BIT(16) 1482 + #define DEV2G5_DEV_RST_CTRL_USX_PCS_RX_RST_SET(x)\ 1483 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_USX_PCS_RX_RST, x) 1484 + #define DEV2G5_DEV_RST_CTRL_USX_PCS_RX_RST_GET(x)\ 1485 + FIELD_GET(DEV2G5_DEV_RST_CTRL_USX_PCS_RX_RST, x) 1486 + 1487 + #define DEV2G5_DEV_RST_CTRL_PCS_TX_RST BIT(12) 1488 + #define DEV2G5_DEV_RST_CTRL_PCS_TX_RST_SET(x)\ 1489 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_PCS_TX_RST, x) 1490 + #define DEV2G5_DEV_RST_CTRL_PCS_TX_RST_GET(x)\ 1491 + FIELD_GET(DEV2G5_DEV_RST_CTRL_PCS_TX_RST, x) 1492 + 1493 + #define DEV2G5_DEV_RST_CTRL_PCS_RX_RST BIT(8) 1494 + #define DEV2G5_DEV_RST_CTRL_PCS_RX_RST_SET(x)\ 1495 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_PCS_RX_RST, x) 1496 + #define DEV2G5_DEV_RST_CTRL_PCS_RX_RST_GET(x)\ 1497 + FIELD_GET(DEV2G5_DEV_RST_CTRL_PCS_RX_RST, x) 1498 + 1499 + #define DEV2G5_DEV_RST_CTRL_MAC_TX_RST BIT(4) 1500 + #define DEV2G5_DEV_RST_CTRL_MAC_TX_RST_SET(x)\ 1501 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_MAC_TX_RST, x) 1502 + #define DEV2G5_DEV_RST_CTRL_MAC_TX_RST_GET(x)\ 1503 + FIELD_GET(DEV2G5_DEV_RST_CTRL_MAC_TX_RST, x) 1504 + 1505 + #define DEV2G5_DEV_RST_CTRL_MAC_RX_RST BIT(0) 1506 + #define DEV2G5_DEV_RST_CTRL_MAC_RX_RST_SET(x)\ 1507 + FIELD_PREP(DEV2G5_DEV_RST_CTRL_MAC_RX_RST, x) 1508 + #define DEV2G5_DEV_RST_CTRL_MAC_RX_RST_GET(x)\ 1509 + FIELD_GET(DEV2G5_DEV_RST_CTRL_MAC_RX_RST, x) 1510 + 1511 + /* DEV1G:MAC_CFG_STATUS:MAC_ENA_CFG */ 1512 + #define DEV2G5_MAC_ENA_CFG(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 0, 0, 1, 4) 1513 + 1514 + #define DEV2G5_MAC_ENA_CFG_RX_ENA BIT(4) 1515 + #define DEV2G5_MAC_ENA_CFG_RX_ENA_SET(x)\ 1516 + FIELD_PREP(DEV2G5_MAC_ENA_CFG_RX_ENA, x) 1517 + #define DEV2G5_MAC_ENA_CFG_RX_ENA_GET(x)\ 1518 + FIELD_GET(DEV2G5_MAC_ENA_CFG_RX_ENA, x) 1519 + 1520 + #define DEV2G5_MAC_ENA_CFG_TX_ENA BIT(0) 1521 + #define DEV2G5_MAC_ENA_CFG_TX_ENA_SET(x)\ 1522 + FIELD_PREP(DEV2G5_MAC_ENA_CFG_TX_ENA, x) 1523 + #define DEV2G5_MAC_ENA_CFG_TX_ENA_GET(x)\ 1524 + FIELD_GET(DEV2G5_MAC_ENA_CFG_TX_ENA, x) 1525 + 1526 + /* DEV1G:MAC_CFG_STATUS:MAC_MODE_CFG */ 1527 + #define DEV2G5_MAC_MODE_CFG(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 4, 0, 1, 4) 1528 + 1529 + #define DEV2G5_MAC_MODE_CFG_FC_WORD_SYNC_ENA BIT(8) 1530 + #define DEV2G5_MAC_MODE_CFG_FC_WORD_SYNC_ENA_SET(x)\ 1531 + FIELD_PREP(DEV2G5_MAC_MODE_CFG_FC_WORD_SYNC_ENA, x) 1532 + #define DEV2G5_MAC_MODE_CFG_FC_WORD_SYNC_ENA_GET(x)\ 1533 + FIELD_GET(DEV2G5_MAC_MODE_CFG_FC_WORD_SYNC_ENA, x) 1534 + 1535 + #define DEV2G5_MAC_MODE_CFG_GIGA_MODE_ENA BIT(4) 1536 + #define DEV2G5_MAC_MODE_CFG_GIGA_MODE_ENA_SET(x)\ 1537 + FIELD_PREP(DEV2G5_MAC_MODE_CFG_GIGA_MODE_ENA, x) 1538 + #define DEV2G5_MAC_MODE_CFG_GIGA_MODE_ENA_GET(x)\ 1539 + FIELD_GET(DEV2G5_MAC_MODE_CFG_GIGA_MODE_ENA, x) 1540 + 1541 + #define DEV2G5_MAC_MODE_CFG_FDX_ENA BIT(0) 1542 + #define DEV2G5_MAC_MODE_CFG_FDX_ENA_SET(x)\ 1543 + FIELD_PREP(DEV2G5_MAC_MODE_CFG_FDX_ENA, x) 1544 + #define DEV2G5_MAC_MODE_CFG_FDX_ENA_GET(x)\ 1545 + FIELD_GET(DEV2G5_MAC_MODE_CFG_FDX_ENA, x) 1546 + 1547 + /* DEV1G:MAC_CFG_STATUS:MAC_MAXLEN_CFG */ 1548 + #define DEV2G5_MAC_MAXLEN_CFG(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 8, 0, 1, 4) 1549 + 1550 + #define DEV2G5_MAC_MAXLEN_CFG_MAX_LEN GENMASK(15, 0) 1551 + #define DEV2G5_MAC_MAXLEN_CFG_MAX_LEN_SET(x)\ 1552 + FIELD_PREP(DEV2G5_MAC_MAXLEN_CFG_MAX_LEN, x) 1553 + #define DEV2G5_MAC_MAXLEN_CFG_MAX_LEN_GET(x)\ 1554 + FIELD_GET(DEV2G5_MAC_MAXLEN_CFG_MAX_LEN, x) 1555 + 1556 + /* DEV1G:MAC_CFG_STATUS:MAC_TAGS_CFG */ 1557 + #define DEV2G5_MAC_TAGS_CFG(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 12, 0, 1, 4) 1558 + 1559 + #define DEV2G5_MAC_TAGS_CFG_TAG_ID GENMASK(31, 16) 1560 + #define DEV2G5_MAC_TAGS_CFG_TAG_ID_SET(x)\ 1561 + FIELD_PREP(DEV2G5_MAC_TAGS_CFG_TAG_ID, x) 1562 + #define DEV2G5_MAC_TAGS_CFG_TAG_ID_GET(x)\ 1563 + FIELD_GET(DEV2G5_MAC_TAGS_CFG_TAG_ID, x) 1564 + 1565 + #define DEV2G5_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA BIT(3) 1566 + #define DEV2G5_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA_SET(x)\ 1567 + FIELD_PREP(DEV2G5_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, x) 1568 + #define DEV2G5_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA_GET(x)\ 1569 + FIELD_GET(DEV2G5_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, x) 1570 + 1571 + #define DEV2G5_MAC_TAGS_CFG_PB_ENA GENMASK(2, 1) 1572 + #define DEV2G5_MAC_TAGS_CFG_PB_ENA_SET(x)\ 1573 + FIELD_PREP(DEV2G5_MAC_TAGS_CFG_PB_ENA, x) 1574 + #define DEV2G5_MAC_TAGS_CFG_PB_ENA_GET(x)\ 1575 + FIELD_GET(DEV2G5_MAC_TAGS_CFG_PB_ENA, x) 1576 + 1577 + #define DEV2G5_MAC_TAGS_CFG_VLAN_AWR_ENA BIT(0) 1578 + #define DEV2G5_MAC_TAGS_CFG_VLAN_AWR_ENA_SET(x)\ 1579 + FIELD_PREP(DEV2G5_MAC_TAGS_CFG_VLAN_AWR_ENA, x) 1580 + #define DEV2G5_MAC_TAGS_CFG_VLAN_AWR_ENA_GET(x)\ 1581 + FIELD_GET(DEV2G5_MAC_TAGS_CFG_VLAN_AWR_ENA, x) 1582 + 1583 + /* DEV1G:MAC_CFG_STATUS:MAC_TAGS_CFG2 */ 1584 + #define DEV2G5_MAC_TAGS_CFG2(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 16, 0, 1, 4) 1585 + 1586 + #define DEV2G5_MAC_TAGS_CFG2_TAG_ID3 GENMASK(31, 16) 1587 + #define DEV2G5_MAC_TAGS_CFG2_TAG_ID3_SET(x)\ 1588 + FIELD_PREP(DEV2G5_MAC_TAGS_CFG2_TAG_ID3, x) 1589 + #define DEV2G5_MAC_TAGS_CFG2_TAG_ID3_GET(x)\ 1590 + FIELD_GET(DEV2G5_MAC_TAGS_CFG2_TAG_ID3, x) 1591 + 1592 + #define DEV2G5_MAC_TAGS_CFG2_TAG_ID2 GENMASK(15, 0) 1593 + #define DEV2G5_MAC_TAGS_CFG2_TAG_ID2_SET(x)\ 1594 + FIELD_PREP(DEV2G5_MAC_TAGS_CFG2_TAG_ID2, x) 1595 + #define DEV2G5_MAC_TAGS_CFG2_TAG_ID2_GET(x)\ 1596 + FIELD_GET(DEV2G5_MAC_TAGS_CFG2_TAG_ID2, x) 1597 + 1598 + /* DEV1G:MAC_CFG_STATUS:MAC_ADV_CHK_CFG */ 1599 + #define DEV2G5_MAC_ADV_CHK_CFG(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 20, 0, 1, 4) 1600 + 1601 + #define DEV2G5_MAC_ADV_CHK_CFG_LEN_DROP_ENA BIT(0) 1602 + #define DEV2G5_MAC_ADV_CHK_CFG_LEN_DROP_ENA_SET(x)\ 1603 + FIELD_PREP(DEV2G5_MAC_ADV_CHK_CFG_LEN_DROP_ENA, x) 1604 + #define DEV2G5_MAC_ADV_CHK_CFG_LEN_DROP_ENA_GET(x)\ 1605 + FIELD_GET(DEV2G5_MAC_ADV_CHK_CFG_LEN_DROP_ENA, x) 1606 + 1607 + /* DEV1G:MAC_CFG_STATUS:MAC_IFG_CFG */ 1608 + #define DEV2G5_MAC_IFG_CFG(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 24, 0, 1, 4) 1609 + 1610 + #define DEV2G5_MAC_IFG_CFG_RESTORE_OLD_IPG_CHECK BIT(17) 1611 + #define DEV2G5_MAC_IFG_CFG_RESTORE_OLD_IPG_CHECK_SET(x)\ 1612 + FIELD_PREP(DEV2G5_MAC_IFG_CFG_RESTORE_OLD_IPG_CHECK, x) 1613 + #define DEV2G5_MAC_IFG_CFG_RESTORE_OLD_IPG_CHECK_GET(x)\ 1614 + FIELD_GET(DEV2G5_MAC_IFG_CFG_RESTORE_OLD_IPG_CHECK, x) 1615 + 1616 + #define DEV2G5_MAC_IFG_CFG_TX_IFG GENMASK(12, 8) 1617 + #define DEV2G5_MAC_IFG_CFG_TX_IFG_SET(x)\ 1618 + FIELD_PREP(DEV2G5_MAC_IFG_CFG_TX_IFG, x) 1619 + #define DEV2G5_MAC_IFG_CFG_TX_IFG_GET(x)\ 1620 + FIELD_GET(DEV2G5_MAC_IFG_CFG_TX_IFG, x) 1621 + 1622 + #define DEV2G5_MAC_IFG_CFG_RX_IFG2 GENMASK(7, 4) 1623 + #define DEV2G5_MAC_IFG_CFG_RX_IFG2_SET(x)\ 1624 + FIELD_PREP(DEV2G5_MAC_IFG_CFG_RX_IFG2, x) 1625 + #define DEV2G5_MAC_IFG_CFG_RX_IFG2_GET(x)\ 1626 + FIELD_GET(DEV2G5_MAC_IFG_CFG_RX_IFG2, x) 1627 + 1628 + #define DEV2G5_MAC_IFG_CFG_RX_IFG1 GENMASK(3, 0) 1629 + #define DEV2G5_MAC_IFG_CFG_RX_IFG1_SET(x)\ 1630 + FIELD_PREP(DEV2G5_MAC_IFG_CFG_RX_IFG1, x) 1631 + #define DEV2G5_MAC_IFG_CFG_RX_IFG1_GET(x)\ 1632 + FIELD_GET(DEV2G5_MAC_IFG_CFG_RX_IFG1, x) 1633 + 1634 + /* DEV1G:MAC_CFG_STATUS:MAC_HDX_CFG */ 1635 + #define DEV2G5_MAC_HDX_CFG(t) __REG(TARGET_DEV2G5, t, 65, 52, 0, 1, 36, 28, 0, 1, 4) 1636 + 1637 + #define DEV2G5_MAC_HDX_CFG_BYPASS_COL_SYNC BIT(26) 1638 + #define DEV2G5_MAC_HDX_CFG_BYPASS_COL_SYNC_SET(x)\ 1639 + FIELD_PREP(DEV2G5_MAC_HDX_CFG_BYPASS_COL_SYNC, x) 1640 + #define DEV2G5_MAC_HDX_CFG_BYPASS_COL_SYNC_GET(x)\ 1641 + FIELD_GET(DEV2G5_MAC_HDX_CFG_BYPASS_COL_SYNC, x) 1642 + 1643 + #define DEV2G5_MAC_HDX_CFG_SEED GENMASK(23, 16) 1644 + #define DEV2G5_MAC_HDX_CFG_SEED_SET(x)\ 1645 + FIELD_PREP(DEV2G5_MAC_HDX_CFG_SEED, x) 1646 + #define DEV2G5_MAC_HDX_CFG_SEED_GET(x)\ 1647 + FIELD_GET(DEV2G5_MAC_HDX_CFG_SEED, x) 1648 + 1649 + #define DEV2G5_MAC_HDX_CFG_SEED_LOAD BIT(12) 1650 + #define DEV2G5_MAC_HDX_CFG_SEED_LOAD_SET(x)\ 1651 + FIELD_PREP(DEV2G5_MAC_HDX_CFG_SEED_LOAD, x) 1652 + #define DEV2G5_MAC_HDX_CFG_SEED_LOAD_GET(x)\ 1653 + FIELD_GET(DEV2G5_MAC_HDX_CFG_SEED_LOAD, x) 1654 + 1655 + #define DEV2G5_MAC_HDX_CFG_RETRY_AFTER_EXC_COL_ENA BIT(8) 1656 + #define DEV2G5_MAC_HDX_CFG_RETRY_AFTER_EXC_COL_ENA_SET(x)\ 1657 + FIELD_PREP(DEV2G5_MAC_HDX_CFG_RETRY_AFTER_EXC_COL_ENA, x) 1658 + #define DEV2G5_MAC_HDX_CFG_RETRY_AFTER_EXC_COL_ENA_GET(x)\ 1659 + FIELD_GET(DEV2G5_MAC_HDX_CFG_RETRY_AFTER_EXC_COL_ENA, x) 1660 + 1661 + #define DEV2G5_MAC_HDX_CFG_LATE_COL_POS GENMASK(6, 0) 1662 + #define DEV2G5_MAC_HDX_CFG_LATE_COL_POS_SET(x)\ 1663 + FIELD_PREP(DEV2G5_MAC_HDX_CFG_LATE_COL_POS, x) 1664 + #define DEV2G5_MAC_HDX_CFG_LATE_COL_POS_GET(x)\ 1665 + FIELD_GET(DEV2G5_MAC_HDX_CFG_LATE_COL_POS, x) 1666 + 1667 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_CFG */ 1668 + #define DEV2G5_PCS1G_CFG(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 0, 0, 1, 4) 1669 + 1670 + #define DEV2G5_PCS1G_CFG_LINK_STATUS_TYPE BIT(4) 1671 + #define DEV2G5_PCS1G_CFG_LINK_STATUS_TYPE_SET(x)\ 1672 + FIELD_PREP(DEV2G5_PCS1G_CFG_LINK_STATUS_TYPE, x) 1673 + #define DEV2G5_PCS1G_CFG_LINK_STATUS_TYPE_GET(x)\ 1674 + FIELD_GET(DEV2G5_PCS1G_CFG_LINK_STATUS_TYPE, x) 1675 + 1676 + #define DEV2G5_PCS1G_CFG_AN_LINK_CTRL_ENA BIT(1) 1677 + #define DEV2G5_PCS1G_CFG_AN_LINK_CTRL_ENA_SET(x)\ 1678 + FIELD_PREP(DEV2G5_PCS1G_CFG_AN_LINK_CTRL_ENA, x) 1679 + #define DEV2G5_PCS1G_CFG_AN_LINK_CTRL_ENA_GET(x)\ 1680 + FIELD_GET(DEV2G5_PCS1G_CFG_AN_LINK_CTRL_ENA, x) 1681 + 1682 + #define DEV2G5_PCS1G_CFG_PCS_ENA BIT(0) 1683 + #define DEV2G5_PCS1G_CFG_PCS_ENA_SET(x)\ 1684 + FIELD_PREP(DEV2G5_PCS1G_CFG_PCS_ENA, x) 1685 + #define DEV2G5_PCS1G_CFG_PCS_ENA_GET(x)\ 1686 + FIELD_GET(DEV2G5_PCS1G_CFG_PCS_ENA, x) 1687 + 1688 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_MODE_CFG */ 1689 + #define DEV2G5_PCS1G_MODE_CFG(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 4, 0, 1, 4) 1690 + 1691 + #define DEV2G5_PCS1G_MODE_CFG_UNIDIR_MODE_ENA BIT(4) 1692 + #define DEV2G5_PCS1G_MODE_CFG_UNIDIR_MODE_ENA_SET(x)\ 1693 + FIELD_PREP(DEV2G5_PCS1G_MODE_CFG_UNIDIR_MODE_ENA, x) 1694 + #define DEV2G5_PCS1G_MODE_CFG_UNIDIR_MODE_ENA_GET(x)\ 1695 + FIELD_GET(DEV2G5_PCS1G_MODE_CFG_UNIDIR_MODE_ENA, x) 1696 + 1697 + #define DEV2G5_PCS1G_MODE_CFG_SAVE_PREAMBLE_ENA BIT(1) 1698 + #define DEV2G5_PCS1G_MODE_CFG_SAVE_PREAMBLE_ENA_SET(x)\ 1699 + FIELD_PREP(DEV2G5_PCS1G_MODE_CFG_SAVE_PREAMBLE_ENA, x) 1700 + #define DEV2G5_PCS1G_MODE_CFG_SAVE_PREAMBLE_ENA_GET(x)\ 1701 + FIELD_GET(DEV2G5_PCS1G_MODE_CFG_SAVE_PREAMBLE_ENA, x) 1702 + 1703 + #define DEV2G5_PCS1G_MODE_CFG_SGMII_MODE_ENA BIT(0) 1704 + #define DEV2G5_PCS1G_MODE_CFG_SGMII_MODE_ENA_SET(x)\ 1705 + FIELD_PREP(DEV2G5_PCS1G_MODE_CFG_SGMII_MODE_ENA, x) 1706 + #define DEV2G5_PCS1G_MODE_CFG_SGMII_MODE_ENA_GET(x)\ 1707 + FIELD_GET(DEV2G5_PCS1G_MODE_CFG_SGMII_MODE_ENA, x) 1708 + 1709 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_SD_CFG */ 1710 + #define DEV2G5_PCS1G_SD_CFG(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 8, 0, 1, 4) 1711 + 1712 + #define DEV2G5_PCS1G_SD_CFG_SD_SEL BIT(8) 1713 + #define DEV2G5_PCS1G_SD_CFG_SD_SEL_SET(x)\ 1714 + FIELD_PREP(DEV2G5_PCS1G_SD_CFG_SD_SEL, x) 1715 + #define DEV2G5_PCS1G_SD_CFG_SD_SEL_GET(x)\ 1716 + FIELD_GET(DEV2G5_PCS1G_SD_CFG_SD_SEL, x) 1717 + 1718 + #define DEV2G5_PCS1G_SD_CFG_SD_POL BIT(4) 1719 + #define DEV2G5_PCS1G_SD_CFG_SD_POL_SET(x)\ 1720 + FIELD_PREP(DEV2G5_PCS1G_SD_CFG_SD_POL, x) 1721 + #define DEV2G5_PCS1G_SD_CFG_SD_POL_GET(x)\ 1722 + FIELD_GET(DEV2G5_PCS1G_SD_CFG_SD_POL, x) 1723 + 1724 + #define DEV2G5_PCS1G_SD_CFG_SD_ENA BIT(0) 1725 + #define DEV2G5_PCS1G_SD_CFG_SD_ENA_SET(x)\ 1726 + FIELD_PREP(DEV2G5_PCS1G_SD_CFG_SD_ENA, x) 1727 + #define DEV2G5_PCS1G_SD_CFG_SD_ENA_GET(x)\ 1728 + FIELD_GET(DEV2G5_PCS1G_SD_CFG_SD_ENA, x) 1729 + 1730 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_ANEG_CFG */ 1731 + #define DEV2G5_PCS1G_ANEG_CFG(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 12, 0, 1, 4) 1732 + 1733 + #define DEV2G5_PCS1G_ANEG_CFG_ADV_ABILITY GENMASK(31, 16) 1734 + #define DEV2G5_PCS1G_ANEG_CFG_ADV_ABILITY_SET(x)\ 1735 + FIELD_PREP(DEV2G5_PCS1G_ANEG_CFG_ADV_ABILITY, x) 1736 + #define DEV2G5_PCS1G_ANEG_CFG_ADV_ABILITY_GET(x)\ 1737 + FIELD_GET(DEV2G5_PCS1G_ANEG_CFG_ADV_ABILITY, x) 1738 + 1739 + #define DEV2G5_PCS1G_ANEG_CFG_SW_RESOLVE_ENA BIT(8) 1740 + #define DEV2G5_PCS1G_ANEG_CFG_SW_RESOLVE_ENA_SET(x)\ 1741 + FIELD_PREP(DEV2G5_PCS1G_ANEG_CFG_SW_RESOLVE_ENA, x) 1742 + #define DEV2G5_PCS1G_ANEG_CFG_SW_RESOLVE_ENA_GET(x)\ 1743 + FIELD_GET(DEV2G5_PCS1G_ANEG_CFG_SW_RESOLVE_ENA, x) 1744 + 1745 + #define DEV2G5_PCS1G_ANEG_CFG_ANEG_RESTART_ONE_SHOT BIT(1) 1746 + #define DEV2G5_PCS1G_ANEG_CFG_ANEG_RESTART_ONE_SHOT_SET(x)\ 1747 + FIELD_PREP(DEV2G5_PCS1G_ANEG_CFG_ANEG_RESTART_ONE_SHOT, x) 1748 + #define DEV2G5_PCS1G_ANEG_CFG_ANEG_RESTART_ONE_SHOT_GET(x)\ 1749 + FIELD_GET(DEV2G5_PCS1G_ANEG_CFG_ANEG_RESTART_ONE_SHOT, x) 1750 + 1751 + #define DEV2G5_PCS1G_ANEG_CFG_ANEG_ENA BIT(0) 1752 + #define DEV2G5_PCS1G_ANEG_CFG_ANEG_ENA_SET(x)\ 1753 + FIELD_PREP(DEV2G5_PCS1G_ANEG_CFG_ANEG_ENA, x) 1754 + #define DEV2G5_PCS1G_ANEG_CFG_ANEG_ENA_GET(x)\ 1755 + FIELD_GET(DEV2G5_PCS1G_ANEG_CFG_ANEG_ENA, x) 1756 + 1757 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_LB_CFG */ 1758 + #define DEV2G5_PCS1G_LB_CFG(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 20, 0, 1, 4) 1759 + 1760 + #define DEV2G5_PCS1G_LB_CFG_RA_ENA BIT(4) 1761 + #define DEV2G5_PCS1G_LB_CFG_RA_ENA_SET(x)\ 1762 + FIELD_PREP(DEV2G5_PCS1G_LB_CFG_RA_ENA, x) 1763 + #define DEV2G5_PCS1G_LB_CFG_RA_ENA_GET(x)\ 1764 + FIELD_GET(DEV2G5_PCS1G_LB_CFG_RA_ENA, x) 1765 + 1766 + #define DEV2G5_PCS1G_LB_CFG_GMII_PHY_LB_ENA BIT(1) 1767 + #define DEV2G5_PCS1G_LB_CFG_GMII_PHY_LB_ENA_SET(x)\ 1768 + FIELD_PREP(DEV2G5_PCS1G_LB_CFG_GMII_PHY_LB_ENA, x) 1769 + #define DEV2G5_PCS1G_LB_CFG_GMII_PHY_LB_ENA_GET(x)\ 1770 + FIELD_GET(DEV2G5_PCS1G_LB_CFG_GMII_PHY_LB_ENA, x) 1771 + 1772 + #define DEV2G5_PCS1G_LB_CFG_TBI_HOST_LB_ENA BIT(0) 1773 + #define DEV2G5_PCS1G_LB_CFG_TBI_HOST_LB_ENA_SET(x)\ 1774 + FIELD_PREP(DEV2G5_PCS1G_LB_CFG_TBI_HOST_LB_ENA, x) 1775 + #define DEV2G5_PCS1G_LB_CFG_TBI_HOST_LB_ENA_GET(x)\ 1776 + FIELD_GET(DEV2G5_PCS1G_LB_CFG_TBI_HOST_LB_ENA, x) 1777 + 1778 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_ANEG_STATUS */ 1779 + #define DEV2G5_PCS1G_ANEG_STATUS(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 32, 0, 1, 4) 1780 + 1781 + #define DEV2G5_PCS1G_ANEG_STATUS_LP_ADV_ABILITY GENMASK(31, 16) 1782 + #define DEV2G5_PCS1G_ANEG_STATUS_LP_ADV_ABILITY_SET(x)\ 1783 + FIELD_PREP(DEV2G5_PCS1G_ANEG_STATUS_LP_ADV_ABILITY, x) 1784 + #define DEV2G5_PCS1G_ANEG_STATUS_LP_ADV_ABILITY_GET(x)\ 1785 + FIELD_GET(DEV2G5_PCS1G_ANEG_STATUS_LP_ADV_ABILITY, x) 1786 + 1787 + #define DEV2G5_PCS1G_ANEG_STATUS_PR BIT(4) 1788 + #define DEV2G5_PCS1G_ANEG_STATUS_PR_SET(x)\ 1789 + FIELD_PREP(DEV2G5_PCS1G_ANEG_STATUS_PR, x) 1790 + #define DEV2G5_PCS1G_ANEG_STATUS_PR_GET(x)\ 1791 + FIELD_GET(DEV2G5_PCS1G_ANEG_STATUS_PR, x) 1792 + 1793 + #define DEV2G5_PCS1G_ANEG_STATUS_PAGE_RX_STICKY BIT(3) 1794 + #define DEV2G5_PCS1G_ANEG_STATUS_PAGE_RX_STICKY_SET(x)\ 1795 + FIELD_PREP(DEV2G5_PCS1G_ANEG_STATUS_PAGE_RX_STICKY, x) 1796 + #define DEV2G5_PCS1G_ANEG_STATUS_PAGE_RX_STICKY_GET(x)\ 1797 + FIELD_GET(DEV2G5_PCS1G_ANEG_STATUS_PAGE_RX_STICKY, x) 1798 + 1799 + #define DEV2G5_PCS1G_ANEG_STATUS_ANEG_COMPLETE BIT(0) 1800 + #define DEV2G5_PCS1G_ANEG_STATUS_ANEG_COMPLETE_SET(x)\ 1801 + FIELD_PREP(DEV2G5_PCS1G_ANEG_STATUS_ANEG_COMPLETE, x) 1802 + #define DEV2G5_PCS1G_ANEG_STATUS_ANEG_COMPLETE_GET(x)\ 1803 + FIELD_GET(DEV2G5_PCS1G_ANEG_STATUS_ANEG_COMPLETE, x) 1804 + 1805 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_LINK_STATUS */ 1806 + #define DEV2G5_PCS1G_LINK_STATUS(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 40, 0, 1, 4) 1807 + 1808 + #define DEV2G5_PCS1G_LINK_STATUS_DELAY_VAR GENMASK(15, 12) 1809 + #define DEV2G5_PCS1G_LINK_STATUS_DELAY_VAR_SET(x)\ 1810 + FIELD_PREP(DEV2G5_PCS1G_LINK_STATUS_DELAY_VAR, x) 1811 + #define DEV2G5_PCS1G_LINK_STATUS_DELAY_VAR_GET(x)\ 1812 + FIELD_GET(DEV2G5_PCS1G_LINK_STATUS_DELAY_VAR, x) 1813 + 1814 + #define DEV2G5_PCS1G_LINK_STATUS_SIGNAL_DETECT BIT(8) 1815 + #define DEV2G5_PCS1G_LINK_STATUS_SIGNAL_DETECT_SET(x)\ 1816 + FIELD_PREP(DEV2G5_PCS1G_LINK_STATUS_SIGNAL_DETECT, x) 1817 + #define DEV2G5_PCS1G_LINK_STATUS_SIGNAL_DETECT_GET(x)\ 1818 + FIELD_GET(DEV2G5_PCS1G_LINK_STATUS_SIGNAL_DETECT, x) 1819 + 1820 + #define DEV2G5_PCS1G_LINK_STATUS_LINK_STATUS BIT(4) 1821 + #define DEV2G5_PCS1G_LINK_STATUS_LINK_STATUS_SET(x)\ 1822 + FIELD_PREP(DEV2G5_PCS1G_LINK_STATUS_LINK_STATUS, x) 1823 + #define DEV2G5_PCS1G_LINK_STATUS_LINK_STATUS_GET(x)\ 1824 + FIELD_GET(DEV2G5_PCS1G_LINK_STATUS_LINK_STATUS, x) 1825 + 1826 + #define DEV2G5_PCS1G_LINK_STATUS_SYNC_STATUS BIT(0) 1827 + #define DEV2G5_PCS1G_LINK_STATUS_SYNC_STATUS_SET(x)\ 1828 + FIELD_PREP(DEV2G5_PCS1G_LINK_STATUS_SYNC_STATUS, x) 1829 + #define DEV2G5_PCS1G_LINK_STATUS_SYNC_STATUS_GET(x)\ 1830 + FIELD_GET(DEV2G5_PCS1G_LINK_STATUS_SYNC_STATUS, x) 1831 + 1832 + /* DEV1G:PCS1G_CFG_STATUS:PCS1G_STICKY */ 1833 + #define DEV2G5_PCS1G_STICKY(t) __REG(TARGET_DEV2G5, t, 65, 88, 0, 1, 68, 48, 0, 1, 4) 1834 + 1835 + #define DEV2G5_PCS1G_STICKY_LINK_DOWN_STICKY BIT(4) 1836 + #define DEV2G5_PCS1G_STICKY_LINK_DOWN_STICKY_SET(x)\ 1837 + FIELD_PREP(DEV2G5_PCS1G_STICKY_LINK_DOWN_STICKY, x) 1838 + #define DEV2G5_PCS1G_STICKY_LINK_DOWN_STICKY_GET(x)\ 1839 + FIELD_GET(DEV2G5_PCS1G_STICKY_LINK_DOWN_STICKY, x) 1840 + 1841 + #define DEV2G5_PCS1G_STICKY_OUT_OF_SYNC_STICKY BIT(0) 1842 + #define DEV2G5_PCS1G_STICKY_OUT_OF_SYNC_STICKY_SET(x)\ 1843 + FIELD_PREP(DEV2G5_PCS1G_STICKY_OUT_OF_SYNC_STICKY, x) 1844 + #define DEV2G5_PCS1G_STICKY_OUT_OF_SYNC_STICKY_GET(x)\ 1845 + FIELD_GET(DEV2G5_PCS1G_STICKY_OUT_OF_SYNC_STICKY, x) 1846 + 1847 + /* DEV1G:PCS_FX100_CONFIGURATION:PCS_FX100_CFG */ 1848 + #define DEV2G5_PCS_FX100_CFG(t) __REG(TARGET_DEV2G5, t, 65, 164, 0, 1, 4, 0, 0, 1, 4) 1849 + 1850 + #define DEV2G5_PCS_FX100_CFG_SD_SEL BIT(26) 1851 + #define DEV2G5_PCS_FX100_CFG_SD_SEL_SET(x)\ 1852 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_SD_SEL, x) 1853 + #define DEV2G5_PCS_FX100_CFG_SD_SEL_GET(x)\ 1854 + FIELD_GET(DEV2G5_PCS_FX100_CFG_SD_SEL, x) 1855 + 1856 + #define DEV2G5_PCS_FX100_CFG_SD_POL BIT(25) 1857 + #define DEV2G5_PCS_FX100_CFG_SD_POL_SET(x)\ 1858 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_SD_POL, x) 1859 + #define DEV2G5_PCS_FX100_CFG_SD_POL_GET(x)\ 1860 + FIELD_GET(DEV2G5_PCS_FX100_CFG_SD_POL, x) 1861 + 1862 + #define DEV2G5_PCS_FX100_CFG_SD_ENA BIT(24) 1863 + #define DEV2G5_PCS_FX100_CFG_SD_ENA_SET(x)\ 1864 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_SD_ENA, x) 1865 + #define DEV2G5_PCS_FX100_CFG_SD_ENA_GET(x)\ 1866 + FIELD_GET(DEV2G5_PCS_FX100_CFG_SD_ENA, x) 1867 + 1868 + #define DEV2G5_PCS_FX100_CFG_LOOPBACK_ENA BIT(20) 1869 + #define DEV2G5_PCS_FX100_CFG_LOOPBACK_ENA_SET(x)\ 1870 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_LOOPBACK_ENA, x) 1871 + #define DEV2G5_PCS_FX100_CFG_LOOPBACK_ENA_GET(x)\ 1872 + FIELD_GET(DEV2G5_PCS_FX100_CFG_LOOPBACK_ENA, x) 1873 + 1874 + #define DEV2G5_PCS_FX100_CFG_SWAP_MII_ENA BIT(16) 1875 + #define DEV2G5_PCS_FX100_CFG_SWAP_MII_ENA_SET(x)\ 1876 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_SWAP_MII_ENA, x) 1877 + #define DEV2G5_PCS_FX100_CFG_SWAP_MII_ENA_GET(x)\ 1878 + FIELD_GET(DEV2G5_PCS_FX100_CFG_SWAP_MII_ENA, x) 1879 + 1880 + #define DEV2G5_PCS_FX100_CFG_RXBITSEL GENMASK(15, 12) 1881 + #define DEV2G5_PCS_FX100_CFG_RXBITSEL_SET(x)\ 1882 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_RXBITSEL, x) 1883 + #define DEV2G5_PCS_FX100_CFG_RXBITSEL_GET(x)\ 1884 + FIELD_GET(DEV2G5_PCS_FX100_CFG_RXBITSEL, x) 1885 + 1886 + #define DEV2G5_PCS_FX100_CFG_SIGDET_CFG GENMASK(10, 9) 1887 + #define DEV2G5_PCS_FX100_CFG_SIGDET_CFG_SET(x)\ 1888 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_SIGDET_CFG, x) 1889 + #define DEV2G5_PCS_FX100_CFG_SIGDET_CFG_GET(x)\ 1890 + FIELD_GET(DEV2G5_PCS_FX100_CFG_SIGDET_CFG, x) 1891 + 1892 + #define DEV2G5_PCS_FX100_CFG_LINKHYST_TM_ENA BIT(8) 1893 + #define DEV2G5_PCS_FX100_CFG_LINKHYST_TM_ENA_SET(x)\ 1894 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_LINKHYST_TM_ENA, x) 1895 + #define DEV2G5_PCS_FX100_CFG_LINKHYST_TM_ENA_GET(x)\ 1896 + FIELD_GET(DEV2G5_PCS_FX100_CFG_LINKHYST_TM_ENA, x) 1897 + 1898 + #define DEV2G5_PCS_FX100_CFG_LINKHYSTTIMER GENMASK(7, 4) 1899 + #define DEV2G5_PCS_FX100_CFG_LINKHYSTTIMER_SET(x)\ 1900 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_LINKHYSTTIMER, x) 1901 + #define DEV2G5_PCS_FX100_CFG_LINKHYSTTIMER_GET(x)\ 1902 + FIELD_GET(DEV2G5_PCS_FX100_CFG_LINKHYSTTIMER, x) 1903 + 1904 + #define DEV2G5_PCS_FX100_CFG_UNIDIR_MODE_ENA BIT(3) 1905 + #define DEV2G5_PCS_FX100_CFG_UNIDIR_MODE_ENA_SET(x)\ 1906 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_UNIDIR_MODE_ENA, x) 1907 + #define DEV2G5_PCS_FX100_CFG_UNIDIR_MODE_ENA_GET(x)\ 1908 + FIELD_GET(DEV2G5_PCS_FX100_CFG_UNIDIR_MODE_ENA, x) 1909 + 1910 + #define DEV2G5_PCS_FX100_CFG_FEFCHK_ENA BIT(2) 1911 + #define DEV2G5_PCS_FX100_CFG_FEFCHK_ENA_SET(x)\ 1912 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_FEFCHK_ENA, x) 1913 + #define DEV2G5_PCS_FX100_CFG_FEFCHK_ENA_GET(x)\ 1914 + FIELD_GET(DEV2G5_PCS_FX100_CFG_FEFCHK_ENA, x) 1915 + 1916 + #define DEV2G5_PCS_FX100_CFG_FEFGEN_ENA BIT(1) 1917 + #define DEV2G5_PCS_FX100_CFG_FEFGEN_ENA_SET(x)\ 1918 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_FEFGEN_ENA, x) 1919 + #define DEV2G5_PCS_FX100_CFG_FEFGEN_ENA_GET(x)\ 1920 + FIELD_GET(DEV2G5_PCS_FX100_CFG_FEFGEN_ENA, x) 1921 + 1922 + #define DEV2G5_PCS_FX100_CFG_PCS_ENA BIT(0) 1923 + #define DEV2G5_PCS_FX100_CFG_PCS_ENA_SET(x)\ 1924 + FIELD_PREP(DEV2G5_PCS_FX100_CFG_PCS_ENA, x) 1925 + #define DEV2G5_PCS_FX100_CFG_PCS_ENA_GET(x)\ 1926 + FIELD_GET(DEV2G5_PCS_FX100_CFG_PCS_ENA, x) 1927 + 1928 + /* DEV1G:PCS_FX100_STATUS:PCS_FX100_STATUS */ 1929 + #define DEV2G5_PCS_FX100_STATUS(t) __REG(TARGET_DEV2G5, t, 65, 168, 0, 1, 4, 0, 0, 1, 4) 1930 + 1931 + #define DEV2G5_PCS_FX100_STATUS_EDGE_POS_PTP GENMASK(11, 8) 1932 + #define DEV2G5_PCS_FX100_STATUS_EDGE_POS_PTP_SET(x)\ 1933 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_EDGE_POS_PTP, x) 1934 + #define DEV2G5_PCS_FX100_STATUS_EDGE_POS_PTP_GET(x)\ 1935 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_EDGE_POS_PTP, x) 1936 + 1937 + #define DEV2G5_PCS_FX100_STATUS_PCS_ERROR_STICKY BIT(7) 1938 + #define DEV2G5_PCS_FX100_STATUS_PCS_ERROR_STICKY_SET(x)\ 1939 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_PCS_ERROR_STICKY, x) 1940 + #define DEV2G5_PCS_FX100_STATUS_PCS_ERROR_STICKY_GET(x)\ 1941 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_PCS_ERROR_STICKY, x) 1942 + 1943 + #define DEV2G5_PCS_FX100_STATUS_FEF_FOUND_STICKY BIT(6) 1944 + #define DEV2G5_PCS_FX100_STATUS_FEF_FOUND_STICKY_SET(x)\ 1945 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_FEF_FOUND_STICKY, x) 1946 + #define DEV2G5_PCS_FX100_STATUS_FEF_FOUND_STICKY_GET(x)\ 1947 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_FEF_FOUND_STICKY, x) 1948 + 1949 + #define DEV2G5_PCS_FX100_STATUS_SSD_ERROR_STICKY BIT(5) 1950 + #define DEV2G5_PCS_FX100_STATUS_SSD_ERROR_STICKY_SET(x)\ 1951 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_SSD_ERROR_STICKY, x) 1952 + #define DEV2G5_PCS_FX100_STATUS_SSD_ERROR_STICKY_GET(x)\ 1953 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_SSD_ERROR_STICKY, x) 1954 + 1955 + #define DEV2G5_PCS_FX100_STATUS_SYNC_LOST_STICKY BIT(4) 1956 + #define DEV2G5_PCS_FX100_STATUS_SYNC_LOST_STICKY_SET(x)\ 1957 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_SYNC_LOST_STICKY, x) 1958 + #define DEV2G5_PCS_FX100_STATUS_SYNC_LOST_STICKY_GET(x)\ 1959 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_SYNC_LOST_STICKY, x) 1960 + 1961 + #define DEV2G5_PCS_FX100_STATUS_FEF_STATUS BIT(2) 1962 + #define DEV2G5_PCS_FX100_STATUS_FEF_STATUS_SET(x)\ 1963 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_FEF_STATUS, x) 1964 + #define DEV2G5_PCS_FX100_STATUS_FEF_STATUS_GET(x)\ 1965 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_FEF_STATUS, x) 1966 + 1967 + #define DEV2G5_PCS_FX100_STATUS_SIGNAL_DETECT BIT(1) 1968 + #define DEV2G5_PCS_FX100_STATUS_SIGNAL_DETECT_SET(x)\ 1969 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_SIGNAL_DETECT, x) 1970 + #define DEV2G5_PCS_FX100_STATUS_SIGNAL_DETECT_GET(x)\ 1971 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_SIGNAL_DETECT, x) 1972 + 1973 + #define DEV2G5_PCS_FX100_STATUS_SYNC_STATUS BIT(0) 1974 + #define DEV2G5_PCS_FX100_STATUS_SYNC_STATUS_SET(x)\ 1975 + FIELD_PREP(DEV2G5_PCS_FX100_STATUS_SYNC_STATUS, x) 1976 + #define DEV2G5_PCS_FX100_STATUS_SYNC_STATUS_GET(x)\ 1977 + FIELD_GET(DEV2G5_PCS_FX100_STATUS_SYNC_STATUS, x) 1978 + 1979 + /* DEV10G:MAC_CFG_STATUS:MAC_ENA_CFG */ 1980 + #define DEV5G_MAC_ENA_CFG(t) __REG(TARGET_DEV5G, t, 13, 0, 0, 1, 60, 0, 0, 1, 4) 1981 + 1982 + #define DEV5G_MAC_ENA_CFG_RX_ENA BIT(4) 1983 + #define DEV5G_MAC_ENA_CFG_RX_ENA_SET(x)\ 1984 + FIELD_PREP(DEV5G_MAC_ENA_CFG_RX_ENA, x) 1985 + #define DEV5G_MAC_ENA_CFG_RX_ENA_GET(x)\ 1986 + FIELD_GET(DEV5G_MAC_ENA_CFG_RX_ENA, x) 1987 + 1988 + #define DEV5G_MAC_ENA_CFG_TX_ENA BIT(0) 1989 + #define DEV5G_MAC_ENA_CFG_TX_ENA_SET(x)\ 1990 + FIELD_PREP(DEV5G_MAC_ENA_CFG_TX_ENA, x) 1991 + #define DEV5G_MAC_ENA_CFG_TX_ENA_GET(x)\ 1992 + FIELD_GET(DEV5G_MAC_ENA_CFG_TX_ENA, x) 1993 + 1994 + /* DEV10G:MAC_CFG_STATUS:MAC_MAXLEN_CFG */ 1995 + #define DEV5G_MAC_MAXLEN_CFG(t) __REG(TARGET_DEV5G, t, 13, 0, 0, 1, 60, 8, 0, 1, 4) 1996 + 1997 + #define DEV5G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK BIT(16) 1998 + #define DEV5G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK_SET(x)\ 1999 + FIELD_PREP(DEV5G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK, x) 2000 + #define DEV5G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK_GET(x)\ 2001 + FIELD_GET(DEV5G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK, x) 2002 + 2003 + #define DEV5G_MAC_MAXLEN_CFG_MAX_LEN GENMASK(15, 0) 2004 + #define DEV5G_MAC_MAXLEN_CFG_MAX_LEN_SET(x)\ 2005 + FIELD_PREP(DEV5G_MAC_MAXLEN_CFG_MAX_LEN, x) 2006 + #define DEV5G_MAC_MAXLEN_CFG_MAX_LEN_GET(x)\ 2007 + FIELD_GET(DEV5G_MAC_MAXLEN_CFG_MAX_LEN, x) 2008 + 2009 + /* DEV10G:MAC_CFG_STATUS:MAC_ADV_CHK_CFG */ 2010 + #define DEV5G_MAC_ADV_CHK_CFG(t) __REG(TARGET_DEV5G, t, 13, 0, 0, 1, 60, 28, 0, 1, 4) 2011 + 2012 + #define DEV5G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA BIT(24) 2013 + #define DEV5G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA_SET(x)\ 2014 + FIELD_PREP(DEV5G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA, x) 2015 + #define DEV5G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA_GET(x)\ 2016 + FIELD_GET(DEV5G_MAC_ADV_CHK_CFG_EXT_EOP_CHK_ENA, x) 2017 + 2018 + #define DEV5G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA BIT(20) 2019 + #define DEV5G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA_SET(x)\ 2020 + FIELD_PREP(DEV5G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA, x) 2021 + #define DEV5G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA_GET(x)\ 2022 + FIELD_GET(DEV5G_MAC_ADV_CHK_CFG_EXT_SOP_CHK_ENA, x) 2023 + 2024 + #define DEV5G_MAC_ADV_CHK_CFG_SFD_CHK_ENA BIT(16) 2025 + #define DEV5G_MAC_ADV_CHK_CFG_SFD_CHK_ENA_SET(x)\ 2026 + FIELD_PREP(DEV5G_MAC_ADV_CHK_CFG_SFD_CHK_ENA, x) 2027 + #define DEV5G_MAC_ADV_CHK_CFG_SFD_CHK_ENA_GET(x)\ 2028 + FIELD_GET(DEV5G_MAC_ADV_CHK_CFG_SFD_CHK_ENA, x) 2029 + 2030 + #define DEV5G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS BIT(12) 2031 + #define DEV5G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS_SET(x)\ 2032 + FIELD_PREP(DEV5G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS, x) 2033 + #define DEV5G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS_GET(x)\ 2034 + FIELD_GET(DEV5G_MAC_ADV_CHK_CFG_PRM_SHK_CHK_DIS, x) 2035 + 2036 + #define DEV5G_MAC_ADV_CHK_CFG_PRM_CHK_ENA BIT(8) 2037 + #define DEV5G_MAC_ADV_CHK_CFG_PRM_CHK_ENA_SET(x)\ 2038 + FIELD_PREP(DEV5G_MAC_ADV_CHK_CFG_PRM_CHK_ENA, x) 2039 + #define DEV5G_MAC_ADV_CHK_CFG_PRM_CHK_ENA_GET(x)\ 2040 + FIELD_GET(DEV5G_MAC_ADV_CHK_CFG_PRM_CHK_ENA, x) 2041 + 2042 + #define DEV5G_MAC_ADV_CHK_CFG_OOR_ERR_ENA BIT(4) 2043 + #define DEV5G_MAC_ADV_CHK_CFG_OOR_ERR_ENA_SET(x)\ 2044 + FIELD_PREP(DEV5G_MAC_ADV_CHK_CFG_OOR_ERR_ENA, x) 2045 + #define DEV5G_MAC_ADV_CHK_CFG_OOR_ERR_ENA_GET(x)\ 2046 + FIELD_GET(DEV5G_MAC_ADV_CHK_CFG_OOR_ERR_ENA, x) 2047 + 2048 + #define DEV5G_MAC_ADV_CHK_CFG_INR_ERR_ENA BIT(0) 2049 + #define DEV5G_MAC_ADV_CHK_CFG_INR_ERR_ENA_SET(x)\ 2050 + FIELD_PREP(DEV5G_MAC_ADV_CHK_CFG_INR_ERR_ENA, x) 2051 + #define DEV5G_MAC_ADV_CHK_CFG_INR_ERR_ENA_GET(x)\ 2052 + FIELD_GET(DEV5G_MAC_ADV_CHK_CFG_INR_ERR_ENA, x) 2053 + 2054 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SYMBOL_ERR_CNT */ 2055 + #define DEV5G_RX_SYMBOL_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 0, 0, 1, 4) 2056 + 2057 + /* DEV10G:DEV_STATISTICS_32BIT:RX_PAUSE_CNT */ 2058 + #define DEV5G_RX_PAUSE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 4, 0, 1, 4) 2059 + 2060 + /* DEV10G:DEV_STATISTICS_32BIT:RX_UNSUP_OPCODE_CNT */ 2061 + #define DEV5G_RX_UNSUP_OPCODE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 8, 0, 1, 4) 2062 + 2063 + /* DEV10G:DEV_STATISTICS_32BIT:RX_UC_CNT */ 2064 + #define DEV5G_RX_UC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 12, 0, 1, 4) 2065 + 2066 + /* DEV10G:DEV_STATISTICS_32BIT:RX_MC_CNT */ 2067 + #define DEV5G_RX_MC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 16, 0, 1, 4) 2068 + 2069 + /* DEV10G:DEV_STATISTICS_32BIT:RX_BC_CNT */ 2070 + #define DEV5G_RX_BC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 20, 0, 1, 4) 2071 + 2072 + /* DEV10G:DEV_STATISTICS_32BIT:RX_CRC_ERR_CNT */ 2073 + #define DEV5G_RX_CRC_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 24, 0, 1, 4) 2074 + 2075 + /* DEV10G:DEV_STATISTICS_32BIT:RX_UNDERSIZE_CNT */ 2076 + #define DEV5G_RX_UNDERSIZE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 28, 0, 1, 4) 2077 + 2078 + /* DEV10G:DEV_STATISTICS_32BIT:RX_FRAGMENTS_CNT */ 2079 + #define DEV5G_RX_FRAGMENTS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 32, 0, 1, 4) 2080 + 2081 + /* DEV10G:DEV_STATISTICS_32BIT:RX_IN_RANGE_LEN_ERR_CNT */ 2082 + #define DEV5G_RX_IN_RANGE_LEN_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 36, 0, 1, 4) 2083 + 2084 + /* DEV10G:DEV_STATISTICS_32BIT:RX_OUT_OF_RANGE_LEN_ERR_CNT */ 2085 + #define DEV5G_RX_OUT_OF_RANGE_LEN_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 40, 0, 1, 4) 2086 + 2087 + /* DEV10G:DEV_STATISTICS_32BIT:RX_OVERSIZE_CNT */ 2088 + #define DEV5G_RX_OVERSIZE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 44, 0, 1, 4) 2089 + 2090 + /* DEV10G:DEV_STATISTICS_32BIT:RX_JABBERS_CNT */ 2091 + #define DEV5G_RX_JABBERS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 48, 0, 1, 4) 2092 + 2093 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SIZE64_CNT */ 2094 + #define DEV5G_RX_SIZE64_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 52, 0, 1, 4) 2095 + 2096 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SIZE65TO127_CNT */ 2097 + #define DEV5G_RX_SIZE65TO127_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 56, 0, 1, 4) 2098 + 2099 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SIZE128TO255_CNT */ 2100 + #define DEV5G_RX_SIZE128TO255_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 60, 0, 1, 4) 2101 + 2102 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SIZE256TO511_CNT */ 2103 + #define DEV5G_RX_SIZE256TO511_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 64, 0, 1, 4) 2104 + 2105 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SIZE512TO1023_CNT */ 2106 + #define DEV5G_RX_SIZE512TO1023_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 68, 0, 1, 4) 2107 + 2108 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SIZE1024TO1518_CNT */ 2109 + #define DEV5G_RX_SIZE1024TO1518_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 72, 0, 1, 4) 2110 + 2111 + /* DEV10G:DEV_STATISTICS_32BIT:RX_SIZE1519TOMAX_CNT */ 2112 + #define DEV5G_RX_SIZE1519TOMAX_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 76, 0, 1, 4) 2113 + 2114 + /* DEV10G:DEV_STATISTICS_32BIT:RX_IPG_SHRINK_CNT */ 2115 + #define DEV5G_RX_IPG_SHRINK_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 80, 0, 1, 4) 2116 + 2117 + /* DEV10G:DEV_STATISTICS_32BIT:TX_PAUSE_CNT */ 2118 + #define DEV5G_TX_PAUSE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 84, 0, 1, 4) 2119 + 2120 + /* DEV10G:DEV_STATISTICS_32BIT:TX_UC_CNT */ 2121 + #define DEV5G_TX_UC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 88, 0, 1, 4) 2122 + 2123 + /* DEV10G:DEV_STATISTICS_32BIT:TX_MC_CNT */ 2124 + #define DEV5G_TX_MC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 92, 0, 1, 4) 2125 + 2126 + /* DEV10G:DEV_STATISTICS_32BIT:TX_BC_CNT */ 2127 + #define DEV5G_TX_BC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 96, 0, 1, 4) 2128 + 2129 + /* DEV10G:DEV_STATISTICS_32BIT:TX_SIZE64_CNT */ 2130 + #define DEV5G_TX_SIZE64_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 100, 0, 1, 4) 2131 + 2132 + /* DEV10G:DEV_STATISTICS_32BIT:TX_SIZE65TO127_CNT */ 2133 + #define DEV5G_TX_SIZE65TO127_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 104, 0, 1, 4) 2134 + 2135 + /* DEV10G:DEV_STATISTICS_32BIT:TX_SIZE128TO255_CNT */ 2136 + #define DEV5G_TX_SIZE128TO255_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 108, 0, 1, 4) 2137 + 2138 + /* DEV10G:DEV_STATISTICS_32BIT:TX_SIZE256TO511_CNT */ 2139 + #define DEV5G_TX_SIZE256TO511_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 112, 0, 1, 4) 2140 + 2141 + /* DEV10G:DEV_STATISTICS_32BIT:TX_SIZE512TO1023_CNT */ 2142 + #define DEV5G_TX_SIZE512TO1023_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 116, 0, 1, 4) 2143 + 2144 + /* DEV10G:DEV_STATISTICS_32BIT:TX_SIZE1024TO1518_CNT */ 2145 + #define DEV5G_TX_SIZE1024TO1518_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 120, 0, 1, 4) 2146 + 2147 + /* DEV10G:DEV_STATISTICS_32BIT:TX_SIZE1519TOMAX_CNT */ 2148 + #define DEV5G_TX_SIZE1519TOMAX_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 124, 0, 1, 4) 2149 + 2150 + /* DEV10G:DEV_STATISTICS_32BIT:RX_ALIGNMENT_LOST_CNT */ 2151 + #define DEV5G_RX_ALIGNMENT_LOST_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 128, 0, 1, 4) 2152 + 2153 + /* DEV10G:DEV_STATISTICS_32BIT:RX_TAGGED_FRMS_CNT */ 2154 + #define DEV5G_RX_TAGGED_FRMS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 132, 0, 1, 4) 2155 + 2156 + /* DEV10G:DEV_STATISTICS_32BIT:RX_UNTAGGED_FRMS_CNT */ 2157 + #define DEV5G_RX_UNTAGGED_FRMS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 136, 0, 1, 4) 2158 + 2159 + /* DEV10G:DEV_STATISTICS_32BIT:TX_TAGGED_FRMS_CNT */ 2160 + #define DEV5G_TX_TAGGED_FRMS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 140, 0, 1, 4) 2161 + 2162 + /* DEV10G:DEV_STATISTICS_32BIT:TX_UNTAGGED_FRMS_CNT */ 2163 + #define DEV5G_TX_UNTAGGED_FRMS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 144, 0, 1, 4) 2164 + 2165 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SYMBOL_ERR_CNT */ 2166 + #define DEV5G_PMAC_RX_SYMBOL_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 148, 0, 1, 4) 2167 + 2168 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_PAUSE_CNT */ 2169 + #define DEV5G_PMAC_RX_PAUSE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 152, 0, 1, 4) 2170 + 2171 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_UNSUP_OPCODE_CNT */ 2172 + #define DEV5G_PMAC_RX_UNSUP_OPCODE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 156, 0, 1, 4) 2173 + 2174 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_UC_CNT */ 2175 + #define DEV5G_PMAC_RX_UC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 160, 0, 1, 4) 2176 + 2177 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_MC_CNT */ 2178 + #define DEV5G_PMAC_RX_MC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 164, 0, 1, 4) 2179 + 2180 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_BC_CNT */ 2181 + #define DEV5G_PMAC_RX_BC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 168, 0, 1, 4) 2182 + 2183 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_CRC_ERR_CNT */ 2184 + #define DEV5G_PMAC_RX_CRC_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 172, 0, 1, 4) 2185 + 2186 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_UNDERSIZE_CNT */ 2187 + #define DEV5G_PMAC_RX_UNDERSIZE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 176, 0, 1, 4) 2188 + 2189 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_FRAGMENTS_CNT */ 2190 + #define DEV5G_PMAC_RX_FRAGMENTS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 180, 0, 1, 4) 2191 + 2192 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_IN_RANGE_LEN_ERR_CNT */ 2193 + #define DEV5G_PMAC_RX_IN_RANGE_LEN_ERR_CNT(t) __REG(TARGET_DEV5G,\ 2194 + t, 13, 60, 0, 1, 312, 184, 0, 1, 4) 2195 + 2196 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT */ 2197 + #define DEV5G_PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT(t) __REG(TARGET_DEV5G,\ 2198 + t, 13, 60, 0, 1, 312, 188, 0, 1, 4) 2199 + 2200 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_OVERSIZE_CNT */ 2201 + #define DEV5G_PMAC_RX_OVERSIZE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 192, 0, 1, 4) 2202 + 2203 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_JABBERS_CNT */ 2204 + #define DEV5G_PMAC_RX_JABBERS_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 196, 0, 1, 4) 2205 + 2206 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SIZE64_CNT */ 2207 + #define DEV5G_PMAC_RX_SIZE64_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 200, 0, 1, 4) 2208 + 2209 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SIZE65TO127_CNT */ 2210 + #define DEV5G_PMAC_RX_SIZE65TO127_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 204, 0, 1, 4) 2211 + 2212 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SIZE128TO255_CNT */ 2213 + #define DEV5G_PMAC_RX_SIZE128TO255_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 208, 0, 1, 4) 2214 + 2215 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SIZE256TO511_CNT */ 2216 + #define DEV5G_PMAC_RX_SIZE256TO511_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 212, 0, 1, 4) 2217 + 2218 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SIZE512TO1023_CNT */ 2219 + #define DEV5G_PMAC_RX_SIZE512TO1023_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 216, 0, 1, 4) 2220 + 2221 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SIZE1024TO1518_CNT */ 2222 + #define DEV5G_PMAC_RX_SIZE1024TO1518_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 220, 0, 1, 4) 2223 + 2224 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_SIZE1519TOMAX_CNT */ 2225 + #define DEV5G_PMAC_RX_SIZE1519TOMAX_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 224, 0, 1, 4) 2226 + 2227 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_PAUSE_CNT */ 2228 + #define DEV5G_PMAC_TX_PAUSE_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 228, 0, 1, 4) 2229 + 2230 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_UC_CNT */ 2231 + #define DEV5G_PMAC_TX_UC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 232, 0, 1, 4) 2232 + 2233 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_MC_CNT */ 2234 + #define DEV5G_PMAC_TX_MC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 236, 0, 1, 4) 2235 + 2236 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_BC_CNT */ 2237 + #define DEV5G_PMAC_TX_BC_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 240, 0, 1, 4) 2238 + 2239 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_SIZE64_CNT */ 2240 + #define DEV5G_PMAC_TX_SIZE64_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 244, 0, 1, 4) 2241 + 2242 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_SIZE65TO127_CNT */ 2243 + #define DEV5G_PMAC_TX_SIZE65TO127_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 248, 0, 1, 4) 2244 + 2245 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_SIZE128TO255_CNT */ 2246 + #define DEV5G_PMAC_TX_SIZE128TO255_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 252, 0, 1, 4) 2247 + 2248 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_SIZE256TO511_CNT */ 2249 + #define DEV5G_PMAC_TX_SIZE256TO511_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 256, 0, 1, 4) 2250 + 2251 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_SIZE512TO1023_CNT */ 2252 + #define DEV5G_PMAC_TX_SIZE512TO1023_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 260, 0, 1, 4) 2253 + 2254 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_SIZE1024TO1518_CNT */ 2255 + #define DEV5G_PMAC_TX_SIZE1024TO1518_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 264, 0, 1, 4) 2256 + 2257 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_TX_SIZE1519TOMAX_CNT */ 2258 + #define DEV5G_PMAC_TX_SIZE1519TOMAX_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 268, 0, 1, 4) 2259 + 2260 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_ALIGNMENT_LOST_CNT */ 2261 + #define DEV5G_PMAC_RX_ALIGNMENT_LOST_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 272, 0, 1, 4) 2262 + 2263 + /* DEV10G:DEV_STATISTICS_32BIT:MM_RX_ASSEMBLY_ERR_CNT */ 2264 + #define DEV5G_MM_RX_ASSEMBLY_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 276, 0, 1, 4) 2265 + 2266 + /* DEV10G:DEV_STATISTICS_32BIT:MM_RX_SMD_ERR_CNT */ 2267 + #define DEV5G_MM_RX_SMD_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 280, 0, 1, 4) 2268 + 2269 + /* DEV10G:DEV_STATISTICS_32BIT:MM_RX_ASSEMBLY_OK_CNT */ 2270 + #define DEV5G_MM_RX_ASSEMBLY_OK_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 284, 0, 1, 4) 2271 + 2272 + /* DEV10G:DEV_STATISTICS_32BIT:MM_RX_MERGE_FRAG_CNT */ 2273 + #define DEV5G_MM_RX_MERGE_FRAG_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 288, 0, 1, 4) 2274 + 2275 + /* DEV10G:DEV_STATISTICS_32BIT:MM_TX_PFRAGMENT_CNT */ 2276 + #define DEV5G_MM_TX_PFRAGMENT_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 292, 0, 1, 4) 2277 + 2278 + /* DEV10G:DEV_STATISTICS_32BIT:RX_HIH_CKSM_ERR_CNT */ 2279 + #define DEV5G_RX_HIH_CKSM_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 296, 0, 1, 4) 2280 + 2281 + /* DEV10G:DEV_STATISTICS_32BIT:RX_XGMII_PROT_ERR_CNT */ 2282 + #define DEV5G_RX_XGMII_PROT_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 300, 0, 1, 4) 2283 + 2284 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_HIH_CKSM_ERR_CNT */ 2285 + #define DEV5G_PMAC_RX_HIH_CKSM_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 304, 0, 1, 4) 2286 + 2287 + /* DEV10G:DEV_STATISTICS_32BIT:PMAC_RX_XGMII_PROT_ERR_CNT */ 2288 + #define DEV5G_PMAC_RX_XGMII_PROT_ERR_CNT(t) __REG(TARGET_DEV5G, t, 13, 60, 0, 1, 312, 308, 0, 1, 4) 2289 + 2290 + /* DEV10G:DEV_STATISTICS_40BIT:RX_IN_BYTES_CNT */ 2291 + #define DEV5G_RX_IN_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 0, 0, 1, 4) 2292 + 2293 + /* DEV10G:DEV_STATISTICS_40BIT:RX_IN_BYTES_MSB_CNT */ 2294 + #define DEV5G_RX_IN_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 4, 0, 1, 4) 2295 + 2296 + #define DEV5G_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT GENMASK(7, 0) 2297 + #define DEV5G_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT_SET(x)\ 2298 + FIELD_PREP(DEV5G_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT, x) 2299 + #define DEV5G_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT_GET(x)\ 2300 + FIELD_GET(DEV5G_RX_IN_BYTES_MSB_CNT_RX_IN_BYTES_MSB_CNT, x) 2301 + 2302 + /* DEV10G:DEV_STATISTICS_40BIT:RX_OK_BYTES_CNT */ 2303 + #define DEV5G_RX_OK_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 8, 0, 1, 4) 2304 + 2305 + /* DEV10G:DEV_STATISTICS_40BIT:RX_OK_BYTES_MSB_CNT */ 2306 + #define DEV5G_RX_OK_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 12, 0, 1, 4) 2307 + 2308 + #define DEV5G_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT GENMASK(7, 0) 2309 + #define DEV5G_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT_SET(x)\ 2310 + FIELD_PREP(DEV5G_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT, x) 2311 + #define DEV5G_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT_GET(x)\ 2312 + FIELD_GET(DEV5G_RX_OK_BYTES_MSB_CNT_RX_OK_BYTES_MSB_CNT, x) 2313 + 2314 + /* DEV10G:DEV_STATISTICS_40BIT:RX_BAD_BYTES_CNT */ 2315 + #define DEV5G_RX_BAD_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 16, 0, 1, 4) 2316 + 2317 + /* DEV10G:DEV_STATISTICS_40BIT:RX_BAD_BYTES_MSB_CNT */ 2318 + #define DEV5G_RX_BAD_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 20, 0, 1, 4) 2319 + 2320 + #define DEV5G_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT GENMASK(7, 0) 2321 + #define DEV5G_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT_SET(x)\ 2322 + FIELD_PREP(DEV5G_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT, x) 2323 + #define DEV5G_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT_GET(x)\ 2324 + FIELD_GET(DEV5G_RX_BAD_BYTES_MSB_CNT_RX_BAD_BYTES_MSB_CNT, x) 2325 + 2326 + /* DEV10G:DEV_STATISTICS_40BIT:TX_OUT_BYTES_CNT */ 2327 + #define DEV5G_TX_OUT_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 24, 0, 1, 4) 2328 + 2329 + /* DEV10G:DEV_STATISTICS_40BIT:TX_OUT_BYTES_MSB_CNT */ 2330 + #define DEV5G_TX_OUT_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 28, 0, 1, 4) 2331 + 2332 + #define DEV5G_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT GENMASK(7, 0) 2333 + #define DEV5G_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT_SET(x)\ 2334 + FIELD_PREP(DEV5G_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT, x) 2335 + #define DEV5G_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT_GET(x)\ 2336 + FIELD_GET(DEV5G_TX_OUT_BYTES_MSB_CNT_TX_OUT_BYTES_MSB_CNT, x) 2337 + 2338 + /* DEV10G:DEV_STATISTICS_40BIT:TX_OK_BYTES_CNT */ 2339 + #define DEV5G_TX_OK_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 32, 0, 1, 4) 2340 + 2341 + /* DEV10G:DEV_STATISTICS_40BIT:TX_OK_BYTES_MSB_CNT */ 2342 + #define DEV5G_TX_OK_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 36, 0, 1, 4) 2343 + 2344 + #define DEV5G_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT GENMASK(7, 0) 2345 + #define DEV5G_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT_SET(x)\ 2346 + FIELD_PREP(DEV5G_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT, x) 2347 + #define DEV5G_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT_GET(x)\ 2348 + FIELD_GET(DEV5G_TX_OK_BYTES_MSB_CNT_TX_OK_BYTES_MSB_CNT, x) 2349 + 2350 + /* DEV10G:DEV_STATISTICS_40BIT:PMAC_RX_OK_BYTES_CNT */ 2351 + #define DEV5G_PMAC_RX_OK_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 40, 0, 1, 4) 2352 + 2353 + /* DEV10G:DEV_STATISTICS_40BIT:PMAC_RX_OK_BYTES_MSB_CNT */ 2354 + #define DEV5G_PMAC_RX_OK_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 44, 0, 1, 4) 2355 + 2356 + #define DEV5G_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT GENMASK(7, 0) 2357 + #define DEV5G_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT_SET(x)\ 2358 + FIELD_PREP(DEV5G_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT, x) 2359 + #define DEV5G_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT_GET(x)\ 2360 + FIELD_GET(DEV5G_PMAC_RX_OK_BYTES_MSB_CNT_PMAC_RX_OK_BYTES_MSB_CNT, x) 2361 + 2362 + /* DEV10G:DEV_STATISTICS_40BIT:PMAC_RX_BAD_BYTES_CNT */ 2363 + #define DEV5G_PMAC_RX_BAD_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 48, 0, 1, 4) 2364 + 2365 + /* DEV10G:DEV_STATISTICS_40BIT:PMAC_RX_BAD_BYTES_MSB_CNT */ 2366 + #define DEV5G_PMAC_RX_BAD_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 52, 0, 1, 4) 2367 + 2368 + #define DEV5G_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT GENMASK(7, 0) 2369 + #define DEV5G_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT_SET(x)\ 2370 + FIELD_PREP(DEV5G_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT, x) 2371 + #define DEV5G_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT_GET(x)\ 2372 + FIELD_GET(DEV5G_PMAC_RX_BAD_BYTES_MSB_CNT_PMAC_RX_BAD_BYTES_MSB_CNT, x) 2373 + 2374 + /* DEV10G:DEV_STATISTICS_40BIT:PMAC_TX_OK_BYTES_CNT */ 2375 + #define DEV5G_PMAC_TX_OK_BYTES_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 56, 0, 1, 4) 2376 + 2377 + /* DEV10G:DEV_STATISTICS_40BIT:PMAC_TX_OK_BYTES_MSB_CNT */ 2378 + #define DEV5G_PMAC_TX_OK_BYTES_MSB_CNT(t) __REG(TARGET_DEV5G, t, 13, 372, 0, 1, 64, 60, 0, 1, 4) 2379 + 2380 + #define DEV5G_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT GENMASK(7, 0) 2381 + #define DEV5G_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT_SET(x)\ 2382 + FIELD_PREP(DEV5G_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT, x) 2383 + #define DEV5G_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT_GET(x)\ 2384 + FIELD_GET(DEV5G_PMAC_TX_OK_BYTES_MSB_CNT_PMAC_TX_OK_BYTES_MSB_CNT, x) 2385 + 2386 + /* DEV10G:DEV_CFG_STATUS:DEV_RST_CTRL */ 2387 + #define DEV5G_DEV_RST_CTRL(t) __REG(TARGET_DEV5G, t, 13, 436, 0, 1, 52, 0, 0, 1, 4) 2388 + 2389 + #define DEV5G_DEV_RST_CTRL_PARDET_MODE_ENA BIT(28) 2390 + #define DEV5G_DEV_RST_CTRL_PARDET_MODE_ENA_SET(x)\ 2391 + FIELD_PREP(DEV5G_DEV_RST_CTRL_PARDET_MODE_ENA, x) 2392 + #define DEV5G_DEV_RST_CTRL_PARDET_MODE_ENA_GET(x)\ 2393 + FIELD_GET(DEV5G_DEV_RST_CTRL_PARDET_MODE_ENA, x) 2394 + 2395 + #define DEV5G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS BIT(27) 2396 + #define DEV5G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_SET(x)\ 2397 + FIELD_PREP(DEV5G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 2398 + #define DEV5G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS_GET(x)\ 2399 + FIELD_GET(DEV5G_DEV_RST_CTRL_USXGMII_OSET_FILTER_DIS, x) 2400 + 2401 + #define DEV5G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS GENMASK(26, 25) 2402 + #define DEV5G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS_SET(x)\ 2403 + FIELD_PREP(DEV5G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS, x) 2404 + #define DEV5G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS_GET(x)\ 2405 + FIELD_GET(DEV5G_DEV_RST_CTRL_MUXED_USXGMII_NETWORK_PORTS, x) 2406 + 2407 + #define DEV5G_DEV_RST_CTRL_SERDES_SPEED_SEL GENMASK(24, 23) 2408 + #define DEV5G_DEV_RST_CTRL_SERDES_SPEED_SEL_SET(x)\ 2409 + FIELD_PREP(DEV5G_DEV_RST_CTRL_SERDES_SPEED_SEL, x) 2410 + #define DEV5G_DEV_RST_CTRL_SERDES_SPEED_SEL_GET(x)\ 2411 + FIELD_GET(DEV5G_DEV_RST_CTRL_SERDES_SPEED_SEL, x) 2412 + 2413 + #define DEV5G_DEV_RST_CTRL_SPEED_SEL GENMASK(22, 20) 2414 + #define DEV5G_DEV_RST_CTRL_SPEED_SEL_SET(x)\ 2415 + FIELD_PREP(DEV5G_DEV_RST_CTRL_SPEED_SEL, x) 2416 + #define DEV5G_DEV_RST_CTRL_SPEED_SEL_GET(x)\ 2417 + FIELD_GET(DEV5G_DEV_RST_CTRL_SPEED_SEL, x) 2418 + 2419 + #define DEV5G_DEV_RST_CTRL_PCS_TX_RST BIT(12) 2420 + #define DEV5G_DEV_RST_CTRL_PCS_TX_RST_SET(x)\ 2421 + FIELD_PREP(DEV5G_DEV_RST_CTRL_PCS_TX_RST, x) 2422 + #define DEV5G_DEV_RST_CTRL_PCS_TX_RST_GET(x)\ 2423 + FIELD_GET(DEV5G_DEV_RST_CTRL_PCS_TX_RST, x) 2424 + 2425 + #define DEV5G_DEV_RST_CTRL_PCS_RX_RST BIT(8) 2426 + #define DEV5G_DEV_RST_CTRL_PCS_RX_RST_SET(x)\ 2427 + FIELD_PREP(DEV5G_DEV_RST_CTRL_PCS_RX_RST, x) 2428 + #define DEV5G_DEV_RST_CTRL_PCS_RX_RST_GET(x)\ 2429 + FIELD_GET(DEV5G_DEV_RST_CTRL_PCS_RX_RST, x) 2430 + 2431 + #define DEV5G_DEV_RST_CTRL_MAC_TX_RST BIT(4) 2432 + #define DEV5G_DEV_RST_CTRL_MAC_TX_RST_SET(x)\ 2433 + FIELD_PREP(DEV5G_DEV_RST_CTRL_MAC_TX_RST, x) 2434 + #define DEV5G_DEV_RST_CTRL_MAC_TX_RST_GET(x)\ 2435 + FIELD_GET(DEV5G_DEV_RST_CTRL_MAC_TX_RST, x) 2436 + 2437 + #define DEV5G_DEV_RST_CTRL_MAC_RX_RST BIT(0) 2438 + #define DEV5G_DEV_RST_CTRL_MAC_RX_RST_SET(x)\ 2439 + FIELD_PREP(DEV5G_DEV_RST_CTRL_MAC_RX_RST, x) 2440 + #define DEV5G_DEV_RST_CTRL_MAC_RX_RST_GET(x)\ 2441 + FIELD_GET(DEV5G_DEV_RST_CTRL_MAC_RX_RST, x) 2442 + 2443 + /* DSM:RAM_CTRL:RAM_INIT */ 2444 + #define DSM_RAM_INIT __REG(TARGET_DSM, 0, 1, 0, 0, 1, 4, 0, 0, 1, 4) 2445 + 2446 + #define DSM_RAM_INIT_RAM_INIT BIT(1) 2447 + #define DSM_RAM_INIT_RAM_INIT_SET(x)\ 2448 + FIELD_PREP(DSM_RAM_INIT_RAM_INIT, x) 2449 + #define DSM_RAM_INIT_RAM_INIT_GET(x)\ 2450 + FIELD_GET(DSM_RAM_INIT_RAM_INIT, x) 2451 + 2452 + #define DSM_RAM_INIT_RAM_CFG_HOOK BIT(0) 2453 + #define DSM_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 2454 + FIELD_PREP(DSM_RAM_INIT_RAM_CFG_HOOK, x) 2455 + #define DSM_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 2456 + FIELD_GET(DSM_RAM_INIT_RAM_CFG_HOOK, x) 2457 + 2458 + /* DSM:CFG:BUF_CFG */ 2459 + #define DSM_BUF_CFG(r) __REG(TARGET_DSM, 0, 1, 20, 0, 1, 3528, 0, r, 67, 4) 2460 + 2461 + #define DSM_BUF_CFG_CSC_STAT_DIS BIT(13) 2462 + #define DSM_BUF_CFG_CSC_STAT_DIS_SET(x)\ 2463 + FIELD_PREP(DSM_BUF_CFG_CSC_STAT_DIS, x) 2464 + #define DSM_BUF_CFG_CSC_STAT_DIS_GET(x)\ 2465 + FIELD_GET(DSM_BUF_CFG_CSC_STAT_DIS, x) 2466 + 2467 + #define DSM_BUF_CFG_AGING_ENA BIT(12) 2468 + #define DSM_BUF_CFG_AGING_ENA_SET(x)\ 2469 + FIELD_PREP(DSM_BUF_CFG_AGING_ENA, x) 2470 + #define DSM_BUF_CFG_AGING_ENA_GET(x)\ 2471 + FIELD_GET(DSM_BUF_CFG_AGING_ENA, x) 2472 + 2473 + #define DSM_BUF_CFG_UNDERFLOW_WATCHDOG_DIS BIT(11) 2474 + #define DSM_BUF_CFG_UNDERFLOW_WATCHDOG_DIS_SET(x)\ 2475 + FIELD_PREP(DSM_BUF_CFG_UNDERFLOW_WATCHDOG_DIS, x) 2476 + #define DSM_BUF_CFG_UNDERFLOW_WATCHDOG_DIS_GET(x)\ 2477 + FIELD_GET(DSM_BUF_CFG_UNDERFLOW_WATCHDOG_DIS, x) 2478 + 2479 + #define DSM_BUF_CFG_UNDERFLOW_WATCHDOG_TIMEOUT GENMASK(10, 0) 2480 + #define DSM_BUF_CFG_UNDERFLOW_WATCHDOG_TIMEOUT_SET(x)\ 2481 + FIELD_PREP(DSM_BUF_CFG_UNDERFLOW_WATCHDOG_TIMEOUT, x) 2482 + #define DSM_BUF_CFG_UNDERFLOW_WATCHDOG_TIMEOUT_GET(x)\ 2483 + FIELD_GET(DSM_BUF_CFG_UNDERFLOW_WATCHDOG_TIMEOUT, x) 2484 + 2485 + /* DSM:CFG:DEV_TX_STOP_WM_CFG */ 2486 + #define DSM_DEV_TX_STOP_WM_CFG(r) __REG(TARGET_DSM, 0, 1, 20, 0, 1, 3528, 1360, r, 67, 4) 2487 + 2488 + #define DSM_DEV_TX_STOP_WM_CFG_FAST_STARTUP_ENA BIT(9) 2489 + #define DSM_DEV_TX_STOP_WM_CFG_FAST_STARTUP_ENA_SET(x)\ 2490 + FIELD_PREP(DSM_DEV_TX_STOP_WM_CFG_FAST_STARTUP_ENA, x) 2491 + #define DSM_DEV_TX_STOP_WM_CFG_FAST_STARTUP_ENA_GET(x)\ 2492 + FIELD_GET(DSM_DEV_TX_STOP_WM_CFG_FAST_STARTUP_ENA, x) 2493 + 2494 + #define DSM_DEV_TX_STOP_WM_CFG_DEV10G_SHADOW_ENA BIT(8) 2495 + #define DSM_DEV_TX_STOP_WM_CFG_DEV10G_SHADOW_ENA_SET(x)\ 2496 + FIELD_PREP(DSM_DEV_TX_STOP_WM_CFG_DEV10G_SHADOW_ENA, x) 2497 + #define DSM_DEV_TX_STOP_WM_CFG_DEV10G_SHADOW_ENA_GET(x)\ 2498 + FIELD_GET(DSM_DEV_TX_STOP_WM_CFG_DEV10G_SHADOW_ENA, x) 2499 + 2500 + #define DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM GENMASK(7, 1) 2501 + #define DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM_SET(x)\ 2502 + FIELD_PREP(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM, x) 2503 + #define DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM_GET(x)\ 2504 + FIELD_GET(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM, x) 2505 + 2506 + #define DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR BIT(0) 2507 + #define DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR_SET(x)\ 2508 + FIELD_PREP(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR, x) 2509 + #define DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR_GET(x)\ 2510 + FIELD_GET(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR, x) 2511 + 2512 + /* DSM:CFG:RX_PAUSE_CFG */ 2513 + #define DSM_RX_PAUSE_CFG(r) __REG(TARGET_DSM, 0, 1, 20, 0, 1, 3528, 1628, r, 67, 4) 2514 + 2515 + #define DSM_RX_PAUSE_CFG_RX_PAUSE_EN BIT(1) 2516 + #define DSM_RX_PAUSE_CFG_RX_PAUSE_EN_SET(x)\ 2517 + FIELD_PREP(DSM_RX_PAUSE_CFG_RX_PAUSE_EN, x) 2518 + #define DSM_RX_PAUSE_CFG_RX_PAUSE_EN_GET(x)\ 2519 + FIELD_GET(DSM_RX_PAUSE_CFG_RX_PAUSE_EN, x) 2520 + 2521 + #define DSM_RX_PAUSE_CFG_FC_OBEY_LOCAL BIT(0) 2522 + #define DSM_RX_PAUSE_CFG_FC_OBEY_LOCAL_SET(x)\ 2523 + FIELD_PREP(DSM_RX_PAUSE_CFG_FC_OBEY_LOCAL, x) 2524 + #define DSM_RX_PAUSE_CFG_FC_OBEY_LOCAL_GET(x)\ 2525 + FIELD_GET(DSM_RX_PAUSE_CFG_FC_OBEY_LOCAL, x) 2526 + 2527 + /* DSM:CFG:MAC_CFG */ 2528 + #define DSM_MAC_CFG(r) __REG(TARGET_DSM, 0, 1, 20, 0, 1, 3528, 2432, r, 67, 4) 2529 + 2530 + #define DSM_MAC_CFG_TX_PAUSE_VAL GENMASK(31, 16) 2531 + #define DSM_MAC_CFG_TX_PAUSE_VAL_SET(x)\ 2532 + FIELD_PREP(DSM_MAC_CFG_TX_PAUSE_VAL, x) 2533 + #define DSM_MAC_CFG_TX_PAUSE_VAL_GET(x)\ 2534 + FIELD_GET(DSM_MAC_CFG_TX_PAUSE_VAL, x) 2535 + 2536 + #define DSM_MAC_CFG_HDX_BACKPREASSURE BIT(2) 2537 + #define DSM_MAC_CFG_HDX_BACKPREASSURE_SET(x)\ 2538 + FIELD_PREP(DSM_MAC_CFG_HDX_BACKPREASSURE, x) 2539 + #define DSM_MAC_CFG_HDX_BACKPREASSURE_GET(x)\ 2540 + FIELD_GET(DSM_MAC_CFG_HDX_BACKPREASSURE, x) 2541 + 2542 + #define DSM_MAC_CFG_SEND_PAUSE_FRM_TWICE BIT(1) 2543 + #define DSM_MAC_CFG_SEND_PAUSE_FRM_TWICE_SET(x)\ 2544 + FIELD_PREP(DSM_MAC_CFG_SEND_PAUSE_FRM_TWICE, x) 2545 + #define DSM_MAC_CFG_SEND_PAUSE_FRM_TWICE_GET(x)\ 2546 + FIELD_GET(DSM_MAC_CFG_SEND_PAUSE_FRM_TWICE, x) 2547 + 2548 + #define DSM_MAC_CFG_TX_PAUSE_XON_XOFF BIT(0) 2549 + #define DSM_MAC_CFG_TX_PAUSE_XON_XOFF_SET(x)\ 2550 + FIELD_PREP(DSM_MAC_CFG_TX_PAUSE_XON_XOFF, x) 2551 + #define DSM_MAC_CFG_TX_PAUSE_XON_XOFF_GET(x)\ 2552 + FIELD_GET(DSM_MAC_CFG_TX_PAUSE_XON_XOFF, x) 2553 + 2554 + /* DSM:CFG:MAC_ADDR_BASE_HIGH_CFG */ 2555 + #define DSM_MAC_ADDR_BASE_HIGH_CFG(r) __REG(TARGET_DSM, 0, 1, 20, 0, 1, 3528, 2700, r, 65, 4) 2556 + 2557 + #define DSM_MAC_ADDR_BASE_HIGH_CFG_MAC_ADDR_HIGH GENMASK(23, 0) 2558 + #define DSM_MAC_ADDR_BASE_HIGH_CFG_MAC_ADDR_HIGH_SET(x)\ 2559 + FIELD_PREP(DSM_MAC_ADDR_BASE_HIGH_CFG_MAC_ADDR_HIGH, x) 2560 + #define DSM_MAC_ADDR_BASE_HIGH_CFG_MAC_ADDR_HIGH_GET(x)\ 2561 + FIELD_GET(DSM_MAC_ADDR_BASE_HIGH_CFG_MAC_ADDR_HIGH, x) 2562 + 2563 + /* DSM:CFG:MAC_ADDR_BASE_LOW_CFG */ 2564 + #define DSM_MAC_ADDR_BASE_LOW_CFG(r) __REG(TARGET_DSM, 0, 1, 20, 0, 1, 3528, 2960, r, 65, 4) 2565 + 2566 + #define DSM_MAC_ADDR_BASE_LOW_CFG_MAC_ADDR_LOW GENMASK(23, 0) 2567 + #define DSM_MAC_ADDR_BASE_LOW_CFG_MAC_ADDR_LOW_SET(x)\ 2568 + FIELD_PREP(DSM_MAC_ADDR_BASE_LOW_CFG_MAC_ADDR_LOW, x) 2569 + #define DSM_MAC_ADDR_BASE_LOW_CFG_MAC_ADDR_LOW_GET(x)\ 2570 + FIELD_GET(DSM_MAC_ADDR_BASE_LOW_CFG_MAC_ADDR_LOW, x) 2571 + 2572 + /* DSM:CFG:TAXI_CAL_CFG */ 2573 + #define DSM_TAXI_CAL_CFG(r) __REG(TARGET_DSM, 0, 1, 20, 0, 1, 3528, 3224, r, 9, 4) 2574 + 2575 + #define DSM_TAXI_CAL_CFG_CAL_IDX GENMASK(20, 15) 2576 + #define DSM_TAXI_CAL_CFG_CAL_IDX_SET(x)\ 2577 + FIELD_PREP(DSM_TAXI_CAL_CFG_CAL_IDX, x) 2578 + #define DSM_TAXI_CAL_CFG_CAL_IDX_GET(x)\ 2579 + FIELD_GET(DSM_TAXI_CAL_CFG_CAL_IDX, x) 2580 + 2581 + #define DSM_TAXI_CAL_CFG_CAL_CUR_LEN GENMASK(14, 9) 2582 + #define DSM_TAXI_CAL_CFG_CAL_CUR_LEN_SET(x)\ 2583 + FIELD_PREP(DSM_TAXI_CAL_CFG_CAL_CUR_LEN, x) 2584 + #define DSM_TAXI_CAL_CFG_CAL_CUR_LEN_GET(x)\ 2585 + FIELD_GET(DSM_TAXI_CAL_CFG_CAL_CUR_LEN, x) 2586 + 2587 + #define DSM_TAXI_CAL_CFG_CAL_CUR_VAL GENMASK(8, 5) 2588 + #define DSM_TAXI_CAL_CFG_CAL_CUR_VAL_SET(x)\ 2589 + FIELD_PREP(DSM_TAXI_CAL_CFG_CAL_CUR_VAL, x) 2590 + #define DSM_TAXI_CAL_CFG_CAL_CUR_VAL_GET(x)\ 2591 + FIELD_GET(DSM_TAXI_CAL_CFG_CAL_CUR_VAL, x) 2592 + 2593 + #define DSM_TAXI_CAL_CFG_CAL_PGM_VAL GENMASK(4, 1) 2594 + #define DSM_TAXI_CAL_CFG_CAL_PGM_VAL_SET(x)\ 2595 + FIELD_PREP(DSM_TAXI_CAL_CFG_CAL_PGM_VAL, x) 2596 + #define DSM_TAXI_CAL_CFG_CAL_PGM_VAL_GET(x)\ 2597 + FIELD_GET(DSM_TAXI_CAL_CFG_CAL_PGM_VAL, x) 2598 + 2599 + #define DSM_TAXI_CAL_CFG_CAL_PGM_ENA BIT(0) 2600 + #define DSM_TAXI_CAL_CFG_CAL_PGM_ENA_SET(x)\ 2601 + FIELD_PREP(DSM_TAXI_CAL_CFG_CAL_PGM_ENA, x) 2602 + #define DSM_TAXI_CAL_CFG_CAL_PGM_ENA_GET(x)\ 2603 + FIELD_GET(DSM_TAXI_CAL_CFG_CAL_PGM_ENA, x) 2604 + 2605 + /* EACL:POL_CFG:POL_EACL_CFG */ 2606 + #define EACL_POL_EACL_CFG __REG(TARGET_EACL, 0, 1, 150608, 0, 1, 780, 768, 0, 1, 4) 2607 + 2608 + #define EACL_POL_EACL_CFG_EACL_CNT_MARKED_AS_DROPPED BIT(5) 2609 + #define EACL_POL_EACL_CFG_EACL_CNT_MARKED_AS_DROPPED_SET(x)\ 2610 + FIELD_PREP(EACL_POL_EACL_CFG_EACL_CNT_MARKED_AS_DROPPED, x) 2611 + #define EACL_POL_EACL_CFG_EACL_CNT_MARKED_AS_DROPPED_GET(x)\ 2612 + FIELD_GET(EACL_POL_EACL_CFG_EACL_CNT_MARKED_AS_DROPPED, x) 2613 + 2614 + #define EACL_POL_EACL_CFG_EACL_ALLOW_FP_COPY BIT(4) 2615 + #define EACL_POL_EACL_CFG_EACL_ALLOW_FP_COPY_SET(x)\ 2616 + FIELD_PREP(EACL_POL_EACL_CFG_EACL_ALLOW_FP_COPY, x) 2617 + #define EACL_POL_EACL_CFG_EACL_ALLOW_FP_COPY_GET(x)\ 2618 + FIELD_GET(EACL_POL_EACL_CFG_EACL_ALLOW_FP_COPY, x) 2619 + 2620 + #define EACL_POL_EACL_CFG_EACL_ALLOW_CPU_COPY BIT(3) 2621 + #define EACL_POL_EACL_CFG_EACL_ALLOW_CPU_COPY_SET(x)\ 2622 + FIELD_PREP(EACL_POL_EACL_CFG_EACL_ALLOW_CPU_COPY, x) 2623 + #define EACL_POL_EACL_CFG_EACL_ALLOW_CPU_COPY_GET(x)\ 2624 + FIELD_GET(EACL_POL_EACL_CFG_EACL_ALLOW_CPU_COPY, x) 2625 + 2626 + #define EACL_POL_EACL_CFG_EACL_FORCE_CLOSE BIT(2) 2627 + #define EACL_POL_EACL_CFG_EACL_FORCE_CLOSE_SET(x)\ 2628 + FIELD_PREP(EACL_POL_EACL_CFG_EACL_FORCE_CLOSE, x) 2629 + #define EACL_POL_EACL_CFG_EACL_FORCE_CLOSE_GET(x)\ 2630 + FIELD_GET(EACL_POL_EACL_CFG_EACL_FORCE_CLOSE, x) 2631 + 2632 + #define EACL_POL_EACL_CFG_EACL_FORCE_OPEN BIT(1) 2633 + #define EACL_POL_EACL_CFG_EACL_FORCE_OPEN_SET(x)\ 2634 + FIELD_PREP(EACL_POL_EACL_CFG_EACL_FORCE_OPEN, x) 2635 + #define EACL_POL_EACL_CFG_EACL_FORCE_OPEN_GET(x)\ 2636 + FIELD_GET(EACL_POL_EACL_CFG_EACL_FORCE_OPEN, x) 2637 + 2638 + #define EACL_POL_EACL_CFG_EACL_FORCE_INIT BIT(0) 2639 + #define EACL_POL_EACL_CFG_EACL_FORCE_INIT_SET(x)\ 2640 + FIELD_PREP(EACL_POL_EACL_CFG_EACL_FORCE_INIT, x) 2641 + #define EACL_POL_EACL_CFG_EACL_FORCE_INIT_GET(x)\ 2642 + FIELD_GET(EACL_POL_EACL_CFG_EACL_FORCE_INIT, x) 2643 + 2644 + /* EACL:RAM_CTRL:RAM_INIT */ 2645 + #define EACL_RAM_INIT __REG(TARGET_EACL, 0, 1, 118736, 0, 1, 4, 0, 0, 1, 4) 2646 + 2647 + #define EACL_RAM_INIT_RAM_INIT BIT(1) 2648 + #define EACL_RAM_INIT_RAM_INIT_SET(x)\ 2649 + FIELD_PREP(EACL_RAM_INIT_RAM_INIT, x) 2650 + #define EACL_RAM_INIT_RAM_INIT_GET(x)\ 2651 + FIELD_GET(EACL_RAM_INIT_RAM_INIT, x) 2652 + 2653 + #define EACL_RAM_INIT_RAM_CFG_HOOK BIT(0) 2654 + #define EACL_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 2655 + FIELD_PREP(EACL_RAM_INIT_RAM_CFG_HOOK, x) 2656 + #define EACL_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 2657 + FIELD_GET(EACL_RAM_INIT_RAM_CFG_HOOK, x) 2658 + 2659 + /* FDMA:FDMA:FDMA_CH_ACTIVATE */ 2660 + #define FDMA_CH_ACTIVATE __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 0, 0, 1, 4) 2661 + 2662 + #define FDMA_CH_ACTIVATE_CH_ACTIVATE GENMASK(7, 0) 2663 + #define FDMA_CH_ACTIVATE_CH_ACTIVATE_SET(x)\ 2664 + FIELD_PREP(FDMA_CH_ACTIVATE_CH_ACTIVATE, x) 2665 + #define FDMA_CH_ACTIVATE_CH_ACTIVATE_GET(x)\ 2666 + FIELD_GET(FDMA_CH_ACTIVATE_CH_ACTIVATE, x) 2667 + 2668 + /* FDMA:FDMA:FDMA_CH_RELOAD */ 2669 + #define FDMA_CH_RELOAD __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 4, 0, 1, 4) 2670 + 2671 + #define FDMA_CH_RELOAD_CH_RELOAD GENMASK(7, 0) 2672 + #define FDMA_CH_RELOAD_CH_RELOAD_SET(x)\ 2673 + FIELD_PREP(FDMA_CH_RELOAD_CH_RELOAD, x) 2674 + #define FDMA_CH_RELOAD_CH_RELOAD_GET(x)\ 2675 + FIELD_GET(FDMA_CH_RELOAD_CH_RELOAD, x) 2676 + 2677 + /* FDMA:FDMA:FDMA_CH_DISABLE */ 2678 + #define FDMA_CH_DISABLE __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 8, 0, 1, 4) 2679 + 2680 + #define FDMA_CH_DISABLE_CH_DISABLE GENMASK(7, 0) 2681 + #define FDMA_CH_DISABLE_CH_DISABLE_SET(x)\ 2682 + FIELD_PREP(FDMA_CH_DISABLE_CH_DISABLE, x) 2683 + #define FDMA_CH_DISABLE_CH_DISABLE_GET(x)\ 2684 + FIELD_GET(FDMA_CH_DISABLE_CH_DISABLE, x) 2685 + 2686 + /* FDMA:FDMA:FDMA_DCB_LLP */ 2687 + #define FDMA_DCB_LLP(r) __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 52, r, 8, 4) 2688 + 2689 + /* FDMA:FDMA:FDMA_DCB_LLP1 */ 2690 + #define FDMA_DCB_LLP1(r) __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 84, r, 8, 4) 2691 + 2692 + /* FDMA:FDMA:FDMA_DCB_LLP_PREV */ 2693 + #define FDMA_DCB_LLP_PREV(r) __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 116, r, 8, 4) 2694 + 2695 + /* FDMA:FDMA:FDMA_DCB_LLP_PREV1 */ 2696 + #define FDMA_DCB_LLP_PREV1(r) __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 148, r, 8, 4) 2697 + 2698 + /* FDMA:FDMA:FDMA_CH_CFG */ 2699 + #define FDMA_CH_CFG(r) __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 224, r, 8, 4) 2700 + 2701 + #define FDMA_CH_CFG_CH_XTR_STATUS_MODE BIT(7) 2702 + #define FDMA_CH_CFG_CH_XTR_STATUS_MODE_SET(x)\ 2703 + FIELD_PREP(FDMA_CH_CFG_CH_XTR_STATUS_MODE, x) 2704 + #define FDMA_CH_CFG_CH_XTR_STATUS_MODE_GET(x)\ 2705 + FIELD_GET(FDMA_CH_CFG_CH_XTR_STATUS_MODE, x) 2706 + 2707 + #define FDMA_CH_CFG_CH_INTR_DB_EOF_ONLY BIT(6) 2708 + #define FDMA_CH_CFG_CH_INTR_DB_EOF_ONLY_SET(x)\ 2709 + FIELD_PREP(FDMA_CH_CFG_CH_INTR_DB_EOF_ONLY, x) 2710 + #define FDMA_CH_CFG_CH_INTR_DB_EOF_ONLY_GET(x)\ 2711 + FIELD_GET(FDMA_CH_CFG_CH_INTR_DB_EOF_ONLY, x) 2712 + 2713 + #define FDMA_CH_CFG_CH_INJ_PORT BIT(5) 2714 + #define FDMA_CH_CFG_CH_INJ_PORT_SET(x)\ 2715 + FIELD_PREP(FDMA_CH_CFG_CH_INJ_PORT, x) 2716 + #define FDMA_CH_CFG_CH_INJ_PORT_GET(x)\ 2717 + FIELD_GET(FDMA_CH_CFG_CH_INJ_PORT, x) 2718 + 2719 + #define FDMA_CH_CFG_CH_DCB_DB_CNT GENMASK(4, 1) 2720 + #define FDMA_CH_CFG_CH_DCB_DB_CNT_SET(x)\ 2721 + FIELD_PREP(FDMA_CH_CFG_CH_DCB_DB_CNT, x) 2722 + #define FDMA_CH_CFG_CH_DCB_DB_CNT_GET(x)\ 2723 + FIELD_GET(FDMA_CH_CFG_CH_DCB_DB_CNT, x) 2724 + 2725 + #define FDMA_CH_CFG_CH_MEM BIT(0) 2726 + #define FDMA_CH_CFG_CH_MEM_SET(x)\ 2727 + FIELD_PREP(FDMA_CH_CFG_CH_MEM, x) 2728 + #define FDMA_CH_CFG_CH_MEM_GET(x)\ 2729 + FIELD_GET(FDMA_CH_CFG_CH_MEM, x) 2730 + 2731 + /* FDMA:FDMA:FDMA_CH_TRANSLATE */ 2732 + #define FDMA_CH_TRANSLATE(r) __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 256, r, 8, 4) 2733 + 2734 + #define FDMA_CH_TRANSLATE_OFFSET GENMASK(15, 0) 2735 + #define FDMA_CH_TRANSLATE_OFFSET_SET(x)\ 2736 + FIELD_PREP(FDMA_CH_TRANSLATE_OFFSET, x) 2737 + #define FDMA_CH_TRANSLATE_OFFSET_GET(x)\ 2738 + FIELD_GET(FDMA_CH_TRANSLATE_OFFSET, x) 2739 + 2740 + /* FDMA:FDMA:FDMA_XTR_CFG */ 2741 + #define FDMA_XTR_CFG __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 364, 0, 1, 4) 2742 + 2743 + #define FDMA_XTR_CFG_XTR_FIFO_WM GENMASK(15, 11) 2744 + #define FDMA_XTR_CFG_XTR_FIFO_WM_SET(x)\ 2745 + FIELD_PREP(FDMA_XTR_CFG_XTR_FIFO_WM, x) 2746 + #define FDMA_XTR_CFG_XTR_FIFO_WM_GET(x)\ 2747 + FIELD_GET(FDMA_XTR_CFG_XTR_FIFO_WM, x) 2748 + 2749 + #define FDMA_XTR_CFG_XTR_ARB_SAT GENMASK(10, 0) 2750 + #define FDMA_XTR_CFG_XTR_ARB_SAT_SET(x)\ 2751 + FIELD_PREP(FDMA_XTR_CFG_XTR_ARB_SAT, x) 2752 + #define FDMA_XTR_CFG_XTR_ARB_SAT_GET(x)\ 2753 + FIELD_GET(FDMA_XTR_CFG_XTR_ARB_SAT, x) 2754 + 2755 + /* FDMA:FDMA:FDMA_PORT_CTRL */ 2756 + #define FDMA_PORT_CTRL(r) __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 376, r, 2, 4) 2757 + 2758 + #define FDMA_PORT_CTRL_INJ_STOP BIT(4) 2759 + #define FDMA_PORT_CTRL_INJ_STOP_SET(x)\ 2760 + FIELD_PREP(FDMA_PORT_CTRL_INJ_STOP, x) 2761 + #define FDMA_PORT_CTRL_INJ_STOP_GET(x)\ 2762 + FIELD_GET(FDMA_PORT_CTRL_INJ_STOP, x) 2763 + 2764 + #define FDMA_PORT_CTRL_INJ_STOP_FORCE BIT(3) 2765 + #define FDMA_PORT_CTRL_INJ_STOP_FORCE_SET(x)\ 2766 + FIELD_PREP(FDMA_PORT_CTRL_INJ_STOP_FORCE, x) 2767 + #define FDMA_PORT_CTRL_INJ_STOP_FORCE_GET(x)\ 2768 + FIELD_GET(FDMA_PORT_CTRL_INJ_STOP_FORCE, x) 2769 + 2770 + #define FDMA_PORT_CTRL_XTR_STOP BIT(2) 2771 + #define FDMA_PORT_CTRL_XTR_STOP_SET(x)\ 2772 + FIELD_PREP(FDMA_PORT_CTRL_XTR_STOP, x) 2773 + #define FDMA_PORT_CTRL_XTR_STOP_GET(x)\ 2774 + FIELD_GET(FDMA_PORT_CTRL_XTR_STOP, x) 2775 + 2776 + #define FDMA_PORT_CTRL_XTR_BUF_IS_EMPTY BIT(1) 2777 + #define FDMA_PORT_CTRL_XTR_BUF_IS_EMPTY_SET(x)\ 2778 + FIELD_PREP(FDMA_PORT_CTRL_XTR_BUF_IS_EMPTY, x) 2779 + #define FDMA_PORT_CTRL_XTR_BUF_IS_EMPTY_GET(x)\ 2780 + FIELD_GET(FDMA_PORT_CTRL_XTR_BUF_IS_EMPTY, x) 2781 + 2782 + #define FDMA_PORT_CTRL_XTR_BUF_RST BIT(0) 2783 + #define FDMA_PORT_CTRL_XTR_BUF_RST_SET(x)\ 2784 + FIELD_PREP(FDMA_PORT_CTRL_XTR_BUF_RST, x) 2785 + #define FDMA_PORT_CTRL_XTR_BUF_RST_GET(x)\ 2786 + FIELD_GET(FDMA_PORT_CTRL_XTR_BUF_RST, x) 2787 + 2788 + /* FDMA:FDMA:FDMA_INTR_DCB */ 2789 + #define FDMA_INTR_DCB __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 384, 0, 1, 4) 2790 + 2791 + #define FDMA_INTR_DCB_INTR_DCB GENMASK(7, 0) 2792 + #define FDMA_INTR_DCB_INTR_DCB_SET(x)\ 2793 + FIELD_PREP(FDMA_INTR_DCB_INTR_DCB, x) 2794 + #define FDMA_INTR_DCB_INTR_DCB_GET(x)\ 2795 + FIELD_GET(FDMA_INTR_DCB_INTR_DCB, x) 2796 + 2797 + /* FDMA:FDMA:FDMA_INTR_DCB_ENA */ 2798 + #define FDMA_INTR_DCB_ENA __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 388, 0, 1, 4) 2799 + 2800 + #define FDMA_INTR_DCB_ENA_INTR_DCB_ENA GENMASK(7, 0) 2801 + #define FDMA_INTR_DCB_ENA_INTR_DCB_ENA_SET(x)\ 2802 + FIELD_PREP(FDMA_INTR_DCB_ENA_INTR_DCB_ENA, x) 2803 + #define FDMA_INTR_DCB_ENA_INTR_DCB_ENA_GET(x)\ 2804 + FIELD_GET(FDMA_INTR_DCB_ENA_INTR_DCB_ENA, x) 2805 + 2806 + /* FDMA:FDMA:FDMA_INTR_DB */ 2807 + #define FDMA_INTR_DB __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 392, 0, 1, 4) 2808 + 2809 + #define FDMA_INTR_DB_INTR_DB GENMASK(7, 0) 2810 + #define FDMA_INTR_DB_INTR_DB_SET(x)\ 2811 + FIELD_PREP(FDMA_INTR_DB_INTR_DB, x) 2812 + #define FDMA_INTR_DB_INTR_DB_GET(x)\ 2813 + FIELD_GET(FDMA_INTR_DB_INTR_DB, x) 2814 + 2815 + /* FDMA:FDMA:FDMA_INTR_DB_ENA */ 2816 + #define FDMA_INTR_DB_ENA __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 396, 0, 1, 4) 2817 + 2818 + #define FDMA_INTR_DB_ENA_INTR_DB_ENA GENMASK(7, 0) 2819 + #define FDMA_INTR_DB_ENA_INTR_DB_ENA_SET(x)\ 2820 + FIELD_PREP(FDMA_INTR_DB_ENA_INTR_DB_ENA, x) 2821 + #define FDMA_INTR_DB_ENA_INTR_DB_ENA_GET(x)\ 2822 + FIELD_GET(FDMA_INTR_DB_ENA_INTR_DB_ENA, x) 2823 + 2824 + /* FDMA:FDMA:FDMA_INTR_ERR */ 2825 + #define FDMA_INTR_ERR __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 400, 0, 1, 4) 2826 + 2827 + #define FDMA_INTR_ERR_INTR_PORT_ERR GENMASK(9, 8) 2828 + #define FDMA_INTR_ERR_INTR_PORT_ERR_SET(x)\ 2829 + FIELD_PREP(FDMA_INTR_ERR_INTR_PORT_ERR, x) 2830 + #define FDMA_INTR_ERR_INTR_PORT_ERR_GET(x)\ 2831 + FIELD_GET(FDMA_INTR_ERR_INTR_PORT_ERR, x) 2832 + 2833 + #define FDMA_INTR_ERR_INTR_CH_ERR GENMASK(7, 0) 2834 + #define FDMA_INTR_ERR_INTR_CH_ERR_SET(x)\ 2835 + FIELD_PREP(FDMA_INTR_ERR_INTR_CH_ERR, x) 2836 + #define FDMA_INTR_ERR_INTR_CH_ERR_GET(x)\ 2837 + FIELD_GET(FDMA_INTR_ERR_INTR_CH_ERR, x) 2838 + 2839 + /* FDMA:FDMA:FDMA_ERRORS */ 2840 + #define FDMA_ERRORS __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 412, 0, 1, 4) 2841 + 2842 + #define FDMA_ERRORS_ERR_XTR_WR GENMASK(31, 30) 2843 + #define FDMA_ERRORS_ERR_XTR_WR_SET(x)\ 2844 + FIELD_PREP(FDMA_ERRORS_ERR_XTR_WR, x) 2845 + #define FDMA_ERRORS_ERR_XTR_WR_GET(x)\ 2846 + FIELD_GET(FDMA_ERRORS_ERR_XTR_WR, x) 2847 + 2848 + #define FDMA_ERRORS_ERR_XTR_OVF GENMASK(29, 28) 2849 + #define FDMA_ERRORS_ERR_XTR_OVF_SET(x)\ 2850 + FIELD_PREP(FDMA_ERRORS_ERR_XTR_OVF, x) 2851 + #define FDMA_ERRORS_ERR_XTR_OVF_GET(x)\ 2852 + FIELD_GET(FDMA_ERRORS_ERR_XTR_OVF, x) 2853 + 2854 + #define FDMA_ERRORS_ERR_XTR_TAXI32_OVF GENMASK(27, 26) 2855 + #define FDMA_ERRORS_ERR_XTR_TAXI32_OVF_SET(x)\ 2856 + FIELD_PREP(FDMA_ERRORS_ERR_XTR_TAXI32_OVF, x) 2857 + #define FDMA_ERRORS_ERR_XTR_TAXI32_OVF_GET(x)\ 2858 + FIELD_GET(FDMA_ERRORS_ERR_XTR_TAXI32_OVF, x) 2859 + 2860 + #define FDMA_ERRORS_ERR_DCB_XTR_DATAL GENMASK(25, 24) 2861 + #define FDMA_ERRORS_ERR_DCB_XTR_DATAL_SET(x)\ 2862 + FIELD_PREP(FDMA_ERRORS_ERR_DCB_XTR_DATAL, x) 2863 + #define FDMA_ERRORS_ERR_DCB_XTR_DATAL_GET(x)\ 2864 + FIELD_GET(FDMA_ERRORS_ERR_DCB_XTR_DATAL, x) 2865 + 2866 + #define FDMA_ERRORS_ERR_DCB_RD GENMASK(23, 16) 2867 + #define FDMA_ERRORS_ERR_DCB_RD_SET(x)\ 2868 + FIELD_PREP(FDMA_ERRORS_ERR_DCB_RD, x) 2869 + #define FDMA_ERRORS_ERR_DCB_RD_GET(x)\ 2870 + FIELD_GET(FDMA_ERRORS_ERR_DCB_RD, x) 2871 + 2872 + #define FDMA_ERRORS_ERR_INJ_RD GENMASK(15, 10) 2873 + #define FDMA_ERRORS_ERR_INJ_RD_SET(x)\ 2874 + FIELD_PREP(FDMA_ERRORS_ERR_INJ_RD, x) 2875 + #define FDMA_ERRORS_ERR_INJ_RD_GET(x)\ 2876 + FIELD_GET(FDMA_ERRORS_ERR_INJ_RD, x) 2877 + 2878 + #define FDMA_ERRORS_ERR_INJ_OUT_OF_SYNC GENMASK(9, 8) 2879 + #define FDMA_ERRORS_ERR_INJ_OUT_OF_SYNC_SET(x)\ 2880 + FIELD_PREP(FDMA_ERRORS_ERR_INJ_OUT_OF_SYNC, x) 2881 + #define FDMA_ERRORS_ERR_INJ_OUT_OF_SYNC_GET(x)\ 2882 + FIELD_GET(FDMA_ERRORS_ERR_INJ_OUT_OF_SYNC, x) 2883 + 2884 + #define FDMA_ERRORS_ERR_CH_WR GENMASK(7, 0) 2885 + #define FDMA_ERRORS_ERR_CH_WR_SET(x)\ 2886 + FIELD_PREP(FDMA_ERRORS_ERR_CH_WR, x) 2887 + #define FDMA_ERRORS_ERR_CH_WR_GET(x)\ 2888 + FIELD_GET(FDMA_ERRORS_ERR_CH_WR, x) 2889 + 2890 + /* FDMA:FDMA:FDMA_ERRORS_2 */ 2891 + #define FDMA_ERRORS_2 __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 416, 0, 1, 4) 2892 + 2893 + #define FDMA_ERRORS_2_ERR_XTR_FRAG GENMASK(1, 0) 2894 + #define FDMA_ERRORS_2_ERR_XTR_FRAG_SET(x)\ 2895 + FIELD_PREP(FDMA_ERRORS_2_ERR_XTR_FRAG, x) 2896 + #define FDMA_ERRORS_2_ERR_XTR_FRAG_GET(x)\ 2897 + FIELD_GET(FDMA_ERRORS_2_ERR_XTR_FRAG, x) 2898 + 2899 + /* FDMA:FDMA:FDMA_CTRL */ 2900 + #define FDMA_CTRL __REG(TARGET_FDMA, 0, 1, 8, 0, 1, 428, 424, 0, 1, 4) 2901 + 2902 + #define FDMA_CTRL_NRESET BIT(0) 2903 + #define FDMA_CTRL_NRESET_SET(x)\ 2904 + FIELD_PREP(FDMA_CTRL_NRESET, x) 2905 + #define FDMA_CTRL_NRESET_GET(x)\ 2906 + FIELD_GET(FDMA_CTRL_NRESET, x) 2907 + 2908 + /* DEVCPU_GCB:CHIP_REGS:CHIP_ID */ 2909 + #define GCB_CHIP_ID __REG(TARGET_GCB, 0, 1, 0, 0, 1, 424, 0, 0, 1, 4) 2910 + 2911 + #define GCB_CHIP_ID_REV_ID GENMASK(31, 28) 2912 + #define GCB_CHIP_ID_REV_ID_SET(x)\ 2913 + FIELD_PREP(GCB_CHIP_ID_REV_ID, x) 2914 + #define GCB_CHIP_ID_REV_ID_GET(x)\ 2915 + FIELD_GET(GCB_CHIP_ID_REV_ID, x) 2916 + 2917 + #define GCB_CHIP_ID_PART_ID GENMASK(27, 12) 2918 + #define GCB_CHIP_ID_PART_ID_SET(x)\ 2919 + FIELD_PREP(GCB_CHIP_ID_PART_ID, x) 2920 + #define GCB_CHIP_ID_PART_ID_GET(x)\ 2921 + FIELD_GET(GCB_CHIP_ID_PART_ID, x) 2922 + 2923 + #define GCB_CHIP_ID_MFG_ID GENMASK(11, 1) 2924 + #define GCB_CHIP_ID_MFG_ID_SET(x)\ 2925 + FIELD_PREP(GCB_CHIP_ID_MFG_ID, x) 2926 + #define GCB_CHIP_ID_MFG_ID_GET(x)\ 2927 + FIELD_GET(GCB_CHIP_ID_MFG_ID, x) 2928 + 2929 + #define GCB_CHIP_ID_ONE BIT(0) 2930 + #define GCB_CHIP_ID_ONE_SET(x)\ 2931 + FIELD_PREP(GCB_CHIP_ID_ONE, x) 2932 + #define GCB_CHIP_ID_ONE_GET(x)\ 2933 + FIELD_GET(GCB_CHIP_ID_ONE, x) 2934 + 2935 + /* DEVCPU_GCB:CHIP_REGS:SOFT_RST */ 2936 + #define GCB_SOFT_RST __REG(TARGET_GCB, 0, 1, 0, 0, 1, 424, 8, 0, 1, 4) 2937 + 2938 + #define GCB_SOFT_RST_SOFT_NON_CFG_RST BIT(2) 2939 + #define GCB_SOFT_RST_SOFT_NON_CFG_RST_SET(x)\ 2940 + FIELD_PREP(GCB_SOFT_RST_SOFT_NON_CFG_RST, x) 2941 + #define GCB_SOFT_RST_SOFT_NON_CFG_RST_GET(x)\ 2942 + FIELD_GET(GCB_SOFT_RST_SOFT_NON_CFG_RST, x) 2943 + 2944 + #define GCB_SOFT_RST_SOFT_SWC_RST BIT(1) 2945 + #define GCB_SOFT_RST_SOFT_SWC_RST_SET(x)\ 2946 + FIELD_PREP(GCB_SOFT_RST_SOFT_SWC_RST, x) 2947 + #define GCB_SOFT_RST_SOFT_SWC_RST_GET(x)\ 2948 + FIELD_GET(GCB_SOFT_RST_SOFT_SWC_RST, x) 2949 + 2950 + #define GCB_SOFT_RST_SOFT_CHIP_RST BIT(0) 2951 + #define GCB_SOFT_RST_SOFT_CHIP_RST_SET(x)\ 2952 + FIELD_PREP(GCB_SOFT_RST_SOFT_CHIP_RST, x) 2953 + #define GCB_SOFT_RST_SOFT_CHIP_RST_GET(x)\ 2954 + FIELD_GET(GCB_SOFT_RST_SOFT_CHIP_RST, x) 2955 + 2956 + /* DEVCPU_GCB:CHIP_REGS:HW_SGPIO_SD_CFG */ 2957 + #define GCB_HW_SGPIO_SD_CFG __REG(TARGET_GCB, 0, 1, 0, 0, 1, 424, 20, 0, 1, 4) 2958 + 2959 + #define GCB_HW_SGPIO_SD_CFG_SD_HIGH_ENA BIT(1) 2960 + #define GCB_HW_SGPIO_SD_CFG_SD_HIGH_ENA_SET(x)\ 2961 + FIELD_PREP(GCB_HW_SGPIO_SD_CFG_SD_HIGH_ENA, x) 2962 + #define GCB_HW_SGPIO_SD_CFG_SD_HIGH_ENA_GET(x)\ 2963 + FIELD_GET(GCB_HW_SGPIO_SD_CFG_SD_HIGH_ENA, x) 2964 + 2965 + #define GCB_HW_SGPIO_SD_CFG_SD_MAP_SEL BIT(0) 2966 + #define GCB_HW_SGPIO_SD_CFG_SD_MAP_SEL_SET(x)\ 2967 + FIELD_PREP(GCB_HW_SGPIO_SD_CFG_SD_MAP_SEL, x) 2968 + #define GCB_HW_SGPIO_SD_CFG_SD_MAP_SEL_GET(x)\ 2969 + FIELD_GET(GCB_HW_SGPIO_SD_CFG_SD_MAP_SEL, x) 2970 + 2971 + /* DEVCPU_GCB:CHIP_REGS:HW_SGPIO_TO_SD_MAP_CFG */ 2972 + #define GCB_HW_SGPIO_TO_SD_MAP_CFG(r) __REG(TARGET_GCB, 0, 1, 0, 0, 1, 424, 24, r, 65, 4) 2973 + 2974 + #define GCB_HW_SGPIO_TO_SD_MAP_CFG_SGPIO_TO_SD_SEL GENMASK(8, 0) 2975 + #define GCB_HW_SGPIO_TO_SD_MAP_CFG_SGPIO_TO_SD_SEL_SET(x)\ 2976 + FIELD_PREP(GCB_HW_SGPIO_TO_SD_MAP_CFG_SGPIO_TO_SD_SEL, x) 2977 + #define GCB_HW_SGPIO_TO_SD_MAP_CFG_SGPIO_TO_SD_SEL_GET(x)\ 2978 + FIELD_GET(GCB_HW_SGPIO_TO_SD_MAP_CFG_SGPIO_TO_SD_SEL, x) 2979 + 2980 + /* DEVCPU_GCB:SIO_CTRL:SIO_CLOCK */ 2981 + #define GCB_SIO_CLOCK(g) __REG(TARGET_GCB, 0, 1, 876, g, 3, 280, 20, 0, 1, 4) 2982 + 2983 + #define GCB_SIO_CLOCK_SIO_CLK_FREQ GENMASK(19, 8) 2984 + #define GCB_SIO_CLOCK_SIO_CLK_FREQ_SET(x)\ 2985 + FIELD_PREP(GCB_SIO_CLOCK_SIO_CLK_FREQ, x) 2986 + #define GCB_SIO_CLOCK_SIO_CLK_FREQ_GET(x)\ 2987 + FIELD_GET(GCB_SIO_CLOCK_SIO_CLK_FREQ, x) 2988 + 2989 + #define GCB_SIO_CLOCK_SYS_CLK_PERIOD GENMASK(7, 0) 2990 + #define GCB_SIO_CLOCK_SYS_CLK_PERIOD_SET(x)\ 2991 + FIELD_PREP(GCB_SIO_CLOCK_SYS_CLK_PERIOD, x) 2992 + #define GCB_SIO_CLOCK_SYS_CLK_PERIOD_GET(x)\ 2993 + FIELD_GET(GCB_SIO_CLOCK_SYS_CLK_PERIOD, x) 2994 + 2995 + /* HSCH:HSCH_MISC:SYS_CLK_PER */ 2996 + #define HSCH_SYS_CLK_PER __REG(TARGET_HSCH, 0, 1, 163104, 0, 1, 648, 640, 0, 1, 4) 2997 + 2998 + #define HSCH_SYS_CLK_PER_SYS_CLK_PER_100PS GENMASK(7, 0) 2999 + #define HSCH_SYS_CLK_PER_SYS_CLK_PER_100PS_SET(x)\ 3000 + FIELD_PREP(HSCH_SYS_CLK_PER_SYS_CLK_PER_100PS, x) 3001 + #define HSCH_SYS_CLK_PER_SYS_CLK_PER_100PS_GET(x)\ 3002 + FIELD_GET(HSCH_SYS_CLK_PER_SYS_CLK_PER_100PS, x) 3003 + 3004 + /* HSCH:SYSTEM:FLUSH_CTRL */ 3005 + #define HSCH_FLUSH_CTRL __REG(TARGET_HSCH, 0, 1, 184000, 0, 1, 312, 4, 0, 1, 4) 3006 + 3007 + #define HSCH_FLUSH_CTRL_FLUSH_ENA BIT(27) 3008 + #define HSCH_FLUSH_CTRL_FLUSH_ENA_SET(x)\ 3009 + FIELD_PREP(HSCH_FLUSH_CTRL_FLUSH_ENA, x) 3010 + #define HSCH_FLUSH_CTRL_FLUSH_ENA_GET(x)\ 3011 + FIELD_GET(HSCH_FLUSH_CTRL_FLUSH_ENA, x) 3012 + 3013 + #define HSCH_FLUSH_CTRL_FLUSH_SRC BIT(26) 3014 + #define HSCH_FLUSH_CTRL_FLUSH_SRC_SET(x)\ 3015 + FIELD_PREP(HSCH_FLUSH_CTRL_FLUSH_SRC, x) 3016 + #define HSCH_FLUSH_CTRL_FLUSH_SRC_GET(x)\ 3017 + FIELD_GET(HSCH_FLUSH_CTRL_FLUSH_SRC, x) 3018 + 3019 + #define HSCH_FLUSH_CTRL_FLUSH_DST BIT(25) 3020 + #define HSCH_FLUSH_CTRL_FLUSH_DST_SET(x)\ 3021 + FIELD_PREP(HSCH_FLUSH_CTRL_FLUSH_DST, x) 3022 + #define HSCH_FLUSH_CTRL_FLUSH_DST_GET(x)\ 3023 + FIELD_GET(HSCH_FLUSH_CTRL_FLUSH_DST, x) 3024 + 3025 + #define HSCH_FLUSH_CTRL_FLUSH_PORT GENMASK(24, 18) 3026 + #define HSCH_FLUSH_CTRL_FLUSH_PORT_SET(x)\ 3027 + FIELD_PREP(HSCH_FLUSH_CTRL_FLUSH_PORT, x) 3028 + #define HSCH_FLUSH_CTRL_FLUSH_PORT_GET(x)\ 3029 + FIELD_GET(HSCH_FLUSH_CTRL_FLUSH_PORT, x) 3030 + 3031 + #define HSCH_FLUSH_CTRL_FLUSH_QUEUE BIT(17) 3032 + #define HSCH_FLUSH_CTRL_FLUSH_QUEUE_SET(x)\ 3033 + FIELD_PREP(HSCH_FLUSH_CTRL_FLUSH_QUEUE, x) 3034 + #define HSCH_FLUSH_CTRL_FLUSH_QUEUE_GET(x)\ 3035 + FIELD_GET(HSCH_FLUSH_CTRL_FLUSH_QUEUE, x) 3036 + 3037 + #define HSCH_FLUSH_CTRL_FLUSH_SE BIT(16) 3038 + #define HSCH_FLUSH_CTRL_FLUSH_SE_SET(x)\ 3039 + FIELD_PREP(HSCH_FLUSH_CTRL_FLUSH_SE, x) 3040 + #define HSCH_FLUSH_CTRL_FLUSH_SE_GET(x)\ 3041 + FIELD_GET(HSCH_FLUSH_CTRL_FLUSH_SE, x) 3042 + 3043 + #define HSCH_FLUSH_CTRL_FLUSH_HIER GENMASK(15, 0) 3044 + #define HSCH_FLUSH_CTRL_FLUSH_HIER_SET(x)\ 3045 + FIELD_PREP(HSCH_FLUSH_CTRL_FLUSH_HIER, x) 3046 + #define HSCH_FLUSH_CTRL_FLUSH_HIER_GET(x)\ 3047 + FIELD_GET(HSCH_FLUSH_CTRL_FLUSH_HIER, x) 3048 + 3049 + /* HSCH:SYSTEM:PORT_MODE */ 3050 + #define HSCH_PORT_MODE(r) __REG(TARGET_HSCH, 0, 1, 184000, 0, 1, 312, 8, r, 70, 4) 3051 + 3052 + #define HSCH_PORT_MODE_DEQUEUE_DIS BIT(4) 3053 + #define HSCH_PORT_MODE_DEQUEUE_DIS_SET(x)\ 3054 + FIELD_PREP(HSCH_PORT_MODE_DEQUEUE_DIS, x) 3055 + #define HSCH_PORT_MODE_DEQUEUE_DIS_GET(x)\ 3056 + FIELD_GET(HSCH_PORT_MODE_DEQUEUE_DIS, x) 3057 + 3058 + #define HSCH_PORT_MODE_AGE_DIS BIT(3) 3059 + #define HSCH_PORT_MODE_AGE_DIS_SET(x)\ 3060 + FIELD_PREP(HSCH_PORT_MODE_AGE_DIS, x) 3061 + #define HSCH_PORT_MODE_AGE_DIS_GET(x)\ 3062 + FIELD_GET(HSCH_PORT_MODE_AGE_DIS, x) 3063 + 3064 + #define HSCH_PORT_MODE_TRUNC_ENA BIT(2) 3065 + #define HSCH_PORT_MODE_TRUNC_ENA_SET(x)\ 3066 + FIELD_PREP(HSCH_PORT_MODE_TRUNC_ENA, x) 3067 + #define HSCH_PORT_MODE_TRUNC_ENA_GET(x)\ 3068 + FIELD_GET(HSCH_PORT_MODE_TRUNC_ENA, x) 3069 + 3070 + #define HSCH_PORT_MODE_EIR_REMARK_ENA BIT(1) 3071 + #define HSCH_PORT_MODE_EIR_REMARK_ENA_SET(x)\ 3072 + FIELD_PREP(HSCH_PORT_MODE_EIR_REMARK_ENA, x) 3073 + #define HSCH_PORT_MODE_EIR_REMARK_ENA_GET(x)\ 3074 + FIELD_GET(HSCH_PORT_MODE_EIR_REMARK_ENA, x) 3075 + 3076 + #define HSCH_PORT_MODE_CPU_PRIO_MODE BIT(0) 3077 + #define HSCH_PORT_MODE_CPU_PRIO_MODE_SET(x)\ 3078 + FIELD_PREP(HSCH_PORT_MODE_CPU_PRIO_MODE, x) 3079 + #define HSCH_PORT_MODE_CPU_PRIO_MODE_GET(x)\ 3080 + FIELD_GET(HSCH_PORT_MODE_CPU_PRIO_MODE, x) 3081 + 3082 + /* HSCH:SYSTEM:OUTB_SHARE_ENA */ 3083 + #define HSCH_OUTB_SHARE_ENA(r) __REG(TARGET_HSCH, 0, 1, 184000, 0, 1, 312, 288, r, 5, 4) 3084 + 3085 + #define HSCH_OUTB_SHARE_ENA_OUTB_SHARE_ENA GENMASK(7, 0) 3086 + #define HSCH_OUTB_SHARE_ENA_OUTB_SHARE_ENA_SET(x)\ 3087 + FIELD_PREP(HSCH_OUTB_SHARE_ENA_OUTB_SHARE_ENA, x) 3088 + #define HSCH_OUTB_SHARE_ENA_OUTB_SHARE_ENA_GET(x)\ 3089 + FIELD_GET(HSCH_OUTB_SHARE_ENA_OUTB_SHARE_ENA, x) 3090 + 3091 + /* HSCH:MMGT:RESET_CFG */ 3092 + #define HSCH_RESET_CFG __REG(TARGET_HSCH, 0, 1, 162368, 0, 1, 16, 8, 0, 1, 4) 3093 + 3094 + #define HSCH_RESET_CFG_CORE_ENA BIT(0) 3095 + #define HSCH_RESET_CFG_CORE_ENA_SET(x)\ 3096 + FIELD_PREP(HSCH_RESET_CFG_CORE_ENA, x) 3097 + #define HSCH_RESET_CFG_CORE_ENA_GET(x)\ 3098 + FIELD_GET(HSCH_RESET_CFG_CORE_ENA, x) 3099 + 3100 + /* HSCH:TAS_CONFIG:TAS_STATEMACHINE_CFG */ 3101 + #define HSCH_TAS_STATEMACHINE_CFG __REG(TARGET_HSCH, 0, 1, 162384, 0, 1, 12, 8, 0, 1, 4) 3102 + 3103 + #define HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY GENMASK(7, 0) 3104 + #define HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY_SET(x)\ 3105 + FIELD_PREP(HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY, x) 3106 + #define HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY_GET(x)\ 3107 + FIELD_GET(HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY, x) 3108 + 3109 + /* LRN:COMMON:COMMON_ACCESS_CTRL */ 3110 + #define LRN_COMMON_ACCESS_CTRL __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 0, 0, 1, 4) 3111 + 3112 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_COL GENMASK(21, 20) 3113 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_COL_SET(x)\ 3114 + FIELD_PREP(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_COL, x) 3115 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_COL_GET(x)\ 3116 + FIELD_GET(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_COL, x) 3117 + 3118 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_TYPE BIT(19) 3119 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_TYPE_SET(x)\ 3120 + FIELD_PREP(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_TYPE, x) 3121 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_TYPE_GET(x)\ 3122 + FIELD_GET(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_TYPE, x) 3123 + 3124 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_ROW GENMASK(18, 5) 3125 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_ROW_SET(x)\ 3126 + FIELD_PREP(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_ROW, x) 3127 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_ROW_GET(x)\ 3128 + FIELD_GET(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_DIRECT_ROW, x) 3129 + 3130 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD GENMASK(4, 1) 3131 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(x)\ 3132 + FIELD_PREP(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD, x) 3133 + #define LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_GET(x)\ 3134 + FIELD_GET(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD, x) 3135 + 3136 + #define LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT BIT(0) 3137 + #define LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_SET(x)\ 3138 + FIELD_PREP(LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT, x) 3139 + #define LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_GET(x)\ 3140 + FIELD_GET(LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT, x) 3141 + 3142 + /* LRN:COMMON:MAC_ACCESS_CFG_0 */ 3143 + #define LRN_MAC_ACCESS_CFG_0 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 4, 0, 1, 4) 3144 + 3145 + #define LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_FID GENMASK(28, 16) 3146 + #define LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_FID_SET(x)\ 3147 + FIELD_PREP(LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_FID, x) 3148 + #define LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_FID_GET(x)\ 3149 + FIELD_GET(LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_FID, x) 3150 + 3151 + #define LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_MAC_MSB GENMASK(15, 0) 3152 + #define LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_MAC_MSB_SET(x)\ 3153 + FIELD_PREP(LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_MAC_MSB, x) 3154 + #define LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_MAC_MSB_GET(x)\ 3155 + FIELD_GET(LRN_MAC_ACCESS_CFG_0_MAC_ENTRY_MAC_MSB, x) 3156 + 3157 + /* LRN:COMMON:MAC_ACCESS_CFG_1 */ 3158 + #define LRN_MAC_ACCESS_CFG_1 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 8, 0, 1, 4) 3159 + 3160 + /* LRN:COMMON:MAC_ACCESS_CFG_2 */ 3161 + #define LRN_MAC_ACCESS_CFG_2 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 12, 0, 1, 4) 3162 + 3163 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_SRC_KILL_FWD BIT(28) 3164 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_SRC_KILL_FWD_SET(x)\ 3165 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_SRC_KILL_FWD, x) 3166 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_SRC_KILL_FWD_GET(x)\ 3167 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_SRC_KILL_FWD, x) 3168 + 3169 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_NXT_LRN_ALL BIT(27) 3170 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_NXT_LRN_ALL_SET(x)\ 3171 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_NXT_LRN_ALL, x) 3172 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_NXT_LRN_ALL_GET(x)\ 3173 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_NXT_LRN_ALL, x) 3174 + 3175 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_QU GENMASK(26, 24) 3176 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_QU_SET(x)\ 3177 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_QU, x) 3178 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_QU_GET(x)\ 3179 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_QU, x) 3180 + 3181 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_COPY BIT(23) 3182 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_COPY_SET(x)\ 3183 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_COPY, x) 3184 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_COPY_GET(x)\ 3185 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_CPU_COPY, x) 3186 + 3187 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLAN_IGNORE BIT(22) 3188 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLAN_IGNORE_SET(x)\ 3189 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLAN_IGNORE, x) 3190 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLAN_IGNORE_GET(x)\ 3191 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLAN_IGNORE, x) 3192 + 3193 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_MIRROR BIT(21) 3194 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_MIRROR_SET(x)\ 3195 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_MIRROR, x) 3196 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_MIRROR_GET(x)\ 3197 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_MIRROR, x) 3198 + 3199 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_FLAG GENMASK(20, 19) 3200 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_FLAG_SET(x)\ 3201 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_FLAG, x) 3202 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_FLAG_GET(x)\ 3203 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_FLAG, x) 3204 + 3205 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_INTERVAL GENMASK(18, 17) 3206 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_INTERVAL_SET(x)\ 3207 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_INTERVAL, x) 3208 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_INTERVAL_GET(x)\ 3209 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_AGE_INTERVAL, x) 3210 + 3211 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_LOCKED BIT(16) 3212 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_LOCKED_SET(x)\ 3213 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_LOCKED, x) 3214 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_LOCKED_GET(x)\ 3215 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_LOCKED, x) 3216 + 3217 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD BIT(15) 3218 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD_SET(x)\ 3219 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD, x) 3220 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD_GET(x)\ 3221 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_VLD, x) 3222 + 3223 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_TYPE GENMASK(14, 12) 3224 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_TYPE_SET(x)\ 3225 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_TYPE, x) 3226 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_TYPE_GET(x)\ 3227 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_TYPE, x) 3228 + 3229 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR GENMASK(11, 0) 3230 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_SET(x)\ 3231 + FIELD_PREP(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR, x) 3232 + #define LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_GET(x)\ 3233 + FIELD_GET(LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR, x) 3234 + 3235 + /* LRN:COMMON:MAC_ACCESS_CFG_3 */ 3236 + #define LRN_MAC_ACCESS_CFG_3 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 16, 0, 1, 4) 3237 + 3238 + #define LRN_MAC_ACCESS_CFG_3_MAC_ENTRY_ISDX_LIMIT_IDX GENMASK(10, 0) 3239 + #define LRN_MAC_ACCESS_CFG_3_MAC_ENTRY_ISDX_LIMIT_IDX_SET(x)\ 3240 + FIELD_PREP(LRN_MAC_ACCESS_CFG_3_MAC_ENTRY_ISDX_LIMIT_IDX, x) 3241 + #define LRN_MAC_ACCESS_CFG_3_MAC_ENTRY_ISDX_LIMIT_IDX_GET(x)\ 3242 + FIELD_GET(LRN_MAC_ACCESS_CFG_3_MAC_ENTRY_ISDX_LIMIT_IDX, x) 3243 + 3244 + /* LRN:COMMON:SCAN_NEXT_CFG */ 3245 + #define LRN_SCAN_NEXT_CFG __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 20, 0, 1, 4) 3246 + 3247 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_FLAG_UPDATE_SEL GENMASK(21, 19) 3248 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_FLAG_UPDATE_SEL_SET(x)\ 3249 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_AGE_FLAG_UPDATE_SEL, x) 3250 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_FLAG_UPDATE_SEL_GET(x)\ 3251 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_AGE_FLAG_UPDATE_SEL, x) 3252 + 3253 + #define LRN_SCAN_NEXT_CFG_SCAN_NXT_LRN_ALL_UPDATE_SEL GENMASK(18, 17) 3254 + #define LRN_SCAN_NEXT_CFG_SCAN_NXT_LRN_ALL_UPDATE_SEL_SET(x)\ 3255 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_NXT_LRN_ALL_UPDATE_SEL, x) 3256 + #define LRN_SCAN_NEXT_CFG_SCAN_NXT_LRN_ALL_UPDATE_SEL_GET(x)\ 3257 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_NXT_LRN_ALL_UPDATE_SEL, x) 3258 + 3259 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_FILTER_SEL GENMASK(16, 15) 3260 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_FILTER_SEL_SET(x)\ 3261 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_AGE_FILTER_SEL, x) 3262 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_FILTER_SEL_GET(x)\ 3263 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_AGE_FILTER_SEL, x) 3264 + 3265 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_MOVE_FOUND_ENA BIT(14) 3266 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_MOVE_FOUND_ENA_SET(x)\ 3267 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_NEXT_MOVE_FOUND_ENA, x) 3268 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_MOVE_FOUND_ENA_GET(x)\ 3269 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_NEXT_MOVE_FOUND_ENA, x) 3270 + 3271 + #define LRN_SCAN_NEXT_CFG_NXT_LRN_ALL_FILTER_ENA BIT(13) 3272 + #define LRN_SCAN_NEXT_CFG_NXT_LRN_ALL_FILTER_ENA_SET(x)\ 3273 + FIELD_PREP(LRN_SCAN_NEXT_CFG_NXT_LRN_ALL_FILTER_ENA, x) 3274 + #define LRN_SCAN_NEXT_CFG_NXT_LRN_ALL_FILTER_ENA_GET(x)\ 3275 + FIELD_GET(LRN_SCAN_NEXT_CFG_NXT_LRN_ALL_FILTER_ENA, x) 3276 + 3277 + #define LRN_SCAN_NEXT_CFG_SCAN_USE_PORT_FILTER_ENA BIT(12) 3278 + #define LRN_SCAN_NEXT_CFG_SCAN_USE_PORT_FILTER_ENA_SET(x)\ 3279 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_USE_PORT_FILTER_ENA, x) 3280 + #define LRN_SCAN_NEXT_CFG_SCAN_USE_PORT_FILTER_ENA_GET(x)\ 3281 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_USE_PORT_FILTER_ENA, x) 3282 + 3283 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_REMOVE_FOUND_ENA BIT(11) 3284 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_REMOVE_FOUND_ENA_SET(x)\ 3285 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_NEXT_REMOVE_FOUND_ENA, x) 3286 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_REMOVE_FOUND_ENA_GET(x)\ 3287 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_NEXT_REMOVE_FOUND_ENA, x) 3288 + 3289 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA BIT(10) 3290 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA_SET(x)\ 3291 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA, x) 3292 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA_GET(x)\ 3293 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA, x) 3294 + 3295 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_INC_AGE_BITS_ENA BIT(9) 3296 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_INC_AGE_BITS_ENA_SET(x)\ 3297 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_NEXT_INC_AGE_BITS_ENA, x) 3298 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_INC_AGE_BITS_ENA_GET(x)\ 3299 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_NEXT_INC_AGE_BITS_ENA, x) 3300 + 3301 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_AGED_ONLY_ENA BIT(8) 3302 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_AGED_ONLY_ENA_SET(x)\ 3303 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_NEXT_AGED_ONLY_ENA, x) 3304 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_AGED_ONLY_ENA_GET(x)\ 3305 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_NEXT_AGED_ONLY_ENA, x) 3306 + 3307 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_IGNORE_LOCKED_ENA BIT(7) 3308 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_IGNORE_LOCKED_ENA_SET(x)\ 3309 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_NEXT_IGNORE_LOCKED_ENA, x) 3310 + #define LRN_SCAN_NEXT_CFG_SCAN_NEXT_IGNORE_LOCKED_ENA_GET(x)\ 3311 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_NEXT_IGNORE_LOCKED_ENA, x) 3312 + 3313 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_INTERVAL_MASK GENMASK(6, 3) 3314 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_INTERVAL_MASK_SET(x)\ 3315 + FIELD_PREP(LRN_SCAN_NEXT_CFG_SCAN_AGE_INTERVAL_MASK, x) 3316 + #define LRN_SCAN_NEXT_CFG_SCAN_AGE_INTERVAL_MASK_GET(x)\ 3317 + FIELD_GET(LRN_SCAN_NEXT_CFG_SCAN_AGE_INTERVAL_MASK, x) 3318 + 3319 + #define LRN_SCAN_NEXT_CFG_ISDX_LIMIT_IDX_FILTER_ENA BIT(2) 3320 + #define LRN_SCAN_NEXT_CFG_ISDX_LIMIT_IDX_FILTER_ENA_SET(x)\ 3321 + FIELD_PREP(LRN_SCAN_NEXT_CFG_ISDX_LIMIT_IDX_FILTER_ENA, x) 3322 + #define LRN_SCAN_NEXT_CFG_ISDX_LIMIT_IDX_FILTER_ENA_GET(x)\ 3323 + FIELD_GET(LRN_SCAN_NEXT_CFG_ISDX_LIMIT_IDX_FILTER_ENA, x) 3324 + 3325 + #define LRN_SCAN_NEXT_CFG_FID_FILTER_ENA BIT(1) 3326 + #define LRN_SCAN_NEXT_CFG_FID_FILTER_ENA_SET(x)\ 3327 + FIELD_PREP(LRN_SCAN_NEXT_CFG_FID_FILTER_ENA, x) 3328 + #define LRN_SCAN_NEXT_CFG_FID_FILTER_ENA_GET(x)\ 3329 + FIELD_GET(LRN_SCAN_NEXT_CFG_FID_FILTER_ENA, x) 3330 + 3331 + #define LRN_SCAN_NEXT_CFG_ADDR_FILTER_ENA BIT(0) 3332 + #define LRN_SCAN_NEXT_CFG_ADDR_FILTER_ENA_SET(x)\ 3333 + FIELD_PREP(LRN_SCAN_NEXT_CFG_ADDR_FILTER_ENA, x) 3334 + #define LRN_SCAN_NEXT_CFG_ADDR_FILTER_ENA_GET(x)\ 3335 + FIELD_GET(LRN_SCAN_NEXT_CFG_ADDR_FILTER_ENA, x) 3336 + 3337 + /* LRN:COMMON:SCAN_NEXT_CFG_1 */ 3338 + #define LRN_SCAN_NEXT_CFG_1 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 24, 0, 1, 4) 3339 + 3340 + #define LRN_SCAN_NEXT_CFG_1_PORT_MOVE_NEW_ADDR GENMASK(30, 16) 3341 + #define LRN_SCAN_NEXT_CFG_1_PORT_MOVE_NEW_ADDR_SET(x)\ 3342 + FIELD_PREP(LRN_SCAN_NEXT_CFG_1_PORT_MOVE_NEW_ADDR, x) 3343 + #define LRN_SCAN_NEXT_CFG_1_PORT_MOVE_NEW_ADDR_GET(x)\ 3344 + FIELD_GET(LRN_SCAN_NEXT_CFG_1_PORT_MOVE_NEW_ADDR, x) 3345 + 3346 + #define LRN_SCAN_NEXT_CFG_1_SCAN_ENTRY_ADDR_MASK GENMASK(14, 0) 3347 + #define LRN_SCAN_NEXT_CFG_1_SCAN_ENTRY_ADDR_MASK_SET(x)\ 3348 + FIELD_PREP(LRN_SCAN_NEXT_CFG_1_SCAN_ENTRY_ADDR_MASK, x) 3349 + #define LRN_SCAN_NEXT_CFG_1_SCAN_ENTRY_ADDR_MASK_GET(x)\ 3350 + FIELD_GET(LRN_SCAN_NEXT_CFG_1_SCAN_ENTRY_ADDR_MASK, x) 3351 + 3352 + /* LRN:COMMON:AUTOAGE_CFG */ 3353 + #define LRN_AUTOAGE_CFG(r) __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 36, r, 4, 4) 3354 + 3355 + #define LRN_AUTOAGE_CFG_UNIT_SIZE GENMASK(29, 28) 3356 + #define LRN_AUTOAGE_CFG_UNIT_SIZE_SET(x)\ 3357 + FIELD_PREP(LRN_AUTOAGE_CFG_UNIT_SIZE, x) 3358 + #define LRN_AUTOAGE_CFG_UNIT_SIZE_GET(x)\ 3359 + FIELD_GET(LRN_AUTOAGE_CFG_UNIT_SIZE, x) 3360 + 3361 + #define LRN_AUTOAGE_CFG_PERIOD_VAL GENMASK(27, 0) 3362 + #define LRN_AUTOAGE_CFG_PERIOD_VAL_SET(x)\ 3363 + FIELD_PREP(LRN_AUTOAGE_CFG_PERIOD_VAL, x) 3364 + #define LRN_AUTOAGE_CFG_PERIOD_VAL_GET(x)\ 3365 + FIELD_GET(LRN_AUTOAGE_CFG_PERIOD_VAL, x) 3366 + 3367 + /* LRN:COMMON:AUTOAGE_CFG_1 */ 3368 + #define LRN_AUTOAGE_CFG_1 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 52, 0, 1, 4) 3369 + 3370 + #define LRN_AUTOAGE_CFG_1_PAUSE_AUTO_AGE_ENA BIT(25) 3371 + #define LRN_AUTOAGE_CFG_1_PAUSE_AUTO_AGE_ENA_SET(x)\ 3372 + FIELD_PREP(LRN_AUTOAGE_CFG_1_PAUSE_AUTO_AGE_ENA, x) 3373 + #define LRN_AUTOAGE_CFG_1_PAUSE_AUTO_AGE_ENA_GET(x)\ 3374 + FIELD_GET(LRN_AUTOAGE_CFG_1_PAUSE_AUTO_AGE_ENA, x) 3375 + 3376 + #define LRN_AUTOAGE_CFG_1_CELLS_BETWEEN_ENTRY_SCAN GENMASK(24, 15) 3377 + #define LRN_AUTOAGE_CFG_1_CELLS_BETWEEN_ENTRY_SCAN_SET(x)\ 3378 + FIELD_PREP(LRN_AUTOAGE_CFG_1_CELLS_BETWEEN_ENTRY_SCAN, x) 3379 + #define LRN_AUTOAGE_CFG_1_CELLS_BETWEEN_ENTRY_SCAN_GET(x)\ 3380 + FIELD_GET(LRN_AUTOAGE_CFG_1_CELLS_BETWEEN_ENTRY_SCAN, x) 3381 + 3382 + #define LRN_AUTOAGE_CFG_1_CLK_PERIOD_01NS GENMASK(14, 7) 3383 + #define LRN_AUTOAGE_CFG_1_CLK_PERIOD_01NS_SET(x)\ 3384 + FIELD_PREP(LRN_AUTOAGE_CFG_1_CLK_PERIOD_01NS, x) 3385 + #define LRN_AUTOAGE_CFG_1_CLK_PERIOD_01NS_GET(x)\ 3386 + FIELD_GET(LRN_AUTOAGE_CFG_1_CLK_PERIOD_01NS, x) 3387 + 3388 + #define LRN_AUTOAGE_CFG_1_USE_PORT_FILTER_ENA BIT(6) 3389 + #define LRN_AUTOAGE_CFG_1_USE_PORT_FILTER_ENA_SET(x)\ 3390 + FIELD_PREP(LRN_AUTOAGE_CFG_1_USE_PORT_FILTER_ENA, x) 3391 + #define LRN_AUTOAGE_CFG_1_USE_PORT_FILTER_ENA_GET(x)\ 3392 + FIELD_GET(LRN_AUTOAGE_CFG_1_USE_PORT_FILTER_ENA, x) 3393 + 3394 + #define LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_SHOT GENMASK(5, 2) 3395 + #define LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_SHOT_SET(x)\ 3396 + FIELD_PREP(LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_SHOT, x) 3397 + #define LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_SHOT_GET(x)\ 3398 + FIELD_GET(LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_SHOT, x) 3399 + 3400 + #define LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_STOP_SHOT BIT(1) 3401 + #define LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_STOP_SHOT_SET(x)\ 3402 + FIELD_PREP(LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_STOP_SHOT, x) 3403 + #define LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_STOP_SHOT_GET(x)\ 3404 + FIELD_GET(LRN_AUTOAGE_CFG_1_FORCE_HW_SCAN_STOP_SHOT, x) 3405 + 3406 + #define LRN_AUTOAGE_CFG_1_FORCE_IDLE_ENA BIT(0) 3407 + #define LRN_AUTOAGE_CFG_1_FORCE_IDLE_ENA_SET(x)\ 3408 + FIELD_PREP(LRN_AUTOAGE_CFG_1_FORCE_IDLE_ENA, x) 3409 + #define LRN_AUTOAGE_CFG_1_FORCE_IDLE_ENA_GET(x)\ 3410 + FIELD_GET(LRN_AUTOAGE_CFG_1_FORCE_IDLE_ENA, x) 3411 + 3412 + /* LRN:COMMON:AUTOAGE_CFG_2 */ 3413 + #define LRN_AUTOAGE_CFG_2 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 56, 0, 1, 4) 3414 + 3415 + #define LRN_AUTOAGE_CFG_2_NEXT_ROW GENMASK(17, 4) 3416 + #define LRN_AUTOAGE_CFG_2_NEXT_ROW_SET(x)\ 3417 + FIELD_PREP(LRN_AUTOAGE_CFG_2_NEXT_ROW, x) 3418 + #define LRN_AUTOAGE_CFG_2_NEXT_ROW_GET(x)\ 3419 + FIELD_GET(LRN_AUTOAGE_CFG_2_NEXT_ROW, x) 3420 + 3421 + #define LRN_AUTOAGE_CFG_2_SCAN_ONGOING_STATUS GENMASK(3, 0) 3422 + #define LRN_AUTOAGE_CFG_2_SCAN_ONGOING_STATUS_SET(x)\ 3423 + FIELD_PREP(LRN_AUTOAGE_CFG_2_SCAN_ONGOING_STATUS, x) 3424 + #define LRN_AUTOAGE_CFG_2_SCAN_ONGOING_STATUS_GET(x)\ 3425 + FIELD_GET(LRN_AUTOAGE_CFG_2_SCAN_ONGOING_STATUS, x) 3426 + 3427 + /* PCIE_DM_EP:PF0_ATU_CAP:IATU_REGION_CTRL_2_OFF_OUTBOUND_0 */ 3428 + #define PCEP_RCTRL_2_OUT_0 __REG(TARGET_PCEP, 0, 1, 3145728, 0, 1, 130852, 4, 0, 1, 4) 3429 + 3430 + #define PCEP_RCTRL_2_OUT_0_MSG_CODE GENMASK(7, 0) 3431 + #define PCEP_RCTRL_2_OUT_0_MSG_CODE_SET(x)\ 3432 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_MSG_CODE, x) 3433 + #define PCEP_RCTRL_2_OUT_0_MSG_CODE_GET(x)\ 3434 + FIELD_GET(PCEP_RCTRL_2_OUT_0_MSG_CODE, x) 3435 + 3436 + #define PCEP_RCTRL_2_OUT_0_TAG GENMASK(15, 8) 3437 + #define PCEP_RCTRL_2_OUT_0_TAG_SET(x)\ 3438 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_TAG, x) 3439 + #define PCEP_RCTRL_2_OUT_0_TAG_GET(x)\ 3440 + FIELD_GET(PCEP_RCTRL_2_OUT_0_TAG, x) 3441 + 3442 + #define PCEP_RCTRL_2_OUT_0_TAG_SUBSTITUTE_EN BIT(16) 3443 + #define PCEP_RCTRL_2_OUT_0_TAG_SUBSTITUTE_EN_SET(x)\ 3444 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_TAG_SUBSTITUTE_EN, x) 3445 + #define PCEP_RCTRL_2_OUT_0_TAG_SUBSTITUTE_EN_GET(x)\ 3446 + FIELD_GET(PCEP_RCTRL_2_OUT_0_TAG_SUBSTITUTE_EN, x) 3447 + 3448 + #define PCEP_RCTRL_2_OUT_0_FUNC_BYPASS BIT(19) 3449 + #define PCEP_RCTRL_2_OUT_0_FUNC_BYPASS_SET(x)\ 3450 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_FUNC_BYPASS, x) 3451 + #define PCEP_RCTRL_2_OUT_0_FUNC_BYPASS_GET(x)\ 3452 + FIELD_GET(PCEP_RCTRL_2_OUT_0_FUNC_BYPASS, x) 3453 + 3454 + #define PCEP_RCTRL_2_OUT_0_SNP BIT(20) 3455 + #define PCEP_RCTRL_2_OUT_0_SNP_SET(x)\ 3456 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_SNP, x) 3457 + #define PCEP_RCTRL_2_OUT_0_SNP_GET(x)\ 3458 + FIELD_GET(PCEP_RCTRL_2_OUT_0_SNP, x) 3459 + 3460 + #define PCEP_RCTRL_2_OUT_0_INHIBIT_PAYLOAD BIT(22) 3461 + #define PCEP_RCTRL_2_OUT_0_INHIBIT_PAYLOAD_SET(x)\ 3462 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_INHIBIT_PAYLOAD, x) 3463 + #define PCEP_RCTRL_2_OUT_0_INHIBIT_PAYLOAD_GET(x)\ 3464 + FIELD_GET(PCEP_RCTRL_2_OUT_0_INHIBIT_PAYLOAD, x) 3465 + 3466 + #define PCEP_RCTRL_2_OUT_0_HEADER_SUBSTITUTE_EN BIT(23) 3467 + #define PCEP_RCTRL_2_OUT_0_HEADER_SUBSTITUTE_EN_SET(x)\ 3468 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_HEADER_SUBSTITUTE_EN, x) 3469 + #define PCEP_RCTRL_2_OUT_0_HEADER_SUBSTITUTE_EN_GET(x)\ 3470 + FIELD_GET(PCEP_RCTRL_2_OUT_0_HEADER_SUBSTITUTE_EN, x) 3471 + 3472 + #define PCEP_RCTRL_2_OUT_0_CFG_SHIFT_MODE BIT(28) 3473 + #define PCEP_RCTRL_2_OUT_0_CFG_SHIFT_MODE_SET(x)\ 3474 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_CFG_SHIFT_MODE, x) 3475 + #define PCEP_RCTRL_2_OUT_0_CFG_SHIFT_MODE_GET(x)\ 3476 + FIELD_GET(PCEP_RCTRL_2_OUT_0_CFG_SHIFT_MODE, x) 3477 + 3478 + #define PCEP_RCTRL_2_OUT_0_INVERT_MODE BIT(29) 3479 + #define PCEP_RCTRL_2_OUT_0_INVERT_MODE_SET(x)\ 3480 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_INVERT_MODE, x) 3481 + #define PCEP_RCTRL_2_OUT_0_INVERT_MODE_GET(x)\ 3482 + FIELD_GET(PCEP_RCTRL_2_OUT_0_INVERT_MODE, x) 3483 + 3484 + #define PCEP_RCTRL_2_OUT_0_REGION_EN BIT(31) 3485 + #define PCEP_RCTRL_2_OUT_0_REGION_EN_SET(x)\ 3486 + FIELD_PREP(PCEP_RCTRL_2_OUT_0_REGION_EN, x) 3487 + #define PCEP_RCTRL_2_OUT_0_REGION_EN_GET(x)\ 3488 + FIELD_GET(PCEP_RCTRL_2_OUT_0_REGION_EN, x) 3489 + 3490 + /* PCIE_DM_EP:PF0_ATU_CAP:IATU_LWR_BASE_ADDR_OFF_OUTBOUND_0 */ 3491 + #define PCEP_ADDR_LWR_OUT_0 __REG(TARGET_PCEP, 0, 1, 3145728, 0, 1, 130852, 8, 0, 1, 4) 3492 + 3493 + #define PCEP_ADDR_LWR_OUT_0_LWR_BASE_HW GENMASK(15, 0) 3494 + #define PCEP_ADDR_LWR_OUT_0_LWR_BASE_HW_SET(x)\ 3495 + FIELD_PREP(PCEP_ADDR_LWR_OUT_0_LWR_BASE_HW, x) 3496 + #define PCEP_ADDR_LWR_OUT_0_LWR_BASE_HW_GET(x)\ 3497 + FIELD_GET(PCEP_ADDR_LWR_OUT_0_LWR_BASE_HW, x) 3498 + 3499 + #define PCEP_ADDR_LWR_OUT_0_LWR_BASE_RW GENMASK(31, 16) 3500 + #define PCEP_ADDR_LWR_OUT_0_LWR_BASE_RW_SET(x)\ 3501 + FIELD_PREP(PCEP_ADDR_LWR_OUT_0_LWR_BASE_RW, x) 3502 + #define PCEP_ADDR_LWR_OUT_0_LWR_BASE_RW_GET(x)\ 3503 + FIELD_GET(PCEP_ADDR_LWR_OUT_0_LWR_BASE_RW, x) 3504 + 3505 + /* PCIE_DM_EP:PF0_ATU_CAP:IATU_UPPER_BASE_ADDR_OFF_OUTBOUND_0 */ 3506 + #define PCEP_ADDR_UPR_OUT_0 __REG(TARGET_PCEP, 0, 1, 3145728, 0, 1, 130852, 12, 0, 1, 4) 3507 + 3508 + /* PCIE_DM_EP:PF0_ATU_CAP:IATU_LIMIT_ADDR_OFF_OUTBOUND_0 */ 3509 + #define PCEP_ADDR_LIM_OUT_0 __REG(TARGET_PCEP, 0, 1, 3145728, 0, 1, 130852, 16, 0, 1, 4) 3510 + 3511 + #define PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_HW GENMASK(15, 0) 3512 + #define PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_HW_SET(x)\ 3513 + FIELD_PREP(PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_HW, x) 3514 + #define PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_HW_GET(x)\ 3515 + FIELD_GET(PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_HW, x) 3516 + 3517 + #define PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_RW GENMASK(31, 16) 3518 + #define PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_RW_SET(x)\ 3519 + FIELD_PREP(PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_RW, x) 3520 + #define PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_RW_GET(x)\ 3521 + FIELD_GET(PCEP_ADDR_LIM_OUT_0_LIMIT_ADDR_RW, x) 3522 + 3523 + /* PCIE_DM_EP:PF0_ATU_CAP:IATU_LWR_TARGET_ADDR_OFF_OUTBOUND_0 */ 3524 + #define PCEP_ADDR_LWR_TGT_OUT_0 __REG(TARGET_PCEP, 0, 1, 3145728, 0, 1, 130852, 20, 0, 1, 4) 3525 + 3526 + /* PCIE_DM_EP:PF0_ATU_CAP:IATU_UPPER_TARGET_ADDR_OFF_OUTBOUND_0 */ 3527 + #define PCEP_ADDR_UPR_TGT_OUT_0 __REG(TARGET_PCEP, 0, 1, 3145728, 0, 1, 130852, 24, 0, 1, 4) 3528 + 3529 + /* PCIE_DM_EP:PF0_ATU_CAP:IATU_UPPR_LIMIT_ADDR_OFF_OUTBOUND_0 */ 3530 + #define PCEP_ADDR_UPR_LIM_OUT_0 __REG(TARGET_PCEP, 0, 1, 3145728, 0, 1, 130852, 32, 0, 1, 4) 3531 + 3532 + #define PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_RW GENMASK(1, 0) 3533 + #define PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_RW_SET(x)\ 3534 + FIELD_PREP(PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_RW, x) 3535 + #define PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_RW_GET(x)\ 3536 + FIELD_GET(PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_RW, x) 3537 + 3538 + #define PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_HW GENMASK(31, 2) 3539 + #define PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_HW_SET(x)\ 3540 + FIELD_PREP(PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_HW, x) 3541 + #define PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_HW_GET(x)\ 3542 + FIELD_GET(PCEP_ADDR_UPR_LIM_OUT_0_UPPR_LIMIT_ADDR_HW, x) 3543 + 3544 + /* PCS_10GBASE_R:PCS_10GBR_CFG:PCS_CFG */ 3545 + #define PCS10G_BR_PCS_CFG(t) __REG(TARGET_PCS10G_BR, t, 12, 0, 0, 1, 56, 0, 0, 1, 4) 3546 + 3547 + #define PCS10G_BR_PCS_CFG_PCS_ENA BIT(31) 3548 + #define PCS10G_BR_PCS_CFG_PCS_ENA_SET(x)\ 3549 + FIELD_PREP(PCS10G_BR_PCS_CFG_PCS_ENA, x) 3550 + #define PCS10G_BR_PCS_CFG_PCS_ENA_GET(x)\ 3551 + FIELD_GET(PCS10G_BR_PCS_CFG_PCS_ENA, x) 3552 + 3553 + #define PCS10G_BR_PCS_CFG_PMA_LOOPBACK_ENA BIT(30) 3554 + #define PCS10G_BR_PCS_CFG_PMA_LOOPBACK_ENA_SET(x)\ 3555 + FIELD_PREP(PCS10G_BR_PCS_CFG_PMA_LOOPBACK_ENA, x) 3556 + #define PCS10G_BR_PCS_CFG_PMA_LOOPBACK_ENA_GET(x)\ 3557 + FIELD_GET(PCS10G_BR_PCS_CFG_PMA_LOOPBACK_ENA, x) 3558 + 3559 + #define PCS10G_BR_PCS_CFG_SH_CNT_MAX GENMASK(29, 24) 3560 + #define PCS10G_BR_PCS_CFG_SH_CNT_MAX_SET(x)\ 3561 + FIELD_PREP(PCS10G_BR_PCS_CFG_SH_CNT_MAX, x) 3562 + #define PCS10G_BR_PCS_CFG_SH_CNT_MAX_GET(x)\ 3563 + FIELD_GET(PCS10G_BR_PCS_CFG_SH_CNT_MAX, x) 3564 + 3565 + #define PCS10G_BR_PCS_CFG_RX_DATA_FLIP BIT(18) 3566 + #define PCS10G_BR_PCS_CFG_RX_DATA_FLIP_SET(x)\ 3567 + FIELD_PREP(PCS10G_BR_PCS_CFG_RX_DATA_FLIP, x) 3568 + #define PCS10G_BR_PCS_CFG_RX_DATA_FLIP_GET(x)\ 3569 + FIELD_GET(PCS10G_BR_PCS_CFG_RX_DATA_FLIP, x) 3570 + 3571 + #define PCS10G_BR_PCS_CFG_RESYNC_ENA BIT(15) 3572 + #define PCS10G_BR_PCS_CFG_RESYNC_ENA_SET(x)\ 3573 + FIELD_PREP(PCS10G_BR_PCS_CFG_RESYNC_ENA, x) 3574 + #define PCS10G_BR_PCS_CFG_RESYNC_ENA_GET(x)\ 3575 + FIELD_GET(PCS10G_BR_PCS_CFG_RESYNC_ENA, x) 3576 + 3577 + #define PCS10G_BR_PCS_CFG_LF_GEN_DIS BIT(14) 3578 + #define PCS10G_BR_PCS_CFG_LF_GEN_DIS_SET(x)\ 3579 + FIELD_PREP(PCS10G_BR_PCS_CFG_LF_GEN_DIS, x) 3580 + #define PCS10G_BR_PCS_CFG_LF_GEN_DIS_GET(x)\ 3581 + FIELD_GET(PCS10G_BR_PCS_CFG_LF_GEN_DIS, x) 3582 + 3583 + #define PCS10G_BR_PCS_CFG_RX_TEST_MODE BIT(13) 3584 + #define PCS10G_BR_PCS_CFG_RX_TEST_MODE_SET(x)\ 3585 + FIELD_PREP(PCS10G_BR_PCS_CFG_RX_TEST_MODE, x) 3586 + #define PCS10G_BR_PCS_CFG_RX_TEST_MODE_GET(x)\ 3587 + FIELD_GET(PCS10G_BR_PCS_CFG_RX_TEST_MODE, x) 3588 + 3589 + #define PCS10G_BR_PCS_CFG_RX_SCR_DISABLE BIT(12) 3590 + #define PCS10G_BR_PCS_CFG_RX_SCR_DISABLE_SET(x)\ 3591 + FIELD_PREP(PCS10G_BR_PCS_CFG_RX_SCR_DISABLE, x) 3592 + #define PCS10G_BR_PCS_CFG_RX_SCR_DISABLE_GET(x)\ 3593 + FIELD_GET(PCS10G_BR_PCS_CFG_RX_SCR_DISABLE, x) 3594 + 3595 + #define PCS10G_BR_PCS_CFG_TX_DATA_FLIP BIT(7) 3596 + #define PCS10G_BR_PCS_CFG_TX_DATA_FLIP_SET(x)\ 3597 + FIELD_PREP(PCS10G_BR_PCS_CFG_TX_DATA_FLIP, x) 3598 + #define PCS10G_BR_PCS_CFG_TX_DATA_FLIP_GET(x)\ 3599 + FIELD_GET(PCS10G_BR_PCS_CFG_TX_DATA_FLIP, x) 3600 + 3601 + #define PCS10G_BR_PCS_CFG_AN_LINK_CTRL_ENA BIT(6) 3602 + #define PCS10G_BR_PCS_CFG_AN_LINK_CTRL_ENA_SET(x)\ 3603 + FIELD_PREP(PCS10G_BR_PCS_CFG_AN_LINK_CTRL_ENA, x) 3604 + #define PCS10G_BR_PCS_CFG_AN_LINK_CTRL_ENA_GET(x)\ 3605 + FIELD_GET(PCS10G_BR_PCS_CFG_AN_LINK_CTRL_ENA, x) 3606 + 3607 + #define PCS10G_BR_PCS_CFG_TX_TEST_MODE BIT(4) 3608 + #define PCS10G_BR_PCS_CFG_TX_TEST_MODE_SET(x)\ 3609 + FIELD_PREP(PCS10G_BR_PCS_CFG_TX_TEST_MODE, x) 3610 + #define PCS10G_BR_PCS_CFG_TX_TEST_MODE_GET(x)\ 3611 + FIELD_GET(PCS10G_BR_PCS_CFG_TX_TEST_MODE, x) 3612 + 3613 + #define PCS10G_BR_PCS_CFG_TX_SCR_DISABLE BIT(3) 3614 + #define PCS10G_BR_PCS_CFG_TX_SCR_DISABLE_SET(x)\ 3615 + FIELD_PREP(PCS10G_BR_PCS_CFG_TX_SCR_DISABLE, x) 3616 + #define PCS10G_BR_PCS_CFG_TX_SCR_DISABLE_GET(x)\ 3617 + FIELD_GET(PCS10G_BR_PCS_CFG_TX_SCR_DISABLE, x) 3618 + 3619 + /* PCS_10GBASE_R:PCS_10GBR_CFG:PCS_SD_CFG */ 3620 + #define PCS10G_BR_PCS_SD_CFG(t) __REG(TARGET_PCS10G_BR, t, 12, 0, 0, 1, 56, 4, 0, 1, 4) 3621 + 3622 + #define PCS10G_BR_PCS_SD_CFG_SD_SEL BIT(8) 3623 + #define PCS10G_BR_PCS_SD_CFG_SD_SEL_SET(x)\ 3624 + FIELD_PREP(PCS10G_BR_PCS_SD_CFG_SD_SEL, x) 3625 + #define PCS10G_BR_PCS_SD_CFG_SD_SEL_GET(x)\ 3626 + FIELD_GET(PCS10G_BR_PCS_SD_CFG_SD_SEL, x) 3627 + 3628 + #define PCS10G_BR_PCS_SD_CFG_SD_POL BIT(4) 3629 + #define PCS10G_BR_PCS_SD_CFG_SD_POL_SET(x)\ 3630 + FIELD_PREP(PCS10G_BR_PCS_SD_CFG_SD_POL, x) 3631 + #define PCS10G_BR_PCS_SD_CFG_SD_POL_GET(x)\ 3632 + FIELD_GET(PCS10G_BR_PCS_SD_CFG_SD_POL, x) 3633 + 3634 + #define PCS10G_BR_PCS_SD_CFG_SD_ENA BIT(0) 3635 + #define PCS10G_BR_PCS_SD_CFG_SD_ENA_SET(x)\ 3636 + FIELD_PREP(PCS10G_BR_PCS_SD_CFG_SD_ENA, x) 3637 + #define PCS10G_BR_PCS_SD_CFG_SD_ENA_GET(x)\ 3638 + FIELD_GET(PCS10G_BR_PCS_SD_CFG_SD_ENA, x) 3639 + 3640 + /* PCS_10GBASE_R:PCS_10GBR_CFG:PCS_CFG */ 3641 + #define PCS25G_BR_PCS_CFG(t) __REG(TARGET_PCS25G_BR, t, 8, 0, 0, 1, 56, 0, 0, 1, 4) 3642 + 3643 + #define PCS25G_BR_PCS_CFG_PCS_ENA BIT(31) 3644 + #define PCS25G_BR_PCS_CFG_PCS_ENA_SET(x)\ 3645 + FIELD_PREP(PCS25G_BR_PCS_CFG_PCS_ENA, x) 3646 + #define PCS25G_BR_PCS_CFG_PCS_ENA_GET(x)\ 3647 + FIELD_GET(PCS25G_BR_PCS_CFG_PCS_ENA, x) 3648 + 3649 + #define PCS25G_BR_PCS_CFG_PMA_LOOPBACK_ENA BIT(30) 3650 + #define PCS25G_BR_PCS_CFG_PMA_LOOPBACK_ENA_SET(x)\ 3651 + FIELD_PREP(PCS25G_BR_PCS_CFG_PMA_LOOPBACK_ENA, x) 3652 + #define PCS25G_BR_PCS_CFG_PMA_LOOPBACK_ENA_GET(x)\ 3653 + FIELD_GET(PCS25G_BR_PCS_CFG_PMA_LOOPBACK_ENA, x) 3654 + 3655 + #define PCS25G_BR_PCS_CFG_SH_CNT_MAX GENMASK(29, 24) 3656 + #define PCS25G_BR_PCS_CFG_SH_CNT_MAX_SET(x)\ 3657 + FIELD_PREP(PCS25G_BR_PCS_CFG_SH_CNT_MAX, x) 3658 + #define PCS25G_BR_PCS_CFG_SH_CNT_MAX_GET(x)\ 3659 + FIELD_GET(PCS25G_BR_PCS_CFG_SH_CNT_MAX, x) 3660 + 3661 + #define PCS25G_BR_PCS_CFG_RX_DATA_FLIP BIT(18) 3662 + #define PCS25G_BR_PCS_CFG_RX_DATA_FLIP_SET(x)\ 3663 + FIELD_PREP(PCS25G_BR_PCS_CFG_RX_DATA_FLIP, x) 3664 + #define PCS25G_BR_PCS_CFG_RX_DATA_FLIP_GET(x)\ 3665 + FIELD_GET(PCS25G_BR_PCS_CFG_RX_DATA_FLIP, x) 3666 + 3667 + #define PCS25G_BR_PCS_CFG_RESYNC_ENA BIT(15) 3668 + #define PCS25G_BR_PCS_CFG_RESYNC_ENA_SET(x)\ 3669 + FIELD_PREP(PCS25G_BR_PCS_CFG_RESYNC_ENA, x) 3670 + #define PCS25G_BR_PCS_CFG_RESYNC_ENA_GET(x)\ 3671 + FIELD_GET(PCS25G_BR_PCS_CFG_RESYNC_ENA, x) 3672 + 3673 + #define PCS25G_BR_PCS_CFG_LF_GEN_DIS BIT(14) 3674 + #define PCS25G_BR_PCS_CFG_LF_GEN_DIS_SET(x)\ 3675 + FIELD_PREP(PCS25G_BR_PCS_CFG_LF_GEN_DIS, x) 3676 + #define PCS25G_BR_PCS_CFG_LF_GEN_DIS_GET(x)\ 3677 + FIELD_GET(PCS25G_BR_PCS_CFG_LF_GEN_DIS, x) 3678 + 3679 + #define PCS25G_BR_PCS_CFG_RX_TEST_MODE BIT(13) 3680 + #define PCS25G_BR_PCS_CFG_RX_TEST_MODE_SET(x)\ 3681 + FIELD_PREP(PCS25G_BR_PCS_CFG_RX_TEST_MODE, x) 3682 + #define PCS25G_BR_PCS_CFG_RX_TEST_MODE_GET(x)\ 3683 + FIELD_GET(PCS25G_BR_PCS_CFG_RX_TEST_MODE, x) 3684 + 3685 + #define PCS25G_BR_PCS_CFG_RX_SCR_DISABLE BIT(12) 3686 + #define PCS25G_BR_PCS_CFG_RX_SCR_DISABLE_SET(x)\ 3687 + FIELD_PREP(PCS25G_BR_PCS_CFG_RX_SCR_DISABLE, x) 3688 + #define PCS25G_BR_PCS_CFG_RX_SCR_DISABLE_GET(x)\ 3689 + FIELD_GET(PCS25G_BR_PCS_CFG_RX_SCR_DISABLE, x) 3690 + 3691 + #define PCS25G_BR_PCS_CFG_TX_DATA_FLIP BIT(7) 3692 + #define PCS25G_BR_PCS_CFG_TX_DATA_FLIP_SET(x)\ 3693 + FIELD_PREP(PCS25G_BR_PCS_CFG_TX_DATA_FLIP, x) 3694 + #define PCS25G_BR_PCS_CFG_TX_DATA_FLIP_GET(x)\ 3695 + FIELD_GET(PCS25G_BR_PCS_CFG_TX_DATA_FLIP, x) 3696 + 3697 + #define PCS25G_BR_PCS_CFG_AN_LINK_CTRL_ENA BIT(6) 3698 + #define PCS25G_BR_PCS_CFG_AN_LINK_CTRL_ENA_SET(x)\ 3699 + FIELD_PREP(PCS25G_BR_PCS_CFG_AN_LINK_CTRL_ENA, x) 3700 + #define PCS25G_BR_PCS_CFG_AN_LINK_CTRL_ENA_GET(x)\ 3701 + FIELD_GET(PCS25G_BR_PCS_CFG_AN_LINK_CTRL_ENA, x) 3702 + 3703 + #define PCS25G_BR_PCS_CFG_TX_TEST_MODE BIT(4) 3704 + #define PCS25G_BR_PCS_CFG_TX_TEST_MODE_SET(x)\ 3705 + FIELD_PREP(PCS25G_BR_PCS_CFG_TX_TEST_MODE, x) 3706 + #define PCS25G_BR_PCS_CFG_TX_TEST_MODE_GET(x)\ 3707 + FIELD_GET(PCS25G_BR_PCS_CFG_TX_TEST_MODE, x) 3708 + 3709 + #define PCS25G_BR_PCS_CFG_TX_SCR_DISABLE BIT(3) 3710 + #define PCS25G_BR_PCS_CFG_TX_SCR_DISABLE_SET(x)\ 3711 + FIELD_PREP(PCS25G_BR_PCS_CFG_TX_SCR_DISABLE, x) 3712 + #define PCS25G_BR_PCS_CFG_TX_SCR_DISABLE_GET(x)\ 3713 + FIELD_GET(PCS25G_BR_PCS_CFG_TX_SCR_DISABLE, x) 3714 + 3715 + /* PCS_10GBASE_R:PCS_10GBR_CFG:PCS_SD_CFG */ 3716 + #define PCS25G_BR_PCS_SD_CFG(t) __REG(TARGET_PCS25G_BR, t, 8, 0, 0, 1, 56, 4, 0, 1, 4) 3717 + 3718 + #define PCS25G_BR_PCS_SD_CFG_SD_SEL BIT(8) 3719 + #define PCS25G_BR_PCS_SD_CFG_SD_SEL_SET(x)\ 3720 + FIELD_PREP(PCS25G_BR_PCS_SD_CFG_SD_SEL, x) 3721 + #define PCS25G_BR_PCS_SD_CFG_SD_SEL_GET(x)\ 3722 + FIELD_GET(PCS25G_BR_PCS_SD_CFG_SD_SEL, x) 3723 + 3724 + #define PCS25G_BR_PCS_SD_CFG_SD_POL BIT(4) 3725 + #define PCS25G_BR_PCS_SD_CFG_SD_POL_SET(x)\ 3726 + FIELD_PREP(PCS25G_BR_PCS_SD_CFG_SD_POL, x) 3727 + #define PCS25G_BR_PCS_SD_CFG_SD_POL_GET(x)\ 3728 + FIELD_GET(PCS25G_BR_PCS_SD_CFG_SD_POL, x) 3729 + 3730 + #define PCS25G_BR_PCS_SD_CFG_SD_ENA BIT(0) 3731 + #define PCS25G_BR_PCS_SD_CFG_SD_ENA_SET(x)\ 3732 + FIELD_PREP(PCS25G_BR_PCS_SD_CFG_SD_ENA, x) 3733 + #define PCS25G_BR_PCS_SD_CFG_SD_ENA_GET(x)\ 3734 + FIELD_GET(PCS25G_BR_PCS_SD_CFG_SD_ENA, x) 3735 + 3736 + /* PCS_10GBASE_R:PCS_10GBR_CFG:PCS_CFG */ 3737 + #define PCS5G_BR_PCS_CFG(t) __REG(TARGET_PCS5G_BR, t, 13, 0, 0, 1, 56, 0, 0, 1, 4) 3738 + 3739 + #define PCS5G_BR_PCS_CFG_PCS_ENA BIT(31) 3740 + #define PCS5G_BR_PCS_CFG_PCS_ENA_SET(x)\ 3741 + FIELD_PREP(PCS5G_BR_PCS_CFG_PCS_ENA, x) 3742 + #define PCS5G_BR_PCS_CFG_PCS_ENA_GET(x)\ 3743 + FIELD_GET(PCS5G_BR_PCS_CFG_PCS_ENA, x) 3744 + 3745 + #define PCS5G_BR_PCS_CFG_PMA_LOOPBACK_ENA BIT(30) 3746 + #define PCS5G_BR_PCS_CFG_PMA_LOOPBACK_ENA_SET(x)\ 3747 + FIELD_PREP(PCS5G_BR_PCS_CFG_PMA_LOOPBACK_ENA, x) 3748 + #define PCS5G_BR_PCS_CFG_PMA_LOOPBACK_ENA_GET(x)\ 3749 + FIELD_GET(PCS5G_BR_PCS_CFG_PMA_LOOPBACK_ENA, x) 3750 + 3751 + #define PCS5G_BR_PCS_CFG_SH_CNT_MAX GENMASK(29, 24) 3752 + #define PCS5G_BR_PCS_CFG_SH_CNT_MAX_SET(x)\ 3753 + FIELD_PREP(PCS5G_BR_PCS_CFG_SH_CNT_MAX, x) 3754 + #define PCS5G_BR_PCS_CFG_SH_CNT_MAX_GET(x)\ 3755 + FIELD_GET(PCS5G_BR_PCS_CFG_SH_CNT_MAX, x) 3756 + 3757 + #define PCS5G_BR_PCS_CFG_RX_DATA_FLIP BIT(18) 3758 + #define PCS5G_BR_PCS_CFG_RX_DATA_FLIP_SET(x)\ 3759 + FIELD_PREP(PCS5G_BR_PCS_CFG_RX_DATA_FLIP, x) 3760 + #define PCS5G_BR_PCS_CFG_RX_DATA_FLIP_GET(x)\ 3761 + FIELD_GET(PCS5G_BR_PCS_CFG_RX_DATA_FLIP, x) 3762 + 3763 + #define PCS5G_BR_PCS_CFG_RESYNC_ENA BIT(15) 3764 + #define PCS5G_BR_PCS_CFG_RESYNC_ENA_SET(x)\ 3765 + FIELD_PREP(PCS5G_BR_PCS_CFG_RESYNC_ENA, x) 3766 + #define PCS5G_BR_PCS_CFG_RESYNC_ENA_GET(x)\ 3767 + FIELD_GET(PCS5G_BR_PCS_CFG_RESYNC_ENA, x) 3768 + 3769 + #define PCS5G_BR_PCS_CFG_LF_GEN_DIS BIT(14) 3770 + #define PCS5G_BR_PCS_CFG_LF_GEN_DIS_SET(x)\ 3771 + FIELD_PREP(PCS5G_BR_PCS_CFG_LF_GEN_DIS, x) 3772 + #define PCS5G_BR_PCS_CFG_LF_GEN_DIS_GET(x)\ 3773 + FIELD_GET(PCS5G_BR_PCS_CFG_LF_GEN_DIS, x) 3774 + 3775 + #define PCS5G_BR_PCS_CFG_RX_TEST_MODE BIT(13) 3776 + #define PCS5G_BR_PCS_CFG_RX_TEST_MODE_SET(x)\ 3777 + FIELD_PREP(PCS5G_BR_PCS_CFG_RX_TEST_MODE, x) 3778 + #define PCS5G_BR_PCS_CFG_RX_TEST_MODE_GET(x)\ 3779 + FIELD_GET(PCS5G_BR_PCS_CFG_RX_TEST_MODE, x) 3780 + 3781 + #define PCS5G_BR_PCS_CFG_RX_SCR_DISABLE BIT(12) 3782 + #define PCS5G_BR_PCS_CFG_RX_SCR_DISABLE_SET(x)\ 3783 + FIELD_PREP(PCS5G_BR_PCS_CFG_RX_SCR_DISABLE, x) 3784 + #define PCS5G_BR_PCS_CFG_RX_SCR_DISABLE_GET(x)\ 3785 + FIELD_GET(PCS5G_BR_PCS_CFG_RX_SCR_DISABLE, x) 3786 + 3787 + #define PCS5G_BR_PCS_CFG_TX_DATA_FLIP BIT(7) 3788 + #define PCS5G_BR_PCS_CFG_TX_DATA_FLIP_SET(x)\ 3789 + FIELD_PREP(PCS5G_BR_PCS_CFG_TX_DATA_FLIP, x) 3790 + #define PCS5G_BR_PCS_CFG_TX_DATA_FLIP_GET(x)\ 3791 + FIELD_GET(PCS5G_BR_PCS_CFG_TX_DATA_FLIP, x) 3792 + 3793 + #define PCS5G_BR_PCS_CFG_AN_LINK_CTRL_ENA BIT(6) 3794 + #define PCS5G_BR_PCS_CFG_AN_LINK_CTRL_ENA_SET(x)\ 3795 + FIELD_PREP(PCS5G_BR_PCS_CFG_AN_LINK_CTRL_ENA, x) 3796 + #define PCS5G_BR_PCS_CFG_AN_LINK_CTRL_ENA_GET(x)\ 3797 + FIELD_GET(PCS5G_BR_PCS_CFG_AN_LINK_CTRL_ENA, x) 3798 + 3799 + #define PCS5G_BR_PCS_CFG_TX_TEST_MODE BIT(4) 3800 + #define PCS5G_BR_PCS_CFG_TX_TEST_MODE_SET(x)\ 3801 + FIELD_PREP(PCS5G_BR_PCS_CFG_TX_TEST_MODE, x) 3802 + #define PCS5G_BR_PCS_CFG_TX_TEST_MODE_GET(x)\ 3803 + FIELD_GET(PCS5G_BR_PCS_CFG_TX_TEST_MODE, x) 3804 + 3805 + #define PCS5G_BR_PCS_CFG_TX_SCR_DISABLE BIT(3) 3806 + #define PCS5G_BR_PCS_CFG_TX_SCR_DISABLE_SET(x)\ 3807 + FIELD_PREP(PCS5G_BR_PCS_CFG_TX_SCR_DISABLE, x) 3808 + #define PCS5G_BR_PCS_CFG_TX_SCR_DISABLE_GET(x)\ 3809 + FIELD_GET(PCS5G_BR_PCS_CFG_TX_SCR_DISABLE, x) 3810 + 3811 + /* PCS_10GBASE_R:PCS_10GBR_CFG:PCS_SD_CFG */ 3812 + #define PCS5G_BR_PCS_SD_CFG(t) __REG(TARGET_PCS5G_BR, t, 13, 0, 0, 1, 56, 4, 0, 1, 4) 3813 + 3814 + #define PCS5G_BR_PCS_SD_CFG_SD_SEL BIT(8) 3815 + #define PCS5G_BR_PCS_SD_CFG_SD_SEL_SET(x)\ 3816 + FIELD_PREP(PCS5G_BR_PCS_SD_CFG_SD_SEL, x) 3817 + #define PCS5G_BR_PCS_SD_CFG_SD_SEL_GET(x)\ 3818 + FIELD_GET(PCS5G_BR_PCS_SD_CFG_SD_SEL, x) 3819 + 3820 + #define PCS5G_BR_PCS_SD_CFG_SD_POL BIT(4) 3821 + #define PCS5G_BR_PCS_SD_CFG_SD_POL_SET(x)\ 3822 + FIELD_PREP(PCS5G_BR_PCS_SD_CFG_SD_POL, x) 3823 + #define PCS5G_BR_PCS_SD_CFG_SD_POL_GET(x)\ 3824 + FIELD_GET(PCS5G_BR_PCS_SD_CFG_SD_POL, x) 3825 + 3826 + #define PCS5G_BR_PCS_SD_CFG_SD_ENA BIT(0) 3827 + #define PCS5G_BR_PCS_SD_CFG_SD_ENA_SET(x)\ 3828 + FIELD_PREP(PCS5G_BR_PCS_SD_CFG_SD_ENA, x) 3829 + #define PCS5G_BR_PCS_SD_CFG_SD_ENA_GET(x)\ 3830 + FIELD_GET(PCS5G_BR_PCS_SD_CFG_SD_ENA, x) 3831 + 3832 + /* PORT_CONF:HW_CFG:DEV5G_MODES */ 3833 + #define PORT_CONF_DEV5G_MODES __REG(TARGET_PORT_CONF, 0, 1, 0, 0, 1, 24, 0, 0, 1, 4) 3834 + 3835 + #define PORT_CONF_DEV5G_MODES_DEV5G_D0_MODE BIT(0) 3836 + #define PORT_CONF_DEV5G_MODES_DEV5G_D0_MODE_SET(x)\ 3837 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D0_MODE, x) 3838 + #define PORT_CONF_DEV5G_MODES_DEV5G_D0_MODE_GET(x)\ 3839 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D0_MODE, x) 3840 + 3841 + #define PORT_CONF_DEV5G_MODES_DEV5G_D1_MODE BIT(1) 3842 + #define PORT_CONF_DEV5G_MODES_DEV5G_D1_MODE_SET(x)\ 3843 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D1_MODE, x) 3844 + #define PORT_CONF_DEV5G_MODES_DEV5G_D1_MODE_GET(x)\ 3845 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D1_MODE, x) 3846 + 3847 + #define PORT_CONF_DEV5G_MODES_DEV5G_D2_MODE BIT(2) 3848 + #define PORT_CONF_DEV5G_MODES_DEV5G_D2_MODE_SET(x)\ 3849 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D2_MODE, x) 3850 + #define PORT_CONF_DEV5G_MODES_DEV5G_D2_MODE_GET(x)\ 3851 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D2_MODE, x) 3852 + 3853 + #define PORT_CONF_DEV5G_MODES_DEV5G_D3_MODE BIT(3) 3854 + #define PORT_CONF_DEV5G_MODES_DEV5G_D3_MODE_SET(x)\ 3855 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D3_MODE, x) 3856 + #define PORT_CONF_DEV5G_MODES_DEV5G_D3_MODE_GET(x)\ 3857 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D3_MODE, x) 3858 + 3859 + #define PORT_CONF_DEV5G_MODES_DEV5G_D4_MODE BIT(4) 3860 + #define PORT_CONF_DEV5G_MODES_DEV5G_D4_MODE_SET(x)\ 3861 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D4_MODE, x) 3862 + #define PORT_CONF_DEV5G_MODES_DEV5G_D4_MODE_GET(x)\ 3863 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D4_MODE, x) 3864 + 3865 + #define PORT_CONF_DEV5G_MODES_DEV5G_D5_MODE BIT(5) 3866 + #define PORT_CONF_DEV5G_MODES_DEV5G_D5_MODE_SET(x)\ 3867 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D5_MODE, x) 3868 + #define PORT_CONF_DEV5G_MODES_DEV5G_D5_MODE_GET(x)\ 3869 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D5_MODE, x) 3870 + 3871 + #define PORT_CONF_DEV5G_MODES_DEV5G_D6_MODE BIT(6) 3872 + #define PORT_CONF_DEV5G_MODES_DEV5G_D6_MODE_SET(x)\ 3873 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D6_MODE, x) 3874 + #define PORT_CONF_DEV5G_MODES_DEV5G_D6_MODE_GET(x)\ 3875 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D6_MODE, x) 3876 + 3877 + #define PORT_CONF_DEV5G_MODES_DEV5G_D7_MODE BIT(7) 3878 + #define PORT_CONF_DEV5G_MODES_DEV5G_D7_MODE_SET(x)\ 3879 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D7_MODE, x) 3880 + #define PORT_CONF_DEV5G_MODES_DEV5G_D7_MODE_GET(x)\ 3881 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D7_MODE, x) 3882 + 3883 + #define PORT_CONF_DEV5G_MODES_DEV5G_D8_MODE BIT(8) 3884 + #define PORT_CONF_DEV5G_MODES_DEV5G_D8_MODE_SET(x)\ 3885 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D8_MODE, x) 3886 + #define PORT_CONF_DEV5G_MODES_DEV5G_D8_MODE_GET(x)\ 3887 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D8_MODE, x) 3888 + 3889 + #define PORT_CONF_DEV5G_MODES_DEV5G_D9_MODE BIT(9) 3890 + #define PORT_CONF_DEV5G_MODES_DEV5G_D9_MODE_SET(x)\ 3891 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D9_MODE, x) 3892 + #define PORT_CONF_DEV5G_MODES_DEV5G_D9_MODE_GET(x)\ 3893 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D9_MODE, x) 3894 + 3895 + #define PORT_CONF_DEV5G_MODES_DEV5G_D10_MODE BIT(10) 3896 + #define PORT_CONF_DEV5G_MODES_DEV5G_D10_MODE_SET(x)\ 3897 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D10_MODE, x) 3898 + #define PORT_CONF_DEV5G_MODES_DEV5G_D10_MODE_GET(x)\ 3899 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D10_MODE, x) 3900 + 3901 + #define PORT_CONF_DEV5G_MODES_DEV5G_D11_MODE BIT(11) 3902 + #define PORT_CONF_DEV5G_MODES_DEV5G_D11_MODE_SET(x)\ 3903 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D11_MODE, x) 3904 + #define PORT_CONF_DEV5G_MODES_DEV5G_D11_MODE_GET(x)\ 3905 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D11_MODE, x) 3906 + 3907 + #define PORT_CONF_DEV5G_MODES_DEV5G_D64_MODE BIT(12) 3908 + #define PORT_CONF_DEV5G_MODES_DEV5G_D64_MODE_SET(x)\ 3909 + FIELD_PREP(PORT_CONF_DEV5G_MODES_DEV5G_D64_MODE, x) 3910 + #define PORT_CONF_DEV5G_MODES_DEV5G_D64_MODE_GET(x)\ 3911 + FIELD_GET(PORT_CONF_DEV5G_MODES_DEV5G_D64_MODE, x) 3912 + 3913 + /* PORT_CONF:HW_CFG:DEV10G_MODES */ 3914 + #define PORT_CONF_DEV10G_MODES __REG(TARGET_PORT_CONF, 0, 1, 0, 0, 1, 24, 4, 0, 1, 4) 3915 + 3916 + #define PORT_CONF_DEV10G_MODES_DEV10G_D12_MODE BIT(0) 3917 + #define PORT_CONF_DEV10G_MODES_DEV10G_D12_MODE_SET(x)\ 3918 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D12_MODE, x) 3919 + #define PORT_CONF_DEV10G_MODES_DEV10G_D12_MODE_GET(x)\ 3920 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D12_MODE, x) 3921 + 3922 + #define PORT_CONF_DEV10G_MODES_DEV10G_D13_MODE BIT(1) 3923 + #define PORT_CONF_DEV10G_MODES_DEV10G_D13_MODE_SET(x)\ 3924 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D13_MODE, x) 3925 + #define PORT_CONF_DEV10G_MODES_DEV10G_D13_MODE_GET(x)\ 3926 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D13_MODE, x) 3927 + 3928 + #define PORT_CONF_DEV10G_MODES_DEV10G_D14_MODE BIT(2) 3929 + #define PORT_CONF_DEV10G_MODES_DEV10G_D14_MODE_SET(x)\ 3930 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D14_MODE, x) 3931 + #define PORT_CONF_DEV10G_MODES_DEV10G_D14_MODE_GET(x)\ 3932 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D14_MODE, x) 3933 + 3934 + #define PORT_CONF_DEV10G_MODES_DEV10G_D15_MODE BIT(3) 3935 + #define PORT_CONF_DEV10G_MODES_DEV10G_D15_MODE_SET(x)\ 3936 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D15_MODE, x) 3937 + #define PORT_CONF_DEV10G_MODES_DEV10G_D15_MODE_GET(x)\ 3938 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D15_MODE, x) 3939 + 3940 + #define PORT_CONF_DEV10G_MODES_DEV10G_D48_MODE BIT(4) 3941 + #define PORT_CONF_DEV10G_MODES_DEV10G_D48_MODE_SET(x)\ 3942 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D48_MODE, x) 3943 + #define PORT_CONF_DEV10G_MODES_DEV10G_D48_MODE_GET(x)\ 3944 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D48_MODE, x) 3945 + 3946 + #define PORT_CONF_DEV10G_MODES_DEV10G_D49_MODE BIT(5) 3947 + #define PORT_CONF_DEV10G_MODES_DEV10G_D49_MODE_SET(x)\ 3948 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D49_MODE, x) 3949 + #define PORT_CONF_DEV10G_MODES_DEV10G_D49_MODE_GET(x)\ 3950 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D49_MODE, x) 3951 + 3952 + #define PORT_CONF_DEV10G_MODES_DEV10G_D50_MODE BIT(6) 3953 + #define PORT_CONF_DEV10G_MODES_DEV10G_D50_MODE_SET(x)\ 3954 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D50_MODE, x) 3955 + #define PORT_CONF_DEV10G_MODES_DEV10G_D50_MODE_GET(x)\ 3956 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D50_MODE, x) 3957 + 3958 + #define PORT_CONF_DEV10G_MODES_DEV10G_D51_MODE BIT(7) 3959 + #define PORT_CONF_DEV10G_MODES_DEV10G_D51_MODE_SET(x)\ 3960 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D51_MODE, x) 3961 + #define PORT_CONF_DEV10G_MODES_DEV10G_D51_MODE_GET(x)\ 3962 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D51_MODE, x) 3963 + 3964 + #define PORT_CONF_DEV10G_MODES_DEV10G_D52_MODE BIT(8) 3965 + #define PORT_CONF_DEV10G_MODES_DEV10G_D52_MODE_SET(x)\ 3966 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D52_MODE, x) 3967 + #define PORT_CONF_DEV10G_MODES_DEV10G_D52_MODE_GET(x)\ 3968 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D52_MODE, x) 3969 + 3970 + #define PORT_CONF_DEV10G_MODES_DEV10G_D53_MODE BIT(9) 3971 + #define PORT_CONF_DEV10G_MODES_DEV10G_D53_MODE_SET(x)\ 3972 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D53_MODE, x) 3973 + #define PORT_CONF_DEV10G_MODES_DEV10G_D53_MODE_GET(x)\ 3974 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D53_MODE, x) 3975 + 3976 + #define PORT_CONF_DEV10G_MODES_DEV10G_D54_MODE BIT(10) 3977 + #define PORT_CONF_DEV10G_MODES_DEV10G_D54_MODE_SET(x)\ 3978 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D54_MODE, x) 3979 + #define PORT_CONF_DEV10G_MODES_DEV10G_D54_MODE_GET(x)\ 3980 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D54_MODE, x) 3981 + 3982 + #define PORT_CONF_DEV10G_MODES_DEV10G_D55_MODE BIT(11) 3983 + #define PORT_CONF_DEV10G_MODES_DEV10G_D55_MODE_SET(x)\ 3984 + FIELD_PREP(PORT_CONF_DEV10G_MODES_DEV10G_D55_MODE, x) 3985 + #define PORT_CONF_DEV10G_MODES_DEV10G_D55_MODE_GET(x)\ 3986 + FIELD_GET(PORT_CONF_DEV10G_MODES_DEV10G_D55_MODE, x) 3987 + 3988 + /* PORT_CONF:HW_CFG:DEV25G_MODES */ 3989 + #define PORT_CONF_DEV25G_MODES __REG(TARGET_PORT_CONF, 0, 1, 0, 0, 1, 24, 8, 0, 1, 4) 3990 + 3991 + #define PORT_CONF_DEV25G_MODES_DEV25G_D56_MODE BIT(0) 3992 + #define PORT_CONF_DEV25G_MODES_DEV25G_D56_MODE_SET(x)\ 3993 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D56_MODE, x) 3994 + #define PORT_CONF_DEV25G_MODES_DEV25G_D56_MODE_GET(x)\ 3995 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D56_MODE, x) 3996 + 3997 + #define PORT_CONF_DEV25G_MODES_DEV25G_D57_MODE BIT(1) 3998 + #define PORT_CONF_DEV25G_MODES_DEV25G_D57_MODE_SET(x)\ 3999 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D57_MODE, x) 4000 + #define PORT_CONF_DEV25G_MODES_DEV25G_D57_MODE_GET(x)\ 4001 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D57_MODE, x) 4002 + 4003 + #define PORT_CONF_DEV25G_MODES_DEV25G_D58_MODE BIT(2) 4004 + #define PORT_CONF_DEV25G_MODES_DEV25G_D58_MODE_SET(x)\ 4005 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D58_MODE, x) 4006 + #define PORT_CONF_DEV25G_MODES_DEV25G_D58_MODE_GET(x)\ 4007 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D58_MODE, x) 4008 + 4009 + #define PORT_CONF_DEV25G_MODES_DEV25G_D59_MODE BIT(3) 4010 + #define PORT_CONF_DEV25G_MODES_DEV25G_D59_MODE_SET(x)\ 4011 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D59_MODE, x) 4012 + #define PORT_CONF_DEV25G_MODES_DEV25G_D59_MODE_GET(x)\ 4013 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D59_MODE, x) 4014 + 4015 + #define PORT_CONF_DEV25G_MODES_DEV25G_D60_MODE BIT(4) 4016 + #define PORT_CONF_DEV25G_MODES_DEV25G_D60_MODE_SET(x)\ 4017 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D60_MODE, x) 4018 + #define PORT_CONF_DEV25G_MODES_DEV25G_D60_MODE_GET(x)\ 4019 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D60_MODE, x) 4020 + 4021 + #define PORT_CONF_DEV25G_MODES_DEV25G_D61_MODE BIT(5) 4022 + #define PORT_CONF_DEV25G_MODES_DEV25G_D61_MODE_SET(x)\ 4023 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D61_MODE, x) 4024 + #define PORT_CONF_DEV25G_MODES_DEV25G_D61_MODE_GET(x)\ 4025 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D61_MODE, x) 4026 + 4027 + #define PORT_CONF_DEV25G_MODES_DEV25G_D62_MODE BIT(6) 4028 + #define PORT_CONF_DEV25G_MODES_DEV25G_D62_MODE_SET(x)\ 4029 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D62_MODE, x) 4030 + #define PORT_CONF_DEV25G_MODES_DEV25G_D62_MODE_GET(x)\ 4031 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D62_MODE, x) 4032 + 4033 + #define PORT_CONF_DEV25G_MODES_DEV25G_D63_MODE BIT(7) 4034 + #define PORT_CONF_DEV25G_MODES_DEV25G_D63_MODE_SET(x)\ 4035 + FIELD_PREP(PORT_CONF_DEV25G_MODES_DEV25G_D63_MODE, x) 4036 + #define PORT_CONF_DEV25G_MODES_DEV25G_D63_MODE_GET(x)\ 4037 + FIELD_GET(PORT_CONF_DEV25G_MODES_DEV25G_D63_MODE, x) 4038 + 4039 + /* PORT_CONF:HW_CFG:QSGMII_ENA */ 4040 + #define PORT_CONF_QSGMII_ENA __REG(TARGET_PORT_CONF, 0, 1, 0, 0, 1, 24, 12, 0, 1, 4) 4041 + 4042 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_0 BIT(0) 4043 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_0_SET(x)\ 4044 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_0, x) 4045 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_0_GET(x)\ 4046 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_0, x) 4047 + 4048 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_1 BIT(1) 4049 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_1_SET(x)\ 4050 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_1, x) 4051 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_1_GET(x)\ 4052 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_1, x) 4053 + 4054 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_2 BIT(2) 4055 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_2_SET(x)\ 4056 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_2, x) 4057 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_2_GET(x)\ 4058 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_2, x) 4059 + 4060 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_3 BIT(3) 4061 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_3_SET(x)\ 4062 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_3, x) 4063 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_3_GET(x)\ 4064 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_3, x) 4065 + 4066 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_4 BIT(4) 4067 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_4_SET(x)\ 4068 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_4, x) 4069 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_4_GET(x)\ 4070 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_4, x) 4071 + 4072 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_5 BIT(5) 4073 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_5_SET(x)\ 4074 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_5, x) 4075 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_5_GET(x)\ 4076 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_5, x) 4077 + 4078 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_6 BIT(6) 4079 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_6_SET(x)\ 4080 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_6, x) 4081 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_6_GET(x)\ 4082 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_6, x) 4083 + 4084 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_7 BIT(7) 4085 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_7_SET(x)\ 4086 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_7, x) 4087 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_7_GET(x)\ 4088 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_7, x) 4089 + 4090 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_8 BIT(8) 4091 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_8_SET(x)\ 4092 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_8, x) 4093 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_8_GET(x)\ 4094 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_8, x) 4095 + 4096 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_9 BIT(9) 4097 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_9_SET(x)\ 4098 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_9, x) 4099 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_9_GET(x)\ 4100 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_9, x) 4101 + 4102 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_10 BIT(10) 4103 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_10_SET(x)\ 4104 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_10, x) 4105 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_10_GET(x)\ 4106 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_10, x) 4107 + 4108 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_11 BIT(11) 4109 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_11_SET(x)\ 4110 + FIELD_PREP(PORT_CONF_QSGMII_ENA_QSGMII_ENA_11, x) 4111 + #define PORT_CONF_QSGMII_ENA_QSGMII_ENA_11_GET(x)\ 4112 + FIELD_GET(PORT_CONF_QSGMII_ENA_QSGMII_ENA_11, x) 4113 + 4114 + /* PORT_CONF:USGMII_CFG_STAT:USGMII_CFG */ 4115 + #define PORT_CONF_USGMII_CFG(g) __REG(TARGET_PORT_CONF, 0, 1, 72, g, 6, 8, 0, 0, 1, 4) 4116 + 4117 + #define PORT_CONF_USGMII_CFG_BYPASS_SCRAM BIT(9) 4118 + #define PORT_CONF_USGMII_CFG_BYPASS_SCRAM_SET(x)\ 4119 + FIELD_PREP(PORT_CONF_USGMII_CFG_BYPASS_SCRAM, x) 4120 + #define PORT_CONF_USGMII_CFG_BYPASS_SCRAM_GET(x)\ 4121 + FIELD_GET(PORT_CONF_USGMII_CFG_BYPASS_SCRAM, x) 4122 + 4123 + #define PORT_CONF_USGMII_CFG_BYPASS_DESCRAM BIT(8) 4124 + #define PORT_CONF_USGMII_CFG_BYPASS_DESCRAM_SET(x)\ 4125 + FIELD_PREP(PORT_CONF_USGMII_CFG_BYPASS_DESCRAM, x) 4126 + #define PORT_CONF_USGMII_CFG_BYPASS_DESCRAM_GET(x)\ 4127 + FIELD_GET(PORT_CONF_USGMII_CFG_BYPASS_DESCRAM, x) 4128 + 4129 + #define PORT_CONF_USGMII_CFG_FLIP_LANES BIT(7) 4130 + #define PORT_CONF_USGMII_CFG_FLIP_LANES_SET(x)\ 4131 + FIELD_PREP(PORT_CONF_USGMII_CFG_FLIP_LANES, x) 4132 + #define PORT_CONF_USGMII_CFG_FLIP_LANES_GET(x)\ 4133 + FIELD_GET(PORT_CONF_USGMII_CFG_FLIP_LANES, x) 4134 + 4135 + #define PORT_CONF_USGMII_CFG_SHYST_DIS BIT(6) 4136 + #define PORT_CONF_USGMII_CFG_SHYST_DIS_SET(x)\ 4137 + FIELD_PREP(PORT_CONF_USGMII_CFG_SHYST_DIS, x) 4138 + #define PORT_CONF_USGMII_CFG_SHYST_DIS_GET(x)\ 4139 + FIELD_GET(PORT_CONF_USGMII_CFG_SHYST_DIS, x) 4140 + 4141 + #define PORT_CONF_USGMII_CFG_E_DET_ENA BIT(5) 4142 + #define PORT_CONF_USGMII_CFG_E_DET_ENA_SET(x)\ 4143 + FIELD_PREP(PORT_CONF_USGMII_CFG_E_DET_ENA, x) 4144 + #define PORT_CONF_USGMII_CFG_E_DET_ENA_GET(x)\ 4145 + FIELD_GET(PORT_CONF_USGMII_CFG_E_DET_ENA, x) 4146 + 4147 + #define PORT_CONF_USGMII_CFG_USE_I1_ENA BIT(4) 4148 + #define PORT_CONF_USGMII_CFG_USE_I1_ENA_SET(x)\ 4149 + FIELD_PREP(PORT_CONF_USGMII_CFG_USE_I1_ENA, x) 4150 + #define PORT_CONF_USGMII_CFG_USE_I1_ENA_GET(x)\ 4151 + FIELD_GET(PORT_CONF_USGMII_CFG_USE_I1_ENA, x) 4152 + 4153 + #define PORT_CONF_USGMII_CFG_QUAD_MODE BIT(1) 4154 + #define PORT_CONF_USGMII_CFG_QUAD_MODE_SET(x)\ 4155 + FIELD_PREP(PORT_CONF_USGMII_CFG_QUAD_MODE, x) 4156 + #define PORT_CONF_USGMII_CFG_QUAD_MODE_GET(x)\ 4157 + FIELD_GET(PORT_CONF_USGMII_CFG_QUAD_MODE, x) 4158 + 4159 + /* QFWD:SYSTEM:SWITCH_PORT_MODE */ 4160 + #define QFWD_SWITCH_PORT_MODE(r) __REG(TARGET_QFWD, 0, 1, 0, 0, 1, 340, 0, r, 70, 4) 4161 + 4162 + #define QFWD_SWITCH_PORT_MODE_PORT_ENA BIT(19) 4163 + #define QFWD_SWITCH_PORT_MODE_PORT_ENA_SET(x)\ 4164 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_PORT_ENA, x) 4165 + #define QFWD_SWITCH_PORT_MODE_PORT_ENA_GET(x)\ 4166 + FIELD_GET(QFWD_SWITCH_PORT_MODE_PORT_ENA, x) 4167 + 4168 + #define QFWD_SWITCH_PORT_MODE_FWD_URGENCY GENMASK(18, 10) 4169 + #define QFWD_SWITCH_PORT_MODE_FWD_URGENCY_SET(x)\ 4170 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_FWD_URGENCY, x) 4171 + #define QFWD_SWITCH_PORT_MODE_FWD_URGENCY_GET(x)\ 4172 + FIELD_GET(QFWD_SWITCH_PORT_MODE_FWD_URGENCY, x) 4173 + 4174 + #define QFWD_SWITCH_PORT_MODE_YEL_RSRVD GENMASK(9, 6) 4175 + #define QFWD_SWITCH_PORT_MODE_YEL_RSRVD_SET(x)\ 4176 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_YEL_RSRVD, x) 4177 + #define QFWD_SWITCH_PORT_MODE_YEL_RSRVD_GET(x)\ 4178 + FIELD_GET(QFWD_SWITCH_PORT_MODE_YEL_RSRVD, x) 4179 + 4180 + #define QFWD_SWITCH_PORT_MODE_INGRESS_DROP_MODE BIT(5) 4181 + #define QFWD_SWITCH_PORT_MODE_INGRESS_DROP_MODE_SET(x)\ 4182 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_INGRESS_DROP_MODE, x) 4183 + #define QFWD_SWITCH_PORT_MODE_INGRESS_DROP_MODE_GET(x)\ 4184 + FIELD_GET(QFWD_SWITCH_PORT_MODE_INGRESS_DROP_MODE, x) 4185 + 4186 + #define QFWD_SWITCH_PORT_MODE_IGR_NO_SHARING BIT(4) 4187 + #define QFWD_SWITCH_PORT_MODE_IGR_NO_SHARING_SET(x)\ 4188 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_IGR_NO_SHARING, x) 4189 + #define QFWD_SWITCH_PORT_MODE_IGR_NO_SHARING_GET(x)\ 4190 + FIELD_GET(QFWD_SWITCH_PORT_MODE_IGR_NO_SHARING, x) 4191 + 4192 + #define QFWD_SWITCH_PORT_MODE_EGR_NO_SHARING BIT(3) 4193 + #define QFWD_SWITCH_PORT_MODE_EGR_NO_SHARING_SET(x)\ 4194 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_EGR_NO_SHARING, x) 4195 + #define QFWD_SWITCH_PORT_MODE_EGR_NO_SHARING_GET(x)\ 4196 + FIELD_GET(QFWD_SWITCH_PORT_MODE_EGR_NO_SHARING, x) 4197 + 4198 + #define QFWD_SWITCH_PORT_MODE_EGRESS_DROP_MODE BIT(2) 4199 + #define QFWD_SWITCH_PORT_MODE_EGRESS_DROP_MODE_SET(x)\ 4200 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_EGRESS_DROP_MODE, x) 4201 + #define QFWD_SWITCH_PORT_MODE_EGRESS_DROP_MODE_GET(x)\ 4202 + FIELD_GET(QFWD_SWITCH_PORT_MODE_EGRESS_DROP_MODE, x) 4203 + 4204 + #define QFWD_SWITCH_PORT_MODE_EGRESS_RSRV_DIS BIT(1) 4205 + #define QFWD_SWITCH_PORT_MODE_EGRESS_RSRV_DIS_SET(x)\ 4206 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_EGRESS_RSRV_DIS, x) 4207 + #define QFWD_SWITCH_PORT_MODE_EGRESS_RSRV_DIS_GET(x)\ 4208 + FIELD_GET(QFWD_SWITCH_PORT_MODE_EGRESS_RSRV_DIS, x) 4209 + 4210 + #define QFWD_SWITCH_PORT_MODE_LEARNALL_MORE BIT(0) 4211 + #define QFWD_SWITCH_PORT_MODE_LEARNALL_MORE_SET(x)\ 4212 + FIELD_PREP(QFWD_SWITCH_PORT_MODE_LEARNALL_MORE, x) 4213 + #define QFWD_SWITCH_PORT_MODE_LEARNALL_MORE_GET(x)\ 4214 + FIELD_GET(QFWD_SWITCH_PORT_MODE_LEARNALL_MORE, x) 4215 + 4216 + /* QRES:RES_CTRL:RES_CFG */ 4217 + #define QRES_RES_CFG(g) __REG(TARGET_QRES, 0, 1, 0, g, 5120, 16, 0, 0, 1, 4) 4218 + 4219 + #define QRES_RES_CFG_WM_HIGH GENMASK(11, 0) 4220 + #define QRES_RES_CFG_WM_HIGH_SET(x)\ 4221 + FIELD_PREP(QRES_RES_CFG_WM_HIGH, x) 4222 + #define QRES_RES_CFG_WM_HIGH_GET(x)\ 4223 + FIELD_GET(QRES_RES_CFG_WM_HIGH, x) 4224 + 4225 + /* QRES:RES_CTRL:RES_STAT */ 4226 + #define QRES_RES_STAT(g) __REG(TARGET_QRES, 0, 1, 0, g, 5120, 16, 4, 0, 1, 4) 4227 + 4228 + #define QRES_RES_STAT_MAXUSE GENMASK(20, 0) 4229 + #define QRES_RES_STAT_MAXUSE_SET(x)\ 4230 + FIELD_PREP(QRES_RES_STAT_MAXUSE, x) 4231 + #define QRES_RES_STAT_MAXUSE_GET(x)\ 4232 + FIELD_GET(QRES_RES_STAT_MAXUSE, x) 4233 + 4234 + /* QRES:RES_CTRL:RES_STAT_CUR */ 4235 + #define QRES_RES_STAT_CUR(g) __REG(TARGET_QRES, 0, 1, 0, g, 5120, 16, 8, 0, 1, 4) 4236 + 4237 + #define QRES_RES_STAT_CUR_INUSE GENMASK(20, 0) 4238 + #define QRES_RES_STAT_CUR_INUSE_SET(x)\ 4239 + FIELD_PREP(QRES_RES_STAT_CUR_INUSE, x) 4240 + #define QRES_RES_STAT_CUR_INUSE_GET(x)\ 4241 + FIELD_GET(QRES_RES_STAT_CUR_INUSE, x) 4242 + 4243 + /* DEVCPU_QS:XTR:XTR_GRP_CFG */ 4244 + #define QS_XTR_GRP_CFG(r) __REG(TARGET_QS, 0, 1, 0, 0, 1, 36, 0, r, 2, 4) 4245 + 4246 + #define QS_XTR_GRP_CFG_MODE GENMASK(3, 2) 4247 + #define QS_XTR_GRP_CFG_MODE_SET(x)\ 4248 + FIELD_PREP(QS_XTR_GRP_CFG_MODE, x) 4249 + #define QS_XTR_GRP_CFG_MODE_GET(x)\ 4250 + FIELD_GET(QS_XTR_GRP_CFG_MODE, x) 4251 + 4252 + #define QS_XTR_GRP_CFG_STATUS_WORD_POS BIT(1) 4253 + #define QS_XTR_GRP_CFG_STATUS_WORD_POS_SET(x)\ 4254 + FIELD_PREP(QS_XTR_GRP_CFG_STATUS_WORD_POS, x) 4255 + #define QS_XTR_GRP_CFG_STATUS_WORD_POS_GET(x)\ 4256 + FIELD_GET(QS_XTR_GRP_CFG_STATUS_WORD_POS, x) 4257 + 4258 + #define QS_XTR_GRP_CFG_BYTE_SWAP BIT(0) 4259 + #define QS_XTR_GRP_CFG_BYTE_SWAP_SET(x)\ 4260 + FIELD_PREP(QS_XTR_GRP_CFG_BYTE_SWAP, x) 4261 + #define QS_XTR_GRP_CFG_BYTE_SWAP_GET(x)\ 4262 + FIELD_GET(QS_XTR_GRP_CFG_BYTE_SWAP, x) 4263 + 4264 + /* DEVCPU_QS:XTR:XTR_RD */ 4265 + #define QS_XTR_RD(r) __REG(TARGET_QS, 0, 1, 0, 0, 1, 36, 8, r, 2, 4) 4266 + 4267 + /* DEVCPU_QS:XTR:XTR_FLUSH */ 4268 + #define QS_XTR_FLUSH __REG(TARGET_QS, 0, 1, 0, 0, 1, 36, 24, 0, 1, 4) 4269 + 4270 + #define QS_XTR_FLUSH_FLUSH GENMASK(1, 0) 4271 + #define QS_XTR_FLUSH_FLUSH_SET(x)\ 4272 + FIELD_PREP(QS_XTR_FLUSH_FLUSH, x) 4273 + #define QS_XTR_FLUSH_FLUSH_GET(x)\ 4274 + FIELD_GET(QS_XTR_FLUSH_FLUSH, x) 4275 + 4276 + /* DEVCPU_QS:XTR:XTR_DATA_PRESENT */ 4277 + #define QS_XTR_DATA_PRESENT __REG(TARGET_QS, 0, 1, 0, 0, 1, 36, 28, 0, 1, 4) 4278 + 4279 + #define QS_XTR_DATA_PRESENT_DATA_PRESENT GENMASK(1, 0) 4280 + #define QS_XTR_DATA_PRESENT_DATA_PRESENT_SET(x)\ 4281 + FIELD_PREP(QS_XTR_DATA_PRESENT_DATA_PRESENT, x) 4282 + #define QS_XTR_DATA_PRESENT_DATA_PRESENT_GET(x)\ 4283 + FIELD_GET(QS_XTR_DATA_PRESENT_DATA_PRESENT, x) 4284 + 4285 + /* DEVCPU_QS:INJ:INJ_GRP_CFG */ 4286 + #define QS_INJ_GRP_CFG(r) __REG(TARGET_QS, 0, 1, 36, 0, 1, 40, 0, r, 2, 4) 4287 + 4288 + #define QS_INJ_GRP_CFG_MODE GENMASK(3, 2) 4289 + #define QS_INJ_GRP_CFG_MODE_SET(x)\ 4290 + FIELD_PREP(QS_INJ_GRP_CFG_MODE, x) 4291 + #define QS_INJ_GRP_CFG_MODE_GET(x)\ 4292 + FIELD_GET(QS_INJ_GRP_CFG_MODE, x) 4293 + 4294 + #define QS_INJ_GRP_CFG_BYTE_SWAP BIT(0) 4295 + #define QS_INJ_GRP_CFG_BYTE_SWAP_SET(x)\ 4296 + FIELD_PREP(QS_INJ_GRP_CFG_BYTE_SWAP, x) 4297 + #define QS_INJ_GRP_CFG_BYTE_SWAP_GET(x)\ 4298 + FIELD_GET(QS_INJ_GRP_CFG_BYTE_SWAP, x) 4299 + 4300 + /* DEVCPU_QS:INJ:INJ_WR */ 4301 + #define QS_INJ_WR(r) __REG(TARGET_QS, 0, 1, 36, 0, 1, 40, 8, r, 2, 4) 4302 + 4303 + /* DEVCPU_QS:INJ:INJ_CTRL */ 4304 + #define QS_INJ_CTRL(r) __REG(TARGET_QS, 0, 1, 36, 0, 1, 40, 16, r, 2, 4) 4305 + 4306 + #define QS_INJ_CTRL_GAP_SIZE GENMASK(24, 21) 4307 + #define QS_INJ_CTRL_GAP_SIZE_SET(x)\ 4308 + FIELD_PREP(QS_INJ_CTRL_GAP_SIZE, x) 4309 + #define QS_INJ_CTRL_GAP_SIZE_GET(x)\ 4310 + FIELD_GET(QS_INJ_CTRL_GAP_SIZE, x) 4311 + 4312 + #define QS_INJ_CTRL_ABORT BIT(20) 4313 + #define QS_INJ_CTRL_ABORT_SET(x)\ 4314 + FIELD_PREP(QS_INJ_CTRL_ABORT, x) 4315 + #define QS_INJ_CTRL_ABORT_GET(x)\ 4316 + FIELD_GET(QS_INJ_CTRL_ABORT, x) 4317 + 4318 + #define QS_INJ_CTRL_EOF BIT(19) 4319 + #define QS_INJ_CTRL_EOF_SET(x)\ 4320 + FIELD_PREP(QS_INJ_CTRL_EOF, x) 4321 + #define QS_INJ_CTRL_EOF_GET(x)\ 4322 + FIELD_GET(QS_INJ_CTRL_EOF, x) 4323 + 4324 + #define QS_INJ_CTRL_SOF BIT(18) 4325 + #define QS_INJ_CTRL_SOF_SET(x)\ 4326 + FIELD_PREP(QS_INJ_CTRL_SOF, x) 4327 + #define QS_INJ_CTRL_SOF_GET(x)\ 4328 + FIELD_GET(QS_INJ_CTRL_SOF, x) 4329 + 4330 + #define QS_INJ_CTRL_VLD_BYTES GENMASK(17, 16) 4331 + #define QS_INJ_CTRL_VLD_BYTES_SET(x)\ 4332 + FIELD_PREP(QS_INJ_CTRL_VLD_BYTES, x) 4333 + #define QS_INJ_CTRL_VLD_BYTES_GET(x)\ 4334 + FIELD_GET(QS_INJ_CTRL_VLD_BYTES, x) 4335 + 4336 + /* DEVCPU_QS:INJ:INJ_STATUS */ 4337 + #define QS_INJ_STATUS __REG(TARGET_QS, 0, 1, 36, 0, 1, 40, 24, 0, 1, 4) 4338 + 4339 + #define QS_INJ_STATUS_WMARK_REACHED GENMASK(5, 4) 4340 + #define QS_INJ_STATUS_WMARK_REACHED_SET(x)\ 4341 + FIELD_PREP(QS_INJ_STATUS_WMARK_REACHED, x) 4342 + #define QS_INJ_STATUS_WMARK_REACHED_GET(x)\ 4343 + FIELD_GET(QS_INJ_STATUS_WMARK_REACHED, x) 4344 + 4345 + #define QS_INJ_STATUS_FIFO_RDY GENMASK(3, 2) 4346 + #define QS_INJ_STATUS_FIFO_RDY_SET(x)\ 4347 + FIELD_PREP(QS_INJ_STATUS_FIFO_RDY, x) 4348 + #define QS_INJ_STATUS_FIFO_RDY_GET(x)\ 4349 + FIELD_GET(QS_INJ_STATUS_FIFO_RDY, x) 4350 + 4351 + #define QS_INJ_STATUS_INJ_IN_PROGRESS GENMASK(1, 0) 4352 + #define QS_INJ_STATUS_INJ_IN_PROGRESS_SET(x)\ 4353 + FIELD_PREP(QS_INJ_STATUS_INJ_IN_PROGRESS, x) 4354 + #define QS_INJ_STATUS_INJ_IN_PROGRESS_GET(x)\ 4355 + FIELD_GET(QS_INJ_STATUS_INJ_IN_PROGRESS, x) 4356 + 4357 + /* QSYS:PAUSE_CFG:PAUSE_CFG */ 4358 + #define QSYS_PAUSE_CFG(r) __REG(TARGET_QSYS, 0, 1, 544, 0, 1, 1128, 0, r, 70, 4) 4359 + 4360 + #define QSYS_PAUSE_CFG_PAUSE_START GENMASK(25, 14) 4361 + #define QSYS_PAUSE_CFG_PAUSE_START_SET(x)\ 4362 + FIELD_PREP(QSYS_PAUSE_CFG_PAUSE_START, x) 4363 + #define QSYS_PAUSE_CFG_PAUSE_START_GET(x)\ 4364 + FIELD_GET(QSYS_PAUSE_CFG_PAUSE_START, x) 4365 + 4366 + #define QSYS_PAUSE_CFG_PAUSE_STOP GENMASK(13, 2) 4367 + #define QSYS_PAUSE_CFG_PAUSE_STOP_SET(x)\ 4368 + FIELD_PREP(QSYS_PAUSE_CFG_PAUSE_STOP, x) 4369 + #define QSYS_PAUSE_CFG_PAUSE_STOP_GET(x)\ 4370 + FIELD_GET(QSYS_PAUSE_CFG_PAUSE_STOP, x) 4371 + 4372 + #define QSYS_PAUSE_CFG_PAUSE_ENA BIT(1) 4373 + #define QSYS_PAUSE_CFG_PAUSE_ENA_SET(x)\ 4374 + FIELD_PREP(QSYS_PAUSE_CFG_PAUSE_ENA, x) 4375 + #define QSYS_PAUSE_CFG_PAUSE_ENA_GET(x)\ 4376 + FIELD_GET(QSYS_PAUSE_CFG_PAUSE_ENA, x) 4377 + 4378 + #define QSYS_PAUSE_CFG_AGGRESSIVE_TAILDROP_ENA BIT(0) 4379 + #define QSYS_PAUSE_CFG_AGGRESSIVE_TAILDROP_ENA_SET(x)\ 4380 + FIELD_PREP(QSYS_PAUSE_CFG_AGGRESSIVE_TAILDROP_ENA, x) 4381 + #define QSYS_PAUSE_CFG_AGGRESSIVE_TAILDROP_ENA_GET(x)\ 4382 + FIELD_GET(QSYS_PAUSE_CFG_AGGRESSIVE_TAILDROP_ENA, x) 4383 + 4384 + /* QSYS:PAUSE_CFG:ATOP */ 4385 + #define QSYS_ATOP(r) __REG(TARGET_QSYS, 0, 1, 544, 0, 1, 1128, 284, r, 70, 4) 4386 + 4387 + #define QSYS_ATOP_ATOP GENMASK(11, 0) 4388 + #define QSYS_ATOP_ATOP_SET(x)\ 4389 + FIELD_PREP(QSYS_ATOP_ATOP, x) 4390 + #define QSYS_ATOP_ATOP_GET(x)\ 4391 + FIELD_GET(QSYS_ATOP_ATOP, x) 4392 + 4393 + /* QSYS:PAUSE_CFG:FWD_PRESSURE */ 4394 + #define QSYS_FWD_PRESSURE(r) __REG(TARGET_QSYS, 0, 1, 544, 0, 1, 1128, 564, r, 70, 4) 4395 + 4396 + #define QSYS_FWD_PRESSURE_FWD_PRESSURE GENMASK(11, 1) 4397 + #define QSYS_FWD_PRESSURE_FWD_PRESSURE_SET(x)\ 4398 + FIELD_PREP(QSYS_FWD_PRESSURE_FWD_PRESSURE, x) 4399 + #define QSYS_FWD_PRESSURE_FWD_PRESSURE_GET(x)\ 4400 + FIELD_GET(QSYS_FWD_PRESSURE_FWD_PRESSURE, x) 4401 + 4402 + #define QSYS_FWD_PRESSURE_FWD_PRESSURE_DIS BIT(0) 4403 + #define QSYS_FWD_PRESSURE_FWD_PRESSURE_DIS_SET(x)\ 4404 + FIELD_PREP(QSYS_FWD_PRESSURE_FWD_PRESSURE_DIS, x) 4405 + #define QSYS_FWD_PRESSURE_FWD_PRESSURE_DIS_GET(x)\ 4406 + FIELD_GET(QSYS_FWD_PRESSURE_FWD_PRESSURE_DIS, x) 4407 + 4408 + /* QSYS:PAUSE_CFG:ATOP_TOT_CFG */ 4409 + #define QSYS_ATOP_TOT_CFG __REG(TARGET_QSYS, 0, 1, 544, 0, 1, 1128, 844, 0, 1, 4) 4410 + 4411 + #define QSYS_ATOP_TOT_CFG_ATOP_TOT GENMASK(11, 0) 4412 + #define QSYS_ATOP_TOT_CFG_ATOP_TOT_SET(x)\ 4413 + FIELD_PREP(QSYS_ATOP_TOT_CFG_ATOP_TOT, x) 4414 + #define QSYS_ATOP_TOT_CFG_ATOP_TOT_GET(x)\ 4415 + FIELD_GET(QSYS_ATOP_TOT_CFG_ATOP_TOT, x) 4416 + 4417 + /* QSYS:CALCFG:CAL_AUTO */ 4418 + #define QSYS_CAL_AUTO(r) __REG(TARGET_QSYS, 0, 1, 2304, 0, 1, 40, 0, r, 7, 4) 4419 + 4420 + #define QSYS_CAL_AUTO_CAL_AUTO GENMASK(29, 0) 4421 + #define QSYS_CAL_AUTO_CAL_AUTO_SET(x)\ 4422 + FIELD_PREP(QSYS_CAL_AUTO_CAL_AUTO, x) 4423 + #define QSYS_CAL_AUTO_CAL_AUTO_GET(x)\ 4424 + FIELD_GET(QSYS_CAL_AUTO_CAL_AUTO, x) 4425 + 4426 + /* QSYS:CALCFG:CAL_CTRL */ 4427 + #define QSYS_CAL_CTRL __REG(TARGET_QSYS, 0, 1, 2304, 0, 1, 40, 36, 0, 1, 4) 4428 + 4429 + #define QSYS_CAL_CTRL_CAL_MODE GENMASK(14, 11) 4430 + #define QSYS_CAL_CTRL_CAL_MODE_SET(x)\ 4431 + FIELD_PREP(QSYS_CAL_CTRL_CAL_MODE, x) 4432 + #define QSYS_CAL_CTRL_CAL_MODE_GET(x)\ 4433 + FIELD_GET(QSYS_CAL_CTRL_CAL_MODE, x) 4434 + 4435 + #define QSYS_CAL_CTRL_CAL_AUTO_GRANT_RATE GENMASK(10, 1) 4436 + #define QSYS_CAL_CTRL_CAL_AUTO_GRANT_RATE_SET(x)\ 4437 + FIELD_PREP(QSYS_CAL_CTRL_CAL_AUTO_GRANT_RATE, x) 4438 + #define QSYS_CAL_CTRL_CAL_AUTO_GRANT_RATE_GET(x)\ 4439 + FIELD_GET(QSYS_CAL_CTRL_CAL_AUTO_GRANT_RATE, x) 4440 + 4441 + #define QSYS_CAL_CTRL_CAL_AUTO_ERROR BIT(0) 4442 + #define QSYS_CAL_CTRL_CAL_AUTO_ERROR_SET(x)\ 4443 + FIELD_PREP(QSYS_CAL_CTRL_CAL_AUTO_ERROR, x) 4444 + #define QSYS_CAL_CTRL_CAL_AUTO_ERROR_GET(x)\ 4445 + FIELD_GET(QSYS_CAL_CTRL_CAL_AUTO_ERROR, x) 4446 + 4447 + /* QSYS:RAM_CTRL:RAM_INIT */ 4448 + #define QSYS_RAM_INIT __REG(TARGET_QSYS, 0, 1, 2344, 0, 1, 4, 0, 0, 1, 4) 4449 + 4450 + #define QSYS_RAM_INIT_RAM_INIT BIT(1) 4451 + #define QSYS_RAM_INIT_RAM_INIT_SET(x)\ 4452 + FIELD_PREP(QSYS_RAM_INIT_RAM_INIT, x) 4453 + #define QSYS_RAM_INIT_RAM_INIT_GET(x)\ 4454 + FIELD_GET(QSYS_RAM_INIT_RAM_INIT, x) 4455 + 4456 + #define QSYS_RAM_INIT_RAM_CFG_HOOK BIT(0) 4457 + #define QSYS_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 4458 + FIELD_PREP(QSYS_RAM_INIT_RAM_CFG_HOOK, x) 4459 + #define QSYS_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 4460 + FIELD_GET(QSYS_RAM_INIT_RAM_CFG_HOOK, x) 4461 + 4462 + /* REW:COMMON:OWN_UPSID */ 4463 + #define REW_OWN_UPSID(r) __REG(TARGET_REW, 0, 1, 387264, 0, 1, 1232, 0, r, 3, 4) 4464 + 4465 + #define REW_OWN_UPSID_OWN_UPSID GENMASK(4, 0) 4466 + #define REW_OWN_UPSID_OWN_UPSID_SET(x)\ 4467 + FIELD_PREP(REW_OWN_UPSID_OWN_UPSID, x) 4468 + #define REW_OWN_UPSID_OWN_UPSID_GET(x)\ 4469 + FIELD_GET(REW_OWN_UPSID_OWN_UPSID, x) 4470 + 4471 + /* REW:PORT:PORT_VLAN_CFG */ 4472 + #define REW_PORT_VLAN_CFG(g) __REG(TARGET_REW, 0, 1, 360448, g, 70, 256, 0, 0, 1, 4) 4473 + 4474 + #define REW_PORT_VLAN_CFG_PORT_PCP GENMASK(15, 13) 4475 + #define REW_PORT_VLAN_CFG_PORT_PCP_SET(x)\ 4476 + FIELD_PREP(REW_PORT_VLAN_CFG_PORT_PCP, x) 4477 + #define REW_PORT_VLAN_CFG_PORT_PCP_GET(x)\ 4478 + FIELD_GET(REW_PORT_VLAN_CFG_PORT_PCP, x) 4479 + 4480 + #define REW_PORT_VLAN_CFG_PORT_DEI BIT(12) 4481 + #define REW_PORT_VLAN_CFG_PORT_DEI_SET(x)\ 4482 + FIELD_PREP(REW_PORT_VLAN_CFG_PORT_DEI, x) 4483 + #define REW_PORT_VLAN_CFG_PORT_DEI_GET(x)\ 4484 + FIELD_GET(REW_PORT_VLAN_CFG_PORT_DEI, x) 4485 + 4486 + #define REW_PORT_VLAN_CFG_PORT_VID GENMASK(11, 0) 4487 + #define REW_PORT_VLAN_CFG_PORT_VID_SET(x)\ 4488 + FIELD_PREP(REW_PORT_VLAN_CFG_PORT_VID, x) 4489 + #define REW_PORT_VLAN_CFG_PORT_VID_GET(x)\ 4490 + FIELD_GET(REW_PORT_VLAN_CFG_PORT_VID, x) 4491 + 4492 + /* REW:PORT:TAG_CTRL */ 4493 + #define REW_TAG_CTRL(g) __REG(TARGET_REW, 0, 1, 360448, g, 70, 256, 132, 0, 1, 4) 4494 + 4495 + #define REW_TAG_CTRL_TAG_CFG_OBEY_WAS_TAGGED BIT(13) 4496 + #define REW_TAG_CTRL_TAG_CFG_OBEY_WAS_TAGGED_SET(x)\ 4497 + FIELD_PREP(REW_TAG_CTRL_TAG_CFG_OBEY_WAS_TAGGED, x) 4498 + #define REW_TAG_CTRL_TAG_CFG_OBEY_WAS_TAGGED_GET(x)\ 4499 + FIELD_GET(REW_TAG_CTRL_TAG_CFG_OBEY_WAS_TAGGED, x) 4500 + 4501 + #define REW_TAG_CTRL_TAG_CFG GENMASK(12, 11) 4502 + #define REW_TAG_CTRL_TAG_CFG_SET(x)\ 4503 + FIELD_PREP(REW_TAG_CTRL_TAG_CFG, x) 4504 + #define REW_TAG_CTRL_TAG_CFG_GET(x)\ 4505 + FIELD_GET(REW_TAG_CTRL_TAG_CFG, x) 4506 + 4507 + #define REW_TAG_CTRL_TAG_TPID_CFG GENMASK(10, 8) 4508 + #define REW_TAG_CTRL_TAG_TPID_CFG_SET(x)\ 4509 + FIELD_PREP(REW_TAG_CTRL_TAG_TPID_CFG, x) 4510 + #define REW_TAG_CTRL_TAG_TPID_CFG_GET(x)\ 4511 + FIELD_GET(REW_TAG_CTRL_TAG_TPID_CFG, x) 4512 + 4513 + #define REW_TAG_CTRL_TAG_VID_CFG GENMASK(7, 6) 4514 + #define REW_TAG_CTRL_TAG_VID_CFG_SET(x)\ 4515 + FIELD_PREP(REW_TAG_CTRL_TAG_VID_CFG, x) 4516 + #define REW_TAG_CTRL_TAG_VID_CFG_GET(x)\ 4517 + FIELD_GET(REW_TAG_CTRL_TAG_VID_CFG, x) 4518 + 4519 + #define REW_TAG_CTRL_TAG_PCP_CFG GENMASK(5, 3) 4520 + #define REW_TAG_CTRL_TAG_PCP_CFG_SET(x)\ 4521 + FIELD_PREP(REW_TAG_CTRL_TAG_PCP_CFG, x) 4522 + #define REW_TAG_CTRL_TAG_PCP_CFG_GET(x)\ 4523 + FIELD_GET(REW_TAG_CTRL_TAG_PCP_CFG, x) 4524 + 4525 + #define REW_TAG_CTRL_TAG_DEI_CFG GENMASK(2, 0) 4526 + #define REW_TAG_CTRL_TAG_DEI_CFG_SET(x)\ 4527 + FIELD_PREP(REW_TAG_CTRL_TAG_DEI_CFG, x) 4528 + #define REW_TAG_CTRL_TAG_DEI_CFG_GET(x)\ 4529 + FIELD_GET(REW_TAG_CTRL_TAG_DEI_CFG, x) 4530 + 4531 + /* REW:RAM_CTRL:RAM_INIT */ 4532 + #define REW_RAM_INIT __REG(TARGET_REW, 0, 1, 378696, 0, 1, 4, 0, 0, 1, 4) 4533 + 4534 + #define REW_RAM_INIT_RAM_INIT BIT(1) 4535 + #define REW_RAM_INIT_RAM_INIT_SET(x)\ 4536 + FIELD_PREP(REW_RAM_INIT_RAM_INIT, x) 4537 + #define REW_RAM_INIT_RAM_INIT_GET(x)\ 4538 + FIELD_GET(REW_RAM_INIT_RAM_INIT, x) 4539 + 4540 + #define REW_RAM_INIT_RAM_CFG_HOOK BIT(0) 4541 + #define REW_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 4542 + FIELD_PREP(REW_RAM_INIT_RAM_CFG_HOOK, x) 4543 + #define REW_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 4544 + FIELD_GET(REW_RAM_INIT_RAM_CFG_HOOK, x) 4545 + 4546 + /* VCAP_SUPER:RAM_CTRL:RAM_INIT */ 4547 + #define VCAP_SUPER_RAM_INIT __REG(TARGET_VCAP_SUPER, 0, 1, 1120, 0, 1, 4, 0, 0, 1, 4) 4548 + 4549 + #define VCAP_SUPER_RAM_INIT_RAM_INIT BIT(1) 4550 + #define VCAP_SUPER_RAM_INIT_RAM_INIT_SET(x)\ 4551 + FIELD_PREP(VCAP_SUPER_RAM_INIT_RAM_INIT, x) 4552 + #define VCAP_SUPER_RAM_INIT_RAM_INIT_GET(x)\ 4553 + FIELD_GET(VCAP_SUPER_RAM_INIT_RAM_INIT, x) 4554 + 4555 + #define VCAP_SUPER_RAM_INIT_RAM_CFG_HOOK BIT(0) 4556 + #define VCAP_SUPER_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 4557 + FIELD_PREP(VCAP_SUPER_RAM_INIT_RAM_CFG_HOOK, x) 4558 + #define VCAP_SUPER_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 4559 + FIELD_GET(VCAP_SUPER_RAM_INIT_RAM_CFG_HOOK, x) 4560 + 4561 + /* VOP:RAM_CTRL:RAM_INIT */ 4562 + #define VOP_RAM_INIT __REG(TARGET_VOP, 0, 1, 279176, 0, 1, 4, 0, 0, 1, 4) 4563 + 4564 + #define VOP_RAM_INIT_RAM_INIT BIT(1) 4565 + #define VOP_RAM_INIT_RAM_INIT_SET(x)\ 4566 + FIELD_PREP(VOP_RAM_INIT_RAM_INIT, x) 4567 + #define VOP_RAM_INIT_RAM_INIT_GET(x)\ 4568 + FIELD_GET(VOP_RAM_INIT_RAM_INIT, x) 4569 + 4570 + #define VOP_RAM_INIT_RAM_CFG_HOOK BIT(0) 4571 + #define VOP_RAM_INIT_RAM_CFG_HOOK_SET(x)\ 4572 + FIELD_PREP(VOP_RAM_INIT_RAM_CFG_HOOK, x) 4573 + #define VOP_RAM_INIT_RAM_CFG_HOOK_GET(x)\ 4574 + FIELD_GET(VOP_RAM_INIT_RAM_CFG_HOOK, x) 4575 + 4576 + /* XQS:SYSTEM:STAT_CFG */ 4577 + #define XQS_STAT_CFG __REG(TARGET_XQS, 0, 1, 6768, 0, 1, 872, 860, 0, 1, 4) 4578 + 4579 + #define XQS_STAT_CFG_STAT_CLEAR_SHOT GENMASK(21, 18) 4580 + #define XQS_STAT_CFG_STAT_CLEAR_SHOT_SET(x)\ 4581 + FIELD_PREP(XQS_STAT_CFG_STAT_CLEAR_SHOT, x) 4582 + #define XQS_STAT_CFG_STAT_CLEAR_SHOT_GET(x)\ 4583 + FIELD_GET(XQS_STAT_CFG_STAT_CLEAR_SHOT, x) 4584 + 4585 + #define XQS_STAT_CFG_STAT_VIEW GENMASK(17, 5) 4586 + #define XQS_STAT_CFG_STAT_VIEW_SET(x)\ 4587 + FIELD_PREP(XQS_STAT_CFG_STAT_VIEW, x) 4588 + #define XQS_STAT_CFG_STAT_VIEW_GET(x)\ 4589 + FIELD_GET(XQS_STAT_CFG_STAT_VIEW, x) 4590 + 4591 + #define XQS_STAT_CFG_STAT_SRV_PKT_ONLY BIT(4) 4592 + #define XQS_STAT_CFG_STAT_SRV_PKT_ONLY_SET(x)\ 4593 + FIELD_PREP(XQS_STAT_CFG_STAT_SRV_PKT_ONLY, x) 4594 + #define XQS_STAT_CFG_STAT_SRV_PKT_ONLY_GET(x)\ 4595 + FIELD_GET(XQS_STAT_CFG_STAT_SRV_PKT_ONLY, x) 4596 + 4597 + #define XQS_STAT_CFG_STAT_WRAP_DIS GENMASK(3, 0) 4598 + #define XQS_STAT_CFG_STAT_WRAP_DIS_SET(x)\ 4599 + FIELD_PREP(XQS_STAT_CFG_STAT_WRAP_DIS, x) 4600 + #define XQS_STAT_CFG_STAT_WRAP_DIS_GET(x)\ 4601 + FIELD_GET(XQS_STAT_CFG_STAT_WRAP_DIS, x) 4602 + 4603 + /* XQS:QLIMIT_SHR:QLIMIT_SHR_TOP_CFG */ 4604 + #define XQS_QLIMIT_SHR_TOP_CFG(g) __REG(TARGET_XQS, 0, 1, 7936, g, 4, 48, 0, 0, 1, 4) 4605 + 4606 + #define XQS_QLIMIT_SHR_TOP_CFG_QLIMIT_SHR_TOP GENMASK(14, 0) 4607 + #define XQS_QLIMIT_SHR_TOP_CFG_QLIMIT_SHR_TOP_SET(x)\ 4608 + FIELD_PREP(XQS_QLIMIT_SHR_TOP_CFG_QLIMIT_SHR_TOP, x) 4609 + #define XQS_QLIMIT_SHR_TOP_CFG_QLIMIT_SHR_TOP_GET(x)\ 4610 + FIELD_GET(XQS_QLIMIT_SHR_TOP_CFG_QLIMIT_SHR_TOP, x) 4611 + 4612 + /* XQS:QLIMIT_SHR:QLIMIT_SHR_ATOP_CFG */ 4613 + #define XQS_QLIMIT_SHR_ATOP_CFG(g) __REG(TARGET_XQS, 0, 1, 7936, g, 4, 48, 4, 0, 1, 4) 4614 + 4615 + #define XQS_QLIMIT_SHR_ATOP_CFG_QLIMIT_SHR_ATOP GENMASK(14, 0) 4616 + #define XQS_QLIMIT_SHR_ATOP_CFG_QLIMIT_SHR_ATOP_SET(x)\ 4617 + FIELD_PREP(XQS_QLIMIT_SHR_ATOP_CFG_QLIMIT_SHR_ATOP, x) 4618 + #define XQS_QLIMIT_SHR_ATOP_CFG_QLIMIT_SHR_ATOP_GET(x)\ 4619 + FIELD_GET(XQS_QLIMIT_SHR_ATOP_CFG_QLIMIT_SHR_ATOP, x) 4620 + 4621 + /* XQS:QLIMIT_SHR:QLIMIT_SHR_CTOP_CFG */ 4622 + #define XQS_QLIMIT_SHR_CTOP_CFG(g) __REG(TARGET_XQS, 0, 1, 7936, g, 4, 48, 8, 0, 1, 4) 4623 + 4624 + #define XQS_QLIMIT_SHR_CTOP_CFG_QLIMIT_SHR_CTOP GENMASK(14, 0) 4625 + #define XQS_QLIMIT_SHR_CTOP_CFG_QLIMIT_SHR_CTOP_SET(x)\ 4626 + FIELD_PREP(XQS_QLIMIT_SHR_CTOP_CFG_QLIMIT_SHR_CTOP, x) 4627 + #define XQS_QLIMIT_SHR_CTOP_CFG_QLIMIT_SHR_CTOP_GET(x)\ 4628 + FIELD_GET(XQS_QLIMIT_SHR_CTOP_CFG_QLIMIT_SHR_CTOP, x) 4629 + 4630 + /* XQS:QLIMIT_SHR:QLIMIT_SHR_QLIM_CFG */ 4631 + #define XQS_QLIMIT_SHR_QLIM_CFG(g) __REG(TARGET_XQS, 0, 1, 7936, g, 4, 48, 12, 0, 1, 4) 4632 + 4633 + #define XQS_QLIMIT_SHR_QLIM_CFG_QLIMIT_SHR_QLIM GENMASK(14, 0) 4634 + #define XQS_QLIMIT_SHR_QLIM_CFG_QLIMIT_SHR_QLIM_SET(x)\ 4635 + FIELD_PREP(XQS_QLIMIT_SHR_QLIM_CFG_QLIMIT_SHR_QLIM, x) 4636 + #define XQS_QLIMIT_SHR_QLIM_CFG_QLIMIT_SHR_QLIM_GET(x)\ 4637 + FIELD_GET(XQS_QLIMIT_SHR_QLIM_CFG_QLIMIT_SHR_QLIM, x) 4638 + 4639 + /* XQS:STAT:CNT */ 4640 + #define XQS_CNT(g) __REG(TARGET_XQS, 0, 1, 0, g, 1024, 4, 0, 0, 1, 4) 4641 + 4642 + #endif /* _SPARX5_MAIN_REGS_H_ */
+264
drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include "sparx5_main_regs.h" 8 + #include "sparx5_main.h" 9 + #include "sparx5_port.h" 10 + 11 + /* The IFH bit position of the first VSTAX bit. This is because the 12 + * VSTAX bit positions in Data sheet is starting from zero. 13 + */ 14 + #define VSTAX 73 15 + 16 + static void ifh_encode_bitfield(void *ifh, u64 value, u32 pos, u32 width) 17 + { 18 + u8 *ifh_hdr = ifh; 19 + /* Calculate the Start IFH byte position of this IFH bit position */ 20 + u32 byte = (35 - (pos / 8)); 21 + /* Calculate the Start bit position in the Start IFH byte */ 22 + u32 bit = (pos % 8); 23 + u64 encode = GENMASK(bit + width - 1, bit) & (value << bit); 24 + 25 + /* Max width is 5 bytes - 40 bits. In worst case this will 26 + * spread over 6 bytes - 48 bits 27 + */ 28 + compiletime_assert(width <= 40, "Unsupported width, must be <= 40"); 29 + 30 + /* The b0-b7 goes into the start IFH byte */ 31 + if (encode & 0xFF) 32 + ifh_hdr[byte] |= (u8)((encode & 0xFF)); 33 + /* The b8-b15 goes into the next IFH byte */ 34 + if (encode & 0xFF00) 35 + ifh_hdr[byte - 1] |= (u8)((encode & 0xFF00) >> 8); 36 + /* The b16-b23 goes into the next IFH byte */ 37 + if (encode & 0xFF0000) 38 + ifh_hdr[byte - 2] |= (u8)((encode & 0xFF0000) >> 16); 39 + /* The b24-b31 goes into the next IFH byte */ 40 + if (encode & 0xFF000000) 41 + ifh_hdr[byte - 3] |= (u8)((encode & 0xFF000000) >> 24); 42 + /* The b32-b39 goes into the next IFH byte */ 43 + if (encode & 0xFF00000000) 44 + ifh_hdr[byte - 4] |= (u8)((encode & 0xFF00000000) >> 32); 45 + /* The b40-b47 goes into the next IFH byte */ 46 + if (encode & 0xFF0000000000) 47 + ifh_hdr[byte - 5] |= (u8)((encode & 0xFF0000000000) >> 40); 48 + } 49 + 50 + static void sparx5_set_port_ifh(void *ifh_hdr, u16 portno) 51 + { 52 + /* VSTAX.RSV = 1. MSBit must be 1 */ 53 + ifh_encode_bitfield(ifh_hdr, 1, VSTAX + 79, 1); 54 + /* VSTAX.INGR_DROP_MODE = Enable. Don't make head-of-line blocking */ 55 + ifh_encode_bitfield(ifh_hdr, 1, VSTAX + 55, 1); 56 + /* MISC.CPU_MASK/DPORT = Destination port */ 57 + ifh_encode_bitfield(ifh_hdr, portno, 29, 8); 58 + /* MISC.PIPELINE_PT */ 59 + ifh_encode_bitfield(ifh_hdr, 16, 37, 5); 60 + /* MISC.PIPELINE_ACT */ 61 + ifh_encode_bitfield(ifh_hdr, 1, 42, 3); 62 + /* FWD.SRC_PORT = CPU */ 63 + ifh_encode_bitfield(ifh_hdr, SPX5_PORT_CPU, 46, 7); 64 + /* FWD.SFLOW_ID (disable SFlow sampling) */ 65 + ifh_encode_bitfield(ifh_hdr, 124, 57, 7); 66 + /* FWD.UPDATE_FCS = Enable. Enforce update of FCS. */ 67 + ifh_encode_bitfield(ifh_hdr, 1, 67, 1); 68 + } 69 + 70 + static int sparx5_port_open(struct net_device *ndev) 71 + { 72 + struct sparx5_port *port = netdev_priv(ndev); 73 + int err = 0; 74 + 75 + sparx5_port_enable(port, true); 76 + err = phylink_of_phy_connect(port->phylink, port->of_node, 0); 77 + if (err) { 78 + netdev_err(ndev, "Could not attach to PHY\n"); 79 + return err; 80 + } 81 + 82 + phylink_start(port->phylink); 83 + 84 + if (!ndev->phydev) { 85 + /* power up serdes */ 86 + port->conf.power_down = false; 87 + if (port->conf.serdes_reset) 88 + err = sparx5_serdes_set(port->sparx5, port, &port->conf); 89 + else 90 + err = phy_power_on(port->serdes); 91 + if (err) 92 + netdev_err(ndev, "%s failed\n", __func__); 93 + } 94 + 95 + return err; 96 + } 97 + 98 + static int sparx5_port_stop(struct net_device *ndev) 99 + { 100 + struct sparx5_port *port = netdev_priv(ndev); 101 + int err = 0; 102 + 103 + sparx5_port_enable(port, false); 104 + phylink_stop(port->phylink); 105 + phylink_disconnect_phy(port->phylink); 106 + 107 + if (!ndev->phydev) { 108 + /* power down serdes */ 109 + port->conf.power_down = true; 110 + if (port->conf.serdes_reset) 111 + err = sparx5_serdes_set(port->sparx5, port, &port->conf); 112 + else 113 + err = phy_power_off(port->serdes); 114 + if (err) 115 + netdev_err(ndev, "%s failed\n", __func__); 116 + } 117 + return 0; 118 + } 119 + 120 + static void sparx5_set_rx_mode(struct net_device *dev) 121 + { 122 + struct sparx5_port *port = netdev_priv(dev); 123 + struct sparx5 *sparx5 = port->sparx5; 124 + 125 + if (!test_bit(port->portno, sparx5->bridge_mask)) 126 + __dev_mc_sync(dev, sparx5_mc_sync, sparx5_mc_unsync); 127 + } 128 + 129 + static int sparx5_port_get_phys_port_name(struct net_device *dev, 130 + char *buf, size_t len) 131 + { 132 + struct sparx5_port *port = netdev_priv(dev); 133 + int ret; 134 + 135 + ret = snprintf(buf, len, "p%d", port->portno); 136 + if (ret >= len) 137 + return -EINVAL; 138 + 139 + return 0; 140 + } 141 + 142 + static int sparx5_set_mac_address(struct net_device *dev, void *p) 143 + { 144 + struct sparx5_port *port = netdev_priv(dev); 145 + struct sparx5 *sparx5 = port->sparx5; 146 + const struct sockaddr *addr = p; 147 + 148 + if (!is_valid_ether_addr(addr->sa_data)) 149 + return -EADDRNOTAVAIL; 150 + 151 + /* Remove current */ 152 + sparx5_mact_forget(sparx5, dev->dev_addr, port->pvid); 153 + 154 + /* Add new */ 155 + sparx5_mact_learn(sparx5, PGID_CPU, addr->sa_data, port->pvid); 156 + 157 + /* Record the address */ 158 + ether_addr_copy(dev->dev_addr, addr->sa_data); 159 + 160 + return 0; 161 + } 162 + 163 + static int sparx5_get_port_parent_id(struct net_device *dev, 164 + struct netdev_phys_item_id *ppid) 165 + { 166 + struct sparx5_port *sparx5_port = netdev_priv(dev); 167 + struct sparx5 *sparx5 = sparx5_port->sparx5; 168 + 169 + ppid->id_len = sizeof(sparx5->base_mac); 170 + memcpy(&ppid->id, &sparx5->base_mac, ppid->id_len); 171 + 172 + return 0; 173 + } 174 + 175 + static const struct net_device_ops sparx5_port_netdev_ops = { 176 + .ndo_open = sparx5_port_open, 177 + .ndo_stop = sparx5_port_stop, 178 + .ndo_start_xmit = sparx5_port_xmit_impl, 179 + .ndo_set_rx_mode = sparx5_set_rx_mode, 180 + .ndo_get_phys_port_name = sparx5_port_get_phys_port_name, 181 + .ndo_set_mac_address = sparx5_set_mac_address, 182 + .ndo_validate_addr = eth_validate_addr, 183 + .ndo_get_stats64 = sparx5_get_stats64, 184 + .ndo_get_port_parent_id = sparx5_get_port_parent_id, 185 + }; 186 + 187 + bool sparx5_netdevice_check(const struct net_device *dev) 188 + { 189 + return dev && (dev->netdev_ops == &sparx5_port_netdev_ops); 190 + } 191 + 192 + struct net_device *sparx5_create_netdev(struct sparx5 *sparx5, u32 portno) 193 + { 194 + struct sparx5_port *spx5_port; 195 + struct net_device *ndev; 196 + u64 val; 197 + 198 + ndev = devm_alloc_etherdev(sparx5->dev, sizeof(struct sparx5_port)); 199 + if (!ndev) 200 + return ERR_PTR(-ENOMEM); 201 + 202 + SET_NETDEV_DEV(ndev, sparx5->dev); 203 + spx5_port = netdev_priv(ndev); 204 + spx5_port->ndev = ndev; 205 + spx5_port->sparx5 = sparx5; 206 + spx5_port->portno = portno; 207 + sparx5_set_port_ifh(spx5_port->ifh, portno); 208 + 209 + ndev->netdev_ops = &sparx5_port_netdev_ops; 210 + ndev->ethtool_ops = &sparx5_ethtool_ops; 211 + 212 + val = ether_addr_to_u64(sparx5->base_mac) + portno + 1; 213 + u64_to_ether_addr(val, ndev->dev_addr); 214 + 215 + return ndev; 216 + } 217 + 218 + int sparx5_register_netdevs(struct sparx5 *sparx5) 219 + { 220 + int portno; 221 + int err; 222 + 223 + for (portno = 0; portno < SPX5_PORTS; portno++) 224 + if (sparx5->ports[portno]) { 225 + err = register_netdev(sparx5->ports[portno]->ndev); 226 + if (err) { 227 + dev_err(sparx5->dev, 228 + "port: %02u: netdev registration failed\n", 229 + portno); 230 + return err; 231 + } 232 + sparx5_port_inj_timer_setup(sparx5->ports[portno]); 233 + } 234 + return 0; 235 + } 236 + 237 + void sparx5_destroy_netdevs(struct sparx5 *sparx5) 238 + { 239 + struct sparx5_port *port; 240 + int portno; 241 + 242 + for (portno = 0; portno < SPX5_PORTS; portno++) { 243 + port = sparx5->ports[portno]; 244 + if (port && port->phylink) { 245 + /* Disconnect the phy */ 246 + rtnl_lock(); 247 + sparx5_port_stop(port->ndev); 248 + phylink_disconnect_phy(port->phylink); 249 + rtnl_unlock(); 250 + phylink_destroy(port->phylink); 251 + port->phylink = NULL; 252 + } 253 + } 254 + } 255 + 256 + void sparx5_unregister_netdevs(struct sparx5 *sparx5) 257 + { 258 + int portno; 259 + 260 + for (portno = 0; portno < SPX5_PORTS; portno++) 261 + if (sparx5->ports[portno]) 262 + unregister_netdev(sparx5->ports[portno]->ndev); 263 + } 264 +
+320
drivers/net/ethernet/microchip/sparx5/sparx5_packet.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include "sparx5_main_regs.h" 8 + #include "sparx5_main.h" 9 + 10 + #define XTR_EOF_0 ntohl((__force __be32)0x80000000u) 11 + #define XTR_EOF_1 ntohl((__force __be32)0x80000001u) 12 + #define XTR_EOF_2 ntohl((__force __be32)0x80000002u) 13 + #define XTR_EOF_3 ntohl((__force __be32)0x80000003u) 14 + #define XTR_PRUNED ntohl((__force __be32)0x80000004u) 15 + #define XTR_ABORT ntohl((__force __be32)0x80000005u) 16 + #define XTR_ESCAPE ntohl((__force __be32)0x80000006u) 17 + #define XTR_NOT_READY ntohl((__force __be32)0x80000007u) 18 + 19 + #define XTR_VALID_BYTES(x) (4 - ((x) & 3)) 20 + 21 + #define INJ_TIMEOUT_NS 50000 22 + 23 + struct frame_info { 24 + int src_port; 25 + }; 26 + 27 + static void sparx5_xtr_flush(struct sparx5 *sparx5, u8 grp) 28 + { 29 + /* Start flush */ 30 + spx5_wr(QS_XTR_FLUSH_FLUSH_SET(BIT(grp)), sparx5, QS_XTR_FLUSH); 31 + 32 + /* Allow to drain */ 33 + mdelay(1); 34 + 35 + /* All Queues normal */ 36 + spx5_wr(0, sparx5, QS_XTR_FLUSH); 37 + } 38 + 39 + static void sparx5_ifh_parse(u32 *ifh, struct frame_info *info) 40 + { 41 + u8 *xtr_hdr = (u8 *)ifh; 42 + 43 + /* FWD is bit 45-72 (28 bits), but we only read the 27 LSB for now */ 44 + u32 fwd = 45 + ((u32)xtr_hdr[27] << 24) | 46 + ((u32)xtr_hdr[28] << 16) | 47 + ((u32)xtr_hdr[29] << 8) | 48 + ((u32)xtr_hdr[30] << 0); 49 + fwd = (fwd >> 5); 50 + info->src_port = FIELD_GET(GENMASK(7, 1), fwd); 51 + } 52 + 53 + static void sparx5_xtr_grp(struct sparx5 *sparx5, u8 grp, bool byte_swap) 54 + { 55 + bool eof_flag = false, pruned_flag = false, abort_flag = false; 56 + struct net_device *netdev; 57 + struct sparx5_port *port; 58 + struct frame_info fi; 59 + int i, byte_cnt = 0; 60 + struct sk_buff *skb; 61 + u32 ifh[IFH_LEN]; 62 + u32 *rxbuf; 63 + 64 + /* Get IFH */ 65 + for (i = 0; i < IFH_LEN; i++) 66 + ifh[i] = spx5_rd(sparx5, QS_XTR_RD(grp)); 67 + 68 + /* Decode IFH (whats needed) */ 69 + sparx5_ifh_parse(ifh, &fi); 70 + 71 + /* Map to port netdev */ 72 + port = fi.src_port < SPX5_PORTS ? 73 + sparx5->ports[fi.src_port] : NULL; 74 + if (!port || !port->ndev) { 75 + dev_err(sparx5->dev, "Data on inactive port %d\n", fi.src_port); 76 + sparx5_xtr_flush(sparx5, grp); 77 + return; 78 + } 79 + 80 + /* Have netdev, get skb */ 81 + netdev = port->ndev; 82 + skb = netdev_alloc_skb(netdev, netdev->mtu + ETH_HLEN); 83 + if (!skb) { 84 + sparx5_xtr_flush(sparx5, grp); 85 + dev_err(sparx5->dev, "No skb allocated\n"); 86 + netdev->stats.rx_dropped++; 87 + return; 88 + } 89 + rxbuf = (u32 *)skb->data; 90 + 91 + /* Now, pull frame data */ 92 + while (!eof_flag) { 93 + u32 val = spx5_rd(sparx5, QS_XTR_RD(grp)); 94 + u32 cmp = val; 95 + 96 + if (byte_swap) 97 + cmp = ntohl((__force __be32)val); 98 + 99 + switch (cmp) { 100 + case XTR_NOT_READY: 101 + break; 102 + case XTR_ABORT: 103 + /* No accompanying data */ 104 + abort_flag = true; 105 + eof_flag = true; 106 + break; 107 + case XTR_EOF_0: 108 + case XTR_EOF_1: 109 + case XTR_EOF_2: 110 + case XTR_EOF_3: 111 + /* This assumes STATUS_WORD_POS == 1, Status 112 + * just after last data 113 + */ 114 + byte_cnt -= (4 - XTR_VALID_BYTES(val)); 115 + eof_flag = true; 116 + break; 117 + case XTR_PRUNED: 118 + /* But get the last 4 bytes as well */ 119 + eof_flag = true; 120 + pruned_flag = true; 121 + fallthrough; 122 + case XTR_ESCAPE: 123 + *rxbuf = spx5_rd(sparx5, QS_XTR_RD(grp)); 124 + byte_cnt += 4; 125 + rxbuf++; 126 + break; 127 + default: 128 + *rxbuf = val; 129 + byte_cnt += 4; 130 + rxbuf++; 131 + } 132 + } 133 + 134 + if (abort_flag || pruned_flag || !eof_flag) { 135 + netdev_err(netdev, "Discarded frame: abort:%d pruned:%d eof:%d\n", 136 + abort_flag, pruned_flag, eof_flag); 137 + kfree_skb(skb); 138 + netdev->stats.rx_dropped++; 139 + return; 140 + } 141 + 142 + /* Everything we see on an interface that is in the HW bridge 143 + * has already been forwarded 144 + */ 145 + if (test_bit(port->portno, sparx5->bridge_mask)) 146 + skb->offload_fwd_mark = 1; 147 + 148 + /* Finish up skb */ 149 + skb_put(skb, byte_cnt - ETH_FCS_LEN); 150 + eth_skb_pad(skb); 151 + skb->protocol = eth_type_trans(skb, netdev); 152 + netif_rx(skb); 153 + netdev->stats.rx_bytes += skb->len; 154 + netdev->stats.rx_packets++; 155 + } 156 + 157 + static int sparx5_inject(struct sparx5 *sparx5, 158 + u32 *ifh, 159 + struct sk_buff *skb, 160 + struct net_device *ndev) 161 + { 162 + int grp = INJ_QUEUE; 163 + u32 val, w, count; 164 + u8 *buf; 165 + 166 + val = spx5_rd(sparx5, QS_INJ_STATUS); 167 + if (!(QS_INJ_STATUS_FIFO_RDY_GET(val) & BIT(grp))) { 168 + pr_err_ratelimited("Injection: Queue not ready: 0x%lx\n", 169 + QS_INJ_STATUS_FIFO_RDY_GET(val)); 170 + return -EBUSY; 171 + } 172 + 173 + /* Indicate SOF */ 174 + spx5_wr(QS_INJ_CTRL_SOF_SET(1) | 175 + QS_INJ_CTRL_GAP_SIZE_SET(1), 176 + sparx5, QS_INJ_CTRL(grp)); 177 + 178 + /* Write the IFH to the chip. */ 179 + for (w = 0; w < IFH_LEN; w++) 180 + spx5_wr(ifh[w], sparx5, QS_INJ_WR(grp)); 181 + 182 + /* Write words, round up */ 183 + count = DIV_ROUND_UP(skb->len, 4); 184 + buf = skb->data; 185 + for (w = 0; w < count; w++, buf += 4) { 186 + val = get_unaligned((const u32 *)buf); 187 + spx5_wr(val, sparx5, QS_INJ_WR(grp)); 188 + } 189 + 190 + /* Add padding */ 191 + while (w < (60 / 4)) { 192 + spx5_wr(0, sparx5, QS_INJ_WR(grp)); 193 + w++; 194 + } 195 + 196 + /* Indicate EOF and valid bytes in last word */ 197 + spx5_wr(QS_INJ_CTRL_GAP_SIZE_SET(1) | 198 + QS_INJ_CTRL_VLD_BYTES_SET(skb->len < 60 ? 0 : skb->len % 4) | 199 + QS_INJ_CTRL_EOF_SET(1), 200 + sparx5, QS_INJ_CTRL(grp)); 201 + 202 + /* Add dummy CRC */ 203 + spx5_wr(0, sparx5, QS_INJ_WR(grp)); 204 + w++; 205 + 206 + val = spx5_rd(sparx5, QS_INJ_STATUS); 207 + if (QS_INJ_STATUS_WMARK_REACHED_GET(val) & BIT(grp)) { 208 + struct sparx5_port *port = netdev_priv(ndev); 209 + 210 + pr_err_ratelimited("Injection: Watermark reached: 0x%lx\n", 211 + QS_INJ_STATUS_WMARK_REACHED_GET(val)); 212 + netif_stop_queue(ndev); 213 + hrtimer_start(&port->inj_timer, INJ_TIMEOUT_NS, 214 + HRTIMER_MODE_REL); 215 + } 216 + 217 + return NETDEV_TX_OK; 218 + } 219 + 220 + int sparx5_port_xmit_impl(struct sk_buff *skb, struct net_device *dev) 221 + { 222 + struct net_device_stats *stats = &dev->stats; 223 + struct sparx5_port *port = netdev_priv(dev); 224 + struct sparx5 *sparx5 = port->sparx5; 225 + int ret; 226 + 227 + ret = sparx5_inject(sparx5, port->ifh, skb, dev); 228 + 229 + if (ret == NETDEV_TX_OK) { 230 + stats->tx_bytes += skb->len; 231 + stats->tx_packets++; 232 + skb_tx_timestamp(skb); 233 + dev_kfree_skb_any(skb); 234 + } else { 235 + stats->tx_dropped++; 236 + } 237 + return ret; 238 + } 239 + 240 + static enum hrtimer_restart sparx5_injection_timeout(struct hrtimer *tmr) 241 + { 242 + struct sparx5_port *port = container_of(tmr, struct sparx5_port, 243 + inj_timer); 244 + int grp = INJ_QUEUE; 245 + u32 val; 246 + 247 + val = spx5_rd(port->sparx5, QS_INJ_STATUS); 248 + if (QS_INJ_STATUS_WMARK_REACHED_GET(val) & BIT(grp)) { 249 + pr_err_ratelimited("Injection: Reset watermark count\n"); 250 + /* Reset Watermark count to restart */ 251 + spx5_rmw(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR_SET(1), 252 + DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR, 253 + port->sparx5, 254 + DSM_DEV_TX_STOP_WM_CFG(port->portno)); 255 + } 256 + netif_wake_queue(port->ndev); 257 + return HRTIMER_NORESTART; 258 + } 259 + 260 + int sparx5_manual_injection_mode(struct sparx5 *sparx5) 261 + { 262 + const int byte_swap = 1; 263 + int portno; 264 + 265 + /* Change mode to manual extraction and injection */ 266 + spx5_wr(QS_XTR_GRP_CFG_MODE_SET(1) | 267 + QS_XTR_GRP_CFG_STATUS_WORD_POS_SET(1) | 268 + QS_XTR_GRP_CFG_BYTE_SWAP_SET(byte_swap), 269 + sparx5, QS_XTR_GRP_CFG(XTR_QUEUE)); 270 + spx5_wr(QS_INJ_GRP_CFG_MODE_SET(1) | 271 + QS_INJ_GRP_CFG_BYTE_SWAP_SET(byte_swap), 272 + sparx5, QS_INJ_GRP_CFG(INJ_QUEUE)); 273 + 274 + /* CPU ports capture setup */ 275 + for (portno = SPX5_PORT_CPU_0; portno <= SPX5_PORT_CPU_1; portno++) { 276 + /* ASM CPU port: No preamble, IFH, enable padding */ 277 + spx5_wr(ASM_PORT_CFG_PAD_ENA_SET(1) | 278 + ASM_PORT_CFG_NO_PREAMBLE_ENA_SET(1) | 279 + ASM_PORT_CFG_INJ_FORMAT_CFG_SET(1), /* 1 = IFH */ 280 + sparx5, ASM_PORT_CFG(portno)); 281 + 282 + /* Reset WM cnt to unclog queued frames */ 283 + spx5_rmw(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR_SET(1), 284 + DSM_DEV_TX_STOP_WM_CFG_DEV_TX_CNT_CLR, 285 + sparx5, 286 + DSM_DEV_TX_STOP_WM_CFG(portno)); 287 + 288 + /* Set Disassembler Stop Watermark level */ 289 + spx5_rmw(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM_SET(0), 290 + DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM, 291 + sparx5, 292 + DSM_DEV_TX_STOP_WM_CFG(portno)); 293 + 294 + /* Enable Disassembler buffer underrun watchdog 295 + */ 296 + spx5_rmw(DSM_BUF_CFG_UNDERFLOW_WATCHDOG_DIS_SET(0), 297 + DSM_BUF_CFG_UNDERFLOW_WATCHDOG_DIS, 298 + sparx5, 299 + DSM_BUF_CFG(portno)); 300 + } 301 + return 0; 302 + } 303 + 304 + irqreturn_t sparx5_xtr_handler(int irq, void *_sparx5) 305 + { 306 + struct sparx5 *s5 = _sparx5; 307 + int poll = 64; 308 + 309 + /* Check data in queue */ 310 + while (spx5_rd(s5, QS_XTR_DATA_PRESENT) & BIT(XTR_QUEUE) && poll-- > 0) 311 + sparx5_xtr_grp(s5, XTR_QUEUE, false); 312 + 313 + return IRQ_HANDLED; 314 + } 315 + 316 + void sparx5_port_inj_timer_setup(struct sparx5_port *port) 317 + { 318 + hrtimer_init(&port->inj_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); 319 + port->inj_timer.function = sparx5_injection_timeout; 320 + }
+210
drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include <linux/module.h> 8 + #include <linux/phylink.h> 9 + #include <linux/device.h> 10 + #include <linux/netdevice.h> 11 + #include <linux/sfp.h> 12 + 13 + #include "sparx5_main_regs.h" 14 + #include "sparx5_main.h" 15 + #include "sparx5_port.h" 16 + 17 + static bool port_conf_has_changed(struct sparx5_port_config *a, struct sparx5_port_config *b) 18 + { 19 + if (a->speed != b->speed || 20 + a->portmode != b->portmode || 21 + a->autoneg != b->autoneg || 22 + a->pause_adv != b->pause_adv || 23 + a->power_down != b->power_down || 24 + a->media != b->media) 25 + return true; 26 + return false; 27 + } 28 + 29 + static void sparx5_phylink_validate(struct phylink_config *config, 30 + unsigned long *supported, 31 + struct phylink_link_state *state) 32 + { 33 + struct sparx5_port *port = netdev_priv(to_net_dev(config->dev)); 34 + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; 35 + 36 + phylink_set(mask, Autoneg); 37 + phylink_set_port_modes(mask); 38 + phylink_set(mask, Pause); 39 + phylink_set(mask, Asym_Pause); 40 + 41 + switch (state->interface) { 42 + case PHY_INTERFACE_MODE_5GBASER: 43 + case PHY_INTERFACE_MODE_10GBASER: 44 + case PHY_INTERFACE_MODE_25GBASER: 45 + case PHY_INTERFACE_MODE_NA: 46 + if (port->conf.bandwidth == SPEED_5000) 47 + phylink_set(mask, 5000baseT_Full); 48 + if (port->conf.bandwidth == SPEED_10000) { 49 + phylink_set(mask, 5000baseT_Full); 50 + phylink_set(mask, 10000baseT_Full); 51 + phylink_set(mask, 10000baseCR_Full); 52 + phylink_set(mask, 10000baseSR_Full); 53 + phylink_set(mask, 10000baseLR_Full); 54 + phylink_set(mask, 10000baseLRM_Full); 55 + phylink_set(mask, 10000baseER_Full); 56 + } 57 + if (port->conf.bandwidth == SPEED_25000) { 58 + phylink_set(mask, 5000baseT_Full); 59 + phylink_set(mask, 10000baseT_Full); 60 + phylink_set(mask, 10000baseCR_Full); 61 + phylink_set(mask, 10000baseSR_Full); 62 + phylink_set(mask, 10000baseLR_Full); 63 + phylink_set(mask, 10000baseLRM_Full); 64 + phylink_set(mask, 10000baseER_Full); 65 + phylink_set(mask, 25000baseCR_Full); 66 + phylink_set(mask, 25000baseSR_Full); 67 + } 68 + if (state->interface != PHY_INTERFACE_MODE_NA) 69 + break; 70 + fallthrough; 71 + case PHY_INTERFACE_MODE_SGMII: 72 + case PHY_INTERFACE_MODE_QSGMII: 73 + phylink_set(mask, 10baseT_Half); 74 + phylink_set(mask, 10baseT_Full); 75 + phylink_set(mask, 100baseT_Half); 76 + phylink_set(mask, 100baseT_Full); 77 + phylink_set(mask, 1000baseT_Full); 78 + phylink_set(mask, 1000baseX_Full); 79 + if (state->interface != PHY_INTERFACE_MODE_NA) 80 + break; 81 + fallthrough; 82 + case PHY_INTERFACE_MODE_1000BASEX: 83 + case PHY_INTERFACE_MODE_2500BASEX: 84 + if (state->interface != PHY_INTERFACE_MODE_2500BASEX) { 85 + phylink_set(mask, 1000baseT_Full); 86 + phylink_set(mask, 1000baseX_Full); 87 + } 88 + if (state->interface == PHY_INTERFACE_MODE_2500BASEX || 89 + state->interface == PHY_INTERFACE_MODE_NA) { 90 + phylink_set(mask, 2500baseT_Full); 91 + phylink_set(mask, 2500baseX_Full); 92 + } 93 + break; 94 + default: 95 + bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); 96 + return; 97 + } 98 + bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); 99 + bitmap_and(state->advertising, state->advertising, mask, 100 + __ETHTOOL_LINK_MODE_MASK_NBITS); 101 + } 102 + 103 + static void sparx5_phylink_mac_config(struct phylink_config *config, 104 + unsigned int mode, 105 + const struct phylink_link_state *state) 106 + { 107 + /* Currently not used */ 108 + } 109 + 110 + static void sparx5_phylink_mac_link_up(struct phylink_config *config, 111 + struct phy_device *phy, 112 + unsigned int mode, 113 + phy_interface_t interface, 114 + int speed, int duplex, 115 + bool tx_pause, bool rx_pause) 116 + { 117 + struct sparx5_port *port = netdev_priv(to_net_dev(config->dev)); 118 + struct sparx5_port_config conf; 119 + int err; 120 + 121 + conf = port->conf; 122 + conf.duplex = duplex; 123 + conf.pause = 0; 124 + conf.pause |= tx_pause ? MLO_PAUSE_TX : 0; 125 + conf.pause |= rx_pause ? MLO_PAUSE_RX : 0; 126 + conf.speed = speed; 127 + /* Configure the port to speed/duplex/pause */ 128 + err = sparx5_port_config(port->sparx5, port, &conf); 129 + if (err) 130 + netdev_err(port->ndev, "port config failed: %d\n", err); 131 + } 132 + 133 + static void sparx5_phylink_mac_link_down(struct phylink_config *config, 134 + unsigned int mode, 135 + phy_interface_t interface) 136 + { 137 + /* Currently not used */ 138 + } 139 + 140 + static struct sparx5_port *sparx5_pcs_to_port(struct phylink_pcs *pcs) 141 + { 142 + return container_of(pcs, struct sparx5_port, phylink_pcs); 143 + } 144 + 145 + static void sparx5_pcs_get_state(struct phylink_pcs *pcs, 146 + struct phylink_link_state *state) 147 + { 148 + struct sparx5_port *port = sparx5_pcs_to_port(pcs); 149 + struct sparx5_port_status status; 150 + 151 + sparx5_get_port_status(port->sparx5, port, &status); 152 + state->link = status.link && !status.link_down; 153 + state->an_complete = status.an_complete; 154 + state->speed = status.speed; 155 + state->duplex = status.duplex; 156 + state->pause = status.pause; 157 + } 158 + 159 + static int sparx5_pcs_config(struct phylink_pcs *pcs, 160 + unsigned int mode, 161 + phy_interface_t interface, 162 + const unsigned long *advertising, 163 + bool permit_pause_to_mac) 164 + { 165 + struct sparx5_port *port = sparx5_pcs_to_port(pcs); 166 + struct sparx5_port_config conf; 167 + int ret = 0; 168 + 169 + conf = port->conf; 170 + conf.power_down = false; 171 + conf.portmode = interface; 172 + conf.inband = phylink_autoneg_inband(mode); 173 + conf.autoneg = phylink_test(advertising, Autoneg); 174 + conf.pause_adv = 0; 175 + if (phylink_test(advertising, Pause)) 176 + conf.pause_adv |= ADVERTISE_1000XPAUSE; 177 + if (phylink_test(advertising, Asym_Pause)) 178 + conf.pause_adv |= ADVERTISE_1000XPSE_ASYM; 179 + if (sparx5_is_baser(interface)) { 180 + if (phylink_test(advertising, FIBRE)) 181 + conf.media = PHY_MEDIA_SR; 182 + else 183 + conf.media = PHY_MEDIA_DAC; 184 + } 185 + if (!port_conf_has_changed(&port->conf, &conf)) 186 + return ret; 187 + /* Enable the PCS matching this interface type */ 188 + ret = sparx5_port_pcs_set(port->sparx5, port, &conf); 189 + if (ret) 190 + netdev_err(port->ndev, "port PCS config failed: %d\n", ret); 191 + return ret; 192 + } 193 + 194 + static void sparx5_pcs_aneg_restart(struct phylink_pcs *pcs) 195 + { 196 + /* Currently not used */ 197 + } 198 + 199 + const struct phylink_pcs_ops sparx5_phylink_pcs_ops = { 200 + .pcs_get_state = sparx5_pcs_get_state, 201 + .pcs_config = sparx5_pcs_config, 202 + .pcs_an_restart = sparx5_pcs_aneg_restart, 203 + }; 204 + 205 + const struct phylink_mac_ops sparx5_phylink_mac_ops = { 206 + .validate = sparx5_phylink_validate, 207 + .mac_config = sparx5_phylink_mac_config, 208 + .mac_link_down = sparx5_phylink_mac_link_down, 209 + .mac_link_up = sparx5_phylink_mac_link_up, 210 + };
+1146
drivers/net/ethernet/microchip/sparx5/sparx5_port.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include <linux/module.h> 8 + #include <linux/phy/phy.h> 9 + 10 + #include "sparx5_main_regs.h" 11 + #include "sparx5_main.h" 12 + #include "sparx5_port.h" 13 + 14 + #define SPX5_ETYPE_TAG_C 0x8100 15 + #define SPX5_ETYPE_TAG_S 0x88a8 16 + 17 + #define SPX5_WAIT_US 1000 18 + #define SPX5_WAIT_MAX_US 2000 19 + 20 + enum port_error { 21 + SPX5_PERR_SPEED, 22 + SPX5_PERR_IFTYPE, 23 + }; 24 + 25 + #define PAUSE_DISCARD 0xC 26 + #define ETH_MAXLEN (ETH_DATA_LEN + ETH_HLEN + ETH_FCS_LEN) 27 + 28 + static void decode_sgmii_word(u16 lp_abil, struct sparx5_port_status *status) 29 + { 30 + status->an_complete = true; 31 + if (!(lp_abil & LPA_SGMII_LINK)) { 32 + status->link = false; 33 + return; 34 + } 35 + 36 + switch (lp_abil & LPA_SGMII_SPD_MASK) { 37 + case LPA_SGMII_10: 38 + status->speed = SPEED_10; 39 + break; 40 + case LPA_SGMII_100: 41 + status->speed = SPEED_100; 42 + break; 43 + case LPA_SGMII_1000: 44 + status->speed = SPEED_1000; 45 + break; 46 + default: 47 + status->link = false; 48 + return; 49 + } 50 + if (lp_abil & LPA_SGMII_FULL_DUPLEX) 51 + status->duplex = DUPLEX_FULL; 52 + else 53 + status->duplex = DUPLEX_HALF; 54 + } 55 + 56 + static void decode_cl37_word(u16 lp_abil, uint16_t ld_abil, struct sparx5_port_status *status) 57 + { 58 + status->link = !(lp_abil & ADVERTISE_RFAULT) && status->link; 59 + status->an_complete = true; 60 + status->duplex = (ADVERTISE_1000XFULL & lp_abil) ? 61 + DUPLEX_FULL : DUPLEX_UNKNOWN; // 1G HDX not supported 62 + 63 + if ((ld_abil & ADVERTISE_1000XPAUSE) && 64 + (lp_abil & ADVERTISE_1000XPAUSE)) { 65 + status->pause = MLO_PAUSE_RX | MLO_PAUSE_TX; 66 + } else if ((ld_abil & ADVERTISE_1000XPSE_ASYM) && 67 + (lp_abil & ADVERTISE_1000XPSE_ASYM)) { 68 + status->pause |= (lp_abil & ADVERTISE_1000XPAUSE) ? 69 + MLO_PAUSE_TX : 0; 70 + status->pause |= (ld_abil & ADVERTISE_1000XPAUSE) ? 71 + MLO_PAUSE_RX : 0; 72 + } else { 73 + status->pause = MLO_PAUSE_NONE; 74 + } 75 + } 76 + 77 + static int sparx5_get_dev2g5_status(struct sparx5 *sparx5, 78 + struct sparx5_port *port, 79 + struct sparx5_port_status *status) 80 + { 81 + u32 portno = port->portno; 82 + u16 lp_adv, ld_adv; 83 + u32 value; 84 + 85 + /* Get PCS Link down sticky */ 86 + value = spx5_rd(sparx5, DEV2G5_PCS1G_STICKY(portno)); 87 + status->link_down = DEV2G5_PCS1G_STICKY_LINK_DOWN_STICKY_GET(value); 88 + if (status->link_down) /* Clear the sticky */ 89 + spx5_wr(value, sparx5, DEV2G5_PCS1G_STICKY(portno)); 90 + 91 + /* Get both current Link and Sync status */ 92 + value = spx5_rd(sparx5, DEV2G5_PCS1G_LINK_STATUS(portno)); 93 + status->link = DEV2G5_PCS1G_LINK_STATUS_LINK_STATUS_GET(value) && 94 + DEV2G5_PCS1G_LINK_STATUS_SYNC_STATUS_GET(value); 95 + 96 + if (port->conf.portmode == PHY_INTERFACE_MODE_1000BASEX) 97 + status->speed = SPEED_1000; 98 + else if (port->conf.portmode == PHY_INTERFACE_MODE_2500BASEX) 99 + status->speed = SPEED_2500; 100 + 101 + status->duplex = DUPLEX_FULL; 102 + 103 + /* Get PCS ANEG status register */ 104 + value = spx5_rd(sparx5, DEV2G5_PCS1G_ANEG_STATUS(portno)); 105 + 106 + /* Aneg complete provides more information */ 107 + if (DEV2G5_PCS1G_ANEG_STATUS_ANEG_COMPLETE_GET(value)) { 108 + lp_adv = DEV2G5_PCS1G_ANEG_STATUS_LP_ADV_ABILITY_GET(value); 109 + if (port->conf.portmode == PHY_INTERFACE_MODE_SGMII) { 110 + decode_sgmii_word(lp_adv, status); 111 + } else { 112 + value = spx5_rd(sparx5, DEV2G5_PCS1G_ANEG_CFG(portno)); 113 + ld_adv = DEV2G5_PCS1G_ANEG_CFG_ADV_ABILITY_GET(value); 114 + decode_cl37_word(lp_adv, ld_adv, status); 115 + } 116 + } 117 + return 0; 118 + } 119 + 120 + static int sparx5_get_sfi_status(struct sparx5 *sparx5, 121 + struct sparx5_port *port, 122 + struct sparx5_port_status *status) 123 + { 124 + bool high_speed_dev = sparx5_is_baser(port->conf.portmode); 125 + u32 portno = port->portno; 126 + u32 value, dev, tinst; 127 + void __iomem *inst; 128 + 129 + if (!high_speed_dev) { 130 + netdev_err(port->ndev, "error: low speed and SFI mode\n"); 131 + return -EINVAL; 132 + } 133 + 134 + dev = sparx5_to_high_dev(portno); 135 + tinst = sparx5_port_dev_index(portno); 136 + inst = spx5_inst_get(sparx5, dev, tinst); 137 + 138 + value = spx5_inst_rd(inst, DEV10G_MAC_TX_MONITOR_STICKY(0)); 139 + if (value != DEV10G_MAC_TX_MONITOR_STICKY_IDLE_STATE_STICKY) { 140 + /* The link is or has been down. Clear the sticky bit */ 141 + status->link_down = 1; 142 + spx5_inst_wr(0xffffffff, inst, DEV10G_MAC_TX_MONITOR_STICKY(0)); 143 + value = spx5_inst_rd(inst, DEV10G_MAC_TX_MONITOR_STICKY(0)); 144 + } 145 + status->link = (value == DEV10G_MAC_TX_MONITOR_STICKY_IDLE_STATE_STICKY); 146 + status->duplex = DUPLEX_FULL; 147 + if (port->conf.portmode == PHY_INTERFACE_MODE_5GBASER) 148 + status->speed = SPEED_5000; 149 + else if (port->conf.portmode == PHY_INTERFACE_MODE_10GBASER) 150 + status->speed = SPEED_10000; 151 + else 152 + status->speed = SPEED_25000; 153 + 154 + return 0; 155 + } 156 + 157 + /* Get link status of 1000Base-X/in-band and SFI ports. 158 + */ 159 + int sparx5_get_port_status(struct sparx5 *sparx5, 160 + struct sparx5_port *port, 161 + struct sparx5_port_status *status) 162 + { 163 + memset(status, 0, sizeof(*status)); 164 + status->speed = port->conf.speed; 165 + if (port->conf.power_down) { 166 + status->link = false; 167 + return 0; 168 + } 169 + switch (port->conf.portmode) { 170 + case PHY_INTERFACE_MODE_SGMII: 171 + case PHY_INTERFACE_MODE_QSGMII: 172 + case PHY_INTERFACE_MODE_1000BASEX: 173 + case PHY_INTERFACE_MODE_2500BASEX: 174 + return sparx5_get_dev2g5_status(sparx5, port, status); 175 + case PHY_INTERFACE_MODE_5GBASER: 176 + case PHY_INTERFACE_MODE_10GBASER: 177 + case PHY_INTERFACE_MODE_25GBASER: 178 + return sparx5_get_sfi_status(sparx5, port, status); 179 + case PHY_INTERFACE_MODE_NA: 180 + return 0; 181 + default: 182 + netdev_err(port->ndev, "Status not supported"); 183 + return -ENODEV; 184 + } 185 + return 0; 186 + } 187 + 188 + static int sparx5_port_error(struct sparx5_port *port, 189 + struct sparx5_port_config *conf, 190 + enum port_error errtype) 191 + { 192 + switch (errtype) { 193 + case SPX5_PERR_SPEED: 194 + netdev_err(port->ndev, 195 + "Interface does not support speed: %u: for %s\n", 196 + conf->speed, phy_modes(conf->portmode)); 197 + break; 198 + case SPX5_PERR_IFTYPE: 199 + netdev_err(port->ndev, 200 + "Switch port does not support interface type: %s\n", 201 + phy_modes(conf->portmode)); 202 + break; 203 + default: 204 + netdev_err(port->ndev, 205 + "Interface configuration error\n"); 206 + } 207 + 208 + return -EINVAL; 209 + } 210 + 211 + static int sparx5_port_verify_speed(struct sparx5 *sparx5, 212 + struct sparx5_port *port, 213 + struct sparx5_port_config *conf) 214 + { 215 + if ((sparx5_port_is_2g5(port->portno) && 216 + conf->speed > SPEED_2500) || 217 + (sparx5_port_is_5g(port->portno) && 218 + conf->speed > SPEED_5000) || 219 + (sparx5_port_is_10g(port->portno) && 220 + conf->speed > SPEED_10000)) 221 + return sparx5_port_error(port, conf, SPX5_PERR_SPEED); 222 + 223 + switch (conf->portmode) { 224 + case PHY_INTERFACE_MODE_NA: 225 + return -EINVAL; 226 + case PHY_INTERFACE_MODE_1000BASEX: 227 + if (conf->speed != SPEED_1000 || 228 + sparx5_port_is_2g5(port->portno)) 229 + return sparx5_port_error(port, conf, SPX5_PERR_SPEED); 230 + if (sparx5_port_is_2g5(port->portno)) 231 + return sparx5_port_error(port, conf, SPX5_PERR_IFTYPE); 232 + break; 233 + case PHY_INTERFACE_MODE_2500BASEX: 234 + if (conf->speed != SPEED_2500 || 235 + sparx5_port_is_2g5(port->portno)) 236 + return sparx5_port_error(port, conf, SPX5_PERR_SPEED); 237 + break; 238 + case PHY_INTERFACE_MODE_QSGMII: 239 + if (port->portno > 47) 240 + return sparx5_port_error(port, conf, SPX5_PERR_IFTYPE); 241 + fallthrough; 242 + case PHY_INTERFACE_MODE_SGMII: 243 + if (conf->speed != SPEED_1000 && 244 + conf->speed != SPEED_100 && 245 + conf->speed != SPEED_10 && 246 + conf->speed != SPEED_2500) 247 + return sparx5_port_error(port, conf, SPX5_PERR_SPEED); 248 + break; 249 + case PHY_INTERFACE_MODE_5GBASER: 250 + case PHY_INTERFACE_MODE_10GBASER: 251 + case PHY_INTERFACE_MODE_25GBASER: 252 + if ((conf->speed != SPEED_5000 && 253 + conf->speed != SPEED_10000 && 254 + conf->speed != SPEED_25000)) 255 + return sparx5_port_error(port, conf, SPX5_PERR_SPEED); 256 + break; 257 + default: 258 + return sparx5_port_error(port, conf, SPX5_PERR_IFTYPE); 259 + } 260 + return 0; 261 + } 262 + 263 + static bool sparx5_dev_change(struct sparx5 *sparx5, 264 + struct sparx5_port *port, 265 + struct sparx5_port_config *conf) 266 + { 267 + return sparx5_is_baser(port->conf.portmode) ^ 268 + sparx5_is_baser(conf->portmode); 269 + } 270 + 271 + static int sparx5_port_flush_poll(struct sparx5 *sparx5, u32 portno) 272 + { 273 + u32 value, resource, prio, delay_cnt = 0; 274 + bool poll_src = true; 275 + char *mem = ""; 276 + 277 + /* Resource == 0: Memory tracked per source (SRC-MEM) 278 + * Resource == 1: Frame references tracked per source (SRC-REF) 279 + * Resource == 2: Memory tracked per destination (DST-MEM) 280 + * Resource == 3: Frame references tracked per destination. (DST-REF) 281 + */ 282 + while (1) { 283 + bool empty = true; 284 + 285 + for (resource = 0; resource < (poll_src ? 2 : 1); resource++) { 286 + u32 base; 287 + 288 + base = (resource == 0 ? 2048 : 0) + SPX5_PRIOS * portno; 289 + for (prio = 0; prio < SPX5_PRIOS; prio++) { 290 + value = spx5_rd(sparx5, 291 + QRES_RES_STAT(base + prio)); 292 + if (value) { 293 + mem = resource == 0 ? 294 + "DST-MEM" : "SRC-MEM"; 295 + empty = false; 296 + } 297 + } 298 + } 299 + 300 + if (empty) 301 + break; 302 + 303 + if (delay_cnt++ == 2000) { 304 + dev_err(sparx5->dev, 305 + "Flush timeout port %u. %s queue not empty\n", 306 + portno, mem); 307 + return -EINVAL; 308 + } 309 + 310 + usleep_range(SPX5_WAIT_US, SPX5_WAIT_MAX_US); 311 + } 312 + return 0; 313 + } 314 + 315 + static int sparx5_port_disable(struct sparx5 *sparx5, struct sparx5_port *port, bool high_spd_dev) 316 + { 317 + u32 tinst = high_spd_dev ? 318 + sparx5_port_dev_index(port->portno) : port->portno; 319 + u32 dev = high_spd_dev ? 320 + sparx5_to_high_dev(port->portno) : TARGET_DEV2G5; 321 + void __iomem *devinst = spx5_inst_get(sparx5, dev, tinst); 322 + u32 spd = port->conf.speed; 323 + u32 spd_prm; 324 + int err; 325 + 326 + if (high_spd_dev) { 327 + /* 1: Reset the PCS Rx clock domain */ 328 + spx5_inst_rmw(DEV10G_DEV_RST_CTRL_PCS_RX_RST, 329 + DEV10G_DEV_RST_CTRL_PCS_RX_RST, 330 + devinst, 331 + DEV10G_DEV_RST_CTRL(0)); 332 + 333 + /* 2: Disable MAC frame reception */ 334 + spx5_inst_rmw(0, 335 + DEV10G_MAC_ENA_CFG_RX_ENA, 336 + devinst, 337 + DEV10G_MAC_ENA_CFG(0)); 338 + } else { 339 + /* 1: Reset the PCS Rx clock domain */ 340 + spx5_inst_rmw(DEV2G5_DEV_RST_CTRL_PCS_RX_RST, 341 + DEV2G5_DEV_RST_CTRL_PCS_RX_RST, 342 + devinst, 343 + DEV2G5_DEV_RST_CTRL(0)); 344 + /* 2: Disable MAC frame reception */ 345 + spx5_inst_rmw(0, 346 + DEV2G5_MAC_ENA_CFG_RX_ENA, 347 + devinst, 348 + DEV2G5_MAC_ENA_CFG(0)); 349 + } 350 + /* 3: Disable traffic being sent to or from switch port->portno */ 351 + spx5_rmw(0, 352 + QFWD_SWITCH_PORT_MODE_PORT_ENA, 353 + sparx5, 354 + QFWD_SWITCH_PORT_MODE(port->portno)); 355 + 356 + /* 4: Disable dequeuing from the egress queues */ 357 + spx5_rmw(HSCH_PORT_MODE_DEQUEUE_DIS, 358 + HSCH_PORT_MODE_DEQUEUE_DIS, 359 + sparx5, 360 + HSCH_PORT_MODE(port->portno)); 361 + 362 + /* 5: Disable Flowcontrol */ 363 + spx5_rmw(QSYS_PAUSE_CFG_PAUSE_STOP_SET(0xFFF - 1), 364 + QSYS_PAUSE_CFG_PAUSE_STOP, 365 + sparx5, 366 + QSYS_PAUSE_CFG(port->portno)); 367 + 368 + spd_prm = spd == SPEED_10 ? 1000 : spd == SPEED_100 ? 100 : 10; 369 + /* 6: Wait while the last frame is exiting the queues */ 370 + usleep_range(8 * spd_prm, 10 * spd_prm); 371 + 372 + /* 7: Flush the queues accociated with the port->portno */ 373 + spx5_rmw(HSCH_FLUSH_CTRL_FLUSH_PORT_SET(port->portno) | 374 + HSCH_FLUSH_CTRL_FLUSH_DST_SET(1) | 375 + HSCH_FLUSH_CTRL_FLUSH_SRC_SET(1) | 376 + HSCH_FLUSH_CTRL_FLUSH_ENA_SET(1), 377 + HSCH_FLUSH_CTRL_FLUSH_PORT | 378 + HSCH_FLUSH_CTRL_FLUSH_DST | 379 + HSCH_FLUSH_CTRL_FLUSH_SRC | 380 + HSCH_FLUSH_CTRL_FLUSH_ENA, 381 + sparx5, 382 + HSCH_FLUSH_CTRL); 383 + 384 + /* 8: Enable dequeuing from the egress queues */ 385 + spx5_rmw(0, 386 + HSCH_PORT_MODE_DEQUEUE_DIS, 387 + sparx5, 388 + HSCH_PORT_MODE(port->portno)); 389 + 390 + /* 9: Wait until flushing is complete */ 391 + err = sparx5_port_flush_poll(sparx5, port->portno); 392 + if (err) 393 + return err; 394 + 395 + /* 10: Reset the MAC clock domain */ 396 + if (high_spd_dev) { 397 + spx5_inst_rmw(DEV10G_DEV_RST_CTRL_PCS_TX_RST_SET(1) | 398 + DEV10G_DEV_RST_CTRL_MAC_RX_RST_SET(1) | 399 + DEV10G_DEV_RST_CTRL_MAC_TX_RST_SET(1), 400 + DEV10G_DEV_RST_CTRL_PCS_TX_RST | 401 + DEV10G_DEV_RST_CTRL_MAC_RX_RST | 402 + DEV10G_DEV_RST_CTRL_MAC_TX_RST, 403 + devinst, 404 + DEV10G_DEV_RST_CTRL(0)); 405 + 406 + } else { 407 + spx5_inst_rmw(DEV2G5_DEV_RST_CTRL_SPEED_SEL_SET(3) | 408 + DEV2G5_DEV_RST_CTRL_PCS_TX_RST_SET(1) | 409 + DEV2G5_DEV_RST_CTRL_PCS_RX_RST_SET(1) | 410 + DEV2G5_DEV_RST_CTRL_MAC_TX_RST_SET(1) | 411 + DEV2G5_DEV_RST_CTRL_MAC_RX_RST_SET(1), 412 + DEV2G5_DEV_RST_CTRL_SPEED_SEL | 413 + DEV2G5_DEV_RST_CTRL_PCS_TX_RST | 414 + DEV2G5_DEV_RST_CTRL_PCS_RX_RST | 415 + DEV2G5_DEV_RST_CTRL_MAC_TX_RST | 416 + DEV2G5_DEV_RST_CTRL_MAC_RX_RST, 417 + devinst, 418 + DEV2G5_DEV_RST_CTRL(0)); 419 + } 420 + /* 11: Clear flushing */ 421 + spx5_rmw(HSCH_FLUSH_CTRL_FLUSH_PORT_SET(port->portno) | 422 + HSCH_FLUSH_CTRL_FLUSH_ENA_SET(0), 423 + HSCH_FLUSH_CTRL_FLUSH_PORT | 424 + HSCH_FLUSH_CTRL_FLUSH_ENA, 425 + sparx5, 426 + HSCH_FLUSH_CTRL); 427 + 428 + if (high_spd_dev) { 429 + u32 pcs = sparx5_to_pcs_dev(port->portno); 430 + void __iomem *pcsinst = spx5_inst_get(sparx5, pcs, tinst); 431 + 432 + /* 12: Disable 5G/10G/25 BaseR PCS */ 433 + spx5_inst_rmw(PCS10G_BR_PCS_CFG_PCS_ENA_SET(0), 434 + PCS10G_BR_PCS_CFG_PCS_ENA, 435 + pcsinst, 436 + PCS10G_BR_PCS_CFG(0)); 437 + 438 + if (sparx5_port_is_25g(port->portno)) 439 + /* Disable 25G PCS */ 440 + spx5_rmw(DEV25G_PCS25G_CFG_PCS25G_ENA_SET(0), 441 + DEV25G_PCS25G_CFG_PCS25G_ENA, 442 + sparx5, 443 + DEV25G_PCS25G_CFG(tinst)); 444 + } else { 445 + /* 12: Disable 1G PCS */ 446 + spx5_rmw(DEV2G5_PCS1G_CFG_PCS_ENA_SET(0), 447 + DEV2G5_PCS1G_CFG_PCS_ENA, 448 + sparx5, 449 + DEV2G5_PCS1G_CFG(port->portno)); 450 + } 451 + 452 + /* The port is now flushed and disabled */ 453 + return 0; 454 + } 455 + 456 + static int sparx5_port_fifo_sz(struct sparx5 *sparx5, 457 + u32 portno, u32 speed) 458 + { 459 + u32 sys_clk = sparx5_clk_period(sparx5->coreclock); 460 + const u32 taxi_dist[SPX5_PORTS_ALL] = { 461 + 6, 8, 10, 6, 8, 10, 6, 8, 10, 6, 8, 10, 462 + 4, 4, 4, 4, 463 + 11, 12, 13, 14, 15, 16, 17, 18, 464 + 11, 12, 13, 14, 15, 16, 17, 18, 465 + 11, 12, 13, 14, 15, 16, 17, 18, 466 + 11, 12, 13, 14, 15, 16, 17, 18, 467 + 4, 6, 8, 4, 6, 8, 6, 8, 468 + 2, 2, 2, 2, 2, 2, 2, 4, 2 469 + }; 470 + u32 mac_per = 6400, tmp1, tmp2, tmp3; 471 + u32 fifo_width = 16; 472 + u32 mac_width = 8; 473 + u32 addition = 0; 474 + 475 + switch (speed) { 476 + case SPEED_25000: 477 + return 0; 478 + case SPEED_10000: 479 + mac_per = 6400; 480 + mac_width = 8; 481 + addition = 1; 482 + break; 483 + case SPEED_5000: 484 + mac_per = 12800; 485 + mac_width = 8; 486 + addition = 0; 487 + break; 488 + case SPEED_2500: 489 + mac_per = 3200; 490 + mac_width = 1; 491 + addition = 0; 492 + break; 493 + case SPEED_1000: 494 + mac_per = 8000; 495 + mac_width = 1; 496 + addition = 0; 497 + break; 498 + case SPEED_100: 499 + case SPEED_10: 500 + return 1; 501 + default: 502 + break; 503 + } 504 + 505 + tmp1 = 1000 * mac_width / fifo_width; 506 + tmp2 = 3000 + ((12000 + 2 * taxi_dist[portno] * 1000) 507 + * sys_clk / mac_per); 508 + tmp3 = tmp1 * tmp2 / 1000; 509 + return (tmp3 + 2000 + 999) / 1000 + addition; 510 + } 511 + 512 + /* Configure port muxing: 513 + * QSGMII: 4x2G5 devices 514 + */ 515 + static int sparx5_port_mux_set(struct sparx5 *sparx5, 516 + struct sparx5_port *port, 517 + struct sparx5_port_config *conf) 518 + { 519 + u32 portno = port->portno; 520 + u32 inst; 521 + 522 + if (port->conf.portmode == conf->portmode) 523 + return 0; /* Nothing to do */ 524 + 525 + switch (conf->portmode) { 526 + case PHY_INTERFACE_MODE_QSGMII: /* QSGMII: 4x2G5 devices. Mode Q' */ 527 + inst = (portno - portno % 4) / 4; 528 + spx5_rmw(BIT(inst), 529 + BIT(inst), 530 + sparx5, 531 + PORT_CONF_QSGMII_ENA); 532 + 533 + if ((portno / 4 % 2) == 0) { 534 + /* Affects d0-d3,d8-d11..d40-d43 */ 535 + spx5_rmw(PORT_CONF_USGMII_CFG_BYPASS_SCRAM_SET(1) | 536 + PORT_CONF_USGMII_CFG_BYPASS_DESCRAM_SET(1) | 537 + PORT_CONF_USGMII_CFG_QUAD_MODE_SET(1), 538 + PORT_CONF_USGMII_CFG_BYPASS_SCRAM | 539 + PORT_CONF_USGMII_CFG_BYPASS_DESCRAM | 540 + PORT_CONF_USGMII_CFG_QUAD_MODE, 541 + sparx5, 542 + PORT_CONF_USGMII_CFG((portno / 8))); 543 + } 544 + break; 545 + default: 546 + break; 547 + } 548 + return 0; 549 + } 550 + 551 + static int sparx5_port_max_tags_set(struct sparx5 *sparx5, 552 + struct sparx5_port *port) 553 + { 554 + enum sparx5_port_max_tags max_tags = port->max_vlan_tags; 555 + int tag_ct = max_tags == SPX5_PORT_MAX_TAGS_ONE ? 1 : 556 + max_tags == SPX5_PORT_MAX_TAGS_TWO ? 2 : 0; 557 + bool dtag = max_tags == SPX5_PORT_MAX_TAGS_TWO; 558 + enum sparx5_vlan_port_type vlan_type = port->vlan_type; 559 + bool dotag = max_tags != SPX5_PORT_MAX_TAGS_NONE; 560 + u32 dev = sparx5_to_high_dev(port->portno); 561 + u32 tinst = sparx5_port_dev_index(port->portno); 562 + void __iomem *inst = spx5_inst_get(sparx5, dev, tinst); 563 + u32 etype; 564 + 565 + etype = (vlan_type == SPX5_VLAN_PORT_TYPE_S_CUSTOM ? 566 + port->custom_etype : 567 + vlan_type == SPX5_VLAN_PORT_TYPE_C ? 568 + SPX5_ETYPE_TAG_C : SPX5_ETYPE_TAG_S); 569 + 570 + spx5_wr(DEV2G5_MAC_TAGS_CFG_TAG_ID_SET(etype) | 571 + DEV2G5_MAC_TAGS_CFG_PB_ENA_SET(dtag) | 572 + DEV2G5_MAC_TAGS_CFG_VLAN_AWR_ENA_SET(dotag) | 573 + DEV2G5_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA_SET(dotag), 574 + sparx5, 575 + DEV2G5_MAC_TAGS_CFG(port->portno)); 576 + 577 + if (sparx5_port_is_2g5(port->portno)) 578 + return 0; 579 + 580 + spx5_inst_rmw(DEV10G_MAC_TAGS_CFG_TAG_ID_SET(etype) | 581 + DEV10G_MAC_TAGS_CFG_TAG_ENA_SET(dotag), 582 + DEV10G_MAC_TAGS_CFG_TAG_ID | 583 + DEV10G_MAC_TAGS_CFG_TAG_ENA, 584 + inst, 585 + DEV10G_MAC_TAGS_CFG(0, 0)); 586 + 587 + spx5_inst_rmw(DEV10G_MAC_NUM_TAGS_CFG_NUM_TAGS_SET(tag_ct), 588 + DEV10G_MAC_NUM_TAGS_CFG_NUM_TAGS, 589 + inst, 590 + DEV10G_MAC_NUM_TAGS_CFG(0)); 591 + 592 + spx5_inst_rmw(DEV10G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK_SET(dotag), 593 + DEV10G_MAC_MAXLEN_CFG_MAX_LEN_TAG_CHK, 594 + inst, 595 + DEV10G_MAC_MAXLEN_CFG(0)); 596 + return 0; 597 + } 598 + 599 + static int sparx5_port_fwd_urg(struct sparx5 *sparx5, u32 speed) 600 + { 601 + u32 clk_period_ps = 1600; /* 625Mhz for now */ 602 + u32 urg = 672000; 603 + 604 + switch (speed) { 605 + case SPEED_10: 606 + case SPEED_100: 607 + case SPEED_1000: 608 + urg = 672000; 609 + break; 610 + case SPEED_2500: 611 + urg = 270000; 612 + break; 613 + case SPEED_5000: 614 + urg = 135000; 615 + break; 616 + case SPEED_10000: 617 + urg = 67200; 618 + break; 619 + case SPEED_25000: 620 + urg = 27000; 621 + break; 622 + } 623 + return urg / clk_period_ps - 1; 624 + } 625 + 626 + static u16 sparx5_wm_enc(u16 value) 627 + { 628 + if (value >= 2048) 629 + return 2048 + value / 16; 630 + 631 + return value; 632 + } 633 + 634 + static int sparx5_port_fc_setup(struct sparx5 *sparx5, 635 + struct sparx5_port *port, 636 + struct sparx5_port_config *conf) 637 + { 638 + bool fc_obey = conf->pause & MLO_PAUSE_RX ? 1 : 0; 639 + u32 pause_stop = 0xFFF - 1; /* FC gen disabled */ 640 + 641 + if (conf->pause & MLO_PAUSE_TX) 642 + pause_stop = sparx5_wm_enc(4 * (ETH_MAXLEN / 643 + SPX5_BUFFER_CELL_SZ)); 644 + 645 + /* Set HDX flowcontrol */ 646 + spx5_rmw(DSM_MAC_CFG_HDX_BACKPREASSURE_SET(conf->duplex == DUPLEX_HALF), 647 + DSM_MAC_CFG_HDX_BACKPREASSURE, 648 + sparx5, 649 + DSM_MAC_CFG(port->portno)); 650 + 651 + /* Obey flowcontrol */ 652 + spx5_rmw(DSM_RX_PAUSE_CFG_RX_PAUSE_EN_SET(fc_obey), 653 + DSM_RX_PAUSE_CFG_RX_PAUSE_EN, 654 + sparx5, 655 + DSM_RX_PAUSE_CFG(port->portno)); 656 + 657 + /* Disable forward pressure */ 658 + spx5_rmw(QSYS_FWD_PRESSURE_FWD_PRESSURE_DIS_SET(fc_obey), 659 + QSYS_FWD_PRESSURE_FWD_PRESSURE_DIS, 660 + sparx5, 661 + QSYS_FWD_PRESSURE(port->portno)); 662 + 663 + /* Generate pause frames */ 664 + spx5_rmw(QSYS_PAUSE_CFG_PAUSE_STOP_SET(pause_stop), 665 + QSYS_PAUSE_CFG_PAUSE_STOP, 666 + sparx5, 667 + QSYS_PAUSE_CFG(port->portno)); 668 + 669 + return 0; 670 + } 671 + 672 + static u16 sparx5_get_aneg_word(struct sparx5_port_config *conf) 673 + { 674 + if (conf->portmode == PHY_INTERFACE_MODE_1000BASEX) /* cl-37 aneg */ 675 + return (conf->pause_adv | ADVERTISE_LPACK | ADVERTISE_1000XFULL); 676 + else 677 + return 1; /* Enable SGMII Aneg */ 678 + } 679 + 680 + int sparx5_serdes_set(struct sparx5 *sparx5, 681 + struct sparx5_port *port, 682 + struct sparx5_port_config *conf) 683 + { 684 + int portmode, err, speed = conf->speed; 685 + 686 + if (conf->portmode == PHY_INTERFACE_MODE_QSGMII && 687 + ((port->portno % 4) != 0)) { 688 + return 0; 689 + } 690 + if (sparx5_is_baser(conf->portmode)) { 691 + if (conf->portmode == PHY_INTERFACE_MODE_25GBASER) 692 + speed = SPEED_25000; 693 + else if (conf->portmode == PHY_INTERFACE_MODE_10GBASER) 694 + speed = SPEED_10000; 695 + else 696 + speed = SPEED_5000; 697 + } 698 + 699 + err = phy_set_media(port->serdes, conf->media); 700 + if (err) 701 + return err; 702 + if (speed > 0) { 703 + err = phy_set_speed(port->serdes, speed); 704 + if (err) 705 + return err; 706 + } 707 + if (conf->serdes_reset) { 708 + err = phy_reset(port->serdes); 709 + if (err) 710 + return err; 711 + } 712 + 713 + /* Configure SerDes with port parameters 714 + * For BaseR, the serdes driver supports 10GGBASE-R and speed 5G/10G/25G 715 + */ 716 + portmode = conf->portmode; 717 + if (sparx5_is_baser(conf->portmode)) 718 + portmode = PHY_INTERFACE_MODE_10GBASER; 719 + err = phy_set_mode_ext(port->serdes, PHY_MODE_ETHERNET, portmode); 720 + if (err) 721 + return err; 722 + conf->serdes_reset = false; 723 + return err; 724 + } 725 + 726 + static int sparx5_port_pcs_low_set(struct sparx5 *sparx5, 727 + struct sparx5_port *port, 728 + struct sparx5_port_config *conf) 729 + { 730 + bool sgmii = false, inband_aneg = false; 731 + int err; 732 + 733 + if (port->conf.inband) { 734 + if (conf->portmode == PHY_INTERFACE_MODE_SGMII || 735 + conf->portmode == PHY_INTERFACE_MODE_QSGMII) 736 + inband_aneg = true; /* Cisco-SGMII in-band-aneg */ 737 + else if (conf->portmode == PHY_INTERFACE_MODE_1000BASEX && 738 + conf->autoneg) 739 + inband_aneg = true; /* Clause-37 in-band-aneg */ 740 + 741 + err = sparx5_serdes_set(sparx5, port, conf); 742 + if (err) 743 + return -EINVAL; 744 + } else { 745 + sgmii = true; /* Phy is connnected to the MAC */ 746 + } 747 + 748 + /* Choose SGMII or 1000BaseX/2500BaseX PCS mode */ 749 + spx5_rmw(DEV2G5_PCS1G_MODE_CFG_SGMII_MODE_ENA_SET(sgmii), 750 + DEV2G5_PCS1G_MODE_CFG_SGMII_MODE_ENA, 751 + sparx5, 752 + DEV2G5_PCS1G_MODE_CFG(port->portno)); 753 + 754 + /* Enable PCS */ 755 + spx5_wr(DEV2G5_PCS1G_CFG_PCS_ENA_SET(1), 756 + sparx5, 757 + DEV2G5_PCS1G_CFG(port->portno)); 758 + 759 + if (inband_aneg) { 760 + u16 abil = sparx5_get_aneg_word(conf); 761 + 762 + /* Enable in-band aneg */ 763 + spx5_wr(DEV2G5_PCS1G_ANEG_CFG_ADV_ABILITY_SET(abil) | 764 + DEV2G5_PCS1G_ANEG_CFG_SW_RESOLVE_ENA_SET(1) | 765 + DEV2G5_PCS1G_ANEG_CFG_ANEG_ENA_SET(1) | 766 + DEV2G5_PCS1G_ANEG_CFG_ANEG_RESTART_ONE_SHOT_SET(1), 767 + sparx5, 768 + DEV2G5_PCS1G_ANEG_CFG(port->portno)); 769 + } else { 770 + spx5_wr(0, sparx5, DEV2G5_PCS1G_ANEG_CFG(port->portno)); 771 + } 772 + 773 + /* Take PCS out of reset */ 774 + spx5_rmw(DEV2G5_DEV_RST_CTRL_SPEED_SEL_SET(2) | 775 + DEV2G5_DEV_RST_CTRL_PCS_TX_RST_SET(0) | 776 + DEV2G5_DEV_RST_CTRL_PCS_RX_RST_SET(0), 777 + DEV2G5_DEV_RST_CTRL_SPEED_SEL | 778 + DEV2G5_DEV_RST_CTRL_PCS_TX_RST | 779 + DEV2G5_DEV_RST_CTRL_PCS_RX_RST, 780 + sparx5, 781 + DEV2G5_DEV_RST_CTRL(port->portno)); 782 + 783 + return 0; 784 + } 785 + 786 + static int sparx5_port_pcs_high_set(struct sparx5 *sparx5, 787 + struct sparx5_port *port, 788 + struct sparx5_port_config *conf) 789 + { 790 + u32 clk_spd = conf->portmode == PHY_INTERFACE_MODE_5GBASER ? 1 : 0; 791 + u32 pix = sparx5_port_dev_index(port->portno); 792 + u32 dev = sparx5_to_high_dev(port->portno); 793 + u32 pcs = sparx5_to_pcs_dev(port->portno); 794 + void __iomem *devinst; 795 + void __iomem *pcsinst; 796 + int err; 797 + 798 + devinst = spx5_inst_get(sparx5, dev, pix); 799 + pcsinst = spx5_inst_get(sparx5, pcs, pix); 800 + 801 + /* SFI : No in-band-aneg. Speeds 5G/10G/25G */ 802 + err = sparx5_serdes_set(sparx5, port, conf); 803 + if (err) 804 + return -EINVAL; 805 + if (conf->portmode == PHY_INTERFACE_MODE_25GBASER) { 806 + /* Enable PCS for 25G device, speed 25G */ 807 + spx5_rmw(DEV25G_PCS25G_CFG_PCS25G_ENA_SET(1), 808 + DEV25G_PCS25G_CFG_PCS25G_ENA, 809 + sparx5, 810 + DEV25G_PCS25G_CFG(pix)); 811 + } else { 812 + /* Enable PCS for 5G/10G/25G devices, speed 5G/10G */ 813 + spx5_inst_rmw(PCS10G_BR_PCS_CFG_PCS_ENA_SET(1), 814 + PCS10G_BR_PCS_CFG_PCS_ENA, 815 + pcsinst, 816 + PCS10G_BR_PCS_CFG(0)); 817 + } 818 + 819 + /* Enable 5G/10G/25G MAC module */ 820 + spx5_inst_wr(DEV10G_MAC_ENA_CFG_RX_ENA_SET(1) | 821 + DEV10G_MAC_ENA_CFG_TX_ENA_SET(1), 822 + devinst, 823 + DEV10G_MAC_ENA_CFG(0)); 824 + 825 + /* Take the device out of reset */ 826 + spx5_inst_rmw(DEV10G_DEV_RST_CTRL_PCS_RX_RST_SET(0) | 827 + DEV10G_DEV_RST_CTRL_PCS_TX_RST_SET(0) | 828 + DEV10G_DEV_RST_CTRL_MAC_RX_RST_SET(0) | 829 + DEV10G_DEV_RST_CTRL_MAC_TX_RST_SET(0) | 830 + DEV10G_DEV_RST_CTRL_SPEED_SEL_SET(clk_spd), 831 + DEV10G_DEV_RST_CTRL_PCS_RX_RST | 832 + DEV10G_DEV_RST_CTRL_PCS_TX_RST | 833 + DEV10G_DEV_RST_CTRL_MAC_RX_RST | 834 + DEV10G_DEV_RST_CTRL_MAC_TX_RST | 835 + DEV10G_DEV_RST_CTRL_SPEED_SEL, 836 + devinst, 837 + DEV10G_DEV_RST_CTRL(0)); 838 + 839 + return 0; 840 + } 841 + 842 + /* Switch between 1G/2500 and 5G/10G/25G devices */ 843 + static void sparx5_dev_switch(struct sparx5 *sparx5, int port, bool hsd) 844 + { 845 + int bt_indx = BIT(sparx5_port_dev_index(port)); 846 + 847 + if (sparx5_port_is_5g(port)) { 848 + spx5_rmw(hsd ? 0 : bt_indx, 849 + bt_indx, 850 + sparx5, 851 + PORT_CONF_DEV5G_MODES); 852 + } else if (sparx5_port_is_10g(port)) { 853 + spx5_rmw(hsd ? 0 : bt_indx, 854 + bt_indx, 855 + sparx5, 856 + PORT_CONF_DEV10G_MODES); 857 + } else if (sparx5_port_is_25g(port)) { 858 + spx5_rmw(hsd ? 0 : bt_indx, 859 + bt_indx, 860 + sparx5, 861 + PORT_CONF_DEV25G_MODES); 862 + } 863 + } 864 + 865 + /* Configure speed/duplex dependent registers */ 866 + static int sparx5_port_config_low_set(struct sparx5 *sparx5, 867 + struct sparx5_port *port, 868 + struct sparx5_port_config *conf) 869 + { 870 + u32 clk_spd, gig_mode, tx_gap, hdx_gap_1, hdx_gap_2; 871 + bool fdx = conf->duplex == DUPLEX_FULL; 872 + int spd = conf->speed; 873 + 874 + clk_spd = spd == SPEED_10 ? 0 : spd == SPEED_100 ? 1 : 2; 875 + gig_mode = spd == SPEED_1000 || spd == SPEED_2500; 876 + tx_gap = spd == SPEED_1000 ? 4 : fdx ? 6 : 5; 877 + hdx_gap_1 = spd == SPEED_1000 ? 0 : spd == SPEED_100 ? 1 : 2; 878 + hdx_gap_2 = spd == SPEED_1000 ? 0 : spd == SPEED_100 ? 4 : 1; 879 + 880 + /* GIG/FDX mode */ 881 + spx5_rmw(DEV2G5_MAC_MODE_CFG_GIGA_MODE_ENA_SET(gig_mode) | 882 + DEV2G5_MAC_MODE_CFG_FDX_ENA_SET(fdx), 883 + DEV2G5_MAC_MODE_CFG_GIGA_MODE_ENA | 884 + DEV2G5_MAC_MODE_CFG_FDX_ENA, 885 + sparx5, 886 + DEV2G5_MAC_MODE_CFG(port->portno)); 887 + 888 + /* Set MAC IFG Gaps */ 889 + spx5_wr(DEV2G5_MAC_IFG_CFG_TX_IFG_SET(tx_gap) | 890 + DEV2G5_MAC_IFG_CFG_RX_IFG1_SET(hdx_gap_1) | 891 + DEV2G5_MAC_IFG_CFG_RX_IFG2_SET(hdx_gap_2), 892 + sparx5, 893 + DEV2G5_MAC_IFG_CFG(port->portno)); 894 + 895 + /* Disabling frame aging when in HDX (due to HDX issue) */ 896 + spx5_rmw(HSCH_PORT_MODE_AGE_DIS_SET(fdx == 0), 897 + HSCH_PORT_MODE_AGE_DIS, 898 + sparx5, 899 + HSCH_PORT_MODE(port->portno)); 900 + 901 + /* Enable MAC module */ 902 + spx5_wr(DEV2G5_MAC_ENA_CFG_RX_ENA | 903 + DEV2G5_MAC_ENA_CFG_TX_ENA, 904 + sparx5, 905 + DEV2G5_MAC_ENA_CFG(port->portno)); 906 + 907 + /* Select speed and take MAC out of reset */ 908 + spx5_rmw(DEV2G5_DEV_RST_CTRL_SPEED_SEL_SET(clk_spd) | 909 + DEV2G5_DEV_RST_CTRL_MAC_TX_RST_SET(0) | 910 + DEV2G5_DEV_RST_CTRL_MAC_RX_RST_SET(0), 911 + DEV2G5_DEV_RST_CTRL_SPEED_SEL | 912 + DEV2G5_DEV_RST_CTRL_MAC_TX_RST | 913 + DEV2G5_DEV_RST_CTRL_MAC_RX_RST, 914 + sparx5, 915 + DEV2G5_DEV_RST_CTRL(port->portno)); 916 + 917 + return 0; 918 + } 919 + 920 + int sparx5_port_pcs_set(struct sparx5 *sparx5, 921 + struct sparx5_port *port, 922 + struct sparx5_port_config *conf) 923 + 924 + { 925 + bool high_speed_dev = sparx5_is_baser(conf->portmode); 926 + int err; 927 + 928 + if (sparx5_dev_change(sparx5, port, conf)) { 929 + /* switch device */ 930 + sparx5_dev_switch(sparx5, port->portno, high_speed_dev); 931 + 932 + /* Disable the not-in-use device */ 933 + err = sparx5_port_disable(sparx5, port, !high_speed_dev); 934 + if (err) 935 + return err; 936 + } 937 + /* Disable the port before re-configuring */ 938 + err = sparx5_port_disable(sparx5, port, high_speed_dev); 939 + if (err) 940 + return -EINVAL; 941 + 942 + if (high_speed_dev) 943 + err = sparx5_port_pcs_high_set(sparx5, port, conf); 944 + else 945 + err = sparx5_port_pcs_low_set(sparx5, port, conf); 946 + 947 + if (err) 948 + return -EINVAL; 949 + 950 + if (port->conf.inband) { 951 + /* Enable/disable 1G counters in ASM */ 952 + spx5_rmw(ASM_PORT_CFG_CSC_STAT_DIS_SET(high_speed_dev), 953 + ASM_PORT_CFG_CSC_STAT_DIS, 954 + sparx5, 955 + ASM_PORT_CFG(port->portno)); 956 + 957 + /* Enable/disable 1G counters in DSM */ 958 + spx5_rmw(DSM_BUF_CFG_CSC_STAT_DIS_SET(high_speed_dev), 959 + DSM_BUF_CFG_CSC_STAT_DIS, 960 + sparx5, 961 + DSM_BUF_CFG(port->portno)); 962 + } 963 + 964 + port->conf = *conf; 965 + 966 + return 0; 967 + } 968 + 969 + int sparx5_port_config(struct sparx5 *sparx5, 970 + struct sparx5_port *port, 971 + struct sparx5_port_config *conf) 972 + { 973 + bool high_speed_dev = sparx5_is_baser(conf->portmode); 974 + int err, urgency, stop_wm; 975 + 976 + err = sparx5_port_verify_speed(sparx5, port, conf); 977 + if (err) 978 + return err; 979 + 980 + /* high speed device is already configured */ 981 + if (!high_speed_dev) 982 + sparx5_port_config_low_set(sparx5, port, conf); 983 + 984 + /* Configure flow control */ 985 + err = sparx5_port_fc_setup(sparx5, port, conf); 986 + if (err) 987 + return err; 988 + 989 + /* Set the DSM stop watermark */ 990 + stop_wm = sparx5_port_fifo_sz(sparx5, port->portno, conf->speed); 991 + spx5_rmw(DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM_SET(stop_wm), 992 + DSM_DEV_TX_STOP_WM_CFG_DEV_TX_STOP_WM, 993 + sparx5, 994 + DSM_DEV_TX_STOP_WM_CFG(port->portno)); 995 + 996 + /* Enable port in queue system */ 997 + urgency = sparx5_port_fwd_urg(sparx5, conf->speed); 998 + spx5_rmw(QFWD_SWITCH_PORT_MODE_PORT_ENA_SET(1) | 999 + QFWD_SWITCH_PORT_MODE_FWD_URGENCY_SET(urgency), 1000 + QFWD_SWITCH_PORT_MODE_PORT_ENA | 1001 + QFWD_SWITCH_PORT_MODE_FWD_URGENCY, 1002 + sparx5, 1003 + QFWD_SWITCH_PORT_MODE(port->portno)); 1004 + 1005 + /* Save the new values */ 1006 + port->conf = *conf; 1007 + 1008 + return 0; 1009 + } 1010 + 1011 + /* Initialize port config to default */ 1012 + int sparx5_port_init(struct sparx5 *sparx5, 1013 + struct sparx5_port *port, 1014 + struct sparx5_port_config *conf) 1015 + { 1016 + u32 pause_start = sparx5_wm_enc(6 * (ETH_MAXLEN / SPX5_BUFFER_CELL_SZ)); 1017 + u32 atop = sparx5_wm_enc(20 * (ETH_MAXLEN / SPX5_BUFFER_CELL_SZ)); 1018 + u32 devhigh = sparx5_to_high_dev(port->portno); 1019 + u32 pix = sparx5_port_dev_index(port->portno); 1020 + u32 pcs = sparx5_to_pcs_dev(port->portno); 1021 + bool sd_pol = port->signd_active_high; 1022 + bool sd_sel = !port->signd_internal; 1023 + bool sd_ena = port->signd_enable; 1024 + u32 pause_stop = 0xFFF - 1; /* FC generate disabled */ 1025 + void __iomem *devinst; 1026 + void __iomem *pcsinst; 1027 + int err; 1028 + 1029 + devinst = spx5_inst_get(sparx5, devhigh, pix); 1030 + pcsinst = spx5_inst_get(sparx5, pcs, pix); 1031 + 1032 + /* Set the mux port mode */ 1033 + err = sparx5_port_mux_set(sparx5, port, conf); 1034 + if (err) 1035 + return err; 1036 + 1037 + /* Configure MAC vlan awareness */ 1038 + err = sparx5_port_max_tags_set(sparx5, port); 1039 + if (err) 1040 + return err; 1041 + 1042 + /* Set Max Length */ 1043 + spx5_rmw(DEV2G5_MAC_MAXLEN_CFG_MAX_LEN_SET(ETH_MAXLEN), 1044 + DEV2G5_MAC_MAXLEN_CFG_MAX_LEN, 1045 + sparx5, 1046 + DEV2G5_MAC_MAXLEN_CFG(port->portno)); 1047 + 1048 + /* 1G/2G5: Signal Detect configuration */ 1049 + spx5_wr(DEV2G5_PCS1G_SD_CFG_SD_POL_SET(sd_pol) | 1050 + DEV2G5_PCS1G_SD_CFG_SD_SEL_SET(sd_sel) | 1051 + DEV2G5_PCS1G_SD_CFG_SD_ENA_SET(sd_ena), 1052 + sparx5, 1053 + DEV2G5_PCS1G_SD_CFG(port->portno)); 1054 + 1055 + /* Set Pause WM hysteresis */ 1056 + spx5_rmw(QSYS_PAUSE_CFG_PAUSE_START_SET(pause_start) | 1057 + QSYS_PAUSE_CFG_PAUSE_STOP_SET(pause_stop) | 1058 + QSYS_PAUSE_CFG_PAUSE_ENA_SET(1), 1059 + QSYS_PAUSE_CFG_PAUSE_START | 1060 + QSYS_PAUSE_CFG_PAUSE_STOP | 1061 + QSYS_PAUSE_CFG_PAUSE_ENA, 1062 + sparx5, 1063 + QSYS_PAUSE_CFG(port->portno)); 1064 + 1065 + /* Port ATOP. Frames are tail dropped when this WM is hit */ 1066 + spx5_wr(QSYS_ATOP_ATOP_SET(atop), 1067 + sparx5, 1068 + QSYS_ATOP(port->portno)); 1069 + 1070 + /* Discard pause frame 01-80-C2-00-00-01 */ 1071 + spx5_wr(PAUSE_DISCARD, sparx5, ANA_CL_CAPTURE_BPDU_CFG(port->portno)); 1072 + 1073 + if (conf->portmode == PHY_INTERFACE_MODE_QSGMII || 1074 + conf->portmode == PHY_INTERFACE_MODE_SGMII) { 1075 + err = sparx5_serdes_set(sparx5, port, conf); 1076 + if (err) 1077 + return err; 1078 + 1079 + if (!sparx5_port_is_2g5(port->portno)) 1080 + /* Enable shadow device */ 1081 + spx5_rmw(DSM_DEV_TX_STOP_WM_CFG_DEV10G_SHADOW_ENA_SET(1), 1082 + DSM_DEV_TX_STOP_WM_CFG_DEV10G_SHADOW_ENA, 1083 + sparx5, 1084 + DSM_DEV_TX_STOP_WM_CFG(port->portno)); 1085 + 1086 + sparx5_dev_switch(sparx5, port->portno, false); 1087 + } 1088 + if (conf->portmode == PHY_INTERFACE_MODE_QSGMII) { 1089 + // All ports must be PCS enabled in QSGMII mode 1090 + spx5_rmw(DEV2G5_DEV_RST_CTRL_PCS_TX_RST_SET(0), 1091 + DEV2G5_DEV_RST_CTRL_PCS_TX_RST, 1092 + sparx5, 1093 + DEV2G5_DEV_RST_CTRL(port->portno)); 1094 + } 1095 + /* Default IFGs for 1G */ 1096 + spx5_wr(DEV2G5_MAC_IFG_CFG_TX_IFG_SET(6) | 1097 + DEV2G5_MAC_IFG_CFG_RX_IFG1_SET(0) | 1098 + DEV2G5_MAC_IFG_CFG_RX_IFG2_SET(0), 1099 + sparx5, 1100 + DEV2G5_MAC_IFG_CFG(port->portno)); 1101 + 1102 + if (sparx5_port_is_2g5(port->portno)) 1103 + return 0; /* Low speed device only - return */ 1104 + 1105 + /* Now setup the high speed device */ 1106 + if (conf->portmode == PHY_INTERFACE_MODE_NA) 1107 + conf->portmode = PHY_INTERFACE_MODE_10GBASER; 1108 + 1109 + if (sparx5_is_baser(conf->portmode)) 1110 + sparx5_dev_switch(sparx5, port->portno, true); 1111 + 1112 + /* Set Max Length */ 1113 + spx5_inst_rmw(DEV10G_MAC_MAXLEN_CFG_MAX_LEN_SET(ETH_MAXLEN), 1114 + DEV10G_MAC_MAXLEN_CFG_MAX_LEN, 1115 + devinst, 1116 + DEV10G_MAC_ENA_CFG(0)); 1117 + 1118 + /* Handle Signal Detect in 10G PCS */ 1119 + spx5_inst_wr(PCS10G_BR_PCS_SD_CFG_SD_POL_SET(sd_pol) | 1120 + PCS10G_BR_PCS_SD_CFG_SD_SEL_SET(sd_sel) | 1121 + PCS10G_BR_PCS_SD_CFG_SD_ENA_SET(sd_ena), 1122 + pcsinst, 1123 + PCS10G_BR_PCS_SD_CFG(0)); 1124 + 1125 + if (sparx5_port_is_25g(port->portno)) { 1126 + /* Handle Signal Detect in 25G PCS */ 1127 + spx5_wr(DEV25G_PCS25G_SD_CFG_SD_POL_SET(sd_pol) | 1128 + DEV25G_PCS25G_SD_CFG_SD_SEL_SET(sd_sel) | 1129 + DEV25G_PCS25G_SD_CFG_SD_ENA_SET(sd_ena), 1130 + sparx5, 1131 + DEV25G_PCS25G_SD_CFG(pix)); 1132 + } 1133 + 1134 + return 0; 1135 + } 1136 + 1137 + void sparx5_port_enable(struct sparx5_port *port, bool enable) 1138 + { 1139 + struct sparx5 *sparx5 = port->sparx5; 1140 + 1141 + /* Enable port for frame transfer? */ 1142 + spx5_rmw(QFWD_SWITCH_PORT_MODE_PORT_ENA_SET(enable), 1143 + QFWD_SWITCH_PORT_MODE_PORT_ENA, 1144 + sparx5, 1145 + QFWD_SWITCH_PORT_MODE(port->portno)); 1146 + }
+93
drivers/net/ethernet/microchip/sparx5/sparx5_port.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #ifndef __SPARX5_PORT_H__ 8 + #define __SPARX5_PORT_H__ 9 + 10 + #include "sparx5_main.h" 11 + 12 + static inline bool sparx5_port_is_2g5(int portno) 13 + { 14 + return portno >= 16 && portno <= 47; 15 + } 16 + 17 + static inline bool sparx5_port_is_5g(int portno) 18 + { 19 + return portno <= 11 || portno == 64; 20 + } 21 + 22 + static inline bool sparx5_port_is_10g(int portno) 23 + { 24 + return (portno >= 12 && portno <= 15) || (portno >= 48 && portno <= 55); 25 + } 26 + 27 + static inline bool sparx5_port_is_25g(int portno) 28 + { 29 + return portno >= 56 && portno <= 63; 30 + } 31 + 32 + static inline u32 sparx5_to_high_dev(int port) 33 + { 34 + if (sparx5_port_is_5g(port)) 35 + return TARGET_DEV5G; 36 + if (sparx5_port_is_10g(port)) 37 + return TARGET_DEV10G; 38 + return TARGET_DEV25G; 39 + } 40 + 41 + static inline u32 sparx5_to_pcs_dev(int port) 42 + { 43 + if (sparx5_port_is_5g(port)) 44 + return TARGET_PCS5G_BR; 45 + if (sparx5_port_is_10g(port)) 46 + return TARGET_PCS10G_BR; 47 + return TARGET_PCS25G_BR; 48 + } 49 + 50 + static inline int sparx5_port_dev_index(int port) 51 + { 52 + if (sparx5_port_is_2g5(port)) 53 + return port; 54 + if (sparx5_port_is_5g(port)) 55 + return (port <= 11 ? port : 12); 56 + if (sparx5_port_is_10g(port)) 57 + return (port >= 12 && port <= 15) ? 58 + port - 12 : port - 44; 59 + return (port - 56); 60 + } 61 + 62 + int sparx5_port_init(struct sparx5 *sparx5, 63 + struct sparx5_port *spx5_port, 64 + struct sparx5_port_config *conf); 65 + 66 + int sparx5_port_config(struct sparx5 *sparx5, 67 + struct sparx5_port *spx5_port, 68 + struct sparx5_port_config *conf); 69 + 70 + int sparx5_port_pcs_set(struct sparx5 *sparx5, 71 + struct sparx5_port *port, 72 + struct sparx5_port_config *conf); 73 + 74 + int sparx5_serdes_set(struct sparx5 *sparx5, 75 + struct sparx5_port *spx5_port, 76 + struct sparx5_port_config *conf); 77 + 78 + struct sparx5_port_status { 79 + bool link; 80 + bool link_down; 81 + int speed; 82 + bool an_complete; 83 + int duplex; 84 + int pause; 85 + }; 86 + 87 + int sparx5_get_port_status(struct sparx5 *sparx5, 88 + struct sparx5_port *port, 89 + struct sparx5_port_status *status); 90 + 91 + void sparx5_port_enable(struct sparx5_port *port, bool enable); 92 + 93 + #endif /* __SPARX5_PORT_H__ */
+508
drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include <linux/if_bridge.h> 8 + #include <net/switchdev.h> 9 + 10 + #include "sparx5_main_regs.h" 11 + #include "sparx5_main.h" 12 + 13 + static struct workqueue_struct *sparx5_owq; 14 + 15 + struct sparx5_switchdev_event_work { 16 + struct work_struct work; 17 + struct switchdev_notifier_fdb_info fdb_info; 18 + struct net_device *dev; 19 + unsigned long event; 20 + }; 21 + 22 + static void sparx5_port_attr_bridge_flags(struct sparx5_port *port, 23 + struct switchdev_brport_flags flags) 24 + { 25 + if (flags.mask & BR_MCAST_FLOOD) 26 + sparx5_pgid_update_mask(port, PGID_MC_FLOOD, true); 27 + } 28 + 29 + static void sparx5_attr_stp_state_set(struct sparx5_port *port, 30 + u8 state) 31 + { 32 + struct sparx5 *sparx5 = port->sparx5; 33 + 34 + if (!test_bit(port->portno, sparx5->bridge_mask)) { 35 + netdev_err(port->ndev, 36 + "Controlling non-bridged port %d?\n", port->portno); 37 + return; 38 + } 39 + 40 + switch (state) { 41 + case BR_STATE_FORWARDING: 42 + set_bit(port->portno, sparx5->bridge_fwd_mask); 43 + fallthrough; 44 + case BR_STATE_LEARNING: 45 + set_bit(port->portno, sparx5->bridge_lrn_mask); 46 + break; 47 + 48 + default: 49 + /* All other states treated as blocking */ 50 + clear_bit(port->portno, sparx5->bridge_fwd_mask); 51 + clear_bit(port->portno, sparx5->bridge_lrn_mask); 52 + break; 53 + } 54 + 55 + /* apply the bridge_fwd_mask to all the ports */ 56 + sparx5_update_fwd(sparx5); 57 + } 58 + 59 + static void sparx5_port_attr_ageing_set(struct sparx5_port *port, 60 + unsigned long ageing_clock_t) 61 + { 62 + unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t); 63 + u32 ageing_time = jiffies_to_msecs(ageing_jiffies); 64 + 65 + sparx5_set_ageing(port->sparx5, ageing_time); 66 + } 67 + 68 + static int sparx5_port_attr_set(struct net_device *dev, 69 + const struct switchdev_attr *attr, 70 + struct netlink_ext_ack *extack) 71 + { 72 + struct sparx5_port *port = netdev_priv(dev); 73 + 74 + switch (attr->id) { 75 + case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: 76 + sparx5_port_attr_bridge_flags(port, attr->u.brport_flags); 77 + break; 78 + case SWITCHDEV_ATTR_ID_PORT_STP_STATE: 79 + sparx5_attr_stp_state_set(port, attr->u.stp_state); 80 + break; 81 + case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME: 82 + sparx5_port_attr_ageing_set(port, attr->u.ageing_time); 83 + break; 84 + case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING: 85 + port->vlan_aware = attr->u.vlan_filtering; 86 + sparx5_vlan_port_apply(port->sparx5, port); 87 + break; 88 + default: 89 + return -EOPNOTSUPP; 90 + } 91 + 92 + return 0; 93 + } 94 + 95 + static int sparx5_port_bridge_join(struct sparx5_port *port, 96 + struct net_device *bridge) 97 + { 98 + struct sparx5 *sparx5 = port->sparx5; 99 + 100 + if (bitmap_empty(sparx5->bridge_mask, SPX5_PORTS)) 101 + /* First bridged port */ 102 + sparx5->hw_bridge_dev = bridge; 103 + else 104 + if (sparx5->hw_bridge_dev != bridge) 105 + /* This is adding the port to a second bridge, this is 106 + * unsupported 107 + */ 108 + return -ENODEV; 109 + 110 + set_bit(port->portno, sparx5->bridge_mask); 111 + 112 + /* Port enters in bridge mode therefor don't need to copy to CPU 113 + * frames for multicast in case the bridge is not requesting them 114 + */ 115 + __dev_mc_unsync(port->ndev, sparx5_mc_unsync); 116 + 117 + return 0; 118 + } 119 + 120 + static void sparx5_port_bridge_leave(struct sparx5_port *port, 121 + struct net_device *bridge) 122 + { 123 + struct sparx5 *sparx5 = port->sparx5; 124 + 125 + clear_bit(port->portno, sparx5->bridge_mask); 126 + if (bitmap_empty(sparx5->bridge_mask, SPX5_PORTS)) 127 + sparx5->hw_bridge_dev = NULL; 128 + 129 + /* Clear bridge vlan settings before updating the port settings */ 130 + port->vlan_aware = 0; 131 + port->pvid = NULL_VID; 132 + port->vid = NULL_VID; 133 + 134 + /* Port enters in host more therefore restore mc list */ 135 + __dev_mc_sync(port->ndev, sparx5_mc_sync, sparx5_mc_unsync); 136 + } 137 + 138 + static int sparx5_port_changeupper(struct net_device *dev, 139 + struct netdev_notifier_changeupper_info *info) 140 + { 141 + struct sparx5_port *port = netdev_priv(dev); 142 + int err = 0; 143 + 144 + if (netif_is_bridge_master(info->upper_dev)) { 145 + if (info->linking) 146 + err = sparx5_port_bridge_join(port, info->upper_dev); 147 + else 148 + sparx5_port_bridge_leave(port, info->upper_dev); 149 + 150 + sparx5_vlan_port_apply(port->sparx5, port); 151 + } 152 + 153 + return err; 154 + } 155 + 156 + static int sparx5_port_add_addr(struct net_device *dev, bool up) 157 + { 158 + struct sparx5_port *port = netdev_priv(dev); 159 + struct sparx5 *sparx5 = port->sparx5; 160 + u16 vid = port->pvid; 161 + 162 + if (up) 163 + sparx5_mact_learn(sparx5, PGID_CPU, port->ndev->dev_addr, vid); 164 + else 165 + sparx5_mact_forget(sparx5, port->ndev->dev_addr, vid); 166 + 167 + return 0; 168 + } 169 + 170 + static int sparx5_netdevice_port_event(struct net_device *dev, 171 + struct notifier_block *nb, 172 + unsigned long event, void *ptr) 173 + { 174 + int err = 0; 175 + 176 + if (!sparx5_netdevice_check(dev)) 177 + return 0; 178 + 179 + switch (event) { 180 + case NETDEV_CHANGEUPPER: 181 + err = sparx5_port_changeupper(dev, ptr); 182 + break; 183 + case NETDEV_PRE_UP: 184 + err = sparx5_port_add_addr(dev, true); 185 + break; 186 + case NETDEV_DOWN: 187 + err = sparx5_port_add_addr(dev, false); 188 + break; 189 + } 190 + 191 + return err; 192 + } 193 + 194 + static int sparx5_netdevice_event(struct notifier_block *nb, 195 + unsigned long event, void *ptr) 196 + { 197 + struct net_device *dev = netdev_notifier_info_to_dev(ptr); 198 + int ret = 0; 199 + 200 + ret = sparx5_netdevice_port_event(dev, nb, event, ptr); 201 + 202 + return notifier_from_errno(ret); 203 + } 204 + 205 + static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work) 206 + { 207 + struct sparx5_switchdev_event_work *switchdev_work = 208 + container_of(work, struct sparx5_switchdev_event_work, work); 209 + struct net_device *dev = switchdev_work->dev; 210 + struct switchdev_notifier_fdb_info *fdb_info; 211 + struct sparx5_port *port; 212 + struct sparx5 *sparx5; 213 + 214 + rtnl_lock(); 215 + if (!sparx5_netdevice_check(dev)) 216 + goto out; 217 + 218 + port = netdev_priv(dev); 219 + sparx5 = port->sparx5; 220 + 221 + fdb_info = &switchdev_work->fdb_info; 222 + 223 + switch (switchdev_work->event) { 224 + case SWITCHDEV_FDB_ADD_TO_DEVICE: 225 + if (!fdb_info->added_by_user) 226 + break; 227 + sparx5_add_mact_entry(sparx5, port, fdb_info->addr, 228 + fdb_info->vid); 229 + break; 230 + case SWITCHDEV_FDB_DEL_TO_DEVICE: 231 + if (!fdb_info->added_by_user) 232 + break; 233 + sparx5_del_mact_entry(sparx5, fdb_info->addr, fdb_info->vid); 234 + break; 235 + } 236 + 237 + out: 238 + rtnl_unlock(); 239 + kfree(switchdev_work->fdb_info.addr); 240 + kfree(switchdev_work); 241 + dev_put(dev); 242 + } 243 + 244 + static void sparx5_schedule_work(struct work_struct *work) 245 + { 246 + queue_work(sparx5_owq, work); 247 + } 248 + 249 + static int sparx5_switchdev_event(struct notifier_block *unused, 250 + unsigned long event, void *ptr) 251 + { 252 + struct net_device *dev = switchdev_notifier_info_to_dev(ptr); 253 + struct sparx5_switchdev_event_work *switchdev_work; 254 + struct switchdev_notifier_fdb_info *fdb_info; 255 + struct switchdev_notifier_info *info = ptr; 256 + int err; 257 + 258 + switch (event) { 259 + case SWITCHDEV_PORT_ATTR_SET: 260 + err = switchdev_handle_port_attr_set(dev, ptr, 261 + sparx5_netdevice_check, 262 + sparx5_port_attr_set); 263 + return notifier_from_errno(err); 264 + case SWITCHDEV_FDB_ADD_TO_DEVICE: 265 + fallthrough; 266 + case SWITCHDEV_FDB_DEL_TO_DEVICE: 267 + switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); 268 + if (!switchdev_work) 269 + return NOTIFY_BAD; 270 + 271 + switchdev_work->dev = dev; 272 + switchdev_work->event = event; 273 + 274 + fdb_info = container_of(info, 275 + struct switchdev_notifier_fdb_info, 276 + info); 277 + INIT_WORK(&switchdev_work->work, 278 + sparx5_switchdev_bridge_fdb_event_work); 279 + memcpy(&switchdev_work->fdb_info, ptr, 280 + sizeof(switchdev_work->fdb_info)); 281 + switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC); 282 + if (!switchdev_work->fdb_info.addr) 283 + goto err_addr_alloc; 284 + 285 + ether_addr_copy((u8 *)switchdev_work->fdb_info.addr, 286 + fdb_info->addr); 287 + dev_hold(dev); 288 + 289 + sparx5_schedule_work(&switchdev_work->work); 290 + break; 291 + } 292 + 293 + return NOTIFY_DONE; 294 + err_addr_alloc: 295 + kfree(switchdev_work); 296 + return NOTIFY_BAD; 297 + } 298 + 299 + static void sparx5_sync_port_dev_addr(struct sparx5 *sparx5, 300 + struct sparx5_port *port, 301 + u16 vid, bool add) 302 + { 303 + if (!port || 304 + !test_bit(port->portno, sparx5->bridge_mask)) 305 + return; /* Skip null/host interfaces */ 306 + 307 + /* Bridge connects to vid? */ 308 + if (add) { 309 + /* Add port MAC address from the VLAN */ 310 + sparx5_mact_learn(sparx5, PGID_CPU, 311 + port->ndev->dev_addr, vid); 312 + } else { 313 + /* Control port addr visibility depending on 314 + * port VLAN connectivity. 315 + */ 316 + if (test_bit(port->portno, sparx5->vlan_mask[vid])) 317 + sparx5_mact_learn(sparx5, PGID_CPU, 318 + port->ndev->dev_addr, vid); 319 + else 320 + sparx5_mact_forget(sparx5, 321 + port->ndev->dev_addr, vid); 322 + } 323 + } 324 + 325 + static void sparx5_sync_bridge_dev_addr(struct net_device *dev, 326 + struct sparx5 *sparx5, 327 + u16 vid, bool add) 328 + { 329 + int i; 330 + 331 + /* First, handle bridge address'es */ 332 + if (add) { 333 + sparx5_mact_learn(sparx5, PGID_CPU, dev->dev_addr, 334 + vid); 335 + sparx5_mact_learn(sparx5, PGID_BCAST, dev->broadcast, 336 + vid); 337 + } else { 338 + sparx5_mact_forget(sparx5, dev->dev_addr, vid); 339 + sparx5_mact_forget(sparx5, dev->broadcast, vid); 340 + } 341 + 342 + /* Now look at bridged ports */ 343 + for (i = 0; i < SPX5_PORTS; i++) 344 + sparx5_sync_port_dev_addr(sparx5, sparx5->ports[i], vid, add); 345 + } 346 + 347 + static int sparx5_handle_port_vlan_add(struct net_device *dev, 348 + struct notifier_block *nb, 349 + const struct switchdev_obj_port_vlan *v) 350 + { 351 + struct sparx5_port *port = netdev_priv(dev); 352 + 353 + if (netif_is_bridge_master(dev)) { 354 + if (v->flags & BRIDGE_VLAN_INFO_BRENTRY) { 355 + struct sparx5 *sparx5 = 356 + container_of(nb, struct sparx5, 357 + switchdev_blocking_nb); 358 + 359 + sparx5_sync_bridge_dev_addr(dev, sparx5, v->vid, true); 360 + } 361 + return 0; 362 + } 363 + 364 + if (!sparx5_netdevice_check(dev)) 365 + return -EOPNOTSUPP; 366 + 367 + return sparx5_vlan_vid_add(port, v->vid, 368 + v->flags & BRIDGE_VLAN_INFO_PVID, 369 + v->flags & BRIDGE_VLAN_INFO_UNTAGGED); 370 + } 371 + 372 + static int sparx5_handle_port_obj_add(struct net_device *dev, 373 + struct notifier_block *nb, 374 + struct switchdev_notifier_port_obj_info *info) 375 + { 376 + const struct switchdev_obj *obj = info->obj; 377 + int err; 378 + 379 + switch (obj->id) { 380 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 381 + err = sparx5_handle_port_vlan_add(dev, nb, 382 + SWITCHDEV_OBJ_PORT_VLAN(obj)); 383 + break; 384 + default: 385 + err = -EOPNOTSUPP; 386 + break; 387 + } 388 + 389 + info->handled = true; 390 + return err; 391 + } 392 + 393 + static int sparx5_handle_port_vlan_del(struct net_device *dev, 394 + struct notifier_block *nb, 395 + u16 vid) 396 + { 397 + struct sparx5_port *port = netdev_priv(dev); 398 + int ret; 399 + 400 + /* Master bridge? */ 401 + if (netif_is_bridge_master(dev)) { 402 + struct sparx5 *sparx5 = 403 + container_of(nb, struct sparx5, 404 + switchdev_blocking_nb); 405 + 406 + sparx5_sync_bridge_dev_addr(dev, sparx5, vid, false); 407 + return 0; 408 + } 409 + 410 + if (!sparx5_netdevice_check(dev)) 411 + return -EOPNOTSUPP; 412 + 413 + ret = sparx5_vlan_vid_del(port, vid); 414 + if (ret) 415 + return ret; 416 + 417 + /* Delete the port MAC address with the matching VLAN information */ 418 + sparx5_mact_forget(port->sparx5, port->ndev->dev_addr, vid); 419 + 420 + return 0; 421 + } 422 + 423 + static int sparx5_handle_port_obj_del(struct net_device *dev, 424 + struct notifier_block *nb, 425 + struct switchdev_notifier_port_obj_info *info) 426 + { 427 + const struct switchdev_obj *obj = info->obj; 428 + int err; 429 + 430 + switch (obj->id) { 431 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 432 + err = sparx5_handle_port_vlan_del(dev, nb, 433 + SWITCHDEV_OBJ_PORT_VLAN(obj)->vid); 434 + break; 435 + default: 436 + err = -EOPNOTSUPP; 437 + break; 438 + } 439 + 440 + info->handled = true; 441 + return err; 442 + } 443 + 444 + static int sparx5_switchdev_blocking_event(struct notifier_block *nb, 445 + unsigned long event, 446 + void *ptr) 447 + { 448 + struct net_device *dev = switchdev_notifier_info_to_dev(ptr); 449 + int err; 450 + 451 + switch (event) { 452 + case SWITCHDEV_PORT_OBJ_ADD: 453 + err = sparx5_handle_port_obj_add(dev, nb, ptr); 454 + return notifier_from_errno(err); 455 + case SWITCHDEV_PORT_OBJ_DEL: 456 + err = sparx5_handle_port_obj_del(dev, nb, ptr); 457 + return notifier_from_errno(err); 458 + case SWITCHDEV_PORT_ATTR_SET: 459 + err = switchdev_handle_port_attr_set(dev, ptr, 460 + sparx5_netdevice_check, 461 + sparx5_port_attr_set); 462 + return notifier_from_errno(err); 463 + } 464 + 465 + return NOTIFY_DONE; 466 + } 467 + 468 + int sparx5_register_notifier_blocks(struct sparx5 *s5) 469 + { 470 + int err; 471 + 472 + s5->netdevice_nb.notifier_call = sparx5_netdevice_event; 473 + err = register_netdevice_notifier(&s5->netdevice_nb); 474 + if (err) 475 + return err; 476 + 477 + s5->switchdev_nb.notifier_call = sparx5_switchdev_event; 478 + err = register_switchdev_notifier(&s5->switchdev_nb); 479 + if (err) 480 + goto err_switchdev_nb; 481 + 482 + s5->switchdev_blocking_nb.notifier_call = sparx5_switchdev_blocking_event; 483 + err = register_switchdev_blocking_notifier(&s5->switchdev_blocking_nb); 484 + if (err) 485 + goto err_switchdev_blocking_nb; 486 + 487 + sparx5_owq = alloc_ordered_workqueue("sparx5_order", 0); 488 + if (!sparx5_owq) 489 + goto err_switchdev_blocking_nb; 490 + 491 + return 0; 492 + 493 + err_switchdev_blocking_nb: 494 + unregister_switchdev_notifier(&s5->switchdev_nb); 495 + err_switchdev_nb: 496 + unregister_netdevice_notifier(&s5->netdevice_nb); 497 + 498 + return err; 499 + } 500 + 501 + void sparx5_unregister_notifier_blocks(struct sparx5 *s5) 502 + { 503 + destroy_workqueue(sparx5_owq); 504 + 505 + unregister_switchdev_blocking_notifier(&s5->switchdev_blocking_nb); 506 + unregister_switchdev_notifier(&s5->switchdev_nb); 507 + unregister_netdevice_notifier(&s5->netdevice_nb); 508 + }
+224
drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip Sparx5 Switch driver 3 + * 4 + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include "sparx5_main_regs.h" 8 + #include "sparx5_main.h" 9 + 10 + static int sparx5_vlant_set_mask(struct sparx5 *sparx5, u16 vid) 11 + { 12 + u32 mask[3]; 13 + 14 + /* Divide up mask in 32 bit words */ 15 + bitmap_to_arr32(mask, sparx5->vlan_mask[vid], SPX5_PORTS); 16 + 17 + /* Output mask to respective registers */ 18 + spx5_wr(mask[0], sparx5, ANA_L3_VLAN_MASK_CFG(vid)); 19 + spx5_wr(mask[1], sparx5, ANA_L3_VLAN_MASK_CFG1(vid)); 20 + spx5_wr(mask[2], sparx5, ANA_L3_VLAN_MASK_CFG2(vid)); 21 + 22 + return 0; 23 + } 24 + 25 + void sparx5_vlan_init(struct sparx5 *sparx5) 26 + { 27 + u16 vid; 28 + 29 + spx5_rmw(ANA_L3_VLAN_CTRL_VLAN_ENA_SET(1), 30 + ANA_L3_VLAN_CTRL_VLAN_ENA, 31 + sparx5, 32 + ANA_L3_VLAN_CTRL); 33 + 34 + /* Map VLAN = FID */ 35 + for (vid = NULL_VID; vid < VLAN_N_VID; vid++) 36 + spx5_rmw(ANA_L3_VLAN_CFG_VLAN_FID_SET(vid), 37 + ANA_L3_VLAN_CFG_VLAN_FID, 38 + sparx5, 39 + ANA_L3_VLAN_CFG(vid)); 40 + } 41 + 42 + void sparx5_vlan_port_setup(struct sparx5 *sparx5, int portno) 43 + { 44 + struct sparx5_port *port = sparx5->ports[portno]; 45 + 46 + /* Configure PVID */ 47 + spx5_rmw(ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA_SET(0) | 48 + ANA_CL_VLAN_CTRL_PORT_VID_SET(port->pvid), 49 + ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA | 50 + ANA_CL_VLAN_CTRL_PORT_VID, 51 + sparx5, 52 + ANA_CL_VLAN_CTRL(port->portno)); 53 + } 54 + 55 + int sparx5_vlan_vid_add(struct sparx5_port *port, u16 vid, bool pvid, 56 + bool untagged) 57 + { 58 + struct sparx5 *sparx5 = port->sparx5; 59 + int ret; 60 + 61 + /* Make the port a member of the VLAN */ 62 + set_bit(port->portno, sparx5->vlan_mask[vid]); 63 + ret = sparx5_vlant_set_mask(sparx5, vid); 64 + if (ret) 65 + return ret; 66 + 67 + /* Default ingress vlan classification */ 68 + if (pvid) 69 + port->pvid = vid; 70 + 71 + /* Untagged egress vlan classification */ 72 + if (untagged && port->vid != vid) { 73 + if (port->vid) { 74 + netdev_err(port->ndev, 75 + "Port already has a native VLAN: %d\n", 76 + port->vid); 77 + return -EBUSY; 78 + } 79 + port->vid = vid; 80 + } 81 + 82 + sparx5_vlan_port_apply(sparx5, port); 83 + 84 + return 0; 85 + } 86 + 87 + int sparx5_vlan_vid_del(struct sparx5_port *port, u16 vid) 88 + { 89 + struct sparx5 *sparx5 = port->sparx5; 90 + int ret; 91 + 92 + /* 8021q removes VID 0 on module unload for all interfaces 93 + * with VLAN filtering feature. We need to keep it to receive 94 + * untagged traffic. 95 + */ 96 + if (vid == 0) 97 + return 0; 98 + 99 + /* Stop the port from being a member of the vlan */ 100 + clear_bit(port->portno, sparx5->vlan_mask[vid]); 101 + ret = sparx5_vlant_set_mask(sparx5, vid); 102 + if (ret) 103 + return ret; 104 + 105 + /* Ingress */ 106 + if (port->pvid == vid) 107 + port->pvid = 0; 108 + 109 + /* Egress */ 110 + if (port->vid == vid) 111 + port->vid = 0; 112 + 113 + sparx5_vlan_port_apply(sparx5, port); 114 + 115 + return 0; 116 + } 117 + 118 + void sparx5_pgid_update_mask(struct sparx5_port *port, int pgid, bool enable) 119 + { 120 + struct sparx5 *sparx5 = port->sparx5; 121 + u32 val, mask; 122 + 123 + /* mask is spread across 3 registers x 32 bit */ 124 + if (port->portno < 32) { 125 + mask = BIT(port->portno); 126 + val = enable ? mask : 0; 127 + spx5_rmw(val, mask, sparx5, ANA_AC_PGID_CFG(pgid)); 128 + } else if (port->portno < 64) { 129 + mask = BIT(port->portno - 32); 130 + val = enable ? mask : 0; 131 + spx5_rmw(val, mask, sparx5, ANA_AC_PGID_CFG1(pgid)); 132 + } else if (port->portno < SPX5_PORTS) { 133 + mask = BIT(port->portno - 64); 134 + val = enable ? mask : 0; 135 + spx5_rmw(val, mask, sparx5, ANA_AC_PGID_CFG2(pgid)); 136 + } else { 137 + netdev_err(port->ndev, "Invalid port no: %d\n", port->portno); 138 + } 139 + } 140 + 141 + void sparx5_update_fwd(struct sparx5 *sparx5) 142 + { 143 + DECLARE_BITMAP(workmask, SPX5_PORTS); 144 + u32 mask[3]; 145 + int port; 146 + 147 + /* Divide up fwd mask in 32 bit words */ 148 + bitmap_to_arr32(mask, sparx5->bridge_fwd_mask, SPX5_PORTS); 149 + 150 + /* Update flood masks */ 151 + for (port = PGID_UC_FLOOD; port <= PGID_BCAST; port++) { 152 + spx5_wr(mask[0], sparx5, ANA_AC_PGID_CFG(port)); 153 + spx5_wr(mask[1], sparx5, ANA_AC_PGID_CFG1(port)); 154 + spx5_wr(mask[2], sparx5, ANA_AC_PGID_CFG2(port)); 155 + } 156 + 157 + /* Update SRC masks */ 158 + for (port = 0; port < SPX5_PORTS; port++) { 159 + if (test_bit(port, sparx5->bridge_fwd_mask)) { 160 + /* Allow to send to all bridged but self */ 161 + bitmap_copy(workmask, sparx5->bridge_fwd_mask, SPX5_PORTS); 162 + clear_bit(port, workmask); 163 + bitmap_to_arr32(mask, workmask, SPX5_PORTS); 164 + spx5_wr(mask[0], sparx5, ANA_AC_SRC_CFG(port)); 165 + spx5_wr(mask[1], sparx5, ANA_AC_SRC_CFG1(port)); 166 + spx5_wr(mask[2], sparx5, ANA_AC_SRC_CFG2(port)); 167 + } else { 168 + spx5_wr(0, sparx5, ANA_AC_SRC_CFG(port)); 169 + spx5_wr(0, sparx5, ANA_AC_SRC_CFG1(port)); 170 + spx5_wr(0, sparx5, ANA_AC_SRC_CFG2(port)); 171 + } 172 + } 173 + 174 + /* Learning enabled only for bridged ports */ 175 + bitmap_and(workmask, sparx5->bridge_fwd_mask, 176 + sparx5->bridge_lrn_mask, SPX5_PORTS); 177 + bitmap_to_arr32(mask, workmask, SPX5_PORTS); 178 + 179 + /* Apply learning mask */ 180 + spx5_wr(mask[0], sparx5, ANA_L2_AUTO_LRN_CFG); 181 + spx5_wr(mask[1], sparx5, ANA_L2_AUTO_LRN_CFG1); 182 + spx5_wr(mask[2], sparx5, ANA_L2_AUTO_LRN_CFG2); 183 + } 184 + 185 + void sparx5_vlan_port_apply(struct sparx5 *sparx5, 186 + struct sparx5_port *port) 187 + 188 + { 189 + u32 val; 190 + 191 + /* Configure PVID, vlan aware */ 192 + val = ANA_CL_VLAN_CTRL_VLAN_AWARE_ENA_SET(port->vlan_aware) | 193 + ANA_CL_VLAN_CTRL_VLAN_POP_CNT_SET(port->vlan_aware) | 194 + ANA_CL_VLAN_CTRL_PORT_VID_SET(port->pvid); 195 + spx5_wr(val, sparx5, ANA_CL_VLAN_CTRL(port->portno)); 196 + 197 + val = 0; 198 + if (port->vlan_aware && !port->pvid) 199 + /* If port is vlan-aware and tagged, drop untagged and 200 + * priority tagged frames. 201 + */ 202 + val = ANA_CL_VLAN_FILTER_CTRL_TAG_REQUIRED_ENA_SET(1) | 203 + ANA_CL_VLAN_FILTER_CTRL_PRIO_CTAG_DIS_SET(1) | 204 + ANA_CL_VLAN_FILTER_CTRL_PRIO_STAG_DIS_SET(1); 205 + spx5_wr(val, sparx5, 206 + ANA_CL_VLAN_FILTER_CTRL(port->portno, 0)); 207 + 208 + /* Egress configuration (REW_TAG_CFG): VLAN tag type to 8021Q */ 209 + val = REW_TAG_CTRL_TAG_TPID_CFG_SET(0); 210 + if (port->vlan_aware) { 211 + if (port->vid) 212 + /* Tag all frames except when VID == DEFAULT_VLAN */ 213 + val |= REW_TAG_CTRL_TAG_CFG_SET(1); 214 + else 215 + val |= REW_TAG_CTRL_TAG_CFG_SET(3); 216 + } 217 + spx5_wr(val, sparx5, REW_TAG_CTRL(port->portno)); 218 + 219 + /* Egress VID */ 220 + spx5_rmw(REW_PORT_VLAN_CFG_PORT_VID_SET(port->vid), 221 + REW_PORT_VLAN_CFG_PORT_VID, 222 + sparx5, 223 + REW_PORT_VLAN_CFG(port->portno)); 224 + }