Merge https://source.denx.de/u-boot/custodians/u-boot-sh
authorTom Rini <trini@konsulko.com>
Mon, 26 Apr 2021 15:04:24 +0000 (11:04 -0400)
committerTom Rini <trini@konsulko.com>
Mon, 26 Apr 2021 15:04:24 +0000 (11:04 -0400)
- RCar3 improvements

155 files changed:
arch/arm/dts/sun50i-a64-bananapi-m64.dts
arch/arm/dts/sun50i-a64-nanopi-a64.dts
arch/arm/dts/sun50i-a64-orangepi-win.dts
arch/arm/dts/sun50i-a64-pine64-lts.dts
arch/arm/dts/sun50i-a64-pine64-plus.dts
arch/arm/dts/sun50i-a64-pine64.dts
arch/arm/dts/sun50i-a64-pinebook.dts
arch/arm/dts/sun50i-a64-pinephone-1.0.dts
arch/arm/dts/sun50i-a64-pinephone-1.1.dts
arch/arm/dts/sun50i-a64-pinephone-1.2.dts
arch/arm/dts/sun50i-a64-pinephone.dtsi
arch/arm/dts/sun50i-a64-pinetab-early-adopter.dts [new file with mode: 0644]
arch/arm/dts/sun50i-a64-pinetab.dts
arch/arm/dts/sun50i-a64-sopine-baseboard.dts
arch/arm/dts/sun50i-a64-sopine.dtsi
arch/arm/dts/sun50i-a64-teres-i.dts
arch/arm/dts/sun50i-a64.dtsi
arch/arm/dts/sun8i-r40-bananapi-m2-ultra.dts
arch/arm/dts/sun8i-r40.dtsi
arch/arm/dts/sun8i-v40-bananapi-m2-berry.dts
arch/mips/dts/Makefile
arch/mips/dts/mrvl,cn73xx.dtsi
arch/mips/dts/mrvl,octeon-ebb7304.dts
arch/mips/dts/mrvl,octeon-nic23.dts [new file with mode: 0644]
arch/mips/include/asm/global_data.h
arch/mips/mach-octeon/Kconfig
arch/mips/mach-octeon/Makefile
arch/mips/mach-octeon/bootoctlinux.c
arch/mips/mach-octeon/cpu.c
arch/mips/mach-octeon/cvmx-bootmem.c
arch/mips/mach-octeon/cvmx-coremask.c
arch/mips/mach-octeon/cvmx-helper-cfg.c [new file with mode: 0644]
arch/mips/mach-octeon/cvmx-helper-fdt.c [new file with mode: 0644]
arch/mips/mach-octeon/cvmx-helper-jtag.c [new file with mode: 0644]
arch/mips/mach-octeon/cvmx-helper-util.c [new file with mode: 0644]
arch/mips/mach-octeon/cvmx-helper.c [new file with mode: 0644]
arch/mips/mach-octeon/cvmx-pcie.c [new file with mode: 0644]
arch/mips/mach-octeon/cvmx-qlm.c [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-address.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-agl-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-asxx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-bgxx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-ciu-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-cmd-queue.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-coremask.h
arch/mips/mach-octeon/include/mach/cvmx-csr-enums.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-csr.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-dbg-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-dpi-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-dtx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-error.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-fpa-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-fpa.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-fpa1.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-fpa3.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-global-resources.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-gmx.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-gmxx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-gserx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-agl.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-bgx.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-board.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-cfg.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-errata.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-fdt.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-fpa.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-gpio.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-ilk.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-ipd.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-jtag.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-loop.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-npi.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-pki.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-pko.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-pko3.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-rgmii.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-sfp.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-sgmii.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-spi.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-srio.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-util.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper-xaui.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-helper.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-hwfau.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-hwpko.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-ilk.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-ipd-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-ipd.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-l2c-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-lmcx-defs.h [moved from arch/mips/mach-octeon/include/mach/cvmx/cvmx-lmcx-defs.h with 100% similarity]
arch/mips/mach-octeon/include/mach/cvmx-mio-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-npi-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-packet.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pcie.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pcieepx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pciercx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pcsx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pemx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pexp-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pip-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pip.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pki-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pki-resources.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pki.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pko-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pko-internal-ports-range.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pko3-queue.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pow-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-pow.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-qlm.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-regs.h
arch/mips/mach-octeon/include/mach/cvmx-rst-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-sata-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-scratch.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-sli-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-smix-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-sriomaintx-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-sriox-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-sso-defs.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/cvmx-wqe.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/octeon-feature.h
arch/mips/mach-octeon/include/mach/octeon-model.h
arch/mips/mach-octeon/include/mach/octeon_ddr.h
arch/mips/mach-octeon/include/mach/octeon_eth.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/octeon_fdt.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/octeon_pci.h [new file with mode: 0644]
arch/mips/mach-octeon/include/mach/octeon_qlm.h [new file with mode: 0644]
arch/mips/mach-octeon/octeon_fdt.c [new file with mode: 0644]
arch/mips/mach-octeon/octeon_qlm.c [new file with mode: 0644]
board/Marvell/octeon_ebb7304/board.c
board/Marvell/octeon_nic23/Kconfig [new file with mode: 0644]
board/Marvell/octeon_nic23/MAINTAINERS [new file with mode: 0644]
board/Marvell/octeon_nic23/Makefile [new file with mode: 0644]
board/Marvell/octeon_nic23/board.c [new file with mode: 0644]
board/Marvell/octeon_nic23/board_ddr.h [new file with mode: 0644]
configs/octeon_ebb7304_defconfig
configs/octeon_nic23_defconfig [new file with mode: 0644]
drivers/ata/Kconfig
drivers/ata/ahci.c
drivers/ata/ahci_mvebu.c
drivers/net/sun8i_emac.c
drivers/pci/Kconfig
drivers/pci/Makefile
drivers/pci/pcie_octeon.c [new file with mode: 0644]
drivers/ram/octeon/octeon3_lmc.c
drivers/ram/octeon/octeon_ddr.c
drivers/scsi/scsi.c
drivers/serial/Kconfig
drivers/serial/Makefile
drivers/serial/serial_octeon_bootcmd.c [new file with mode: 0644]
drivers/serial/serial_octeon_pcie_console.c [new file with mode: 0644]
include/configs/octeon_nic23.h [new file with mode: 0644]
include/dt-bindings/clock/sun8i-r40-ccu.h
include/dt-bindings/interrupt-controller/arm-gic.h
include/dt-bindings/thermal/thermal.h

index 883f217..f7fe9fa 100644 (file)
        leds {
                compatible = "gpio-leds";
 
-               pwr-led {
+               led-0 {
                        label = "bananapi-m64:red:pwr";
                        gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
                        default-state = "on";
                };
 
-               green {
+               led-1 {
                        label = "bananapi-m64:green:user";
                        gpios = <&pio 4 14 GPIO_ACTIVE_HIGH>; /* PE14 */
                };
 
-               blue {
+               led-2 {
                        label = "bananapi-m64:blue:user";
                        gpios = <&pio 4 15 GPIO_ACTIVE_HIGH>; /* PE15 */
                };
 &emac {
        pinctrl-names = "default";
        pinctrl-0 = <&rgmii_pins>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-handle = <&ext_rgmii_phy>;
        phy-supply = <&reg_dc1sw>;
        status = "okay";
                                    "Microphone", "Microphone Jack",
                                    "Microphone", "Onboard Microphone";
        simple-audio-card,routing =
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "Headphone Jack", "HP",
                        "MIC2", "Microphone Jack",
                        "Onboard Microphone", "MBIAS",
index e58db8a..09b3c7f 100644 (file)
@@ -35,7 +35,7 @@
        leds {
                compatible = "gpio-leds";
 
-               blue {
+               led {
                        label = "nanopi-a64:blue:status";
                        gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */
                };
index fde9c7a..70e3174 100644 (file)
 &emac {
        pinctrl-names = "default";
        pinctrl-0 = <&rgmii_pins>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-handle = <&ext_rgmii_phy>;
        phy-supply = <&reg_gmac_3v3>;
        status = "okay";
                                    "Microphone", "Microphone Jack",
                                    "Microphone", "Onboard Microphone";
        simple-audio-card,routing =
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "Headphone Jack", "HP",
                        "MIC2", "Microphone Jack",
                        "Onboard Microphone", "MBIAS",
index 302e24b..596a259 100644 (file)
@@ -1,10 +1,25 @@
 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 // Copyright (c) 2018 ARM Ltd.
 
+#include <dt-bindings/leds/common.h>
 #include "sun50i-a64-sopine-baseboard.dts"
 
 / {
        model = "Pine64 LTS";
        compatible = "pine64,pine64-lts", "allwinner,sun50i-r18",
                     "allwinner,sun50i-a64";
+
+       leds {
+               compatible = "gpio-leds";
+
+               led {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_BLUE>;
+                       gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */
+               };
+       };
+};
+
+&mmc0 {
+       broken-cd;              /* card detect is broken on *some* boards */
 };
index b26181c..b54099b 100644 (file)
@@ -13,7 +13,7 @@
 &emac {
        pinctrl-names = "default";
        pinctrl-0 = <&rgmii_pins>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-txid";
        phy-handle = <&ext_rgmii_phy>;
        status = "okay";
 };
index 2165f23..329cf27 100644 (file)
        simple-audio-card,widgets = "Microphone", "Microphone Jack",
                                    "Headphone", "Headphone Jack";
        simple-audio-card,routing =
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
                        "Headphone Jack", "HP",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "MIC2", "Microphone Jack";
        status = "okay";
 };
index 64b1c54..7ae1654 100644 (file)
 };
 
 &ehci0 {
-       phys = <&usbphy 0>;
-       phy-names = "usb";
        status = "okay";
 };
 
        pinctrl-0 = <&mmc2_pins>, <&mmc2_ds_pin>;
        vmmc-supply = <&reg_dcdc1>;
        vqmmc-supply = <&reg_eldo1>;
+       max-frequency = <200000000>;
        bus-width = <8>;
        non-removable;
        cap-mmc-hw-reset;
 };
 
 &ohci0 {
-       phys = <&usbphy 0>;
-       phy-names = "usb";
        status = "okay";
 };
 
                                    "Headphone", "Headphone Jack",
                                    "Speaker", "Internal Speaker";
        simple-audio-card,routing =
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
                        "Speaker Amp INL", "LINEOUT",
                        "Speaker Amp INR", "LINEOUT",
                        "Internal Speaker", "Speaker Amp OUTL",
                        "Internal Speaker", "Speaker Amp OUTR",
                        "Headphone Jack", "HP",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "Internal Microphone Left", "MBIAS",
                        "MIC1", "Internal Microphone Left",
                        "Internal Microphone Right", "HBIAS",
index 0c42272..fb65319 100644 (file)
@@ -7,5 +7,10 @@
 
 / {
        model = "Pine64 PinePhone Developer Batch (1.0)";
-       compatible = "pine64,pinephone-1.0", "allwinner,sun50i-a64";
+       compatible = "pine64,pinephone-1.0", "pine64,pinephone", "allwinner,sun50i-a64";
+};
+
+&sgm3140 {
+       enable-gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>; /* PC3 */
+       flash-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
 };
index 3e99a87..5e59d37 100644 (file)
@@ -7,7 +7,7 @@
 
 / {
        model = "Pine64 PinePhone Braveheart (1.1)";
-       compatible = "pine64,pinephone-1.1", "allwinner,sun50i-a64";
+       compatible = "pine64,pinephone-1.1", "pine64,pinephone", "allwinner,sun50i-a64";
 };
 
 &backlight {
@@ -28,3 +28,8 @@
        num-interpolated-steps = <50>;
        default-brightness-level = <400>;
 };
+
+&sgm3140 {
+       enable-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
+       flash-gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>; /* PC3 */
+};
index a9f5b67..4e7e237 100644 (file)
@@ -7,7 +7,12 @@
 
 / {
        model = "Pine64 PinePhone (1.2)";
-       compatible = "pine64,pinephone-1.2", "allwinner,sun50i-a64";
+       compatible = "pine64,pinephone-1.2", "pine64,pinephone", "allwinner,sun50i-a64";
+
+       wifi_pwrseq: wifi-pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
+       };
 };
 
 &backlight {
        interrupt-parent = <&pio>;
        interrupts = <1 1 IRQ_TYPE_EDGE_RISING>; /* PB1 */
 };
+
+&mmc1 {
+       mmc-pwrseq = <&wifi_pwrseq>;
+};
+
+&sgm3140 {
+       enable-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
+       flash-gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>; /* PC3 */
+};
index 25150ab..9f69d48 100644 (file)
@@ -13,6 +13,7 @@
 
 / {
        aliases {
+               ethernet0 = &rtl8723cs;
                serial0 = &uart0;
        };
 
@@ -20,6 +21,7 @@
                compatible = "pwm-backlight";
                pwms = <&r_pwm 0 50000 PWM_POLARITY_INVERTED>;
                enable-gpios = <&pio 7 10 GPIO_ACTIVE_HIGH>; /* PH10 */
+               power-supply = <&reg_ps>;
                /* Backlight configuration differs per PinePhone revision. */
        };
 
        leds {
                compatible = "gpio-leds";
 
-               blue {
+               led-0 {
                        function = LED_FUNCTION_INDICATOR;
                        color = <LED_COLOR_ID_BLUE>;
                        gpios = <&pio 3 20 GPIO_ACTIVE_HIGH>; /* PD20 */
                };
 
-               green {
+               led-1 {
                        function = LED_FUNCTION_INDICATOR;
                        color = <LED_COLOR_ID_GREEN>;
                        gpios = <&pio 3 18 GPIO_ACTIVE_HIGH>; /* PD18 */
                };
 
-               red {
+               led-2 {
                        function = LED_FUNCTION_INDICATOR;
                        color = <LED_COLOR_ID_RED>;
                        gpios = <&pio 3 19 GPIO_ACTIVE_HIGH>; /* PD19 */
                };
        };
 
+       reg_ps: ps-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "ps";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-boot-on;
+       };
+
+       reg_vbat_wifi: vbat-wifi {
+               compatible = "regulator-fixed";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-name = "vbat-wifi";
+       };
+
+       sgm3140: led-controller {
+               compatible = "sgmicro,sgm3140";
+               vin-supply = <&reg_dcdc1>;
+
+               sgm3140_flash: led {
+                       function = LED_FUNCTION_FLASH;
+                       color = <LED_COLOR_ID_WHITE>;
+                       flash-max-timeout-us = <250000>;
+               };
+       };
+
        speaker_amp: audio-amplifier {
                compatible = "simple-audio-amplifier";
                enable-gpios = <&pio 2 7 GPIO_ACTIVE_HIGH>; /* PC7 */
        status = "okay";
 
        /* Magnetometer */
-       lis3mdl: lis3mdl@1e {
+       lis3mdl: magnetometer@1e {
                compatible = "st,lis3mdl-magn";
                reg = <0x1e>;
                vdd-supply = <&reg_dldo1>;
                vddio-supply = <&reg_dldo1>;
        };
 
+       /* Light/proximity sensor */
+       light-sensor@48 {
+               compatible = "sensortek,stk3311";
+               reg = <0x48>;
+               interrupt-parent = <&pio>;
+               interrupts = <1 0 IRQ_TYPE_EDGE_FALLING>; /* PB0 */
+       };
+
        /* Accelerometer/gyroscope */
-       mpu6050@68 {
+       accelerometer@68 {
                compatible = "invensense,mpu6050";
                reg = <0x68>;
                interrupt-parent = <&pio>;
 
 &lradc {
        vref-supply = <&reg_aldo3>;
+       wakeup-source;
        status = "okay";
 
        button-200 {
        status = "okay";
 };
 
+&mmc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins>;
+       vmmc-supply = <&reg_vbat_wifi>;
+       vqmmc-supply = <&reg_dldo4>;
+       bus-width = <4>;
+       non-removable;
+       status = "okay";
+
+       rtl8723cs: wifi@1 {
+               reg = <1>;
+       };
+};
+
 &mmc2 {
        pinctrl-names = "default";
        pinctrl-0 = <&mmc2_pins>;
 
 #include "axp803.dtsi"
 
-&ac_power_supply {
-       status = "okay";
-};
-
 &battery_power_supply {
        status = "okay";
 };
 
 &reg_aldo3 {
        regulator-always-on;
-       regulator-min-microvolt = <2700000>;
-       regulator-max-microvolt = <3300000>;
+       regulator-min-microvolt = <3000000>;
+       regulator-max-microvolt = <3000000>;
        regulator-name = "vcc-pll-avcc";
 };
 
                        "Internal Speaker", "Speaker Amp OUTR",
                        "Speaker Amp INL", "LINEOUT",
                        "Speaker Amp INR", "LINEOUT",
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "Internal Microphone", "MBIAS",
                        "MIC1", "Internal Microphone",
                        "Headset Microphone", "HBIAS",
        status = "okay";
 };
 
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
+       status = "okay";
+
+       bluetooth {
+               compatible = "realtek,rtl8723cs-bt";
+               device-wake-gpios = <&pio 7 6 GPIO_ACTIVE_LOW>; /* PH6 */
+               enable-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
+               host-wake-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */
+       };
+};
+
 /* Connected to the modem (hardware flow control can't be used) */
 &uart3 {
        pinctrl-names = "default";
diff --git a/arch/arm/dts/sun50i-a64-pinetab-early-adopter.dts b/arch/arm/dts/sun50i-a64-pinetab-early-adopter.dts
new file mode 100644 (file)
index 0000000..6265360
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (C) 2020 Icenowy Zheng <icenowy@aosc.io>
+ *
+ */
+
+/dts-v1/;
+
+#include "sun50i-a64-pinetab.dts"
+
+/ {
+       model = "PineTab, Early Adopter's version";
+       compatible = "pine64,pinetab-early-adopter", "allwinner,sun50i-a64";
+};
+
+&dsi {
+       /delete-node/ panel@0;
+
+       panel@0 {
+               compatible = "feixin,k101-im2byl02", "ilitek,ili9881c";
+               reg = <0>;
+               power-supply = <&reg_dc1sw>;
+               reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */
+               backlight = <&backlight>;
+       };
+};
index dc4ab6b..422a850 100644 (file)
@@ -14,7 +14,7 @@
 #include <dt-bindings/pwm/pwm.h>
 
 / {
-       model = "PineTab";
+       model = "PineTab, Development Sample";
        compatible = "pine64,pinetab", "allwinner,sun50i-a64";
 
        aliases {
        status = "okay";
 
        port {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
                csi_ep: endpoint {
                        remote-endpoint = <&ov5640_ep>;
                        bus-width = <8>;
                                    "Headphone", "Headphone Jack",
                                    "Speaker", "Internal Speaker";
        simple-audio-card,routing =
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
                        "Speaker Amp INL", "LINEOUT",
                        "Speaker Amp INR", "LINEOUT",
                        "Internal Speaker", "Speaker Amp OUTL",
                        "Internal Speaker", "Speaker Amp OUTR",
                        "Headphone Jack", "HP",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "Internal Microphone Left", "MBIAS",
                        "MIC1", "Internal Microphone Left",
                        "Internal Microphone Right", "HBIAS",
index 2f6ea9f..e22b94c 100644 (file)
@@ -79,7 +79,7 @@
 &emac {
        pinctrl-names = "default";
        pinctrl-0 = <&rgmii_pins>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-handle = <&ext_rgmii_phy>;
        phy-supply = <&reg_dc1sw>;
        status = "okay";
        bus-width = <8>;
        non-removable;
        cap-mmc-hw-reset;
+       mmc-hs200-1_8v;
        status = "okay";
 };
 
        simple-audio-card,widgets = "Microphone", "Microphone Jack",
                                    "Headphone", "Headphone Jack";
        simple-audio-card,routing =
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
                        "Headphone Jack", "HP",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "MIC2", "Microphone Jack";
        status = "okay";
 };
index c48692b..df62044 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&mmc0_pins>;
        vmmc-supply = <&reg_dcdc1>;
-       non-removable;
        disable-wp;
        bus-width = <4>;
-       cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
+       cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 push-pull switch */
        status = "okay";
 };
 
index f5df5f7..f0a16f3 100644 (file)
        leds {
                compatible = "gpio-leds";
 
-               capslock {
+               led-0 {
                        label = "teres-i:green:capslock";
                        gpios = <&pio 2 7 GPIO_ACTIVE_HIGH>; /* PC7 */
                };
 
-               numlock {
+               led-1 {
                        label = "teres-i:green:numlock";
                        gpios = <&pio 2 4 GPIO_ACTIVE_HIGH>; /* PC4 */
                };
                                    "Microphone", "Internal Microphone",
                                    "Speaker", "Internal Speaker";
        simple-audio-card,routing =
-                       "Left DAC", "AIF1 Slot 0 Left",
-                       "Right DAC", "AIF1 Slot 0 Right",
-                       "AIF1 Slot 0 Left ADC", "Left ADC",
-                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "Left DAC", "DACL",
+                       "Right DAC", "DACR",
+                       "ADCL", "Left ADC",
+                       "ADCR", "Right ADC",
                        "Headphone Jack", "HP",
                        "Speaker Amp INL", "LINEOUT",
                        "Speaker Amp INR", "LINEOUT",
index 8dfbcd1..57786fc 100644 (file)
@@ -51,7 +51,7 @@
                        reg = <0>;
                        enable-method = "psci";
                        next-level-cache = <&L2>;
-                       clocks = <&ccu 21>;
+                       clocks = <&ccu CLK_CPUX>;
                        clock-names = "cpu";
                        #cooling-cells = <2>;
                };
@@ -62,7 +62,7 @@
                        reg = <1>;
                        enable-method = "psci";
                        next-level-cache = <&L2>;
-                       clocks = <&ccu 21>;
+                       clocks = <&ccu CLK_CPUX>;
                        clock-names = "cpu";
                        #cooling-cells = <2>;
                };
@@ -73,7 +73,7 @@
                        reg = <2>;
                        enable-method = "psci";
                        next-level-cache = <&L2>;
-                       clocks = <&ccu 21>;
+                       clocks = <&ccu CLK_CPUX>;
                        clock-names = "cpu";
                        #cooling-cells = <2>;
                };
@@ -84,7 +84,7 @@
                        reg = <3>;
                        enable-method = "psci";
                        next-level-cache = <&L2>;
-                       clocks = <&ccu 21>;
+                       clocks = <&ccu CLK_CPUX>;
                        clock-names = "cpu";
                        #cooling-cells = <2>;
                };
                simple-audio-card,mclk-fs = <128>;
                simple-audio-card,aux-devs = <&codec_analog>;
                simple-audio-card,routing =
-                               "Left DAC", "AIF1 Slot 0 Left",
-                               "Right DAC", "AIF1 Slot 0 Right",
-                               "AIF1 Slot 0 Left ADC", "Left ADC",
-                               "AIF1 Slot 0 Right ADC", "Right ADC";
+                               "Left DAC", "DACL",
+                               "Right DAC", "DACR",
+                               "ADCL", "Left ADC",
+                               "ADCR", "Right ADC";
                status = "disabled";
 
                cpudai: simple-audio-card,cpu {
        timer {
                compatible = "arm,armv8-timer";
                allwinner,erratum-unknown1;
+               arm,no-tick-in-suspend;
                interrupts = <GIC_PPI 13
                        (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
                             <GIC_PPI 14
                        resets = <&ccu RST_BUS_MMC2>;
                        reset-names = "ahb";
                        interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
-                       max-frequency = <200000000>;
+                       max-frequency = <150000000>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                                 <&ccu CLK_USB_OHCI0>;
                        resets = <&ccu RST_BUS_OHCI0>,
                                 <&ccu RST_BUS_EHCI0>;
+                       phys = <&usbphy 0>;
+                       phy-names = "usb";
                        status = "disabled";
                };
 
                        clocks = <&ccu CLK_BUS_OHCI0>,
                                 <&ccu CLK_USB_OHCI0>;
                        resets = <&ccu RST_BUS_OHCI0>;
+                       phys = <&usbphy 0>;
+                       phy-names = "usb";
                        status = "disabled";
                };
 
                        status = "disabled";
                };
 
+               i2s2: i2s@1c22800 {
+                       #sound-dai-cells = <0>;
+                       compatible = "allwinner,sun50i-a64-i2s",
+                                    "allwinner,sun8i-h3-i2s";
+                       reg = <0x01c22800 0x400>;
+                       interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_I2S2>, <&ccu CLK_I2S2>;
+                       clock-names = "apb", "mod";
+                       resets = <&ccu RST_BUS_I2S2>;
+                       dma-names = "rx", "tx";
+                       dmas = <&dma 27>, <&dma 27>;
+                       status = "disabled";
+               };
+
                dai: dai@1c22c00 {
                        #sound-dai-cells = <0>;
                        compatible = "allwinner,sun50i-a64-codec-i2s";
 
                codec: codec@1c22e00 {
                        #sound-dai-cells = <0>;
-                       compatible = "allwinner,sun8i-a33-codec";
+                       compatible = "allwinner,sun50i-a64-codec",
+                                    "allwinner,sun8i-a33-codec";
                        reg = <0x01c22e00 0x600>;
                        interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_CODEC>, <&ccu CLK_AC_DIG>;
index c488aaa..a6a1087 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&gmac_rgmii_pins>;
        phy-handle = <&phy1>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-supply = <&reg_dc1sw>;
        status = "okay";
 };
 
 #include "axp22x.dtsi"
 
+&ir0 {
+       status = "okay";
+};
+
 &mmc0 {
        vmmc-supply = <&reg_dcdc1>;
        bus-width = <4>;
 &pio {
        pinctrl-names = "default";
        pinctrl-0 = <&clk_out_a_pin>;
+       vcc-pa-supply = <&reg_aldo2>;
+       vcc-pc-supply = <&reg_dcdc1>;
+       vcc-pd-supply = <&reg_dcdc1>;
+       vcc-pe-supply = <&reg_eldo1>;
+       vcc-pf-supply = <&reg_dcdc1>;
+       vcc-pg-supply = <&reg_dldo1>;
 };
 
 &reg_aldo2 {
-       regulator-always-on;
        regulator-min-microvolt = <2500000>;
        regulator-max-microvolt = <2500000>;
        regulator-name = "vcc-pa";
 };
 
 &reg_dc1sw {
-       regulator-min-microvolt = <3000000>;
-       regulator-max-microvolt = <3000000>;
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
        regulator-name = "vcc-gmac-phy";
 };
 
 &reg_dcdc1 {
        regulator-always-on;
-       regulator-min-microvolt = <3000000>;
-       regulator-max-microvolt = <3000000>;
-       regulator-name = "vcc-3v0";
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-3v3";
 };
 
 &reg_dcdc2 {
index 06b6858..d5ad3b9 100644 (file)
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/clock/sun8i-de2.h>
 #include <dt-bindings/clock/sun8i-r40-ccu.h>
+#include <dt-bindings/clock/sun8i-tcon-top.h>
 #include <dt-bindings/reset/sun8i-r40-ccu.h>
 #include <dt-bindings/reset/sun8i-de2.h>
+#include <dt-bindings/thermal/thermal.h>
 
 / {
        #address-cells = <1>;
                #address-cells = <1>;
                #size-cells = <0>;
 
-               cpu@0 {
+               cpu0: cpu@0 {
                        compatible = "arm,cortex-a7";
                        device_type = "cpu";
                        reg = <0>;
                };
 
-               cpu@1 {
+               cpu1: cpu@1 {
                        compatible = "arm,cortex-a7";
                        device_type = "cpu";
                        reg = <1>;
                };
 
-               cpu@2 {
+               cpu2: cpu@2 {
                        compatible = "arm,cortex-a7";
                        device_type = "cpu";
                        reg = <2>;
                };
 
-               cpu@3 {
+               cpu3: cpu@3 {
                        compatible = "arm,cortex-a7";
                        device_type = "cpu";
                        reg = <3>;
                status = "disabled";
        };
 
+       thermal-zones {
+               cpu_thermal: cpu0-thermal {
+                       /* milliseconds */
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&ths 0>;
+               };
+
+               gpu_thermal: gpu-thermal {
+                       /* milliseconds */
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&ths 1>;
+               };
+       };
+
        soc {
                compatible = "simple-bus";
                #address-cells = <1>;
                display_clocks: clock@1000000 {
                        compatible = "allwinner,sun8i-r40-de2-clk",
                                     "allwinner,sun8i-h3-de2-clk";
-                       reg = <0x01000000 0x100000>;
-                       clocks = <&ccu CLK_DE>,
-                                <&ccu CLK_BUS_DE>;
-                       clock-names = "mod",
-                                     "bus";
+                       reg = <0x01000000 0x10000>;
+                       clocks = <&ccu CLK_BUS_DE>,
+                                <&ccu CLK_DE>;
+                       clock-names = "bus",
+                                     "mod";
                        resets = <&ccu RST_BUS_DE>;
                        #clock-cells = <1>;
                        #reset-cells = <1>;
                        };
                };
 
+               deinterlace: deinterlace@1400000 {
+                       compatible = "allwinner,sun8i-r40-deinterlace",
+                                    "allwinner,sun8i-h3-deinterlace";
+                       reg = <0x01400000 0x20000>;
+                       clocks = <&ccu CLK_BUS_DEINTERLACE>,
+                                <&ccu CLK_DEINTERLACE>,
+                                /*
+                                 * NOTE: Contrary to what datasheet claims,
+                                 * DRAM deinterlace gate doesn't exist and
+                                 * it's shared with CSI1.
+                                 */
+                                <&ccu CLK_DRAM_CSI1>;
+                       clock-names = "bus", "mod", "ram";
+                       resets = <&ccu RST_BUS_DEINTERLACE>;
+                       interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
+                       interconnects = <&mbus 9>;
+                       interconnect-names = "dma-mem";
+               };
+
+               syscon: system-control@1c00000 {
+                       compatible = "allwinner,sun8i-r40-system-control",
+                                    "allwinner,sun4i-a10-system-control";
+                       reg = <0x01c00000 0x30>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       sram_c: sram@1d00000 {
+                               compatible = "mmio-sram";
+                               reg = <0x01d00000 0xd0000>;
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0x01d00000 0xd0000>;
+
+                               ve_sram: sram-section@0 {
+                                       compatible = "allwinner,sun8i-r40-sram-c1",
+                                                    "allwinner,sun4i-a10-sram-c1";
+                                       reg = <0x000000 0x80000>;
+                               };
+                       };
+               };
+
                nmi_intc: interrupt-controller@1c00030 {
                        compatible = "allwinner,sun7i-a20-sc-nmi";
                        interrupt-controller;
                        interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
                };
 
+               dma: dma-controller@1c02000 {
+                       compatible = "allwinner,sun8i-r40-dma",
+                                    "allwinner,sun50i-a64-dma";
+                       reg = <0x01c02000 0x1000>;
+                       interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_DMA>;
+                       dma-channels = <16>;
+                       dma-requests = <31>;
+                       resets = <&ccu RST_BUS_DMA>;
+                       #dma-cells = <1>;
+               };
+
+               spi0: spi@1c05000 {
+                       compatible = "allwinner,sun8i-r40-spi",
+                                    "allwinner,sun8i-h3-spi";
+                       reg = <0x01c05000 0x1000>;
+                       interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>;
+                       clock-names = "ahb", "mod";
+                       resets = <&ccu RST_BUS_SPI0>;
+                       status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               spi1: spi@1c06000 {
+                       compatible = "allwinner,sun8i-r40-spi",
+                                    "allwinner,sun8i-h3-spi";
+                       reg = <0x01c06000 0x1000>;
+                       interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_SPI1>, <&ccu CLK_SPI1>;
+                       clock-names = "ahb", "mod";
+                       resets = <&ccu RST_BUS_SPI1>;
+                       status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               csi0: csi@1c09000 {
+                       compatible = "allwinner,sun8i-r40-csi0",
+                                    "allwinner,sun7i-a20-csi0";
+                       reg = <0x01c09000 0x1000>;
+                       interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_CSI0>, <&ccu CLK_CSI_SCLK>,
+                                <&ccu CLK_DRAM_CSI0>;
+                       clock-names = "bus", "isp", "ram";
+                       resets = <&ccu RST_BUS_CSI0>;
+                       interconnects = <&mbus 5>;
+                       interconnect-names = "dma-mem";
+                       status = "disabled";
+               };
+
+               video-codec@1c0e000 {
+                       compatible = "allwinner,sun8i-r40-video-engine";
+                       reg = <0x01c0e000 0x1000>;
+                       clocks = <&ccu CLK_BUS_VE>, <&ccu CLK_VE>,
+                       <&ccu CLK_DRAM_VE>;
+                       clock-names = "ahb", "mod", "ram";
+                       resets = <&ccu RST_BUS_VE>;
+                       interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+                       allwinner,sram = <&ve_sram 1>;
+               };
+
                mmc0: mmc@1c0f000 {
                        compatible = "allwinner,sun8i-r40-mmc",
                                     "allwinner,sun50i-a64-mmc";
                        #phy-cells = <1>;
                };
 
+               crypto: crypto@1c15000 {
+                       compatible = "allwinner,sun8i-r40-crypto";
+                       reg = <0x01c15000 0x1000>;
+                       interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_CE>, <&ccu CLK_CE>;
+                       clock-names = "bus", "mod";
+                       resets = <&ccu RST_BUS_CE>;
+               };
+
+               spi2: spi@1c17000 {
+                       compatible = "allwinner,sun8i-r40-spi",
+                                    "allwinner,sun8i-h3-spi";
+                       reg = <0x01c17000 0x1000>;
+                       interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_SPI2>, <&ccu CLK_SPI2>;
+                       clock-names = "ahb", "mod";
+                       resets = <&ccu RST_BUS_SPI2>;
+                       status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               ahci: sata@1c18000 {
+                       compatible = "allwinner,sun8i-r40-ahci";
+                       reg = <0x01c18000 0x1000>;
+                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_SATA>, <&ccu CLK_SATA>;
+                       resets = <&ccu RST_BUS_SATA>;
+                       reset-names = "ahci";
+                       status = "disabled";
+               };
+
                ehci1: usb@1c19000 {
                        compatible = "allwinner,sun8i-r40-ehci", "generic-ehci";
                        reg = <0x01c19000 0x100>;
                        status = "disabled";
                };
 
+               spi3: spi@1c1f000 {
+                       compatible = "allwinner,sun8i-r40-spi",
+                                    "allwinner,sun8i-h3-spi";
+                       reg = <0x01c1f000 0x1000>;
+                       interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_SPI3>, <&ccu CLK_SPI3>;
+                       clock-names = "ahb", "mod";
+                       resets = <&ccu RST_BUS_SPI3>;
+                       status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
                ccu: clock@1c20000 {
                        compatible = "allwinner,sun8i-r40-ccu";
                        reg = <0x01c20000 0x400>;
                };
 
                rtc: rtc@1c20400 {
-                       compatible = "allwinner,sun8i-r40-rtc",
-                                    "allwinner,sun8i-h3-rtc";
+                       compatible = "allwinner,sun8i-r40-rtc";
                        reg = <0x01c20400 0x400>;
                        interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
                        clock-output-names = "osc32k", "osc32k-out";
                                function = "clk_out_a";
                        };
 
+                       /omit-if-no-ref/
+                       csi0_8bits_pins: csi0-8bits-pins {
+                               pins = "PE0", "PE2", "PE3", "PE4", "PE5",
+                                      "PE6", "PE7", "PE8", "PE9", "PE10",
+                                      "PE11";
+                               function = "csi0";
+                       };
+
+                       /omit-if-no-ref/
+                       csi0_mclk_pin: csi0-mclk-pin {
+                               pins = "PE1";
+                               function = "csi0";
+                       };
+
                        gmac_rgmii_pins: gmac-rgmii-pins {
                                pins = "PA0", "PA1", "PA2", "PA3",
                                       "PA4", "PA5", "PA6", "PA7",
                                function = "i2c0";
                        };
 
+                       i2c1_pins: i2c1-pins {
+                               pins = "PB18", "PB19";
+                               function = "i2c1";
+                       };
+
+                       i2c2_pins: i2c2-pins {
+                               pins = "PB20", "PB21";
+                               function = "i2c2";
+                       };
+
+                       i2c3_pins: i2c3-pins {
+                               pins = "PI0", "PI1";
+                               function = "i2c3";
+                       };
+
+                       i2c4_pins: i2c4-pins {
+                               pins = "PI2", "PI3";
+                               function = "i2c4";
+                       };
+
+                       ir0_pins: ir0-pins {
+                               pins = "PB4";
+                               function = "ir0";
+                       };
+
+                       ir1_pins: ir1-pins {
+                               pins = "PB23";
+                               function = "ir1";
+                       };
+
                        mmc0_pins: mmc0-pins {
                                pins = "PF0", "PF1", "PF2",
                                       "PF3", "PF4", "PF5";
                                bias-pull-up;
                        };
 
+                       /omit-if-no-ref/
+                       spi0_pc_pins: spi0-pc-pins {
+                               pins = "PC0", "PC1", "PC2";
+                               function = "spi0";
+                       };
+
+                       /omit-if-no-ref/
+                       spi0_cs0_pc_pin: spi0-cs0-pc-pin {
+                               pins = "PC23";
+                               function = "spi0";
+                       };
+
+                       /omit-if-no-ref/
+                       spi1_pi_pins: spi1-pi-pins {
+                               pins = "PI17", "PI18", "PI19";
+                               function = "spi1";
+                       };
+
+                       /omit-if-no-ref/
+                       spi1_cs0_pi_pin: spi1-cs0-pi-pin {
+                               pins = "PI16";
+                               function = "spi1";
+                       };
+
+                       /omit-if-no-ref/
+                       spi1_cs1_pi_pin: spi1-cs1-pi-pin {
+                               pins = "PI15";
+                               function = "spi1";
+                       };
+
                        uart0_pb_pins: uart0-pb-pins {
                                pins = "PB22", "PB23";
                                function = "uart0";
                wdt: watchdog@1c20c90 {
                        compatible = "allwinner,sun4i-a10-wdt";
                        reg = <0x01c20c90 0x10>;
+                       interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&osc24M>;
+               };
+
+               ir0: ir@1c21800 {
+                       compatible = "allwinner,sun8i-r40-ir",
+                                    "allwinner,sun6i-a31-ir";
+                       reg = <0x01c21800 0x400>;
+                       pinctrl-0 = <&ir0_pins>;
+                       pinctrl-names = "default";
+                       clocks = <&ccu CLK_BUS_IR0>, <&ccu CLK_IR0>;
+                       clock-names = "apb", "ir";
+                       interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&ccu RST_BUS_IR0>;
+                       status = "disabled";
+               };
+
+               ir1: ir@1c21c00 {
+                       compatible = "allwinner,sun8i-r40-ir",
+                                    "allwinner,sun6i-a31-ir";
+                       reg = <0x01c21c00 0x400>;
+                       pinctrl-0 = <&ir1_pins>;
+                       pinctrl-names = "default";
+                       clocks = <&ccu CLK_BUS_IR1>, <&ccu CLK_IR1>;
+                       clock-names = "apb", "ir";
+                       interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&ccu RST_BUS_IR1>;
+                       status = "disabled";
+               };
+
+               ths: thermal-sensor@1c24c00 {
+                       compatible = "allwinner,sun8i-r40-ths";
+                       reg = <0x01c24c00 0x100>;
+                       clocks = <&ccu CLK_BUS_THS>, <&ccu CLK_THS>;
+                       clock-names = "bus", "mod";
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&ccu RST_BUS_THS>;
+                       /* TODO: add nvmem-cells for calibration */
+                       #thermal-sensor-cells = <1>;
                };
 
                uart0: serial@1c28000 {
                        interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_I2C1>;
                        resets = <&ccu RST_BUS_I2C1>;
+                       pinctrl-0 = <&i2c1_pins>;
+                       pinctrl-names = "default";
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_I2C2>;
                        resets = <&ccu RST_BUS_I2C2>;
+                       pinctrl-0 = <&i2c2_pins>;
+                       pinctrl-names = "default";
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_I2C3>;
                        resets = <&ccu RST_BUS_I2C3>;
+                       pinctrl-0 = <&i2c3_pins>;
+                       pinctrl-names = "default";
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_I2C4>;
                        resets = <&ccu RST_BUS_I2C4>;
+                       pinctrl-0 = <&i2c4_pins>;
+                       pinctrl-names = "default";
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                };
 
-               ahci: sata@1c18000 {
-                       compatible = "allwinner,sun8i-r40-ahci";
-                       reg = <0x01c18000 0x1000>;
-                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&ccu CLK_BUS_SATA>, <&ccu CLK_SATA>;
-                       resets = <&ccu RST_BUS_SATA>;
-                       resets-name = "ahci";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-
+               mali: gpu@1c40000 {
+                       compatible = "allwinner,sun8i-r40-mali", "arm,mali-400";
+                       reg = <0x01c40000 0x10000>;
+                       interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "gp",
+                                         "gpmmu",
+                                         "pp0",
+                                         "ppmmu0",
+                                         "pp1",
+                                         "ppmmu1",
+                                         "pmu";
+                       clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>;
+                       clock-names = "bus", "core";
+                       resets = <&ccu RST_BUS_GPU>;
                };
 
                gmac: ethernet@1c50000 {
                        };
                };
 
+               mbus: dram-controller@1c62000 {
+                       compatible = "allwinner,sun8i-r40-mbus";
+                       reg = <0x01c62000 0x1000>;
+                       clocks = <&ccu 155>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       dma-ranges = <0x00000000 0x40000000 0x80000000>;
+                       #interconnect-cells = <1>;
+               };
+
                tcon_top: tcon-top@1c70000 {
                        compatible = "allwinner,sun8i-r40-tcon-top";
                        reg = <0x01c70000 0x1000>;
                                #size-cells = <0>;
 
                                tcon_top_mixer0_in: port@0 {
-                                       #address-cells = <1>;
-                                       #size-cells = <0>;
                                        reg = <0>;
 
-                                       tcon_top_mixer0_in_mixer0: endpoint@0 {
-                                               reg = <0>;
+                                       tcon_top_mixer0_in_mixer0: endpoint {
                                                remote-endpoint = <&mixer0_out_tcon_top>;
                                        };
                                };
                        compatible = "allwinner,sun8i-r40-tcon-tv";
                        reg = <0x01c73000 0x1000>;
                        interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&ccu CLK_BUS_TCON_TV0>, <&tcon_top 0>;
+                       clocks = <&ccu CLK_BUS_TCON_TV0>, <&tcon_top CLK_TCON_TOP_TV0>;
                        clock-names = "ahb", "tcon-ch1";
                        resets = <&ccu RST_BUS_TCON_TV0>;
                        reset-names = "lcd";
                        compatible = "allwinner,sun8i-r40-tcon-tv";
                        reg = <0x01c74000 0x1000>;
                        interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&ccu CLK_BUS_TCON_TV1>, <&tcon_top 1>;
+                       clocks = <&ccu CLK_BUS_TCON_TV1>, <&tcon_top CLK_TCON_TOP_TV1>;
                        clock-names = "ahb", "tcon-ch1";
                        resets = <&ccu RST_BUS_TCON_TV1>;
                        reset-names = "lcd";
                gic: interrupt-controller@1c81000 {
                        compatible = "arm,gic-400";
                        reg = <0x01c81000 0x1000>,
-                             <0x01c82000 0x1000>,
+                             <0x01c82000 0x2000>,
                              <0x01c84000 0x2000>,
                              <0x01c86000 0x2000>;
                        interrupt-controller;
                        resets = <&ccu RST_BUS_HDMI1>;
                        reset-names = "ctrl";
                        phys = <&hdmi_phy>;
-                       phy-names = "hdmi-phy";
+                       phy-names = "phy";
                        status = "disabled";
 
                        ports {
                        compatible = "allwinner,sun8i-r40-hdmi-phy";
                        reg = <0x01ef0000 0x10000>;
                        clocks = <&ccu CLK_BUS_HDMI1>, <&ccu CLK_HDMI_SLOW>,
-                                <&ccu 7>, <&ccu 16>;
+                                <&ccu CLK_PLL_VIDEO0>, <&ccu CLK_PLL_VIDEO1>;
                        clock-names = "bus", "mod", "pll-0", "pll-1";
                        resets = <&ccu RST_BUS_HDMI0>;
                        reset-names = "phy";
                };
        };
 
+       pmu {
+               compatible = "arm,cortex-a7-pmu";
+               interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
+       };
+
        timer {
                compatible = "arm,armv7-timer";
                interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
index 15c22b0..4795455 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&gmac_rgmii_pins>;
        phy-handle = <&phy1>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-supply = <&reg_dc1sw>;
        status = "okay";
 };
 };
 
 &reg_dc1sw {
-       regulator-min-microvolt = <3000000>;
-       regulator-max-microvolt = <3000000>;
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
        regulator-name = "vcc-gmac-phy";
 };
 
 &reg_dcdc1 {
        regulator-always-on;
-       regulator-min-microvolt = <3000000>;
-       regulator-max-microvolt = <3000000>;
-       regulator-name = "vcc-3v0";
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-3v3";
 };
 
 &reg_dcdc2 {
index 7c42923..215283c 100644 (file)
@@ -20,6 +20,7 @@ dtb-$(CONFIG_BOARD_MT7628_RFB) += mediatek,mt7628-rfb.dtb
 dtb-$(CONFIG_BOARD_GARDENA_SMART_GATEWAY_MT7688) += gardena-smart-gateway-mt7688.dtb
 dtb-$(CONFIG_BOARD_LINKIT_SMART_7688) += linkit-smart-7688.dtb
 dtb-$(CONFIG_TARGET_OCTEON_EBB7304) += mrvl,octeon-ebb7304.dtb
+dtb-$(CONFIG_TARGET_OCTEON_NIC23) += mrvl,octeon-nic23.dtb
 dtb-$(CONFIG_BOARD_NETGEAR_CG3100D) += netgear,cg3100d.dtb
 dtb-$(CONFIG_BOARD_NETGEAR_DGND3700V2) += netgear,dgnd3700v2.dtb
 dtb-$(CONFIG_BOARD_SAGEM_FAST1704) += sagem,f@st1704.dtb
index 27cdfd0..2a17f7a 100644 (file)
@@ -97,6 +97,7 @@
                uart0: serial@1180000000800 {
                        compatible = "cavium,octeon-3860-uart","ns16550";
                        reg = <0x11800 0x00000800 0x0 0x400>;
+                       clocks = <&clk OCTEON_CLK_IO>;
                        clock-frequency = <0>;
                        current-speed = <115200>;
                        reg-shift = <3>;
                uart1: serial@1180000000c00 {
                        compatible = "cavium,octeon-3860-uart","ns16550";
                        reg = <0x11800 0x00000c00 0x0 0x400>;
+                       clocks = <&clk OCTEON_CLK_IO>;
                        clock-frequency = <0>;
                        current-speed = <115200>;
                        reg-shift = <3>;
                                dr_mode = "host";
                        };
                };
+
+               /* PCIe 0 */
+               pcie0: pcie@1180069000000 {
+                       compatible =  "marvell,pcie-host-octeon";
+                       reg = <0 0xf2600000 0 0x10000>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                       dma-coherent;
+
+                       bus-range = <0 0xff>;
+                       marvell,pcie-port = <0>;
+                       ranges = <0x81000000 0x00000000 0xd0000000 0x00011a00 0xd0000000 0x00000000 0x01000000 /* IO */
+                                 0x02000000 0x00000000 0xe0000000 0x00011b00 0xe0000000 0x00000000 0x10000000  /* non-prefetchable memory */
+                                 0x43000000 0x00011c00 0x00000000 0x00011c00 0x00000000 0x00000010 0x00000000>;/* prefetchable memory */
+               };
+
+               uctl@118006c000000 {
+                       compatible = "cavium,octeon-7130-sata-uctl", "simple-bus";
+                       reg = <0x11800 0x6c000000 0x0 0x100>;
+                       ranges; /* Direct mapping */
+                       #address-cells = <2>;
+                       #size-cells = <2>;
+                       portmap = <0x3>;
+                       staggered-spinup;
+                       cavium,qlm-trim = "4,sata";
+
+                       sata: sata@16c0000000000 {
+                               compatible = "cavium,octeon-7130-ahci";
+                               reg = <0x16c00 0x00000000 0x0 0x200>;
+                               #address-cells = <2>;
+                               #size-cells = <2>;
+                               interrupts = <0x6c010 4>;
+                       };
+               };
        };
 };
index 1bb34e1..fda559d 100644 (file)
        };
 };
 
-&uart0 {
-       clock-frequency = <1200000000>;
-};
-
 &i2c0 {
        u-boot,dm-pre-reloc;    /* Needed early for DDR SPD EEPROM */
        clock-frequency = <100000>;
+
+       rtc@68 {
+               compatible = "dallas,ds1337";
+               reg = <0x68>;
+       };
+
+       tlv-eeprom@56 {
+               compatible = "atmel,24c256", "microchip,24lc256";
+               reg = <0x56>;
+               pagesize = <64>;
+       };
 };
 
 &i2c1 {
diff --git a/arch/mips/dts/mrvl,octeon-nic23.dts b/arch/mips/dts/mrvl,octeon-nic23.dts
new file mode 100644 (file)
index 0000000..72ef56d
--- /dev/null
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Marvell / Cavium Inc. NIC23
+ */
+
+/dts-v1/;
+
+#include "mrvl,cn73xx.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       model = "cavium,nic23";
+       compatible = "cavium,nic23";
+
+       aliases {
+               mmc0 = &mmc0;
+               serial0 = &uart0;
+               spi0 = &spi;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               /* Power on GPIO 8, active high */
+               reg_mmc_3v3: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "mmc-3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       gpio = <&gpio 8 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+       };
+
+       chosen {
+               stdout-path = &uart0;
+       };
+};
+
+&bootbus {
+       /*
+        * bootbus CS0 for CFI flash is remapped (0x1fc0.0000 -> 1f40.0000)
+        * as the initial size is too small for the 8MiB flash device
+        */
+       ranges = <0 0  0       0x1f400000  0xc00000>,
+                <1 0  0x10000 0x10000000  0>,
+                <2 0  0x10000 0x20000000  0>,
+                <3 0  0x10000 0x30000000  0>,
+                <4 0  0       0x1d020000  0x10000>,
+                <5 0  0x10000 0x50000000  0>,
+                <6 0  0x10000 0x60000000  0>,
+                <7 0  0x10000 0x70000000  0>;
+
+       cavium,cs-config@0 {
+               compatible = "cavium,octeon-3860-bootbus-config";
+               cavium,cs-index = <0>;
+               cavium,t-adr  = <10>;
+               cavium,t-ce   = <50>;
+               cavium,t-oe   = <50>;
+               cavium,t-we   = <35>;
+               cavium,t-rd-hld = <25>;
+               cavium,t-wr-hld = <35>;
+               cavium,t-pause  = <0>;
+               cavium,t-wait   = <50>;
+               cavium,t-page   = <30>;
+               cavium,t-rd-dly = <0>;
+               cavium,page-mode = <1>;
+               cavium,pages     = <8>;
+               cavium,bus-width = <8>;
+       };
+
+       cavium,cs-config@4 {
+               compatible = "cavium,octeon-3860-bootbus-config";
+               cavium,cs-index = <4>;
+               cavium,t-adr  = <10>;
+               cavium,t-ce   = <10>;
+               cavium,t-oe   = <160>;
+               cavium,t-we   = <100>;
+               cavium,t-rd-hld = <10>;
+               cavium,t-wr-hld = <0>;
+               cavium,t-pause  = <50>;
+               cavium,t-wait   = <50>;
+               cavium,t-page   = <10>;
+               cavium,t-rd-dly = <10>;
+               cavium,pages     = <0>;
+               cavium,bus-width = <8>;
+       };
+
+       flash0: nor@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0 0x800000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               partition@0 {
+                       label = "bootloader";
+                       reg = <0 0x340000>;
+                       read-only;
+               };
+               partition@300000 {
+                       label = "storage";
+                       reg = <0x340000 0x4be000>;
+               };
+               partition@7fe000 {
+                       label = "environment";
+                       reg = <0x7fe000 0x2000>;
+                       read-only;
+               };
+       };
+};
+
+&uart0 {
+       clock-frequency = <800000000>;
+};
+
+&i2c0 {
+       u-boot,dm-pre-reloc;    /* Needed early for DDR SPD EEPROM */
+       clock-frequency = <100000>;
+};
+
+&i2c1 {
+       u-boot,dm-pre-reloc;    /* Needed early for DDR SPD EEPROM */
+       clock-frequency = <100000>;
+};
+
+&mmc {
+       status = "okay";
+
+       mmc0: mmc-slot@0 {
+               compatible = "cavium,octeon-6130-mmc-slot", "mmc-slot";
+               reg = <0>;
+               vqmmc-supply = <&reg_mmc_3v3>;
+               voltage-ranges = <3300 3300>;
+               spi-max-frequency = <52000000>;
+               /* bus width can be 1, 4 or 8 */
+               bus-width = <8>; /* new std property */
+               cavium,bus-max-width = <8>; /* custom property */
+               non-removable;
+       };
+};
+
+&soc0 {
+       pci-console@0 {
+               compatible = "marvell,pci-console";
+               status = "okay";
+       };
+
+       pci-bootcmd@0 {
+               compatible = "marvell,pci-bootcmd";
+               status = "okay";
+       };
+};
+
+&spi {
+       flash@0 {
+               compatible = "micron,n25q128a11", "jedec,spi-nor";
+               spi-max-frequency = <2000000>;
+               reg = <0>;
+       };
+};
index 4c30fab..f0d3b07 100644 (file)
@@ -8,6 +8,12 @@
 #define __ASM_GBL_DATA_H
 
 #include <asm/regdef.h>
+#include <asm/types.h>
+
+struct octeon_eeprom_mac_addr {
+       u8 mac_addr_base[6];
+       u8 count;
+};
 
 /* Architecture-specific global data */
 struct arch_global_data {
@@ -30,6 +36,9 @@ struct arch_global_data {
 #ifdef CONFIG_ARCH_MTMIPS
        unsigned long timer_freq;
 #endif
+#ifdef CONFIG_ARCH_OCTEON
+       struct octeon_eeprom_mac_addr mac_desc;
+#endif
 };
 
 #include <asm-generic/global_data.h>
index e8596ed..624039d 100644 (file)
@@ -41,6 +41,12 @@ config TARGET_OCTEON_EBB7304
        help
         Choose this for the Octeon EBB7304 board
 
+config TARGET_OCTEON_NIC23
+       bool "Marvell Octeon NIC23"
+       select OCTEON_CN73XX
+       help
+        Choose this for the Octeon NIC23 board
+
 endchoice
 
 config SYS_DCACHE_SIZE
@@ -55,6 +61,11 @@ config SYS_ICACHE_SIZE
 config SYS_ICACHE_LINE_SIZE
        default 128
 
+config SYS_PCI_64BIT
+       bool
+       default y
+
 source "board/Marvell/octeon_ebb7304/Kconfig"
+source "board/Marvell/octeon_nic23/Kconfig"
 
 endmenu
index 3486aa9..40ddab2 100644 (file)
@@ -11,3 +11,14 @@ obj-y += dram.o
 obj-y += cvmx-coremask.o
 obj-y += cvmx-bootmem.o
 obj-y += bootoctlinux.o
+
+# QLM related code
+obj-y += cvmx-helper-cfg.o
+obj-y += cvmx-helper-fdt.o
+obj-y += cvmx-helper-jtag.o
+obj-y += cvmx-helper-util.o
+obj-y += cvmx-helper.o
+obj-y += cvmx-pcie.o
+obj-y += cvmx-qlm.o
+obj-y += octeon_fdt.o
+obj-y += octeon_qlm.o
index f661c16..c195dc2 100644 (file)
@@ -25,6 +25,7 @@
 #include <mach/octeon-model.h>
 #include <mach/octeon-feature.h>
 #include <mach/bootoct_cmd.h>
+#include <mach/cvmx-ciu-defs.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index 6f87a4e..f56beb8 100644 (file)
@@ -3,6 +3,10 @@
  * Copyright (C) 2020 Marvell International Ltd.
  */
 
+#include <dm.h>
+#include <dm/uclass.h>
+#include <env.h>
+#include <iomux.h>
 #include <asm/global_data.h>
 #include <linux/bitfield.h>
 #include <linux/bitops.h>
 #include <linux/io.h>
 #include <mach/clock.h>
 #include <mach/cavm-reg.h>
+#include <mach/cvmx-bootmem.h>
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-sata-defs.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 /*
+ * Important:
+ * This address cannot be changed as the PCI console tool relies on exactly
+ * this value!
+ */
+#define BOOTLOADER_BOOTMEM_DESC_ADDR   0x6c100
+#define BOOTLOADER_BOOTMEM_DESC_SPACE  (BOOTLOADER_BOOTMEM_DESC_ADDR + 0x8)
+
+#define OCTEON_RESERVED_LOW_BOOT_MEM_SIZE (1024 * 1024)
+
+#define BOOTCMD_NAME                   "pci-bootcmd"
+#define CONSOLE_NAME                   "pci-console@0"
+#define OCTEON_BOOTLOADER_LOAD_MEM_NAME        "__tmp_load"
+
+/*
  * TRUE for devices having registers with little-endian byte
  * order, FALSE for registers with native-endian byte order.
  * PCI mandates little-endian, USB and SATA are configurable,
@@ -30,7 +51,6 @@ const bool octeon_should_swizzle_table[256] = {
        [0x1e] = true,  /* PCI mmio window */
        [0x68] = true,  /* OCTEON III USB */
        [0x69] = true,  /* OCTEON III USB */
-       [0x6c] = true,  /* OCTEON III SATA */
        [0x6f] = true,  /* OCTEON II USB */
 };
 
@@ -85,3 +105,329 @@ int print_cpuinfo(void)
 
        return 0;
 }
+
+static int octeon_bootmem_init(void)
+{
+       int ret;
+
+       /* Call old single-node func: it uses only gd->ram_size */
+       ret = cvmx_bootmem_phy_mem_list_init(gd->ram_size,
+                                            OCTEON_RESERVED_LOW_BOOT_MEM_SIZE,
+                                            (void *)CKSEG0ADDR(BOOTLOADER_BOOTMEM_DESC_SPACE));
+       if (!ret) {
+               printf("FATAL: Error initializing bootmem list\n");
+               return -ENOSPC;
+       }
+
+       /*
+        * Put bootmem descriptor address in known location for host.
+        * Make sure it is not in kseg0, as we want physical address
+        */
+       writeq((u64)__cvmx_bootmem_internal_get_desc_ptr() & 0x7fffffffull,
+              (void *)CKSEG0ADDR(BOOTLOADER_BOOTMEM_DESC_ADDR));
+
+       debug("Reserving first 1MB of memory\n");
+       ret = cvmx_bootmem_reserve_memory(0, OCTEON_RESERVED_LOW_BOOT_MEM_SIZE,
+                                         "__low_reserved", 0);
+       if (!ret)
+               puts("Error reserving low 1MB of memory\n");
+
+#ifdef DEBUG
+       cvmx_bootmem_phy_list_print();
+#endif
+
+       return 0;
+}
+
+static int octeon_configure_load_memory(void)
+{
+       char *eptr;
+       u32 addr;
+       u32 size;
+       int ret;
+
+       eptr = env_get("octeon_reserved_mem_load_size");
+       if (!eptr || !strcmp("auto", eptr)) {
+               /*
+                * Pick a size that we think is appropriate.
+                * Please note that for small memory boards this guess
+                * will likely not be ideal.
+                * Please pick a specific size for boards/applications
+                * that require it.
+                */
+               if (gd->ram_size <= (256 << 20)) {
+                       size = min_t(u64, (128 << 20),
+                                    ((gd->ram_size * 2) / 5) & ~0xFFFFF);
+               } else {
+                       size = min_t(u64, (256 << 20),
+                                    ((gd->ram_size - (256 << 20)) / 3) & ~0xFFFFF);
+               }
+       } else {
+               size = simple_strtol(eptr, NULL, 16);
+               debug("octeon_reserved_mem_load_size=0x%08x\n", size);
+       }
+
+       if (size) {
+               debug("Linux reserved load size 0x%08x\n", size);
+               eptr = env_get("octeon_reserved_mem_load_base");
+               if (!eptr || !strcmp("auto", eptr)) {
+                       u64 mem_top;
+                       /*
+                        * Leave some room for previous allocations that
+                        * are made starting at the top of the low
+                        * 256 Mbytes of DRAM
+                        */
+                       int adjust = (1 << 20);
+
+                       if (gd->ram_size <= (512 << 20))
+                               adjust = (17 << 20);
+
+                       /* Put block at the top of DDR0, or bottom of DDR2 */
+                       if ((gd->ram_size <= (256 << 20)) ||
+                           (size > (gd->ram_size - (256 << 20)))) {
+                               mem_top = min_t(u64, gd->ram_size - adjust,
+                                               (256 << 20) - adjust);
+                       } else if ((gd->ram_size <= (512 << 20)) ||
+                                  (size > (gd->ram_size - (512 << 20)))) {
+                               mem_top = min_t(u64, gd->ram_size - adjust,
+                                               (512 << 20) - adjust);
+                       } else {
+                               /*
+                                * We have enough room, so set
+                                * mem_top so that the block is
+                                * at the base of the DDR2
+                                * segment
+                                */
+                               mem_top = (512 << 20) + size;
+                       }
+
+                       /*
+                        * Adjust for boot bus memory hole on OCTEON II
+                        * and later.
+                        */
+                       if ((gd->ram_size > (256 << 20)))
+                               mem_top += (256 << 20);
+
+                       debug("Adjusted memory top is 0x%llx\n", mem_top);
+                       addr = mem_top - size;
+                       if (addr > (512 << 20))
+                               addr = (512 << 20);
+                       if ((addr >= (256 << 20)) && addr < (512 << 20)) {
+                               /*
+                                * The address landed in the boot-bus
+                                * memory hole.  Dig it out of the hole.
+                                */
+                               addr = (512 << 20);
+                       }
+               } else {
+                       addr = simple_strtol(eptr, NULL, 16);
+               }
+
+               ret = cvmx_bootmem_phy_named_block_alloc(size, addr,
+                                                        addr + size, 0,
+                                                        OCTEON_BOOTLOADER_LOAD_MEM_NAME,
+                                                        0);
+               if (ret < 0) {
+                       printf("ERROR: Unable to allocate bootloader reserved memory (addr: 0x%x, size: 0x%x).\n",
+                              addr, size);
+               } else {
+                       /*
+                        * Set default load address to base of memory
+                        * reserved for loading. The setting of the
+                        * env. variable also sets the load_addr global
+                        * variable.
+                        * This environment variable is overridden each
+                        * boot if a reserved block is created.
+                        */
+                       char str[20];
+
+                       snprintf(str, sizeof(str), "0x%x", addr);
+                       env_set("loadaddr", str);
+                       debug("Setting load address to 0x%08x, size 0x%x\n",
+                             addr, size);
+               }
+               return 0;
+       }
+
+       printf("WARNING: No reserved memory for image loading.\n");
+       return -1;
+}
+
+static int init_pcie_console(void)
+{
+       char *stdinname = env_get("stdin");
+       char *stdoutname = env_get("stdout");
+       char *stderrname = env_get("stderr");
+       struct udevice *pcie_console_dev = NULL;
+       bool stdin_set, stdout_set, stderr_set;
+       char iomux_name[128];
+       int ret = 0;
+
+       debug("%s: stdin: %s, stdout: %s, stderr: %s\n", __func__, stdinname,
+             stdoutname, stderrname);
+       if (!stdinname) {
+               env_set("stdin", "serial");
+               stdinname = env_get("stdin");
+       }
+       if (!stdoutname) {
+               env_set("stdout", "serial");
+               stdoutname = env_get("stdout");
+       }
+       if (!stderrname) {
+               env_set("stderr", "serial");
+               stderrname = env_get("stderr");
+       }
+
+       if (!stdinname || !stdoutname || !stderrname) {
+               printf("%s: Error setting environment variables for serial\n",
+                      __func__);
+               return -1;
+       }
+
+       stdin_set = !!strstr(stdinname, CONSOLE_NAME);
+       stdout_set = !!strstr(stdoutname, CONSOLE_NAME);
+       stderr_set = !!strstr(stderrname, CONSOLE_NAME);
+
+       log_debug("stdin: %d, \"%s\", stdout: %d, \"%s\", stderr: %d, \"%s\"\n",
+                 stdin_set, stdinname, stdout_set, stdoutname,
+                 stderr_set, stderrname);
+       ret = uclass_get_device_by_name(UCLASS_SERIAL, CONSOLE_NAME,
+                                       &pcie_console_dev);
+       if (ret || !pcie_console_dev) {
+               debug("%s: No PCI console device %s found\n", __func__,
+                     CONSOLE_NAME);
+               return 0;
+       }
+
+       if (stdin_set)
+               strncpy(iomux_name, stdinname, sizeof(iomux_name));
+       else
+               snprintf(iomux_name, sizeof(iomux_name), "%s,%s",
+                        stdinname, pcie_console_dev->name);
+
+       ret = iomux_doenv(stdin, iomux_name);
+       if (ret) {
+               log_err("%s: Error setting I/O stdin MUX to %s\n",
+                       __func__, iomux_name);
+               return ret;
+       }
+
+       if (!stdin_set)
+               env_set("stdin", iomux_name);
+
+       if (stdout_set)
+               strncpy(iomux_name, stdoutname, sizeof(iomux_name));
+       else
+               snprintf(iomux_name, sizeof(iomux_name), "%s,%s", stdoutname,
+                        pcie_console_dev->name);
+
+       ret = iomux_doenv(stdout, iomux_name);
+       if (ret) {
+               log_err("%s: Error setting I/O stdout MUX to %s\n",
+                       __func__, iomux_name);
+               return ret;
+       }
+       if (!stdout_set)
+               env_set("stdout", iomux_name);
+
+       if (stderr_set)
+               strncpy(iomux_name, stderrname, sizeof(iomux_name));
+       else
+               snprintf(iomux_name, sizeof(iomux_name), "%s,%s", stderrname,
+                        pcie_console_dev->name);
+
+       ret = iomux_doenv(stderr, iomux_name);
+       if (ret) {
+               log_err("%s: Error setting I/O stderr MUX to %s\n",
+                       __func__, iomux_name);
+               return ret;
+       }
+
+       if (!stderr_set)
+               env_set("stderr", iomux_name);
+
+       debug("%s: stdin: %s, stdout: %s, stderr: %s, ret: %d\n",
+             __func__, env_get("stdin"), env_get("stdout"),
+             env_get("stderr"), ret);
+
+       return ret;
+}
+
+static int init_bootcmd_console(void)
+{
+       char *stdinname = env_get("stdin");
+       struct udevice *bootcmd_dev = NULL;
+       bool stdin_set;
+       char iomux_name[128];
+       int ret = 0;
+
+       debug("%s: stdin before: %s\n", __func__,
+             stdinname ? stdinname : "NONE");
+       if (!stdinname) {
+               env_set("stdin", "serial");
+               stdinname = env_get("stdin");
+       }
+       stdin_set = !!strstr(stdinname, BOOTCMD_NAME);
+       ret = uclass_get_device_by_driver(UCLASS_SERIAL,
+                                         DM_DRIVER_GET(octeon_bootcmd),
+                                         &bootcmd_dev);
+       if (ret) {
+               log_err("%s: Error getting %s serial class\n", __func__,
+                       BOOTCMD_NAME);
+       } else if (bootcmd_dev) {
+               if (stdin_set)
+                       strncpy(iomux_name, stdinname, sizeof(iomux_name));
+               else
+                       snprintf(iomux_name, sizeof(iomux_name), "%s,%s",
+                                stdinname, bootcmd_dev->name);
+               ret = iomux_doenv(stdin, iomux_name);
+               if (ret)
+                       log_err("%s: Error %d enabling the PCI bootcmd input console \"%s\"\n",
+                               __func__, ret, iomux_name);
+               if (!stdin_set)
+                       env_set("stdin", iomux_name);
+       }
+
+       debug("%s: Set iomux and stdin to %s (ret: %d)\n",
+             __func__, iomux_name, ret);
+       return ret;
+}
+
+int arch_misc_init(void)
+{
+       int ret;
+
+       ret = octeon_bootmem_init();
+       if (ret)
+               return ret;
+
+       ret = octeon_configure_load_memory();
+       if (ret)
+               return ret;
+
+       if (CONFIG_IS_ENABLED(OCTEON_SERIAL_PCIE_CONSOLE))
+               init_pcie_console();
+
+       if (CONFIG_IS_ENABLED(OCTEON_SERIAL_BOOTCMD))
+               init_bootcmd_console();
+
+       return 0;
+}
+
+int board_ahci_enable(void)
+{
+       cvmx_sata_uctl_shim_cfg_t shim_cfg;
+
+       /*
+        * Configure proper endian swapping for the AHCI port so that the
+        * common AHCI code can be used
+        */
+       shim_cfg.u64 = csr_rd(CVMX_SATA_UCTL_SHIM_CFG);
+       shim_cfg.s.dma_endian_mode = 1;
+       /* Use 1 for LE mode when running BE, or 3 for BE mode running BE */
+       shim_cfg.s.csr_endian_mode = 3; /* Don't byte swap */
+       shim_cfg.s.dma_read_cmd = 1; /* No allocate L2C */
+       csr_wr(CVMX_SATA_UCTL_SHIM_CFG, shim_cfg.u64);
+
+       return 0;
+}
index 80bb7ac..12695df 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define CVMX_MIPS32_SPACE_KSEG0                1L
-#define CVMX_MIPS_SPACE_XKPHYS         2LL
-
-#define CVMX_ADD_SEG(seg, add)         ((((u64)(seg)) << 62) | (add))
-#define CVMX_ADD_SEG32(seg, add)       (((u32)(seg) << 31) | (u32)(add))
-
 /**
  * This is the physical location of a struct cvmx_bootmem_desc
  * structure in Octeon's memory. Note that dues to addressing
@@ -289,8 +283,8 @@ static int __cvmx_bootmem_check_version(int exact_match)
        int major_version;
 
        major_version = CVMX_BOOTMEM_DESC_GET_FIELD(major_version);
-       if (major_version > 3 ||
-           (exact_match && major_version) != exact_match) {
+       if ((major_version > 3) ||
+           (exact_match && major_version != exact_match)) {
                debug("ERROR: Incompatible bootmem descriptor version: %d.%d at addr: 0x%llx\n",
                      major_version,
                      (int)CVMX_BOOTMEM_DESC_GET_FIELD(minor_version),
index cff8c08..ed673e4 100644 (file)
@@ -14,6 +14,7 @@
 #include <mach/cvmx-fuse.h>
 #include <mach/octeon-model.h>
 #include <mach/octeon-feature.h>
+#include <mach/cvmx-ciu-defs.h>
 
 struct cvmx_coremask *get_coremask_override(struct cvmx_coremask *pcm)
 {
diff --git a/arch/mips/mach-octeon/cvmx-helper-cfg.c b/arch/mips/mach-octeon/cvmx-helper-cfg.c
new file mode 100644 (file)
index 0000000..6b7dd8a
--- /dev/null
@@ -0,0 +1,1914 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper Functions for the Configuration Framework
+ */
+
+#include <log.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-csr.h>
+#include <mach/cvmx-bootmem.h>
+#include <mach/octeon-model.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/cvmx-pcie.h>
+#include <mach/cvmx-coremask.h>
+
+#include <mach/cvmx-agl-defs.h>
+#include <mach/cvmx-bgxx-defs.h>
+#include <mach/cvmx-gmxx-defs.h>
+#include <mach/cvmx-ipd-defs.h>
+#include <mach/cvmx-pki-defs.h>
+
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-board.h>
+#include <mach/cvmx-helper-fdt.h>
+#include <mach/cvmx-helper-bgx.h>
+#include <mach/cvmx-helper-cfg.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-helper-pki.h>
+
+#include <mach/cvmx-global-resources.h>
+#include <mach/cvmx-pko-internal-ports-range.h>
+#include <mach/cvmx-ilk.h>
+#include <mach/cvmx-pip.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int cvmx_npi_max_pknds;
+static bool port_cfg_data_initialized;
+
+struct cvmx_cfg_port_param cvmx_cfg_port[CVMX_MAX_NODES][CVMX_HELPER_MAX_IFACE]
+                                       [CVMX_HELPER_CFG_MAX_PORT_PER_IFACE];
+/*
+ * Indexed by the pko_port number
+ */
+static int __cvmx_cfg_pko_highest_queue;
+struct cvmx_cfg_pko_port_param
+cvmx_pko_queue_table[CVMX_HELPER_CFG_MAX_PKO_PORT] = {
+       [0 ... CVMX_HELPER_CFG_MAX_PKO_PORT - 1] = {
+               CVMX_HELPER_CFG_INVALID_VALUE,
+               CVMX_HELPER_CFG_INVALID_VALUE
+       }
+};
+
+cvmx_user_static_pko_queue_config_t
+__cvmx_pko_queue_static_config[CVMX_MAX_NODES];
+
+struct cvmx_cfg_pko_port_map
+cvmx_cfg_pko_port_map[CVMX_HELPER_CFG_MAX_PKO_PORT] = {
+       [0 ... CVMX_HELPER_CFG_MAX_PKO_PORT - 1] = {
+               CVMX_HELPER_CFG_INVALID_VALUE,
+               CVMX_HELPER_CFG_INVALID_VALUE,
+               CVMX_HELPER_CFG_INVALID_VALUE
+       }
+};
+
+/*
+ * This array assists translation from ipd_port to pko_port.
+ * The ``16'' is the rounded value for the 3rd 4-bit value of
+ * ipd_port, used to differentiate ``interfaces.''
+ */
+static struct cvmx_cfg_pko_port_pair
+ipd2pko_port_cache[16][CVMX_HELPER_CFG_MAX_PORT_PER_IFACE] = {
+       [0 ... 15] = {
+               [0 ... CVMX_HELPER_CFG_MAX_PORT_PER_IFACE - 1] = {
+                       CVMX_HELPER_CFG_INVALID_VALUE,
+                       CVMX_HELPER_CFG_INVALID_VALUE
+               }
+       }
+};
+
+/*
+ * Options
+ *
+ * Each array-elem's initial value is also the option's default value.
+ */
+static u64 cvmx_cfg_opts[CVMX_HELPER_CFG_OPT_MAX] = {
+       [0 ... CVMX_HELPER_CFG_OPT_MAX - 1] = 1
+};
+
+/*
+ * MISC
+ */
+
+static int cvmx_cfg_max_pko_engines; /* # of PKO DMA engines allocated */
+static int cvmx_pko_queue_alloc(u64 port, int count);
+static void cvmx_init_port_cfg(void);
+static const int dbg;
+
+int __cvmx_helper_cfg_pknd(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int pkind;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       /*
+        * Only 8 PKNDs are assigned to ILK channels. The channels are wrapped
+        * if more than 8 channels are configured, fix the index accordingly.
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               if (cvmx_helper_interface_get_mode(xiface) ==
+                   CVMX_HELPER_INTERFACE_MODE_ILK)
+                       index %= 8;
+       }
+
+       pkind = cvmx_cfg_port[xi.node][xi.interface][index].ccpp_pknd;
+       return pkind;
+}
+
+int __cvmx_helper_cfg_bpid(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       /*
+        * Only 8 BIDs are assigned to ILK channels. The channels are wrapped
+        * if more than 8 channels are configured, fix the index accordingly.
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               if (cvmx_helper_interface_get_mode(xiface) ==
+                   CVMX_HELPER_INTERFACE_MODE_ILK)
+                       index %= 8;
+       }
+
+       return cvmx_cfg_port[xi.node][xi.interface][index].ccpp_bpid;
+}
+
+int __cvmx_helper_cfg_pko_port_base(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       return cvmx_cfg_port[xi.node][xi.interface][index].ccpp_pko_port_base;
+}
+
+int __cvmx_helper_cfg_pko_port_num(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       return cvmx_cfg_port[xi.node][xi.interface][index].ccpp_pko_num_ports;
+}
+
+int __cvmx_helper_cfg_pko_queue_num(int pko_port)
+{
+       return cvmx_pko_queue_table[pko_port].ccppp_num_queues;
+}
+
+int __cvmx_helper_cfg_pko_queue_base(int pko_port)
+{
+       return cvmx_pko_queue_table[pko_port].ccppp_queue_base;
+}
+
+int __cvmx_helper_cfg_pko_max_queue(void)
+{
+       return __cvmx_cfg_pko_highest_queue;
+}
+
+int __cvmx_helper_cfg_pko_max_engine(void)
+{
+       return cvmx_cfg_max_pko_engines;
+}
+
+int cvmx_helper_cfg_opt_set(cvmx_helper_cfg_option_t opt, uint64_t val)
+{
+       if (opt >= CVMX_HELPER_CFG_OPT_MAX)
+               return -1;
+
+       cvmx_cfg_opts[opt] = val;
+
+       return 0;
+}
+
+uint64_t cvmx_helper_cfg_opt_get(cvmx_helper_cfg_option_t opt)
+{
+       if (opt >= CVMX_HELPER_CFG_OPT_MAX)
+               return (uint64_t)CVMX_HELPER_CFG_INVALID_VALUE;
+
+       return cvmx_cfg_opts[opt];
+}
+
+/*
+ * initialize the queue allocation list. the existing static allocation result
+ * is used as a starting point to ensure backward compatibility.
+ *
+ * @return  0 on success
+ *         -1 on failure
+ */
+int cvmx_pko_queue_grp_alloc(u64 start, uint64_t end, uint64_t count)
+{
+       u64 port;
+       int ret_val;
+
+       for (port = start; port < end; port++) {
+               ret_val = cvmx_pko_queue_alloc(port, count);
+               if (ret_val == -1) {
+                       printf("ERROR: %sL Failed to allocate queue for port=%d count=%d\n",
+                              __func__, (int)port, (int)count);
+                       return ret_val;
+               }
+       }
+       return 0;
+}
+
+int cvmx_pko_queue_init_from_cvmx_config_non_pknd(void)
+{
+       int ret_val = -1;
+       u64 count, start, end;
+
+       start = 0;
+       end = __cvmx_pko_queue_static_config[0].non_pknd.pko_ports_per_interface[0];
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_interface[0];
+       cvmx_pko_queue_grp_alloc(start, end, count);
+
+       start = 16;
+       end = start + __cvmx_pko_queue_static_config[0].non_pknd.pko_ports_per_interface[1];
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_interface[1];
+       ret_val = cvmx_pko_queue_grp_alloc(start, end, count);
+       if (ret_val != 0)
+               return -1;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               /* Interface 4: AGL, PKO port 24 only, DPI 32-35 */
+               start = 24;
+               end = start + 1;
+               count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_interface[4];
+               ret_val = cvmx_pko_queue_grp_alloc(start, end, count);
+
+               if (ret_val != 0)
+                       return -1;
+               end = 32; /* DPI first PKO poty */
+       }
+
+       start = end;
+       end = 36;
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_pci;
+       cvmx_pko_queue_grp_alloc(start, end, count);
+       if (ret_val != 0)
+               return -1;
+
+       start = end;
+       end = 40;
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_loop;
+       cvmx_pko_queue_grp_alloc(start, end, count);
+       if (ret_val != 0)
+               return -1;
+
+       start = end;
+       end = 42;
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_srio[0];
+       cvmx_pko_queue_grp_alloc(start, end, count);
+       if (ret_val != 0)
+               return -1;
+
+       start = end;
+       end = 44;
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_srio[1];
+       cvmx_pko_queue_grp_alloc(start, end, count);
+       if (ret_val != 0)
+               return -1;
+
+       start = end;
+       end = 46;
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_srio[2];
+       cvmx_pko_queue_grp_alloc(start, end, count);
+       if (ret_val != 0)
+               return -1;
+
+       start = end;
+       end = 48;
+       count = __cvmx_pko_queue_static_config[0].non_pknd.pko_queues_per_port_srio[3];
+       cvmx_pko_queue_grp_alloc(start, end, count);
+       if (ret_val != 0)
+               return -1;
+       return 0;
+}
+
+int cvmx_helper_pko_queue_config_get(int node, cvmx_user_static_pko_queue_config_t *cfg)
+{
+       *cfg = __cvmx_pko_queue_static_config[node];
+       return 0;
+}
+
+int cvmx_helper_pko_queue_config_set(int node, cvmx_user_static_pko_queue_config_t *cfg)
+{
+       __cvmx_pko_queue_static_config[node] = *cfg;
+       return 0;
+}
+
+static int queue_range_init;
+
+int init_cvmx_pko_que_range(void)
+{
+       int rv = 0;
+
+       if (queue_range_init)
+               return 0;
+       queue_range_init = 1;
+       rv = cvmx_create_global_resource_range(CVMX_GR_TAG_PKO_QUEUES,
+                                              CVMX_HELPER_CFG_MAX_PKO_QUEUES);
+       if (rv != 0)
+               printf("ERROR: %s: Failed to initialize pko queues range\n", __func__);
+
+       return rv;
+}
+
+/*
+ * get a block of "count" queues for "port"
+ *
+ * @param  port   the port for which the queues are requested
+ * @param  count  the number of queues requested
+ *
+ * @return  0 on success
+ *         -1 on failure
+ */
+static int cvmx_pko_queue_alloc(u64 port, int count)
+{
+       int ret_val = -1;
+       int highest_queue;
+
+       init_cvmx_pko_que_range();
+
+       if (cvmx_pko_queue_table[port].ccppp_num_queues == count)
+               return cvmx_pko_queue_table[port].ccppp_queue_base;
+
+       if (cvmx_pko_queue_table[port].ccppp_num_queues > 0) {
+               printf("WARNING: %s port=%d already %d queues\n",
+                      __func__, (int)port,
+                      (int)cvmx_pko_queue_table[port].ccppp_num_queues);
+               return -1;
+       }
+
+       if (port >= CVMX_HELPER_CFG_MAX_PKO_QUEUES) {
+               printf("ERROR: %s port=%d > %d\n", __func__, (int)port,
+                      CVMX_HELPER_CFG_MAX_PKO_QUEUES);
+               return -1;
+       }
+
+       ret_val = cvmx_allocate_global_resource_range(CVMX_GR_TAG_PKO_QUEUES,
+                                                     port, count, 1);
+
+       debug("%s: pko_e_port=%i q_base=%i q_count=%i\n",
+             __func__, (int)port, ret_val, (int)count);
+
+       if (ret_val == -1)
+               return ret_val;
+       cvmx_pko_queue_table[port].ccppp_queue_base = ret_val;
+       cvmx_pko_queue_table[port].ccppp_num_queues = count;
+
+       highest_queue = ret_val + count - 1;
+       if (highest_queue > __cvmx_cfg_pko_highest_queue)
+               __cvmx_cfg_pko_highest_queue = highest_queue;
+       return 0;
+}
+
+/*
+ * return the queues for "port"
+ *
+ * @param  port   the port for which the queues are returned
+ *
+ * @return  0 on success
+ *         -1 on failure
+ */
+int cvmx_pko_queue_free(uint64_t port)
+{
+       int ret_val = -1;
+
+       init_cvmx_pko_que_range();
+       if (port >= CVMX_HELPER_CFG_MAX_PKO_QUEUES) {
+               debug("ERROR: %s port=%d > %d", __func__, (int)port,
+                     CVMX_HELPER_CFG_MAX_PKO_QUEUES);
+               return -1;
+       }
+
+       ret_val = cvmx_free_global_resource_range_with_base(
+               CVMX_GR_TAG_PKO_QUEUES, cvmx_pko_queue_table[port].ccppp_queue_base,
+               cvmx_pko_queue_table[port].ccppp_num_queues);
+       if (ret_val != 0)
+               return ret_val;
+
+       cvmx_pko_queue_table[port].ccppp_num_queues = 0;
+       cvmx_pko_queue_table[port].ccppp_queue_base = CVMX_HELPER_CFG_INVALID_VALUE;
+       ret_val = 0;
+       return ret_val;
+}
+
+void cvmx_pko_queue_free_all(void)
+{
+       int i;
+
+       for (i = 0; i < CVMX_HELPER_CFG_MAX_PKO_PORT; i++)
+               if (cvmx_pko_queue_table[i].ccppp_queue_base !=
+                   CVMX_HELPER_CFG_INVALID_VALUE)
+                       cvmx_pko_queue_free(i);
+}
+
+void cvmx_pko_queue_show(void)
+{
+       int i;
+
+       cvmx_show_global_resource_range(CVMX_GR_TAG_PKO_QUEUES);
+       for (i = 0; i < CVMX_HELPER_CFG_MAX_PKO_PORT; i++)
+               if (cvmx_pko_queue_table[i].ccppp_queue_base !=
+                   CVMX_HELPER_CFG_INVALID_VALUE)
+                       debug("port=%d que_base=%d que_num=%d\n", i,
+                             (int)cvmx_pko_queue_table[i].ccppp_queue_base,
+                             (int)cvmx_pko_queue_table[i].ccppp_num_queues);
+}
+
+void cvmx_helper_cfg_show_cfg(void)
+{
+       int i, j;
+
+       for (i = 0; i < cvmx_helper_get_number_of_interfaces(); i++) {
+               debug("%s: interface%d mode %10s nports%4d\n", __func__, i,
+                     cvmx_helper_interface_mode_to_string(cvmx_helper_interface_get_mode(i)),
+                     cvmx_helper_interface_enumerate(i));
+
+               for (j = 0; j < cvmx_helper_interface_enumerate(i); j++) {
+                       debug("\tpknd[%i][%d]%d", i, j,
+                             __cvmx_helper_cfg_pknd(i, j));
+                       debug(" pko_port_base[%i][%d]%d", i, j,
+                             __cvmx_helper_cfg_pko_port_base(i, j));
+                       debug(" pko_port_num[%i][%d]%d\n", i, j,
+                             __cvmx_helper_cfg_pko_port_num(i, j));
+               }
+       }
+
+       for (i = 0; i < CVMX_HELPER_CFG_MAX_PKO_PORT; i++) {
+               if (__cvmx_helper_cfg_pko_queue_base(i) !=
+                   CVMX_HELPER_CFG_INVALID_VALUE) {
+                       debug("%s: pko_port%d qbase%d nqueues%d interface%d index%d\n",
+                             __func__, i, __cvmx_helper_cfg_pko_queue_base(i),
+                             __cvmx_helper_cfg_pko_queue_num(i),
+                             __cvmx_helper_cfg_pko_port_interface(i),
+                             __cvmx_helper_cfg_pko_port_index(i));
+               }
+       }
+}
+
+/*
+ * initialize cvmx_cfg_pko_port_map
+ */
+void cvmx_helper_cfg_init_pko_port_map(void)
+{
+       int i, j, k;
+       int pko_eid;
+       int pko_port_base, pko_port_max;
+       cvmx_helper_interface_mode_t mode;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       /*
+        * one pko_eid is allocated to each port except for ILK, NPI, and
+        * LOOP. Each of the three has one eid.
+        */
+       pko_eid = 0;
+       for (i = 0; i < cvmx_helper_get_number_of_interfaces(); i++) {
+               mode = cvmx_helper_interface_get_mode(i);
+               for (j = 0; j < cvmx_helper_interface_enumerate(i); j++) {
+                       pko_port_base = cvmx_cfg_port[0][i][j].ccpp_pko_port_base;
+                       pko_port_max = pko_port_base + cvmx_cfg_port[0][i][j].ccpp_pko_num_ports;
+                       if (!octeon_has_feature(OCTEON_FEATURE_PKO3)) {
+                               cvmx_helper_cfg_assert(pko_port_base !=
+                                                      CVMX_HELPER_CFG_INVALID_VALUE);
+                               cvmx_helper_cfg_assert(pko_port_max >= pko_port_base);
+                       }
+                       for (k = pko_port_base; k < pko_port_max; k++) {
+                               cvmx_cfg_pko_port_map[k].ccppl_interface = i;
+                               cvmx_cfg_pko_port_map[k].ccppl_index = j;
+                               cvmx_cfg_pko_port_map[k].ccppl_eid = pko_eid;
+                       }
+
+                       if (!(mode == CVMX_HELPER_INTERFACE_MODE_NPI ||
+                             mode == CVMX_HELPER_INTERFACE_MODE_LOOP ||
+                             mode == CVMX_HELPER_INTERFACE_MODE_ILK))
+                               pko_eid++;
+               }
+
+               if (mode == CVMX_HELPER_INTERFACE_MODE_NPI ||
+                   mode == CVMX_HELPER_INTERFACE_MODE_LOOP ||
+                   mode == CVMX_HELPER_INTERFACE_MODE_ILK)
+                       pko_eid++;
+       }
+
+       /*
+        * Legal pko_eids [0, 0x13] should not be exhausted.
+        */
+       if (!octeon_has_feature(OCTEON_FEATURE_PKO3))
+               cvmx_helper_cfg_assert(pko_eid <= 0x14);
+
+       cvmx_cfg_max_pko_engines = pko_eid;
+}
+
+void cvmx_helper_cfg_set_jabber_and_frame_max(void)
+{
+       int interface, port;
+       /*Set the frame max size and jabber size to 65535. */
+       const unsigned int max_frame = 65535;
+
+       // FIXME: should support node argument for remote node init
+       if (octeon_has_feature(OCTEON_FEATURE_BGX)) {
+               int ipd_port;
+               int node = cvmx_get_node_num();
+
+               for (interface = 0;
+                    interface < cvmx_helper_get_number_of_interfaces();
+                    interface++) {
+                       int xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+                       cvmx_helper_interface_mode_t imode = cvmx_helper_interface_get_mode(xiface);
+                       int num_ports = cvmx_helper_ports_on_interface(xiface);
+
+                       // FIXME: should be an easier way to determine
+                       // that an interface is Ethernet/BGX
+                       switch (imode) {
+                       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+                       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+                       case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+                       case CVMX_HELPER_INTERFACE_MODE_XLAUI:
+                       case CVMX_HELPER_INTERFACE_MODE_XFI:
+                       case CVMX_HELPER_INTERFACE_MODE_10G_KR:
+                       case CVMX_HELPER_INTERFACE_MODE_40G_KR4:
+                               for (port = 0; port < num_ports; port++) {
+                                       ipd_port = cvmx_helper_get_ipd_port(xiface, port);
+                                       cvmx_pki_set_max_frm_len(ipd_port, max_frame);
+                                       cvmx_helper_bgx_set_jabber(xiface, port, max_frame);
+                               }
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       } else {
+               /*Set the frame max size and jabber size to 65535. */
+               for (interface = 0; interface < cvmx_helper_get_number_of_interfaces();
+                    interface++) {
+                       int xiface = cvmx_helper_node_interface_to_xiface(cvmx_get_node_num(),
+                                                                         interface);
+                       /*
+                        * Set the frame max size and jabber size to 65535, as the defaults
+                        * are too small.
+                        */
+                       cvmx_helper_interface_mode_t imode = cvmx_helper_interface_get_mode(xiface);
+                       int num_ports = cvmx_helper_ports_on_interface(xiface);
+
+                       switch (imode) {
+                       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+                       case CVMX_HELPER_INTERFACE_MODE_QSGMII:
+                       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+                       case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+                               for (port = 0; port < num_ports; port++)
+                                       csr_wr(CVMX_GMXX_RXX_JABBER(port, interface), 65535);
+                               /* Set max and min value for frame check */
+                               cvmx_pip_set_frame_check(interface, -1);
+                               break;
+
+                       case CVMX_HELPER_INTERFACE_MODE_RGMII:
+                       case CVMX_HELPER_INTERFACE_MODE_GMII:
+                               /* Set max and min value for frame check */
+                               cvmx_pip_set_frame_check(interface, -1);
+                               for (port = 0; port < num_ports; port++) {
+                                       csr_wr(CVMX_GMXX_RXX_FRM_MAX(port, interface), 65535);
+                                       csr_wr(CVMX_GMXX_RXX_JABBER(port, interface), 65535);
+                               }
+                               break;
+                       case CVMX_HELPER_INTERFACE_MODE_ILK:
+                               /* Set max and min value for frame check */
+                               cvmx_pip_set_frame_check(interface, -1);
+                               for (port = 0; port < num_ports; port++) {
+                                       int ipd_port = cvmx_helper_get_ipd_port(interface, port);
+
+                                       cvmx_ilk_enable_la_header(ipd_port, 0);
+                               }
+                               break;
+                       case CVMX_HELPER_INTERFACE_MODE_SRIO:
+                               /* Set max and min value for frame check */
+                               cvmx_pip_set_frame_check(interface, -1);
+                               break;
+                       case CVMX_HELPER_INTERFACE_MODE_AGL:
+                               /* Set max and min value for frame check */
+                               cvmx_pip_set_frame_check(interface, -1);
+                               csr_wr(CVMX_AGL_GMX_RXX_FRM_MAX(0), 65535);
+                               csr_wr(CVMX_AGL_GMX_RXX_JABBER(0), 65535);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       }
+}
+
+/**
+ * Enable storing short packets only in the WQE
+ * unless NO_WPTR is set, which already has the same effect
+ */
+void cvmx_helper_cfg_store_short_packets_in_wqe(void)
+{
+       int interface, port;
+       cvmx_ipd_ctl_status_t ipd_ctl_status;
+       unsigned int dyn_rs = 1;
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKI))
+               return;
+
+       /* NO_WPTR combines WQE with 1st MBUF, RS is redundant */
+       ipd_ctl_status.u64 = csr_rd(CVMX_IPD_CTL_STATUS);
+       if (ipd_ctl_status.s.no_wptr) {
+               dyn_rs = 0;
+               /* Note: consider also setting 'ignrs' wtn NO_WPTR is set */
+       }
+
+       for (interface = 0; interface < cvmx_helper_get_number_of_interfaces(); interface++) {
+               int num_ports = cvmx_helper_ports_on_interface(interface);
+
+               for (port = 0; port < num_ports; port++) {
+                       cvmx_pip_port_cfg_t port_cfg;
+                       int pknd = port;
+
+                       if (octeon_has_feature(OCTEON_FEATURE_PKND))
+                               pknd = cvmx_helper_get_pknd(interface, port);
+                       else
+                               pknd = cvmx_helper_get_ipd_port(interface, port);
+                       port_cfg.u64 = csr_rd(CVMX_PIP_PRT_CFGX(pknd));
+                       port_cfg.s.dyn_rs = dyn_rs;
+                       csr_wr(CVMX_PIP_PRT_CFGX(pknd), port_cfg.u64);
+               }
+       }
+}
+
+int __cvmx_helper_cfg_pko_port_interface(int pko_port)
+{
+       return cvmx_cfg_pko_port_map[pko_port].ccppl_interface;
+}
+
+int __cvmx_helper_cfg_pko_port_index(int pko_port)
+{
+       return cvmx_cfg_pko_port_map[pko_port].ccppl_index;
+}
+
+int __cvmx_helper_cfg_pko_port_eid(int pko_port)
+{
+       return cvmx_cfg_pko_port_map[pko_port].ccppl_eid;
+}
+
+#define IPD2PKO_CACHE_Y(ipd_port) (ipd_port) >> 8
+#define IPD2PKO_CACHE_X(ipd_port) (ipd_port) & 0xff
+
+static inline int __cvmx_helper_cfg_ipd2pko_cachex(int ipd_port)
+{
+       int ipd_x = IPD2PKO_CACHE_X(ipd_port);
+
+       if (ipd_port & 0x800)
+               ipd_x = (ipd_x >> 4) & 3;
+       return ipd_x;
+}
+
+/*
+ * ipd_port to pko_port translation cache
+ */
+int __cvmx_helper_cfg_init_ipd2pko_cache(void)
+{
+       int i, j, n;
+       int ipd_y, ipd_x, ipd_port;
+
+       for (i = 0; i < cvmx_helper_get_number_of_interfaces(); i++) {
+               n = cvmx_helper_interface_enumerate(i);
+
+               for (j = 0; j < n; j++) {
+                       ipd_port = cvmx_helper_get_ipd_port(i, j);
+                       ipd_y = IPD2PKO_CACHE_Y(ipd_port);
+                       ipd_x = __cvmx_helper_cfg_ipd2pko_cachex(ipd_port);
+                       ipd2pko_port_cache[ipd_y][ipd_x] = (struct cvmx_cfg_pko_port_pair){
+                               __cvmx_helper_cfg_pko_port_base(i, j),
+                               __cvmx_helper_cfg_pko_port_num(i, j)
+                       };
+               }
+       }
+
+       return 0;
+}
+
+int cvmx_helper_cfg_ipd2pko_port_base(int ipd_port)
+{
+       int ipd_y, ipd_x;
+
+       /* Internal PKO ports are not present in PKO3 */
+       if (octeon_has_feature(OCTEON_FEATURE_PKI))
+               return ipd_port;
+
+       ipd_y = IPD2PKO_CACHE_Y(ipd_port);
+       ipd_x = __cvmx_helper_cfg_ipd2pko_cachex(ipd_port);
+
+       return ipd2pko_port_cache[ipd_y][ipd_x].ccppp_base_port;
+}
+
+int cvmx_helper_cfg_ipd2pko_port_num(int ipd_port)
+{
+       int ipd_y, ipd_x;
+
+       ipd_y = IPD2PKO_CACHE_Y(ipd_port);
+       ipd_x = __cvmx_helper_cfg_ipd2pko_cachex(ipd_port);
+
+       return ipd2pko_port_cache[ipd_y][ipd_x].ccppp_nports;
+}
+
+/**
+ * Return the number of queues to be assigned to this pko_port
+ *
+ * @param pko_port
+ * @return the number of queues for this pko_port
+ *
+ */
+static int cvmx_helper_cfg_dft_nqueues(int pko_port)
+{
+       cvmx_helper_interface_mode_t mode;
+       int interface;
+       int n;
+       int ret;
+
+       interface = __cvmx_helper_cfg_pko_port_interface(pko_port);
+       mode = cvmx_helper_interface_get_mode(interface);
+
+       n = NUM_ELEMENTS(__cvmx_pko_queue_static_config[0].pknd.pko_cfg_iface);
+
+       if (mode == CVMX_HELPER_INTERFACE_MODE_LOOP) {
+               ret = __cvmx_pko_queue_static_config[0].pknd.pko_cfg_loop.queues_per_port;
+       } else if (mode == CVMX_HELPER_INTERFACE_MODE_NPI) {
+               ret = __cvmx_pko_queue_static_config[0].pknd.pko_cfg_npi.queues_per_port;
+       }
+
+       else if ((interface >= 0) && (interface < n)) {
+               ret = __cvmx_pko_queue_static_config[0].pknd.pko_cfg_iface[interface].queues_per_port;
+       } else {
+               /* Should never be called */
+               ret = 1;
+       }
+       /* Override for sanity in case of empty static config table */
+       if (ret == 0)
+               ret = 1;
+       return ret;
+}
+
+static int cvmx_helper_cfg_init_pko_iports_and_queues_using_static_config(void)
+{
+       int pko_port_base = 0;
+       int cvmx_cfg_default_pko_nports = 1;
+       int i, j, n, k;
+       int rv = 0;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       /* When not using config file, each port is assigned one internal pko port*/
+       for (i = 0; i < cvmx_helper_get_number_of_interfaces(); i++) {
+               n = cvmx_helper_interface_enumerate(i);
+               for (j = 0; j < n; j++) {
+                       cvmx_cfg_port[0][i][j].ccpp_pko_port_base = pko_port_base;
+                       cvmx_cfg_port[0][i][j].ccpp_pko_num_ports = cvmx_cfg_default_pko_nports;
+                       /*
+                        * Initialize interface early here so that the
+                        * cvmx_helper_cfg_dft_nqueues() below
+                        * can get the interface number corresponding to the
+                        * pko port
+                        */
+                       for (k = pko_port_base; k < pko_port_base + cvmx_cfg_default_pko_nports;
+                            k++) {
+                               cvmx_cfg_pko_port_map[k].ccppl_interface = i;
+                       }
+                       pko_port_base += cvmx_cfg_default_pko_nports;
+               }
+       }
+       cvmx_helper_cfg_assert(pko_port_base <= CVMX_HELPER_CFG_MAX_PKO_PORT);
+
+       /* Assigning queues per pko */
+       for (i = 0; i < pko_port_base; i++) {
+               int base;
+
+               n = cvmx_helper_cfg_dft_nqueues(i);
+               base = cvmx_pko_queue_alloc(i, n);
+               if (base == -1) {
+                       printf("ERROR: %s: failed to alloc %d queues for pko port=%d\n", __func__,
+                              n, i);
+                       rv = -1;
+               }
+       }
+       return rv;
+}
+
+/**
+ * Returns if port is valid for a given interface
+ *
+ * @param xiface  interface to check
+ * @param index      port index in the interface
+ *
+ * @return status of the port present or not.
+ */
+int cvmx_helper_is_port_valid(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].valid;
+}
+
+void cvmx_helper_set_port_valid(int xiface, int index, bool valid)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].valid = valid;
+}
+
+void cvmx_helper_set_mac_phy_mode(int xiface, int index, bool valid)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].sgmii_phy_mode = valid;
+}
+
+bool cvmx_helper_get_mac_phy_mode(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].sgmii_phy_mode;
+}
+
+void cvmx_helper_set_1000x_mode(int xiface, int index, bool valid)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].sgmii_1000x_mode = valid;
+}
+
+bool cvmx_helper_get_1000x_mode(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].sgmii_1000x_mode;
+}
+
+void cvmx_helper_set_agl_rx_clock_delay_bypass(int xiface, int index, bool valid)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].agl_rx_clk_delay_bypass = valid;
+}
+
+bool cvmx_helper_get_agl_rx_clock_delay_bypass(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].agl_rx_clk_delay_bypass;
+}
+
+void cvmx_helper_set_agl_rx_clock_skew(int xiface, int index, uint8_t value)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].agl_rx_clk_skew = value;
+}
+
+uint8_t cvmx_helper_get_agl_rx_clock_skew(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].agl_rx_clk_skew;
+}
+
+void cvmx_helper_set_agl_refclk_sel(int xiface, int index, uint8_t value)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].agl_refclk_sel = value;
+}
+
+uint8_t cvmx_helper_get_agl_refclk_sel(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].agl_refclk_sel;
+}
+
+void cvmx_helper_set_port_force_link_up(int xiface, int index, bool value)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].force_link_up = value;
+}
+
+bool cvmx_helper_get_port_force_link_up(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].force_link_up;
+}
+
+void cvmx_helper_set_port_phy_present(int xiface, int index, bool value)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].phy_present = value;
+}
+
+bool cvmx_helper_get_port_phy_present(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].phy_present;
+}
+
+int __cvmx_helper_init_port_valid(void)
+{
+       int i, j, node;
+       bool valid;
+       static void *fdt_addr;
+       int rc;
+       struct cvmx_coremask pcm;
+
+       octeon_get_available_coremask(&pcm);
+
+       if (fdt_addr == 0)
+               fdt_addr = __cvmx_phys_addr_to_ptr((u64)gd->fdt_blob, 128 * 1024);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       if (octeon_has_feature(OCTEON_FEATURE_BGX)) {
+               rc = __cvmx_helper_parse_bgx_dt(fdt_addr);
+               if (!rc)
+                       rc = __cvmx_fdt_parse_vsc7224(fdt_addr);
+               if (!rc)
+                       rc = __cvmx_fdt_parse_avsp5410(fdt_addr);
+               if (!rc && octeon_has_feature(OCTEON_FEATURE_BGX_XCV))
+                       rc = __cvmx_helper_parse_bgx_rgmii_dt(fdt_addr);
+
+               /* Some ports are not in sequence, the device tree does not
+                * clear them.
+                *
+                * Also clear any ports that are not defined in the device tree.
+                * Apply this to each node.
+                */
+               for (node = 0; node < CVMX_MAX_NODES; node++) {
+                       if (!cvmx_coremask_get64_node(&pcm, node))
+                               continue;
+                       for (i = 0; i < CVMX_HELPER_MAX_GMX; i++) {
+                               int j;
+                               int xiface = cvmx_helper_node_interface_to_xiface(node, i);
+
+                               for (j = 0; j < cvmx_helper_interface_enumerate(i); j++) {
+                                       cvmx_bgxx_cmrx_config_t cmr_config;
+
+                                       cmr_config.u64 =
+                                               csr_rd_node(node, CVMX_BGXX_CMRX_CONFIG(j, i));
+                                       if ((cmr_config.s.lane_to_sds == 0xe4 &&
+                                            cmr_config.s.lmac_type != 4 &&
+                                            cmr_config.s.lmac_type != 1 &&
+                                            cmr_config.s.lmac_type != 5) ||
+                                           ((cvmx_helper_get_port_fdt_node_offset(xiface, j) ==
+                                             CVMX_HELPER_CFG_INVALID_VALUE)))
+                                               cvmx_helper_set_port_valid(xiface, j, false);
+                               }
+                       }
+               }
+               return rc;
+       }
+
+       /* TODO: Update this to behave more like 78XX */
+       for (i = 0; i < cvmx_helper_get_number_of_interfaces(); i++) {
+               int n = cvmx_helper_interface_enumerate(i);
+
+               for (j = 0; j < n; j++) {
+                       int ipd_port = cvmx_helper_get_ipd_port(i, j);
+
+                       valid = (__cvmx_helper_board_get_port_from_dt(fdt_addr, ipd_port) == 1);
+                       cvmx_helper_set_port_valid(i, j, valid);
+               }
+       }
+       return 0;
+}
+
+typedef int (*cvmx_import_config_t)(void);
+cvmx_import_config_t cvmx_import_app_config;
+
+int __cvmx_helper_init_port_config_data_local(void)
+{
+       int rv = 0;
+       int dbg = 0;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               if (cvmx_import_app_config) {
+                       rv = (*cvmx_import_app_config)();
+                       if (rv != 0) {
+                               debug("failed to import config\n");
+                               return -1;
+                       }
+               }
+
+               cvmx_helper_cfg_init_pko_port_map();
+               __cvmx_helper_cfg_init_ipd2pko_cache();
+       } else {
+               if (cvmx_import_app_config) {
+                       rv = (*cvmx_import_app_config)();
+                       if (rv != 0) {
+                               debug("failed to import config\n");
+                               return -1;
+                       }
+               }
+       }
+       if (dbg) {
+               cvmx_helper_cfg_show_cfg();
+               cvmx_pko_queue_show();
+       }
+       return rv;
+}
+
+/*
+ * This call is made from Linux octeon_ethernet driver
+ * to setup the PKO with a specific queue count and
+ * internal port count configuration.
+ */
+int cvmx_pko_alloc_iport_and_queues(int interface, int port, int port_cnt, int queue_cnt)
+{
+       int rv, p, port_start, cnt;
+
+       if (dbg)
+               debug("%s: intf %d/%d pcnt %d qcnt %d\n", __func__, interface, port, port_cnt,
+                     queue_cnt);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               rv = cvmx_pko_internal_ports_alloc(interface, port, port_cnt);
+               if (rv < 0) {
+                       printf("ERROR: %s: failed to allocate internal ports forinterface=%d port=%d cnt=%d\n",
+                              __func__, interface, port, port_cnt);
+                       return -1;
+               }
+               port_start = __cvmx_helper_cfg_pko_port_base(interface, port);
+               cnt = __cvmx_helper_cfg_pko_port_num(interface, port);
+       } else {
+               port_start = cvmx_helper_get_ipd_port(interface, port);
+               cnt = 1;
+       }
+
+       for (p = port_start; p < port_start + cnt; p++) {
+               rv = cvmx_pko_queue_alloc(p, queue_cnt);
+               if (rv < 0) {
+                       printf("ERROR: %s: failed to allocate queues for port=%d cnt=%d\n",
+                              __func__, p, queue_cnt);
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+static void cvmx_init_port_cfg(void)
+{
+       int node, i, j;
+
+       if (port_cfg_data_initialized)
+               return;
+
+       for (node = 0; node < CVMX_MAX_NODES; node++) {
+               for (i = 0; i < CVMX_HELPER_MAX_IFACE; i++) {
+                       for (j = 0; j < CVMX_HELPER_CFG_MAX_PORT_PER_IFACE; j++) {
+                               struct cvmx_cfg_port_param *pcfg;
+                               struct cvmx_srio_port_param *sr;
+
+                               pcfg = &cvmx_cfg_port[node][i][j];
+                               memset(pcfg, 0, sizeof(*pcfg));
+
+                               pcfg->port_fdt_node = CVMX_HELPER_CFG_INVALID_VALUE;
+                               pcfg->phy_fdt_node = CVMX_HELPER_CFG_INVALID_VALUE;
+                               pcfg->phy_info = NULL;
+                               pcfg->ccpp_pknd = CVMX_HELPER_CFG_INVALID_VALUE;
+                               pcfg->ccpp_bpid = CVMX_HELPER_CFG_INVALID_VALUE;
+                               pcfg->ccpp_pko_port_base = CVMX_HELPER_CFG_INVALID_VALUE;
+                               pcfg->ccpp_pko_num_ports = CVMX_HELPER_CFG_INVALID_VALUE;
+                               pcfg->agl_rx_clk_skew = 0;
+                               pcfg->valid = true;
+                               pcfg->sgmii_phy_mode = false;
+                               pcfg->sgmii_1000x_mode = false;
+                               pcfg->agl_rx_clk_delay_bypass = false;
+                               pcfg->force_link_up = false;
+                               pcfg->disable_an = false;
+                               pcfg->link_down_pwr_dn = false;
+                               pcfg->phy_present = false;
+                               pcfg->tx_clk_delay_bypass = false;
+                               pcfg->rgmii_tx_clk_delay = 0;
+                               pcfg->enable_fec = false;
+                               sr = &pcfg->srio_short;
+                               sr->srio_rx_ctle_agc_override = false;
+                               sr->srio_rx_ctle_zero = 0x6;
+                               sr->srio_rx_agc_pre_ctle = 0x5;
+                               sr->srio_rx_agc_post_ctle = 0x4;
+                               sr->srio_tx_swing_override = false;
+                               sr->srio_tx_swing = 0x7;
+                               sr->srio_tx_premptap_override = false;
+                               sr->srio_tx_premptap_pre = 0;
+                               sr->srio_tx_premptap_post = 0xF;
+                               sr->srio_tx_gain_override = false;
+                               sr->srio_tx_gain = 0x3;
+                               sr->srio_tx_vboost_override = 0;
+                               sr->srio_tx_vboost = true;
+                               sr = &pcfg->srio_long;
+                               sr->srio_rx_ctle_agc_override = false;
+                               sr->srio_rx_ctle_zero = 0x6;
+                               sr->srio_rx_agc_pre_ctle = 0x5;
+                               sr->srio_rx_agc_post_ctle = 0x4;
+                               sr->srio_tx_swing_override = false;
+                               sr->srio_tx_swing = 0x7;
+                               sr->srio_tx_premptap_override = false;
+                               sr->srio_tx_premptap_pre = 0;
+                               sr->srio_tx_premptap_post = 0xF;
+                               sr->srio_tx_gain_override = false;
+                               sr->srio_tx_gain = 0x3;
+                               sr->srio_tx_vboost_override = 0;
+                               sr->srio_tx_vboost = true;
+                               pcfg->agl_refclk_sel = 0;
+                               pcfg->sfp_of_offset = -1;
+                               pcfg->vsc7224_chan = NULL;
+                       }
+               }
+       }
+       port_cfg_data_initialized = true;
+}
+
+int __cvmx_helper_init_port_config_data(int node)
+{
+       int rv = 0;
+       int i, j, n;
+       int num_interfaces, interface;
+       int pknd = 0, bpid = 0;
+       const int use_static_config = 1;
+
+       if (dbg)
+               printf("%s:\n", __func__);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               /* PKO3: only needs BPID, PKND to be setup,
+                * while the rest of PKO3 init is done in cvmx-helper-pko3.c
+                */
+               pknd = 0;
+               bpid = 0;
+               for (i = 0; i < cvmx_helper_get_number_of_interfaces(); i++) {
+                       int xiface = cvmx_helper_node_interface_to_xiface(node, i);
+
+                       n = cvmx_helper_interface_enumerate(xiface);
+                       /*
+                        * Assign 8 pknds to ILK interface, these pknds will be
+                        * distributed among the channels configured
+                        */
+                       if (cvmx_helper_interface_get_mode(xiface) ==
+                           CVMX_HELPER_INTERFACE_MODE_ILK) {
+                               if (n > 8)
+                                       n = 8;
+                       }
+                       if (cvmx_helper_interface_get_mode(xiface) !=
+                           CVMX_HELPER_INTERFACE_MODE_NPI) {
+                               for (j = 0; j < n; j++) {
+                                       struct cvmx_cfg_port_param *pcfg;
+
+                                       pcfg = &cvmx_cfg_port[node][i][j];
+                                       pcfg->ccpp_pknd = pknd++;
+                                       pcfg->ccpp_bpid = bpid++;
+                               }
+                       } else {
+                               for (j = 0; j < n; j++) {
+                                       if (j == n / cvmx_npi_max_pknds) {
+                                               pknd++;
+                                               bpid++;
+                                       }
+                                       cvmx_cfg_port[node][i][j].ccpp_pknd = pknd;
+                                       cvmx_cfg_port[node][i][j].ccpp_bpid = bpid;
+                               }
+                               pknd++;
+                               bpid++;
+                       }
+               } /* for i=0 */
+               cvmx_helper_cfg_assert(pknd <= CVMX_HELPER_CFG_MAX_PIP_PKND);
+               cvmx_helper_cfg_assert(bpid <= CVMX_HELPER_CFG_MAX_PIP_BPID);
+       } else if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               if (use_static_config)
+                       cvmx_helper_cfg_init_pko_iports_and_queues_using_static_config();
+
+               /* Initialize pknd and bpid */
+               for (i = 0; i < cvmx_helper_get_number_of_interfaces(); i++) {
+                       n = cvmx_helper_interface_enumerate(i);
+                       for (j = 0; j < n; j++) {
+                               cvmx_cfg_port[0][i][j].ccpp_pknd = pknd++;
+                               cvmx_cfg_port[0][i][j].ccpp_bpid = bpid++;
+                       }
+               }
+               cvmx_helper_cfg_assert(pknd <= CVMX_HELPER_CFG_MAX_PIP_PKND);
+               cvmx_helper_cfg_assert(bpid <= CVMX_HELPER_CFG_MAX_PIP_BPID);
+       } else {
+               if (use_static_config)
+                       cvmx_pko_queue_init_from_cvmx_config_non_pknd();
+       }
+
+       /* Remainder not used for PKO3 */
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               return 0;
+
+       /* init ports, queues which are not initialized */
+       num_interfaces = cvmx_helper_get_number_of_interfaces();
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int num_ports = __cvmx_helper_early_ports_on_interface(interface);
+               int port, port_base, queue;
+
+               for (port = 0; port < num_ports; port++) {
+                       bool init_req = false;
+
+                       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+                               port_base = __cvmx_helper_cfg_pko_port_base(interface, port);
+                               if (port_base == CVMX_HELPER_CFG_INVALID_VALUE)
+                                       init_req = true;
+                       } else {
+                               port_base = cvmx_helper_get_ipd_port(interface, port);
+                               queue = __cvmx_helper_cfg_pko_queue_base(port_base);
+                               if (queue == CVMX_HELPER_CFG_INVALID_VALUE)
+                                       init_req = true;
+                       }
+
+                       if (init_req) {
+                               rv = cvmx_pko_alloc_iport_and_queues(interface, port, 1, 1);
+                               if (rv < 0) {
+                                       debug("cvm_pko_alloc_iport_and_queues failed.\n");
+                                       return rv;
+                               }
+                       }
+               }
+       }
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               cvmx_helper_cfg_init_pko_port_map();
+               __cvmx_helper_cfg_init_ipd2pko_cache();
+       }
+
+       if (dbg) {
+               cvmx_helper_cfg_show_cfg();
+               cvmx_pko_queue_show();
+       }
+       return rv;
+}
+
+/**
+ * @INTERNAL
+ * Store the FDT node offset in the device tree of a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param node_offset  node offset to store
+ */
+void cvmx_helper_set_port_fdt_node_offset(int xiface, int index, int node_offset)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].port_fdt_node = node_offset;
+}
+
+/**
+ * @INTERNAL
+ * Return the FDT node offset in the device tree of a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @return             node offset of port or -1 if invalid
+ */
+int cvmx_helper_get_port_fdt_node_offset(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].port_fdt_node;
+}
+
+/**
+ * Search for a port based on its FDT node offset
+ *
+ * @param      of_offset       Node offset of port to search for
+ * @param[out] xiface          xinterface of match
+ * @param[out] index           port index of match
+ *
+ * @return     0 if found, -1 if not found
+ */
+int cvmx_helper_cfg_get_xiface_index_by_fdt_node_offset(int of_offset, int *xiface, int *index)
+{
+       int iface;
+       int i;
+       int node;
+       struct cvmx_cfg_port_param *pcfg = NULL;
+       *xiface = -1;
+       *index = -1;
+
+       for (node = 0; node < CVMX_MAX_NODES; node++) {
+               for (iface = 0; iface < CVMX_HELPER_MAX_IFACE; iface++) {
+                       for (i = 0; i < CVMX_HELPER_CFG_MAX_PORT_PER_IFACE; i++) {
+                               pcfg = &cvmx_cfg_port[node][iface][i];
+                               if (pcfg->valid && pcfg->port_fdt_node == of_offset) {
+                                       *xiface = cvmx_helper_node_interface_to_xiface(node, iface);
+                                       *index = i;
+                                       return 0;
+                               }
+                       }
+               }
+       }
+       return -1;
+}
+
+/**
+ * @INTERNAL
+ * Store the FDT node offset in the device tree of a phy
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param node_offset  node offset to store
+ */
+void cvmx_helper_set_phy_fdt_node_offset(int xiface, int index, int node_offset)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].phy_fdt_node = node_offset;
+}
+
+/**
+ * @INTERNAL
+ * Return the FDT node offset in the device tree of a phy
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @return             node offset of phy or -1 if invalid
+ */
+int cvmx_helper_get_phy_fdt_node_offset(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].phy_fdt_node;
+}
+
+/**
+ * @INTERNAL
+ * Override default autonegotiation for a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param enable       true to enable autonegotiation, false to force full
+ *                     duplex, full speed.
+ */
+void cvmx_helper_set_port_autonegotiation(int xiface, int index, bool enable)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].disable_an = !enable;
+}
+
+/**
+ * @INTERNAL
+ * Returns if autonegotiation is enabled or not.
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return 0 if autonegotiation is disabled, 1 if enabled.
+ */
+bool cvmx_helper_get_port_autonegotiation(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return !cvmx_cfg_port[xi.node][xi.interface][index].disable_an;
+}
+
+/**
+ * @INTERNAL
+ * Override default forward error correction for a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param enable       true to enable fec, false to disable it
+ */
+void cvmx_helper_set_port_fec(int xiface, int index, bool enable)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].enable_fec = enable;
+}
+
+/**
+ * @INTERNAL
+ * Returns if forward error correction is enabled or not.
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return false if fec is disabled, true if enabled.
+ */
+bool cvmx_helper_get_port_fec(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].enable_fec;
+}
+
+/**
+ * @INTERNAL
+ * Configure the SRIO RX interface AGC settings for host mode
+ *
+ * @param xiface       node and interface
+ * @param index                lane
+ * @param long_run     true for long run, false for short run
+ * @param agc_override true to put AGC in manual mode
+ * @param ctle_zero    RX equalizer peaking control (default 0x6)
+ * @param agc_pre_ctle AGC pre-CTLE gain (default 0x5)
+ * @param agc_post_ctle        AGC post-CTLE gain (default 0x4)
+ *
+ * NOTE: This must be called before SRIO is initialized to take effect
+ */
+void cvmx_helper_set_srio_rx(int xiface, int index, bool long_run, bool ctle_zero_override,
+                            u8 ctle_zero, bool agc_override, uint8_t agc_pre_ctle,
+                            uint8_t agc_post_ctle)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_cfg_port_param *pcfg = &cvmx_cfg_port[xi.node][xi.interface][index];
+       struct cvmx_srio_port_param *sr = long_run ? &pcfg->srio_long : &pcfg->srio_short;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       sr->srio_rx_ctle_zero_override = ctle_zero_override;
+       sr->srio_rx_ctle_zero = ctle_zero;
+       sr->srio_rx_ctle_agc_override = agc_override;
+       sr->srio_rx_agc_pre_ctle = agc_pre_ctle;
+       sr->srio_rx_agc_post_ctle = agc_post_ctle;
+}
+
+/**
+ * @INTERNAL
+ * Get the SRIO RX interface AGC settings for host mode
+ *
+ * @param xiface       node and interface
+ * @param index                lane
+ * @param long_run     true for long run, false for short run
+ * @param[out] agc_override    true to put AGC in manual mode
+ * @param[out] ctle_zero       RX equalizer peaking control (default 0x6)
+ * @param[out] agc_pre_ctle    AGC pre-CTLE gain (default 0x5)
+ * @param[out] agc_post_ctle   AGC post-CTLE gain (default 0x4)
+ */
+void cvmx_helper_get_srio_rx(int xiface, int index, bool long_run, bool *ctle_zero_override,
+                            u8 *ctle_zero, bool *agc_override, uint8_t *agc_pre_ctle,
+                            uint8_t *agc_post_ctle)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_cfg_port_param *pcfg = &cvmx_cfg_port[xi.node][xi.interface][index];
+       struct cvmx_srio_port_param *sr = long_run ? &pcfg->srio_long : &pcfg->srio_short;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       if (ctle_zero_override)
+               *ctle_zero_override = sr->srio_rx_ctle_zero_override;
+       if (ctle_zero)
+               *ctle_zero = sr->srio_rx_ctle_zero;
+       if (agc_override)
+               *agc_override = sr->srio_rx_ctle_agc_override;
+       if (agc_pre_ctle)
+               *agc_pre_ctle = sr->srio_rx_agc_pre_ctle;
+       if (agc_post_ctle)
+               *agc_post_ctle = sr->srio_rx_agc_post_ctle;
+}
+
+/**
+ * @INTERNAL
+ * Configure the SRIO TX interface for host mode
+ *
+ * @param xiface               node and interface
+ * @param index                        lane
+ * @param long_run             true for long run, false for short run
+ * @param tx_swing             tx swing value to use (default 0x7), -1 to not
+ *                             override.
+ * @param tx_gain              PCS SDS TX gain (default 0x3), -1 to not
+ *                             override
+ * @param tx_premptap_override true to override preemphasis control
+ * @param tx_premptap_pre      preemphasis pre tap value (default 0x0)
+ * @param tx_premptap_post     preemphasis post tap value (default 0xF)
+ * @param tx_vboost            vboost enable (1 = enable, -1 = don't override)
+ *                             hardware default is 1.
+ *
+ * NOTE: This must be called before SRIO is initialized to take effect
+ */
+void cvmx_helper_set_srio_tx(int xiface, int index, bool long_run, int tx_swing, int tx_gain,
+                            bool tx_premptap_override, uint8_t tx_premptap_pre,
+                            u8 tx_premptap_post, int tx_vboost)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_cfg_port_param *pcfg = &cvmx_cfg_port[xi.node][xi.interface][index];
+       struct cvmx_srio_port_param *sr = long_run ? &pcfg->srio_long : &pcfg->srio_short;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       sr->srio_tx_swing_override = (tx_swing != -1);
+       sr->srio_tx_swing = tx_swing != -1 ? tx_swing : 0x7;
+       sr->srio_tx_gain_override = (tx_gain != -1);
+       sr->srio_tx_gain = tx_gain != -1 ? tx_gain : 0x3;
+       sr->srio_tx_premptap_override = tx_premptap_override;
+       sr->srio_tx_premptap_pre = tx_premptap_override ? tx_premptap_pre : 0;
+       sr->srio_tx_premptap_post = tx_premptap_override ? tx_premptap_post : 0xF;
+       sr->srio_tx_vboost_override = tx_vboost != -1;
+       sr->srio_tx_vboost = (tx_vboost != -1) ? tx_vboost : 1;
+}
+
+/**
+ * @INTERNAL
+ * Get the SRIO TX interface settings for host mode
+ *
+ * @param xiface                       node and interface
+ * @param index                                lane
+ * @param long_run                     true for long run, false for short run
+ * @param[out] tx_swing_override       true to override pcs_sds_txX_swing
+ * @param[out] tx_swing                        tx swing value to use (default 0x7)
+ * @param[out] tx_gain_override                true to override default gain
+ * @param[out] tx_gain                 PCS SDS TX gain (default 0x3)
+ * @param[out] tx_premptap_override    true to override preemphasis control
+ * @param[out] tx_premptap_pre         preemphasis pre tap value (default 0x0)
+ * @param[out] tx_premptap_post                preemphasis post tap value (default 0xF)
+ * @param[out] tx_vboost_override      override vboost setting
+ * @param[out] tx_vboost               vboost enable (default true)
+ */
+void cvmx_helper_get_srio_tx(int xiface, int index, bool long_run, bool *tx_swing_override,
+                            u8 *tx_swing, bool *tx_gain_override, uint8_t *tx_gain,
+                            bool *tx_premptap_override, uint8_t *tx_premptap_pre,
+                            u8 *tx_premptap_post, bool *tx_vboost_override, bool *tx_vboost)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_cfg_port_param *pcfg = &cvmx_cfg_port[xi.node][xi.interface][index];
+       struct cvmx_srio_port_param *sr = long_run ? &pcfg->srio_long : &pcfg->srio_short;
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+
+       if (tx_swing_override)
+               *tx_swing_override = sr->srio_tx_swing_override;
+       if (tx_swing)
+               *tx_swing = sr->srio_tx_swing;
+       if (tx_gain_override)
+               *tx_gain_override = sr->srio_tx_gain_override;
+       if (tx_gain)
+               *tx_gain = sr->srio_tx_gain;
+       if (tx_premptap_override)
+               *tx_premptap_override = sr->srio_tx_premptap_override;
+       if (tx_premptap_pre)
+               *tx_premptap_pre = sr->srio_tx_premptap_pre;
+       if (tx_premptap_post)
+               *tx_premptap_post = sr->srio_tx_premptap_post;
+       if (tx_vboost_override)
+               *tx_vboost_override = sr->srio_tx_vboost_override;
+       if (tx_vboost)
+               *tx_vboost = sr->srio_tx_vboost;
+}
+
+/**
+ * @INTERNAL
+ * Sets the PHY info data structure
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param[in] phy_info phy information data structure pointer
+ */
+void cvmx_helper_set_port_phy_info(int xiface, int index, struct cvmx_phy_info *phy_info)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].phy_info = phy_info;
+}
+
+/**
+ * @INTERNAL
+ * Returns the PHY information data structure for a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return pointer to PHY information data structure or NULL if not set
+ */
+struct cvmx_phy_info *cvmx_helper_get_port_phy_info(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].phy_info;
+}
+
+/**
+ * @INTERNAL
+ * Returns a pointer to the PHY LED configuration (if local GPIOs drive them)
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ *
+ * @return pointer to the PHY LED information data structure or NULL if not
+ *        present
+ */
+struct cvmx_phy_gpio_leds *cvmx_helper_get_port_phy_leds(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].gpio_leds;
+}
+
+/**
+ * @INTERNAL
+ * Sets a pointer to the PHY LED configuration (if local GPIOs drive them)
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ * @param leds         pointer to led data structure
+ */
+void cvmx_helper_set_port_phy_leds(int xiface, int index, struct cvmx_phy_gpio_leds *leds)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].gpio_leds = leds;
+}
+
+/**
+ * @INTERNAL
+ * Disables RGMII TX clock bypass and sets delay value
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ * @param bypass       Set true to enable the clock bypass and false
+ *                     to sync clock and data synchronously.
+ *                     Default is false.
+ * @param clk_delay    Delay value to skew TXC from TXD
+ */
+void cvmx_helper_cfg_set_rgmii_tx_clk_delay(int xiface, int index, bool bypass, int clk_delay)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].tx_clk_delay_bypass = bypass;
+       cvmx_cfg_port[xi.node][xi.interface][index].rgmii_tx_clk_delay = clk_delay;
+}
+
+/**
+ * @INTERNAL
+ * Gets RGMII TX clock bypass and delay value
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ * @param bypass       Set true to enable the clock bypass and false
+ *                     to sync clock and data synchronously.
+ *                     Default is false.
+ * @param clk_delay    Delay value to skew TXC from TXD, default is 0.
+ */
+void cvmx_helper_cfg_get_rgmii_tx_clk_delay(int xiface, int index, bool *bypass, int *clk_delay)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       *bypass = cvmx_cfg_port[xi.node][xi.interface][index].tx_clk_delay_bypass;
+
+       *clk_delay = cvmx_cfg_port[xi.node][xi.interface][index].rgmii_tx_clk_delay;
+}
+
+/**
+ * @INTERNAL
+ * Retrieve the SFP node offset in the device tree
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return offset in device tree or -1 if error or not defined.
+ */
+int cvmx_helper_cfg_get_sfp_fdt_offset(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].sfp_of_offset;
+}
+
+/**
+ * @INTERNAL
+ * Sets the SFP node offset
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param sfp_of_offset        Offset of SFP node in device tree
+ */
+void cvmx_helper_cfg_set_sfp_fdt_offset(int xiface, int index, int sfp_of_offset)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].sfp_of_offset = sfp_of_offset;
+}
+
+/**
+ * Get data structure defining the Microsemi VSC7224 channel info
+ * or NULL if not present
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return pointer to vsc7224 data structure or NULL if not present
+ */
+struct cvmx_vsc7224_chan *cvmx_helper_cfg_get_vsc7224_chan_info(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].vsc7224_chan;
+}
+
+/**
+ * Sets the Microsemi VSC7224 channel info data structure
+ *
+ * @param      xiface  node and interface
+ * @param      index   port index
+ * @param[in]  vsc7224_info    Microsemi VSC7224 data structure
+ */
+void cvmx_helper_cfg_set_vsc7224_chan_info(int xiface, int index,
+                                          struct cvmx_vsc7224_chan *vsc7224_chan_info)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].vsc7224_chan = vsc7224_chan_info;
+}
+
+/**
+ * Get data structure defining the Avago AVSP5410 phy info
+ * or NULL if not present
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return pointer to avsp5410 data structure or NULL if not present
+ */
+struct cvmx_avsp5410 *cvmx_helper_cfg_get_avsp5410_info(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].avsp5410;
+}
+
+/**
+ * Sets the Avago AVSP5410 phy info data structure
+ *
+ * @param      xiface  node and interface
+ * @param      index   port index
+ * @param[in]  avsp5410_info   Avago AVSP5410 data structure
+ */
+void cvmx_helper_cfg_set_avsp5410_info(int xiface, int index, struct cvmx_avsp5410 *avsp5410_info)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].avsp5410 = avsp5410_info;
+}
+
+/**
+ * Gets the SFP data associated with a port
+ *
+ * @param      xiface  node and interface
+ * @param      index   port index
+ *
+ * @return     pointer to SFP data structure or NULL if none
+ */
+struct cvmx_fdt_sfp_info *cvmx_helper_cfg_get_sfp_info(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].sfp_info;
+}
+
+/**
+ * Sets the SFP data associated with a port
+ *
+ * @param      xiface          node and interface
+ * @param      index           port index
+ * @param[in]  sfp_info        port SFP data or NULL for none
+ */
+void cvmx_helper_cfg_set_sfp_info(int xiface, int index, struct cvmx_fdt_sfp_info *sfp_info)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].sfp_info = sfp_info;
+}
+
+/**
+ * Returns a pointer to the phy device associated with a port
+ *
+ * @param      xiface          node and interface
+ * @param      index           port index
+ *
+ * return      pointer to phy device or NULL if none
+ */
+struct phy_device *cvmx_helper_cfg_get_phy_device(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       return cvmx_cfg_port[xi.node][xi.interface][index].phydev;
+}
+
+/**
+ * Sets the phy device associated with a port
+ *
+ * @param      xiface          node and interface
+ * @param      index           port index
+ * @param[in]  phydev          phy device to assiciate
+ */
+void cvmx_helper_cfg_set_phy_device(int xiface, int index, struct phy_device *phydev)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (!port_cfg_data_initialized)
+               cvmx_init_port_cfg();
+       cvmx_cfg_port[xi.node][xi.interface][index].phydev = phydev;
+}
diff --git a/arch/mips/mach-octeon/cvmx-helper-fdt.c b/arch/mips/mach-octeon/cvmx-helper-fdt.c
new file mode 100644 (file)
index 0000000..87bc6d2
--- /dev/null
@@ -0,0 +1,970 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * FDT Helper functions similar to those provided to U-Boot.
+ */
+
+#include <log.h>
+#include <malloc.h>
+#include <net.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-csr.h>
+#include <mach/cvmx-bootmem.h>
+#include <mach/octeon-model.h>
+#include <mach/octeon_fdt.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-board.h>
+#include <mach/cvmx-helper-cfg.h>
+#include <mach/cvmx-helper-fdt.h>
+#include <mach/cvmx-helper-gpio.h>
+
+/** Structure used to get type of GPIO from device tree */
+struct gpio_compat {
+       char *compatible;         /** Compatible string */
+       enum cvmx_gpio_type type; /** Type */
+       int8_t size;              /** (max) Number of pins */
+};
+
+#define GPIO_REG_PCA953X_IN    0
+#define GPIO_REG_PCA953X_OUT   1
+#define GPIO_REG_PCA953X_INVERT 2
+#define GPIO_REG_PCA953X_DIR   3
+
+#define GPIO_REG_PCA957X_IN    0
+#define GPIO_REG_PCA957X_INVERT 1
+#define GPIO_REG_PCA957X_CFG   4
+#define GPIO_REG_PCA957X_OUT   5
+
+enum cvmx_i2c_mux_type { I2C_MUX, I2C_SWITCH };
+
+/** Structure used to get type of GPIO from device tree */
+struct mux_compat {
+       char *compatible;                /** Compatible string */
+       enum cvmx_i2c_bus_type type;     /** Mux chip type */
+       enum cvmx_i2c_mux_type mux_type; /** Type of mux */
+       u8 enable;                       /** Enable bit for mux */
+       u8 size;                         /** (max) Number of channels */
+};
+
+/**
+ * Local allocator to handle both SE and U-Boot that also zeroes out memory
+ *
+ * @param      size    number of bytes to allocate
+ *
+ * @return     pointer to allocated memory or NULL if out of memory.
+ *             Alignment is set to 8-bytes.
+ */
+void *__cvmx_fdt_alloc(size_t size)
+{
+       return calloc(size, 1);
+}
+
+/**
+ * Free allocated memory.
+ *
+ * @param      ptr     pointer to memory to free
+ *
+ * NOTE: This only works in U-Boot since SE does not really have a freeing
+ *      mechanism.  In SE the memory is zeroed out.
+ */
+void __cvmx_fdt_free(void *ptr, size_t size)
+{
+       free(ptr);
+}
+
+/**
+ * Look up a phandle and follow it to its node then return the offset of that
+ * node.
+ *
+ * @param[in]  fdt_addr        pointer to FDT blob
+ * @param      node            node to read phandle from
+ * @param[in]  prop_name       name of property to find
+ * @param[in,out] lenp         Number of phandles, input max number
+ * @param[out] nodes           Array of phandle nodes
+ *
+ * @return     -ve error code on error or 0 for success
+ */
+int cvmx_fdt_lookup_phandles(const void *fdt_addr, int node,
+                            const char *prop_name, int *lenp,
+                            int *nodes)
+{
+       const u32 *phandles;
+       int count;
+       int i;
+
+       phandles = fdt_getprop(fdt_addr, node, prop_name, &count);
+       if (!phandles || count < 0)
+               return -FDT_ERR_NOTFOUND;
+
+       count /= 4;
+       if (count > *lenp)
+               count = *lenp;
+
+       for (i = 0; i < count; i++)
+               nodes[i] = fdt_node_offset_by_phandle(fdt_addr,
+                                                     fdt32_to_cpu(phandles[i]));
+       *lenp = count;
+       return 0;
+}
+
+/**
+ * Given a FDT node return the CPU node number
+ *
+ * @param[in]  fdt_addr        Address of FDT
+ * @param      node            FDT node number
+ *
+ * @return     CPU node number or error if negative
+ */
+int cvmx_fdt_get_cpu_node(const void *fdt_addr, int node)
+{
+       int parent = node;
+       const u32 *ranges;
+       int len = 0;
+
+       while (fdt_node_check_compatible(fdt_addr, parent, "simple-bus") != 0) {
+               parent = fdt_parent_offset(fdt_addr, parent);
+               if (parent < 0)
+                       return parent;
+       }
+       ranges = fdt_getprop(fdt_addr, parent, "ranges", &len);
+       if (!ranges)
+               return len;
+
+       if (len == 0)
+               return 0;
+
+       if (len < 24)
+               return -FDT_ERR_TRUNCATED;
+
+       return fdt32_to_cpu(ranges[2]) / 0x10;
+}
+
+/**
+ * Get the total size of the flat device tree
+ *
+ * @param[in]  fdt_addr        Address of FDT
+ *
+ * @return     Size of flat device tree in bytes or error if negative.
+ */
+int cvmx_fdt_get_fdt_size(const void *fdt_addr)
+{
+       int rc;
+
+       rc = fdt_check_header(fdt_addr);
+       if (rc)
+               return rc;
+       return fdt_totalsize(fdt_addr);
+}
+
+/**
+ * Returns if a node is compatible with one of the items in the string list
+ *
+ * @param[in]  fdt_addr        Pointer to flat device tree
+ * @param      node            Node offset to check
+ * @param[in]  strlist         Array of FDT device compatibility strings,
+ *                             must end with NULL or empty string.
+ *
+ * @return     0 if at least one item matches, 1 if no matches
+ */
+int cvmx_fdt_node_check_compatible_list(const void *fdt_addr, int node, const char *const *strlist)
+{
+       while (*strlist && **strlist) {
+               if (!fdt_node_check_compatible(fdt_addr, node, *strlist))
+                       return 0;
+               strlist++;
+       }
+       return 1;
+}
+
+/**
+ * Given a FDT node, return the next compatible node.
+ *
+ * @param[in]  fdt_addr        Pointer to flat device tree
+ * @param      start_offset    Starting node offset or -1 to find the first
+ * @param      strlist         Array of FDT device compatibility strings, must
+ *                             end with NULL or empty string.
+ *
+ * @return     next matching node or -1 if no more matches.
+ */
+int cvmx_fdt_node_offset_by_compatible_list(const void *fdt_addr, int startoffset,
+                                           const char *const *strlist)
+{
+       int offset;
+
+       for (offset = fdt_next_node(fdt_addr, startoffset, NULL); offset >= 0;
+            offset = fdt_next_node(fdt_addr, offset, NULL)) {
+               if (!cvmx_fdt_node_check_compatible_list(fdt_addr, offset, strlist))
+                       return offset;
+       }
+       return -1;
+}
+
+/**
+ * Attaches a PHY to a SFP or QSFP.
+ *
+ * @param      sfp             sfp to attach PHY to
+ * @param      phy_info        phy descriptor to attach or NULL to detach
+ */
+void cvmx_sfp_attach_phy(struct cvmx_fdt_sfp_info *sfp, struct cvmx_phy_info *phy_info)
+{
+       sfp->phy_info = phy_info;
+       if (phy_info)
+               phy_info->sfp_info = sfp;
+}
+
+/**
+ * Assigns an IPD port to a SFP slot
+ *
+ * @param      sfp             Handle to SFP data structure
+ * @param      ipd_port        Port to assign it to
+ *
+ * @return     0 for success, -1 on error
+ */
+int cvmx_sfp_set_ipd_port(struct cvmx_fdt_sfp_info *sfp, int ipd_port)
+{
+       int i;
+
+       if (sfp->is_qsfp) {
+               int xiface;
+               cvmx_helper_interface_mode_t mode;
+
+               xiface = cvmx_helper_get_interface_num(ipd_port);
+               mode = cvmx_helper_interface_get_mode(xiface);
+               sfp->ipd_port[0] = ipd_port;
+
+               switch (mode) {
+               case CVMX_HELPER_INTERFACE_MODE_SGMII:
+               case CVMX_HELPER_INTERFACE_MODE_XFI:
+               case CVMX_HELPER_INTERFACE_MODE_10G_KR:
+                       for (i = 1; i < 4; i++)
+                               sfp->ipd_port[i] = cvmx_helper_get_ipd_port(xiface, i);
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_XLAUI:
+               case CVMX_HELPER_INTERFACE_MODE_40G_KR4:
+                       sfp->ipd_port[0] = ipd_port;
+                       for (i = 1; i < 4; i++)
+                               sfp->ipd_port[i] = -1;
+                       break;
+               default:
+                       debug("%s: Interface mode %s for interface 0x%x, ipd_port %d not supported for QSFP\n",
+                             __func__, cvmx_helper_interface_mode_to_string(mode), xiface,
+                             ipd_port);
+                       return -1;
+               }
+       } else {
+               sfp->ipd_port[0] = ipd_port;
+               for (i = 1; i < 4; i++)
+                       sfp->ipd_port[i] = -1;
+       }
+       return 0;
+}
+
+/**
+ * Parses all of the channels assigned to a VSC7224 device
+ *
+ * @param[in]          fdt_addr        Address of flat device tree
+ * @param              of_offset       Offset of vsc7224 node
+ * @param[in,out]      vsc7224         Data structure to hold the data
+ *
+ * @return     0 for success, -1 on error
+ */
+static int cvmx_fdt_parse_vsc7224_channels(const void *fdt_addr, int of_offset,
+                                          struct cvmx_vsc7224 *vsc7224)
+{
+       int parent_offset = of_offset;
+       int err = 0;
+       int reg;
+       int num_chan = 0;
+       struct cvmx_vsc7224_chan *channel;
+       struct cvmx_fdt_sfp_info *sfp_info;
+       int len;
+       int num_taps;
+       int i;
+       const u32 *tap_values;
+       int of_mac;
+       int xiface, index;
+       bool is_tx;
+       bool is_qsfp;
+       const char *mac_str;
+
+       debug("%s(%p, %d, %s)\n", __func__, fdt_addr, of_offset, vsc7224->name);
+       do {
+               /* Walk through all channels */
+               of_offset = fdt_node_offset_by_compatible(fdt_addr, of_offset,
+                                                         "vitesse,vsc7224-channel");
+               if (of_offset == -FDT_ERR_NOTFOUND) {
+                       break;
+               } else if (of_offset < 0) {
+                       debug("%s: Failed finding compatible channel\n",
+                             __func__);
+                       err = -1;
+                       break;
+               }
+               if (fdt_parent_offset(fdt_addr, of_offset) != parent_offset)
+                       break;
+               reg = cvmx_fdt_get_int(fdt_addr, of_offset, "reg", -1);
+               if (reg < 0 || reg > 3) {
+                       debug("%s: channel reg is either not present or out of range\n",
+                             __func__);
+                       err = -1;
+                       break;
+               }
+               is_tx = cvmx_fdt_get_bool(fdt_addr, of_offset, "direction-tx");
+
+               debug("%s(%s): Adding %cx channel %d\n",
+                     __func__, vsc7224->name, is_tx ? 't' : 'r',
+                     reg);
+               tap_values = (const uint32_t *)fdt_getprop(fdt_addr, of_offset, "taps", &len);
+               if (!tap_values) {
+                       debug("%s: Error: no taps defined for vsc7224 channel %d\n",
+                             __func__, reg);
+                       err = -1;
+                       break;
+               }
+
+               if (vsc7224->channel[reg]) {
+                       debug("%s: Error: channel %d already assigned at %p\n",
+                             __func__, reg,
+                             vsc7224->channel[reg]);
+                       err = -1;
+                       break;
+               }
+               if (len % 16) {
+                       debug("%s: Error: tap format error for channel %d\n",
+                             __func__, reg);
+                       err = -1;
+                       break;
+               }
+               num_taps = len / 16;
+               debug("%s: Adding %d taps\n", __func__, num_taps);
+
+               channel = __cvmx_fdt_alloc(sizeof(*channel) +
+                                          num_taps * sizeof(struct cvmx_vsc7224_tap));
+               if (!channel) {
+                       debug("%s: Out of memory\n", __func__);
+                       err = -1;
+                       break;
+               }
+               vsc7224->channel[reg] = channel;
+               channel->num_taps = num_taps;
+               channel->lane = reg;
+               channel->of_offset = of_offset;
+               channel->is_tx = is_tx;
+               channel->pretap_disable = cvmx_fdt_get_bool(fdt_addr, of_offset, "pretap-disable");
+               channel->posttap_disable =
+                       cvmx_fdt_get_bool(fdt_addr, of_offset, "posttap-disable");
+               channel->vsc7224 = vsc7224;
+               /* Read all the tap values */
+               for (i = 0; i < num_taps; i++) {
+                       channel->taps[i].len = fdt32_to_cpu(tap_values[i * 4 + 0]);
+                       channel->taps[i].main_tap = fdt32_to_cpu(tap_values[i * 4 + 1]);
+                       channel->taps[i].pre_tap = fdt32_to_cpu(tap_values[i * 4 + 2]);
+                       channel->taps[i].post_tap = fdt32_to_cpu(tap_values[i * 4 + 3]);
+                       debug("%s: tap %d: len: %d, main_tap: 0x%x, pre_tap: 0x%x, post_tap: 0x%x\n",
+                             __func__, i, channel->taps[i].len, channel->taps[i].main_tap,
+                             channel->taps[i].pre_tap, channel->taps[i].post_tap);
+               }
+               /* Now find out which interface it's mapped to */
+               channel->ipd_port = -1;
+
+               mac_str = "sfp-mac";
+               if (fdt_getprop(fdt_addr, of_offset, mac_str, NULL)) {
+                       is_qsfp = false;
+               } else if (fdt_getprop(fdt_addr, of_offset, "qsfp-mac", NULL)) {
+                       is_qsfp = true;
+                       mac_str = "qsfp-mac";
+               } else {
+                       debug("%s: Error: MAC not found for %s channel %d\n", __func__,
+                             vsc7224->name, reg);
+                       return -1;
+               }
+               of_mac = cvmx_fdt_lookup_phandle(fdt_addr, of_offset, mac_str);
+               if (of_mac < 0) {
+                       debug("%s: Error %d with MAC %s phandle for %s\n", __func__, of_mac,
+                             mac_str, vsc7224->name);
+                       return -1;
+               }
+
+               debug("%s: Found mac at offset %d\n", __func__, of_mac);
+               err = cvmx_helper_cfg_get_xiface_index_by_fdt_node_offset(of_mac, &xiface, &index);
+               if (!err) {
+                       channel->xiface = xiface;
+                       channel->index = index;
+                       channel->ipd_port = cvmx_helper_get_ipd_port(xiface, index);
+
+                       debug("%s: Found MAC, xiface: 0x%x, index: %d, ipd port: %d\n", __func__,
+                             xiface, index, channel->ipd_port);
+                       if (channel->ipd_port >= 0) {
+                               cvmx_helper_cfg_set_vsc7224_chan_info(xiface, index, channel);
+                               debug("%s: Storing config channel for xiface 0x%x, index %d\n",
+                                     __func__, xiface, index);
+                       }
+                       sfp_info = cvmx_helper_cfg_get_sfp_info(xiface, index);
+                       if (!sfp_info) {
+                               debug("%s: Warning: no (Q)SFP+ slot found for xinterface 0x%x, index %d for channel %d\n",
+                                     __func__, xiface, index, channel->lane);
+                               continue;
+                       }
+
+                       /* Link it */
+                       channel->next = sfp_info->vsc7224_chan;
+                       if (sfp_info->vsc7224_chan)
+                               sfp_info->vsc7224_chan->prev = channel;
+                       sfp_info->vsc7224_chan = channel;
+                       sfp_info->is_vsc7224 = true;
+                       debug("%s: Registering VSC7224 %s channel %d with SFP %s\n", __func__,
+                             vsc7224->name, channel->lane, sfp_info->name);
+                       if (!sfp_info->mod_abs_changed) {
+                               debug("%s: Registering cvmx_sfp_vsc7224_mod_abs_changed at %p for xinterface 0x%x, index %d\n",
+                                     __func__, &cvmx_sfp_vsc7224_mod_abs_changed, xiface, index);
+                               cvmx_sfp_register_mod_abs_changed(
+                                       sfp_info,
+                                       &cvmx_sfp_vsc7224_mod_abs_changed,
+                                       NULL);
+                       }
+               }
+       } while (!err && num_chan < 4);
+
+       return err;
+}
+
+/**
+ * @INTERNAL
+ * Parses all instances of the Vitesse VSC7224 reclocking chip
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ *
+ * @return     0 for success, error otherwise
+ */
+int __cvmx_fdt_parse_vsc7224(const void *fdt_addr)
+{
+       int of_offset = -1;
+       struct cvmx_vsc7224 *vsc7224 = NULL;
+       struct cvmx_fdt_gpio_info *gpio_info = NULL;
+       int err = 0;
+       int of_parent;
+       static bool parsed;
+
+       debug("%s(%p)\n", __func__, fdt_addr);
+
+       if (parsed) {
+               debug("%s: Already parsed\n", __func__);
+               return 0;
+       }
+       do {
+               of_offset = fdt_node_offset_by_compatible(fdt_addr, of_offset,
+                                                         "vitesse,vsc7224");
+               debug("%s: of_offset: %d\n", __func__, of_offset);
+               if (of_offset == -FDT_ERR_NOTFOUND) {
+                       break;
+               } else if (of_offset < 0) {
+                       err = -1;
+                       debug("%s: Error %d parsing FDT\n",
+                             __func__, of_offset);
+                       break;
+               }
+
+               vsc7224 = __cvmx_fdt_alloc(sizeof(*vsc7224));
+
+               if (!vsc7224) {
+                       debug("%s: Out of memory!\n", __func__);
+                       return -1;
+               }
+               vsc7224->of_offset = of_offset;
+               vsc7224->i2c_addr = cvmx_fdt_get_int(fdt_addr, of_offset,
+                                                    "reg", -1);
+               of_parent = fdt_parent_offset(fdt_addr, of_offset);
+               vsc7224->i2c_bus = cvmx_fdt_get_i2c_bus(fdt_addr, of_parent);
+               if (vsc7224->i2c_addr < 0) {
+                       debug("%s: Error: reg field missing\n", __func__);
+                       err = -1;
+                       break;
+               }
+               if (!vsc7224->i2c_bus) {
+                       debug("%s: Error getting i2c bus\n", __func__);
+                       err = -1;
+                       break;
+               }
+               vsc7224->name = fdt_get_name(fdt_addr, of_offset, NULL);
+               debug("%s: Adding %s\n", __func__, vsc7224->name);
+               if (fdt_getprop(fdt_addr, of_offset, "reset", NULL)) {
+                       gpio_info = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "reset");
+                       vsc7224->reset_gpio = gpio_info;
+               }
+               if (fdt_getprop(fdt_addr, of_offset, "los", NULL)) {
+                       gpio_info = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "los");
+                       vsc7224->los_gpio = gpio_info;
+               }
+               debug("%s: Parsing channels\n", __func__);
+               err = cvmx_fdt_parse_vsc7224_channels(fdt_addr, of_offset, vsc7224);
+               if (err) {
+                       debug("%s: Error parsing VSC7224 channels\n", __func__);
+                       break;
+               }
+       } while (of_offset > 0);
+
+       if (err) {
+               debug("%s(): Error\n", __func__);
+               if (vsc7224) {
+                       if (vsc7224->reset_gpio)
+                               __cvmx_fdt_free(vsc7224->reset_gpio, sizeof(*vsc7224->reset_gpio));
+                       if (vsc7224->los_gpio)
+                               __cvmx_fdt_free(vsc7224->los_gpio, sizeof(*vsc7224->los_gpio));
+                       if (vsc7224->i2c_bus)
+                               cvmx_fdt_free_i2c_bus(vsc7224->i2c_bus);
+                       __cvmx_fdt_free(vsc7224, sizeof(*vsc7224));
+               }
+       }
+       if (!err)
+               parsed = true;
+
+       return err;
+}
+
+/**
+ * @INTERNAL
+ * Parses all instances of the Avago AVSP5410 gearbox phy
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ *
+ * @return     0 for success, error otherwise
+ */
+int __cvmx_fdt_parse_avsp5410(const void *fdt_addr)
+{
+       int of_offset = -1;
+       struct cvmx_avsp5410 *avsp5410 = NULL;
+       struct cvmx_fdt_sfp_info *sfp_info;
+       int err = 0;
+       int of_parent;
+       static bool parsed;
+       int of_mac;
+       int xiface, index;
+       bool is_qsfp;
+       const char *mac_str;
+
+       debug("%s(%p)\n", __func__, fdt_addr);
+
+       if (parsed) {
+               debug("%s: Already parsed\n", __func__);
+               return 0;
+       }
+
+       do {
+               of_offset = fdt_node_offset_by_compatible(fdt_addr, of_offset,
+                                                         "avago,avsp-5410");
+               debug("%s: of_offset: %d\n", __func__, of_offset);
+               if (of_offset == -FDT_ERR_NOTFOUND) {
+                       break;
+               } else if (of_offset < 0) {
+                       err = -1;
+                       debug("%s: Error %d parsing FDT\n", __func__, of_offset);
+                       break;
+               }
+
+               avsp5410 = __cvmx_fdt_alloc(sizeof(*avsp5410));
+
+               if (!avsp5410) {
+                       debug("%s: Out of memory!\n", __func__);
+                       return -1;
+               }
+               avsp5410->of_offset = of_offset;
+               avsp5410->i2c_addr = cvmx_fdt_get_int(fdt_addr, of_offset,
+                                                     "reg", -1);
+               of_parent = fdt_parent_offset(fdt_addr, of_offset);
+               avsp5410->i2c_bus = cvmx_fdt_get_i2c_bus(fdt_addr, of_parent);
+               if (avsp5410->i2c_addr < 0) {
+                       debug("%s: Error: reg field missing\n", __func__);
+                       err = -1;
+                       break;
+               }
+               if (!avsp5410->i2c_bus) {
+                       debug("%s: Error getting i2c bus\n", __func__);
+                       err = -1;
+                       break;
+               }
+               avsp5410->name = fdt_get_name(fdt_addr, of_offset, NULL);
+               debug("%s: Adding %s\n", __func__, avsp5410->name);
+
+               /* Now find out which interface it's mapped to */
+               avsp5410->ipd_port = -1;
+
+               mac_str = "sfp-mac";
+               if (fdt_getprop(fdt_addr, of_offset, mac_str, NULL)) {
+                       is_qsfp = false;
+               } else if (fdt_getprop(fdt_addr, of_offset, "qsfp-mac", NULL)) {
+                       is_qsfp = true;
+                       mac_str = "qsfp-mac";
+               } else {
+                       debug("%s: Error: MAC not found for %s\n", __func__, avsp5410->name);
+                       return -1;
+               }
+               of_mac = cvmx_fdt_lookup_phandle(fdt_addr, of_offset, mac_str);
+               if (of_mac < 0) {
+                       debug("%s: Error %d with MAC %s phandle for %s\n", __func__, of_mac,
+                             mac_str, avsp5410->name);
+                       return -1;
+               }
+
+               debug("%s: Found mac at offset %d\n", __func__, of_mac);
+               err = cvmx_helper_cfg_get_xiface_index_by_fdt_node_offset(of_mac, &xiface, &index);
+               if (!err) {
+                       avsp5410->xiface = xiface;
+                       avsp5410->index = index;
+                       avsp5410->ipd_port = cvmx_helper_get_ipd_port(xiface, index);
+
+                       debug("%s: Found MAC, xiface: 0x%x, index: %d, ipd port: %d\n", __func__,
+                             xiface, index, avsp5410->ipd_port);
+                       if (avsp5410->ipd_port >= 0) {
+                               cvmx_helper_cfg_set_avsp5410_info(xiface, index, avsp5410);
+                               debug("%s: Storing config phy for xiface 0x%x, index %d\n",
+                                     __func__, xiface, index);
+                       }
+                       sfp_info = cvmx_helper_cfg_get_sfp_info(xiface, index);
+                       if (!sfp_info) {
+                               debug("%s: Warning: no (Q)SFP+ slot found for xinterface 0x%x, index %d\n",
+                                     __func__, xiface, index);
+                               continue;
+                       }
+
+                       sfp_info->is_avsp5410 = true;
+                       sfp_info->avsp5410 = avsp5410;
+                       debug("%s: Registering AVSP5410 %s with SFP %s\n", __func__, avsp5410->name,
+                             sfp_info->name);
+                       if (!sfp_info->mod_abs_changed) {
+                               debug("%s: Registering cvmx_sfp_avsp5410_mod_abs_changed at %p for xinterface 0x%x, index %d\n",
+                                     __func__, &cvmx_sfp_avsp5410_mod_abs_changed, xiface, index);
+                               cvmx_sfp_register_mod_abs_changed(
+                                       sfp_info,
+                                       &cvmx_sfp_avsp5410_mod_abs_changed,
+                                       NULL);
+                       }
+               }
+       } while (of_offset > 0);
+
+       if (err) {
+               debug("%s(): Error\n", __func__);
+               if (avsp5410) {
+                       if (avsp5410->i2c_bus)
+                               cvmx_fdt_free_i2c_bus(avsp5410->i2c_bus);
+                       __cvmx_fdt_free(avsp5410, sizeof(*avsp5410));
+               }
+       }
+       if (!err)
+               parsed = true;
+
+       return err;
+}
+
+/**
+ * Parse QSFP GPIOs for SFP
+ *
+ * @param[in]  fdt_addr        Pointer to flat device tree
+ * @param      of_offset       Offset of QSFP node
+ * @param[out] sfp_info        Pointer to sfp info to fill in
+ *
+ * @return     0 for success
+ */
+static int cvmx_parse_qsfp(const void *fdt_addr, int of_offset, struct cvmx_fdt_sfp_info *sfp_info)
+{
+       sfp_info->select = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "select");
+       sfp_info->mod_abs = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "mod_prs");
+       sfp_info->reset = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "reset");
+       sfp_info->interrupt = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "interrupt");
+       sfp_info->lp_mode = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "lp_mode");
+       return 0;
+}
+
+/**
+ * Parse SFP GPIOs for SFP
+ *
+ * @param[in]  fdt_addr        Pointer to flat device tree
+ * @param      of_offset       Offset of SFP node
+ * @param[out] sfp_info        Pointer to sfp info to fill in
+ *
+ * @return     0 for success
+ */
+static int cvmx_parse_sfp(const void *fdt_addr, int of_offset, struct cvmx_fdt_sfp_info *sfp_info)
+{
+       sfp_info->mod_abs = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "mod_abs");
+       sfp_info->rx_los = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "rx_los");
+       sfp_info->tx_disable = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "tx_disable");
+       sfp_info->tx_error = cvmx_fdt_gpio_get_info_phandle(fdt_addr, of_offset, "tx_error");
+       return 0;
+}
+
+/**
+ * Parse SFP/QSFP EEPROM and diag
+ *
+ * @param[in]  fdt_addr        Pointer to flat device tree
+ * @param      of_offset       Offset of SFP node
+ * @param[out] sfp_info        Pointer to sfp info to fill in
+ *
+ * @return     0 for success, -1 on error
+ */
+static int cvmx_parse_sfp_eeprom(const void *fdt_addr, int of_offset,
+                                struct cvmx_fdt_sfp_info *sfp_info)
+{
+       int of_eeprom;
+       int of_diag;
+
+       debug("%s(%p, %d, %s)\n", __func__, fdt_addr, of_offset, sfp_info->name);
+       of_eeprom = cvmx_fdt_lookup_phandle(fdt_addr, of_offset, "eeprom");
+       if (of_eeprom < 0) {
+               debug("%s: Missing \"eeprom\" from device tree for %s\n", __func__, sfp_info->name);
+               return -1;
+       }
+
+       sfp_info->i2c_bus = cvmx_fdt_get_i2c_bus(fdt_addr, fdt_parent_offset(fdt_addr, of_eeprom));
+       sfp_info->i2c_eeprom_addr = cvmx_fdt_get_int(fdt_addr, of_eeprom, "reg", 0x50);
+
+       debug("%s(%p, %d, %s, %d)\n", __func__, fdt_addr, of_offset, sfp_info->name,
+             sfp_info->i2c_eeprom_addr);
+
+       if (!sfp_info->i2c_bus) {
+               debug("%s: Error: could not determine i2c bus for eeprom for %s\n", __func__,
+                     sfp_info->name);
+               return -1;
+       }
+       of_diag = cvmx_fdt_lookup_phandle(fdt_addr, of_offset, "diag");
+       if (of_diag >= 0)
+               sfp_info->i2c_diag_addr = cvmx_fdt_get_int(fdt_addr, of_diag, "reg", 0x51);
+       else
+               sfp_info->i2c_diag_addr = 0x51;
+       return 0;
+}
+
+/**
+ * Parse SFP information from device tree
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ *
+ * @return pointer to sfp info or NULL if error
+ */
+struct cvmx_fdt_sfp_info *cvmx_helper_fdt_parse_sfp_info(const void *fdt_addr, int of_offset)
+{
+       struct cvmx_fdt_sfp_info *sfp_info = NULL;
+       int err = -1;
+       bool is_qsfp;
+
+       if (!fdt_node_check_compatible(fdt_addr, of_offset, "ethernet,sfp-slot")) {
+               is_qsfp = false;
+       } else if (!fdt_node_check_compatible(fdt_addr, of_offset, "ethernet,qsfp-slot")) {
+               is_qsfp = true;
+       } else {
+               debug("%s: Error: incompatible sfp/qsfp slot, compatible=%s\n", __func__,
+                     (char *)fdt_getprop(fdt_addr, of_offset, "compatible", NULL));
+               goto error_exit;
+       }
+
+       debug("%s: %ssfp module found at offset %d\n", __func__, is_qsfp ? "q" : "", of_offset);
+       sfp_info = __cvmx_fdt_alloc(sizeof(*sfp_info));
+       if (!sfp_info) {
+               debug("%s: Error: out of memory\n", __func__);
+               goto error_exit;
+       }
+       sfp_info->name = fdt_get_name(fdt_addr, of_offset, NULL);
+       sfp_info->of_offset = of_offset;
+       sfp_info->is_qsfp = is_qsfp;
+       sfp_info->last_mod_abs = -1;
+       sfp_info->last_rx_los = -1;
+
+       if (is_qsfp)
+               err = cvmx_parse_qsfp(fdt_addr, of_offset, sfp_info);
+       else
+               err = cvmx_parse_sfp(fdt_addr, of_offset, sfp_info);
+       if (err) {
+               debug("%s: Error in %s parsing %ssfp GPIO info\n", __func__, sfp_info->name,
+                     is_qsfp ? "q" : "");
+               goto error_exit;
+       }
+       debug("%s: Parsing %ssfp module eeprom\n", __func__, is_qsfp ? "q" : "");
+       err = cvmx_parse_sfp_eeprom(fdt_addr, of_offset, sfp_info);
+       if (err) {
+               debug("%s: Error parsing eeprom info for %s\n", __func__, sfp_info->name);
+               goto error_exit;
+       }
+
+       /* Register default check for mod_abs changed */
+       if (!err)
+               cvmx_sfp_register_check_mod_abs(sfp_info, cvmx_sfp_check_mod_abs, NULL);
+
+error_exit:
+       /* Note: we don't free any data structures on error since it gets
+        * rather complicated with i2c buses and whatnot.
+        */
+       return err ? NULL : sfp_info;
+}
+
+/**
+ * @INTERNAL
+ * Parse a slice of the Inphi/Cortina CS4343 in the device tree
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ * @param      of_offset       fdt offset of slice
+ * @param      phy_info        phy_info data structure
+ *
+ * @return     slice number if non-negative, otherwise error
+ */
+static int cvmx_fdt_parse_cs4343_slice(const void *fdt_addr, int of_offset,
+                                      struct cvmx_phy_info *phy_info)
+{
+       struct cvmx_cs4343_slice_info *slice;
+       int reg;
+       int reg_offset;
+
+       reg = cvmx_fdt_get_int(fdt_addr, of_offset, "reg", -1);
+       reg_offset = cvmx_fdt_get_int(fdt_addr, of_offset, "slice_offset", -1);
+
+       if (reg < 0 || reg >= 4) {
+               debug("%s(%p, %d, %p): Error: reg %d undefined or out of range\n", __func__,
+                     fdt_addr, of_offset, phy_info, reg);
+               return -1;
+       }
+       if (reg_offset % 0x1000 || reg_offset > 0x3000 || reg_offset < 0) {
+               debug("%s(%p, %d, %p): Error: reg_offset 0x%x undefined or out of range\n",
+                     __func__, fdt_addr, of_offset, phy_info, reg_offset);
+               return -1;
+       }
+       if (!phy_info->cs4343_info) {
+               debug("%s: Error: phy info cs4343 datastructure is NULL\n", __func__);
+               return -1;
+       }
+       debug("%s(%p, %d, %p): %s, reg: %d, slice offset: 0x%x\n", __func__, fdt_addr, of_offset,
+             phy_info, fdt_get_name(fdt_addr, of_offset, NULL), reg, reg_offset);
+       slice = &phy_info->cs4343_info->slice[reg];
+       slice->name = fdt_get_name(fdt_addr, of_offset, NULL);
+       slice->mphy = phy_info->cs4343_info;
+       slice->phy_info = phy_info;
+       slice->of_offset = of_offset;
+       slice->slice_no = reg;
+       slice->reg_offset = reg_offset;
+       /* SR settings */
+       slice->sr_stx_cmode_res = cvmx_fdt_get_int(fdt_addr, of_offset, "sr-stx-cmode-res", 3);
+       slice->sr_stx_drv_lower_cm =
+               cvmx_fdt_get_int(fdt_addr, of_offset, "sr-stx-drv-lower-cm", 8);
+       slice->sr_stx_level = cvmx_fdt_get_int(fdt_addr, of_offset, "sr-stx-level", 0x1c);
+       slice->sr_stx_pre_peak = cvmx_fdt_get_int(fdt_addr, of_offset, "sr-stx-pre-peak", 1);
+       slice->sr_stx_muxsubrate_sel =
+               cvmx_fdt_get_int(fdt_addr, of_offset, "sr-stx-muxsubrate-sel", 0);
+       slice->sr_stx_post_peak = cvmx_fdt_get_int(fdt_addr, of_offset, "sr-stx-post-peak", 8);
+       /* CX settings */
+       slice->cx_stx_cmode_res = cvmx_fdt_get_int(fdt_addr, of_offset, "cx-stx-cmode-res", 3);
+       slice->cx_stx_drv_lower_cm =
+               cvmx_fdt_get_int(fdt_addr, of_offset, "cx-stx-drv-lower-cm", 8);
+       slice->cx_stx_level = cvmx_fdt_get_int(fdt_addr, of_offset, "cx-stx-level", 0x1c);
+       slice->cx_stx_pre_peak = cvmx_fdt_get_int(fdt_addr, of_offset, "cx-stx-pre-peak", 1);
+       slice->cx_stx_muxsubrate_sel =
+               cvmx_fdt_get_int(fdt_addr, of_offset, "cx-stx-muxsubrate-sel", 0);
+       slice->cx_stx_post_peak = cvmx_fdt_get_int(fdt_addr, of_offset, "cx-stx-post-peak", 0xC);
+       /* 1000Base-X settings */
+       /* CX settings */
+       slice->basex_stx_cmode_res =
+               cvmx_fdt_get_int(fdt_addr, of_offset, "basex-stx-cmode-res", 3);
+       slice->basex_stx_drv_lower_cm =
+               cvmx_fdt_get_int(fdt_addr, of_offset, "basex-stx-drv-lower-cm", 8);
+       slice->basex_stx_level = cvmx_fdt_get_int(fdt_addr, of_offset,
+                                                 "basex-stx-level", 0x1c);
+       slice->basex_stx_pre_peak = cvmx_fdt_get_int(fdt_addr, of_offset,
+                                                    "basex-stx-pre-peak", 1);
+       slice->basex_stx_muxsubrate_sel =
+               cvmx_fdt_get_int(fdt_addr, of_offset,
+                                "basex-stx-muxsubrate-sel", 0);
+       slice->basex_stx_post_peak =
+               cvmx_fdt_get_int(fdt_addr, of_offset, "basex-stx-post-peak", 8);
+       /* Get the link LED gpio pin */
+       slice->link_gpio = cvmx_fdt_get_int(fdt_addr, of_offset,
+                                           "link-led-gpio", -1);
+       slice->error_gpio = cvmx_fdt_get_int(fdt_addr, of_offset,
+                                            "error-led-gpio", -1);
+       slice->los_gpio = cvmx_fdt_get_int(fdt_addr, of_offset,
+                                          "los-input-gpio", -1);
+       slice->link_inverted = cvmx_fdt_get_bool(fdt_addr, of_offset,
+                                                "link-led-gpio-inverted");
+       slice->error_inverted = cvmx_fdt_get_bool(fdt_addr, of_offset,
+                                                 "error-led-gpio-inverted");
+       slice->los_inverted = cvmx_fdt_get_bool(fdt_addr, of_offset,
+                                               "los-input-gpio-inverted");
+       /* Convert GPIOs to be die based if they're not already */
+       if (slice->link_gpio > 4 && slice->link_gpio <= 8)
+               slice->link_gpio -= 4;
+       if (slice->error_gpio > 4 && slice->error_gpio <= 8)
+               slice->error_gpio -= 4;
+       if (slice->los_gpio > 4 && slice->los_gpio <= 8)
+               slice->los_gpio -= 4;
+
+       return reg;
+}
+
+/**
+ * @INTERNAL
+ * Parses either a CS4343 phy or a slice of the phy from the device tree
+ * @param[in]  fdt_addr        Address of FDT
+ * @param      of_offset       offset of slice or phy in device tree
+ * @param      phy_info        phy_info data structure to fill in
+ *
+ * @return     0 for success, -1 on error
+ */
+int cvmx_fdt_parse_cs4343(const void *fdt_addr, int of_offset, struct cvmx_phy_info *phy_info)
+{
+       int of_slice = -1;
+       struct cvmx_cs4343_info *cs4343;
+       int err = -1;
+       int reg;
+
+       debug("%s(%p, %d, %p): %s (%s)\n", __func__,
+             fdt_addr, of_offset, phy_info,
+             fdt_get_name(fdt_addr, of_offset, NULL),
+             (const char *)fdt_getprop(fdt_addr, of_offset, "compatible", NULL));
+
+       if (!phy_info->cs4343_info)
+               phy_info->cs4343_info = __cvmx_fdt_alloc(sizeof(struct cvmx_cs4343_info));
+       if (!phy_info->cs4343_info) {
+               debug("%s: Error: out of memory!\n", __func__);
+               return -1;
+       }
+       cs4343 = phy_info->cs4343_info;
+       /* If we're passed to a slice then process only that slice */
+       if (!fdt_node_check_compatible(fdt_addr, of_offset, "cortina,cs4343-slice")) {
+               err = 0;
+               of_slice = of_offset;
+               of_offset = fdt_parent_offset(fdt_addr, of_offset);
+               reg = cvmx_fdt_parse_cs4343_slice(fdt_addr, of_slice, phy_info);
+               if (reg >= 0)
+                       phy_info->cs4343_slice_info = &cs4343->slice[reg];
+               else
+                       err = reg;
+       } else if (!fdt_node_check_compatible(fdt_addr, of_offset,
+                                             "cortina,cs4343")) {
+               /* Walk through and process all of the slices */
+               of_slice =
+                       fdt_node_offset_by_compatible(fdt_addr, of_offset, "cortina,cs4343-slice");
+               while (of_slice > 0 && fdt_parent_offset(fdt_addr, of_slice) ==
+                      of_offset) {
+                       debug("%s: Parsing slice %s\n", __func__,
+                             fdt_get_name(fdt_addr, of_slice, NULL));
+                       err = cvmx_fdt_parse_cs4343_slice(fdt_addr, of_slice,
+                                                         phy_info);
+                       if (err < 0)
+                               break;
+                       of_slice = fdt_node_offset_by_compatible(fdt_addr,
+                                                                of_slice,
+                                                                "cortina,cs4343-slice");
+               }
+       } else {
+               debug("%s: Error: unknown compatible string %s for %s\n", __func__,
+                     (const char *)fdt_getprop(fdt_addr, of_offset,
+                                               "compatible", NULL),
+                     fdt_get_name(fdt_addr, of_offset, NULL));
+       }
+
+       if (err >= 0) {
+               cs4343->name = fdt_get_name(fdt_addr, of_offset, NULL);
+               cs4343->phy_info = phy_info;
+               cs4343->of_offset = of_offset;
+       }
+
+       return err < 0 ? -1 : 0;
+}
diff --git a/arch/mips/mach-octeon/cvmx-helper-jtag.c b/arch/mips/mach-octeon/cvmx-helper-jtag.c
new file mode 100644 (file)
index 0000000..a6fa69b
--- /dev/null
@@ -0,0 +1,172 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper utilities for qlm_jtag.
+ */
+
+#include <log.h>
+#include <asm/global_data.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/octeon-model.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/cvmx-pcie.h>
+#include <mach/cvmx-ciu-defs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * Initialize the internal QLM JTAG logic to allow programming
+ * of the JTAG chain by the cvmx_helper_qlm_jtag_*() functions.
+ * These functions should only be used at the direction of Cavium
+ * Networks. Programming incorrect values into the JTAG chain
+ * can cause chip damage.
+ */
+void cvmx_helper_qlm_jtag_init(void)
+{
+       union cvmx_ciu_qlm_jtgc jtgc;
+       int clock_div = 0;
+       int divisor;
+
+       divisor = gd->bus_clk / (1000000 * (OCTEON_IS_MODEL(OCTEON_CN68XX) ? 10 : 25));
+
+       divisor = (divisor - 1) >> 2;
+       /* Convert the divisor into a power of 2 shift */
+       while (divisor) {
+               clock_div++;
+               divisor >>= 1;
+       }
+
+       /*
+        * Clock divider for QLM JTAG operations.  sclk is divided by
+        * 2^(CLK_DIV + 2)
+        */
+       jtgc.u64 = 0;
+       jtgc.s.clk_div = clock_div;
+       jtgc.s.mux_sel = 0;
+       if (OCTEON_IS_MODEL(OCTEON_CN63XX) || OCTEON_IS_MODEL(OCTEON_CN66XX))
+               jtgc.s.bypass = 0x7;
+       else
+               jtgc.s.bypass = 0xf;
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               jtgc.s.bypass_ext = 1;
+       csr_wr(CVMX_CIU_QLM_JTGC, jtgc.u64);
+       csr_rd(CVMX_CIU_QLM_JTGC);
+}
+
+/**
+ * Write up to 32bits into the QLM jtag chain. Bits are shifted
+ * into the MSB and out the LSB, so you should shift in the low
+ * order bits followed by the high order bits. The JTAG chain for
+ * CN52XX and CN56XX is 4 * 268 bits long, or 1072. The JTAG chain
+ * for CN63XX is 4 * 300 bits long, or 1200.
+ *
+ * @param qlm    QLM to shift value into
+ * @param bits   Number of bits to shift in (1-32).
+ * @param data   Data to shift in. Bit 0 enters the chain first, followed by
+ *               bit 1, etc.
+ *
+ * @return The low order bits of the JTAG chain that shifted out of the
+ *         circle.
+ */
+uint32_t cvmx_helper_qlm_jtag_shift(int qlm, int bits, uint32_t data)
+{
+       union cvmx_ciu_qlm_jtgc jtgc;
+       union cvmx_ciu_qlm_jtgd jtgd;
+
+       jtgc.u64 = csr_rd(CVMX_CIU_QLM_JTGC);
+       jtgc.s.mux_sel = qlm;
+       csr_wr(CVMX_CIU_QLM_JTGC, jtgc.u64);
+       csr_rd(CVMX_CIU_QLM_JTGC);
+
+       jtgd.u64 = 0;
+       jtgd.s.shift = 1;
+       jtgd.s.shft_cnt = bits - 1;
+       jtgd.s.shft_reg = data;
+       jtgd.s.select = 1 << qlm;
+       csr_wr(CVMX_CIU_QLM_JTGD, jtgd.u64);
+       do {
+               jtgd.u64 = csr_rd(CVMX_CIU_QLM_JTGD);
+       } while (jtgd.s.shift);
+       return jtgd.s.shft_reg >> (32 - bits);
+}
+
+/**
+ * Shift long sequences of zeros into the QLM JTAG chain. It is
+ * common to need to shift more than 32 bits of zeros into the
+ * chain. This function is a convience wrapper around
+ * cvmx_helper_qlm_jtag_shift() to shift more than 32 bits of
+ * zeros at a time.
+ *
+ * @param qlm    QLM to shift zeros into
+ * @param bits
+ */
+void cvmx_helper_qlm_jtag_shift_zeros(int qlm, int bits)
+{
+       while (bits > 0) {
+               int n = bits;
+
+               if (n > 32)
+                       n = 32;
+               cvmx_helper_qlm_jtag_shift(qlm, n, 0);
+               bits -= n;
+       }
+}
+
+/**
+ * Program the QLM JTAG chain into all lanes of the QLM. You must
+ * have already shifted in the proper number of bits into the
+ * JTAG chain. Updating invalid values can possibly cause chip damage.
+ *
+ * @param qlm    QLM to program
+ */
+void cvmx_helper_qlm_jtag_update(int qlm)
+{
+       union cvmx_ciu_qlm_jtgc jtgc;
+       union cvmx_ciu_qlm_jtgd jtgd;
+
+       jtgc.u64 = csr_rd(CVMX_CIU_QLM_JTGC);
+       jtgc.s.mux_sel = qlm;
+
+       csr_wr(CVMX_CIU_QLM_JTGC, jtgc.u64);
+       csr_rd(CVMX_CIU_QLM_JTGC);
+
+       /* Update the new data */
+       jtgd.u64 = 0;
+       jtgd.s.update = 1;
+       jtgd.s.select = 1 << qlm;
+       csr_wr(CVMX_CIU_QLM_JTGD, jtgd.u64);
+       do {
+               jtgd.u64 = csr_rd(CVMX_CIU_QLM_JTGD);
+       } while (jtgd.s.update);
+}
+
+/**
+ * Load the QLM JTAG chain with data from all lanes of the QLM.
+ *
+ * @param qlm    QLM to program
+ */
+void cvmx_helper_qlm_jtag_capture(int qlm)
+{
+       union cvmx_ciu_qlm_jtgc jtgc;
+       union cvmx_ciu_qlm_jtgd jtgd;
+
+       jtgc.u64 = csr_rd(CVMX_CIU_QLM_JTGC);
+       jtgc.s.mux_sel = qlm;
+
+       csr_wr(CVMX_CIU_QLM_JTGC, jtgc.u64);
+       csr_rd(CVMX_CIU_QLM_JTGC);
+
+       jtgd.u64 = 0;
+       jtgd.s.capture = 1;
+       jtgd.s.select = 1 << qlm;
+       csr_wr(CVMX_CIU_QLM_JTGD, jtgd.u64);
+       do {
+               jtgd.u64 = csr_rd(CVMX_CIU_QLM_JTGD);
+       } while (jtgd.s.capture);
+}
diff --git a/arch/mips/mach-octeon/cvmx-helper-util.c b/arch/mips/mach-octeon/cvmx-helper-util.c
new file mode 100644 (file)
index 0000000..4625b45
--- /dev/null
@@ -0,0 +1,1225 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Small helper utilities.
+ */
+
+#include <log.h>
+#include <time.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-csr-enums.h>
+#include <mach/octeon-model.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-gmxx-defs.h>
+#include <mach/cvmx-ipd-defs.h>
+#include <mach/cvmx-pko-defs.h>
+#include <mach/cvmx-ipd.h>
+#include <mach/cvmx-hwpko.h>
+#include <mach/cvmx-pki.h>
+#include <mach/cvmx-pip.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-helper-pki.h>
+
+/**
+ * @INTERNAL
+ * These are the interface types needed to convert interface numbers to ipd
+ * ports.
+ *
+ * @param GMII
+ *     This type is used for sgmii, rgmii, xaui and rxaui interfaces.
+ * @param ILK
+ *     This type is used for ilk interfaces.
+ * @param SRIO
+ *     This type is used for serial-RapidIo interfaces.
+ * @param NPI
+ *     This type is used for npi interfaces.
+ * @param LB
+ *     This type is used for loopback interfaces.
+ * @param INVALID_IF_TYPE
+ *     This type indicates the interface hasn't been configured.
+ */
+enum port_map_if_type { INVALID_IF_TYPE = 0, GMII, ILK, SRIO, NPI, LB };
+
+/**
+ * @INTERNAL
+ * This structure is used to map interface numbers to ipd ports.
+ *
+ * @param type
+ *     Interface type
+ * @param first_ipd_port
+ *     First IPD port number assigned to this interface.
+ * @param last_ipd_port
+ *     Last IPD port number assigned to this interface.
+ * @param ipd_port_adj
+ *     Different octeon chips require different ipd ports for the
+ *     same interface port/mode configuration. This value is used
+ *     to account for that difference.
+ */
+struct ipd_port_map {
+       enum port_map_if_type type;
+       int first_ipd_port;
+       int last_ipd_port;
+       int ipd_port_adj;
+};
+
+/**
+ * @INTERNAL
+ * Interface number to ipd port map for the octeon 68xx.
+ */
+static const struct ipd_port_map ipd_port_map_68xx[CVMX_HELPER_MAX_IFACE] = {
+       { GMII, 0x800, 0x8ff, 0x40 }, /* Interface 0 */
+       { GMII, 0x900, 0x9ff, 0x40 }, /* Interface 1 */
+       { GMII, 0xa00, 0xaff, 0x40 }, /* Interface 2 */
+       { GMII, 0xb00, 0xbff, 0x40 }, /* Interface 3 */
+       { GMII, 0xc00, 0xcff, 0x40 }, /* Interface 4 */
+       { ILK, 0x400, 0x4ff, 0x00 },  /* Interface 5 */
+       { ILK, 0x500, 0x5ff, 0x00 },  /* Interface 6 */
+       { NPI, 0x100, 0x120, 0x00 },  /* Interface 7 */
+       { LB, 0x000, 0x008, 0x00 },   /* Interface 8 */
+};
+
+/**
+ * @INTERNAL
+ * Interface number to ipd port map for the octeon 78xx.
+ *
+ * This mapping corresponds to WQE(CHAN) enumeration in
+ * HRM Sections 11.15, PKI_CHAN_E, Section 11.6
+ *
+ */
+static const struct ipd_port_map ipd_port_map_78xx[CVMX_HELPER_MAX_IFACE] = {
+       { GMII, 0x800, 0x83f, 0x00 }, /* Interface 0 - BGX0 */
+       { GMII, 0x900, 0x93f, 0x00 }, /* Interface 1  -BGX1 */
+       { GMII, 0xa00, 0xa3f, 0x00 }, /* Interface 2  -BGX2 */
+       { GMII, 0xb00, 0xb3f, 0x00 }, /* Interface 3 - BGX3 */
+       { GMII, 0xc00, 0xc3f, 0x00 }, /* Interface 4 - BGX4 */
+       { GMII, 0xd00, 0xd3f, 0x00 }, /* Interface 5 - BGX5 */
+       { ILK, 0x400, 0x4ff, 0x00 },  /* Interface 6 - ILK0 */
+       { ILK, 0x500, 0x5ff, 0x00 },  /* Interface 7 - ILK1 */
+       { NPI, 0x100, 0x13f, 0x00 },  /* Interface 8 - DPI */
+       { LB, 0x000, 0x03f, 0x00 },   /* Interface 9 - LOOPBACK */
+};
+
+/**
+ * @INTERNAL
+ * Interface number to ipd port map for the octeon 73xx.
+ */
+static const struct ipd_port_map ipd_port_map_73xx[CVMX_HELPER_MAX_IFACE] = {
+       { GMII, 0x800, 0x83f, 0x00 }, /* Interface 0 - BGX(0,0-3) */
+       { GMII, 0x900, 0x93f, 0x00 }, /* Interface 1  -BGX(1,0-3) */
+       { GMII, 0xa00, 0xa3f, 0x00 }, /* Interface 2  -BGX(2,0-3) */
+       { NPI, 0x100, 0x17f, 0x00 },  /* Interface 3 - DPI */
+       { LB, 0x000, 0x03f, 0x00 },   /* Interface 4 - LOOPBACK */
+};
+
+/**
+ * @INTERNAL
+ * Interface number to ipd port map for the octeon 75xx.
+ */
+static const struct ipd_port_map ipd_port_map_75xx[CVMX_HELPER_MAX_IFACE] = {
+       { GMII, 0x800, 0x83f, 0x00 }, /* Interface 0 - BGX0 */
+       { SRIO, 0x240, 0x241, 0x00 }, /* Interface 1 - SRIO 0 */
+       { SRIO, 0x242, 0x243, 0x00 }, /* Interface 2 - SRIO 1 */
+       { NPI, 0x100, 0x13f, 0x00 },  /* Interface 3 - DPI */
+       { LB, 0x000, 0x03f, 0x00 },   /* Interface 4 - LOOPBACK */
+};
+
+/**
+ * Convert a interface mode into a human readable string
+ *
+ * @param mode   Mode to convert
+ *
+ * @return String
+ */
+const char *cvmx_helper_interface_mode_to_string(cvmx_helper_interface_mode_t mode)
+{
+       switch (mode) {
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+               return "DISABLED";
+       case CVMX_HELPER_INTERFACE_MODE_RGMII:
+               return "RGMII";
+       case CVMX_HELPER_INTERFACE_MODE_GMII:
+               return "GMII";
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+               return "SPI";
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               return "PCIE";
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               return "XAUI";
+       case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+               return "RXAUI";
+       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+               return "SGMII";
+       case CVMX_HELPER_INTERFACE_MODE_QSGMII:
+               return "QSGMII";
+       case CVMX_HELPER_INTERFACE_MODE_PICMG:
+               return "PICMG";
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+               return "NPI";
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               return "LOOP";
+       case CVMX_HELPER_INTERFACE_MODE_SRIO:
+               return "SRIO";
+       case CVMX_HELPER_INTERFACE_MODE_ILK:
+               return "ILK";
+       case CVMX_HELPER_INTERFACE_MODE_AGL:
+               return "AGL";
+       case CVMX_HELPER_INTERFACE_MODE_XLAUI:
+               return "XLAUI";
+       case CVMX_HELPER_INTERFACE_MODE_XFI:
+               return "XFI";
+       case CVMX_HELPER_INTERFACE_MODE_40G_KR4:
+               return "40G_KR4";
+       case CVMX_HELPER_INTERFACE_MODE_10G_KR:
+               return "10G_KR";
+       case CVMX_HELPER_INTERFACE_MODE_MIXED:
+               return "MIXED";
+       }
+       return "UNKNOWN";
+}
+
+/**
+ * Debug routine to dump the packet structure to the console
+ *
+ * @param work   Work queue entry containing the packet to dump
+ * @return
+ */
+int cvmx_helper_dump_packet(cvmx_wqe_t *work)
+{
+       u64 count;
+       u64 remaining_bytes;
+       union cvmx_buf_ptr buffer_ptr;
+       cvmx_buf_ptr_pki_t bptr;
+       cvmx_wqe_78xx_t *wqe = (void *)work;
+       u64 start_of_buffer;
+       u8 *data_address;
+       u8 *end_of_data;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_pki_dump_wqe(wqe);
+               cvmx_wqe_pki_errata_20776(work);
+       } else {
+               debug("WORD0 = %lx\n", (unsigned long)work->word0.u64);
+               debug("WORD1 = %lx\n", (unsigned long)work->word1.u64);
+               debug("WORD2 = %lx\n", (unsigned long)work->word2.u64);
+               debug("Packet Length:   %u\n", cvmx_wqe_get_len(work));
+               debug("    Input Port:  %u\n", cvmx_wqe_get_port(work));
+               debug("    QoS:         %u\n", cvmx_wqe_get_qos(work));
+               debug("    Buffers:     %u\n", cvmx_wqe_get_bufs(work));
+       }
+
+       if (cvmx_wqe_get_bufs(work) == 0) {
+               int wqe_pool;
+
+               if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+                       debug("%s: ERROR: Unexpected bufs==0 in WQE\n", __func__);
+                       return -1;
+               }
+               wqe_pool = (int)cvmx_fpa_get_wqe_pool();
+               buffer_ptr.u64 = 0;
+               buffer_ptr.s.pool = wqe_pool;
+
+               buffer_ptr.s.size = 128;
+               buffer_ptr.s.addr = cvmx_ptr_to_phys(work->packet_data);
+               if (cvmx_likely(!work->word2.s.not_IP)) {
+                       union cvmx_pip_ip_offset pip_ip_offset;
+
+                       pip_ip_offset.u64 = csr_rd(CVMX_PIP_IP_OFFSET);
+                       buffer_ptr.s.addr +=
+                               (pip_ip_offset.s.offset << 3) - work->word2.s.ip_offset;
+                       buffer_ptr.s.addr += (work->word2.s.is_v6 ^ 1) << 2;
+               } else {
+                       /*
+                        * WARNING: This code assume that the packet
+                        * is not RAW. If it was, we would use
+                        * PIP_GBL_CFG[RAW_SHF] instead of
+                        * PIP_GBL_CFG[NIP_SHF].
+                        */
+                       union cvmx_pip_gbl_cfg pip_gbl_cfg;
+
+                       pip_gbl_cfg.u64 = csr_rd(CVMX_PIP_GBL_CFG);
+                       buffer_ptr.s.addr += pip_gbl_cfg.s.nip_shf;
+               }
+       } else {
+               buffer_ptr = work->packet_ptr;
+       }
+
+       remaining_bytes = cvmx_wqe_get_len(work);
+
+       while (remaining_bytes) {
+               /* native cn78xx buffer format, unless legacy-translated */
+               if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE) && !wqe->pki_wqe_translated) {
+                       bptr.u64 = buffer_ptr.u64;
+                       /* XXX- assumes cache-line aligned buffer */
+                       start_of_buffer = (bptr.addr >> 7) << 7;
+                       debug("    Buffer Start:%llx\n", (unsigned long long)start_of_buffer);
+                       debug("    Buffer Data: %llx\n", (unsigned long long)bptr.addr);
+                       debug("    Buffer Size: %u\n", bptr.size);
+                       data_address = (uint8_t *)cvmx_phys_to_ptr(bptr.addr);
+                       end_of_data = data_address + bptr.size;
+               } else {
+                       start_of_buffer = ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
+                       debug("    Buffer Start:%llx\n", (unsigned long long)start_of_buffer);
+                       debug("    Buffer I   : %u\n", buffer_ptr.s.i);
+                       debug("    Buffer Back: %u\n", buffer_ptr.s.back);
+                       debug("    Buffer Pool: %u\n", buffer_ptr.s.pool);
+                       debug("    Buffer Data: %llx\n", (unsigned long long)buffer_ptr.s.addr);
+                       debug("    Buffer Size: %u\n", buffer_ptr.s.size);
+                       data_address = (uint8_t *)cvmx_phys_to_ptr(buffer_ptr.s.addr);
+                       end_of_data = data_address + buffer_ptr.s.size;
+               }
+
+               debug("\t\t");
+               count = 0;
+               while (data_address < end_of_data) {
+                       if (remaining_bytes == 0)
+                               break;
+
+                       remaining_bytes--;
+                       debug("%02x", (unsigned int)*data_address);
+                       data_address++;
+                       if (remaining_bytes && count == 7) {
+                               debug("\n\t\t");
+                               count = 0;
+                       } else {
+                               count++;
+                       }
+               }
+               debug("\n");
+
+               if (remaining_bytes) {
+                       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE) &&
+                           !wqe->pki_wqe_translated)
+                               buffer_ptr.u64 = *(uint64_t *)cvmx_phys_to_ptr(bptr.addr - 8);
+                       else
+                               buffer_ptr.u64 =
+                                       *(uint64_t *)cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
+               }
+       }
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ *
+ * Extract NO_WPTR mode from PIP/IPD register
+ */
+static int __cvmx_ipd_mode_no_wptr(void)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_NO_WPTR)) {
+               cvmx_ipd_ctl_status_t ipd_ctl_status;
+
+               ipd_ctl_status.u64 = csr_rd(CVMX_IPD_CTL_STATUS);
+               return ipd_ctl_status.s.no_wptr;
+       }
+       return 0;
+}
+
+static cvmx_buf_ptr_t __cvmx_packet_short_ptr[4];
+static int8_t __cvmx_wqe_pool = -1;
+
+/**
+ * @INTERNAL
+ * Prepare packet pointer templace for dynamic short
+ * packets.
+ */
+static void cvmx_packet_short_ptr_calculate(void)
+{
+       unsigned int i, off;
+       union cvmx_pip_gbl_cfg pip_gbl_cfg;
+       union cvmx_pip_ip_offset pip_ip_offset;
+
+       /* Fill in the common values for all cases */
+       for (i = 0; i < 4; i++) {
+               if (__cvmx_ipd_mode_no_wptr())
+                       /* packet pool, set to 0 in hardware */
+                       __cvmx_wqe_pool = 0;
+               else
+                       /* WQE pool as configured */
+                       __cvmx_wqe_pool = csr_rd(CVMX_IPD_WQE_FPA_QUEUE) & 7;
+
+               __cvmx_packet_short_ptr[i].s.pool = __cvmx_wqe_pool;
+               __cvmx_packet_short_ptr[i].s.size = cvmx_fpa_get_block_size(__cvmx_wqe_pool);
+               __cvmx_packet_short_ptr[i].s.size -= 32;
+               __cvmx_packet_short_ptr[i].s.addr = 32;
+       }
+
+       pip_gbl_cfg.u64 = csr_rd(CVMX_PIP_GBL_CFG);
+       pip_ip_offset.u64 = csr_rd(CVMX_PIP_IP_OFFSET);
+
+       /* RAW_FULL: index = 0 */
+       i = 0;
+       off = pip_gbl_cfg.s.raw_shf;
+       __cvmx_packet_short_ptr[i].s.addr += off;
+       __cvmx_packet_short_ptr[i].s.size -= off;
+       __cvmx_packet_short_ptr[i].s.back += off >> 7;
+
+       /* NON-IP: index = 1 */
+       i = 1;
+       off = pip_gbl_cfg.s.nip_shf;
+       __cvmx_packet_short_ptr[i].s.addr += off;
+       __cvmx_packet_short_ptr[i].s.size -= off;
+       __cvmx_packet_short_ptr[i].s.back += off >> 7;
+
+       /* IPv4: index = 2 */
+       i = 2;
+       off = (pip_ip_offset.s.offset << 3) + 4;
+       __cvmx_packet_short_ptr[i].s.addr += off;
+       __cvmx_packet_short_ptr[i].s.size -= off;
+       __cvmx_packet_short_ptr[i].s.back += off >> 7;
+
+       /* IPv6: index = 3 */
+       i = 3;
+       off = (pip_ip_offset.s.offset << 3) + 0;
+       __cvmx_packet_short_ptr[i].s.addr += off;
+       __cvmx_packet_short_ptr[i].s.size -= off;
+       __cvmx_packet_short_ptr[i].s.back += off >> 7;
+
+       /* For IPv4/IPv6: subtract work->word2.s.ip_offset
+        * to addr, if it is smaller than IP_OFFSET[OFFSET]*8
+        * which is stored in __cvmx_packet_short_ptr[3].s.addr
+        */
+}
+
+/**
+ * Extract packet data buffer pointer from work queue entry.
+ *
+ * Returns the legacy (Octeon1/Octeon2) buffer pointer structure
+ * for the linked buffer list.
+ * On CN78XX, the native buffer pointer structure is converted into
+ * the legacy format.
+ * The legacy buf_ptr is then stored in the WQE, and word0 reserved
+ * field is set to indicate that the buffer pointers were translated.
+ * If the packet data is only found inside the work queue entry,
+ * a standard buffer pointer structure is created for it.
+ */
+cvmx_buf_ptr_t cvmx_wqe_get_packet_ptr(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (void *)work;
+               cvmx_buf_ptr_t optr, lptr;
+               cvmx_buf_ptr_pki_t nptr;
+               unsigned int pool, bufs;
+               int node = cvmx_get_node_num();
+
+               /* In case of repeated calls of this function */
+               if (wqe->pki_wqe_translated || wqe->word2.software) {
+                       optr.u64 = wqe->packet_ptr.u64;
+                       return optr;
+               }
+
+               bufs = wqe->word0.bufs;
+               pool = wqe->word0.aura;
+               nptr.u64 = wqe->packet_ptr.u64;
+
+               optr.u64 = 0;
+               optr.s.pool = pool;
+               optr.s.addr = nptr.addr;
+               if (bufs == 1) {
+                       optr.s.size = pki_dflt_pool[node].buffer_size -
+                                     pki_dflt_style[node].parm_cfg.first_skip - 8 -
+                                     wqe->word0.apad;
+               } else {
+                       optr.s.size = nptr.size;
+               }
+
+               /* Calculate the "back" offset */
+               if (!nptr.packet_outside_wqe) {
+                       optr.s.back = (nptr.addr -
+                                      cvmx_ptr_to_phys(wqe)) >> 7;
+               } else {
+                       optr.s.back =
+                               (pki_dflt_style[node].parm_cfg.first_skip +
+                                8 + wqe->word0.apad) >> 7;
+               }
+               lptr = optr;
+
+               /* Follow pointer and convert all linked pointers */
+               while (bufs > 1) {
+                       void *vptr;
+
+                       vptr = cvmx_phys_to_ptr(lptr.s.addr);
+
+                       memcpy(&nptr, vptr - 8, 8);
+                       /*
+                        * Errata (PKI-20776) PKI_BUFLINK_S's are endian-swapped
+                        * CN78XX pass 1.x has a bug where the packet pointer
+                        * in each segment is written in the opposite
+                        * endianness of the configured mode. Fix these here
+                        */
+                       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                               nptr.u64 = __builtin_bswap64(nptr.u64);
+                       lptr.u64 = 0;
+                       lptr.s.pool = pool;
+                       lptr.s.addr = nptr.addr;
+                       lptr.s.size = nptr.size;
+                       lptr.s.back = (pki_dflt_style[0].parm_cfg.later_skip + 8) >>
+                                     7; /* TBD: not guaranteed !! */
+
+                       memcpy(vptr - 8, &lptr, 8);
+                       bufs--;
+               }
+               /* Store translated bufptr in WQE, and set indicator */
+               wqe->pki_wqe_translated = 1;
+               wqe->packet_ptr.u64 = optr.u64;
+               return optr;
+
+       } else {
+               unsigned int i;
+               unsigned int off = 0;
+               cvmx_buf_ptr_t bptr;
+
+               if (cvmx_likely(work->word2.s.bufs > 0))
+                       return work->packet_ptr;
+
+               if (cvmx_unlikely(work->word2.s.software))
+                       return work->packet_ptr;
+
+               /* first packet, precalculate packet_ptr templaces */
+               if (cvmx_unlikely(__cvmx_packet_short_ptr[0].u64 == 0))
+                       cvmx_packet_short_ptr_calculate();
+
+               /* calculate templace index */
+               i = work->word2.s_cn38xx.not_IP | work->word2.s_cn38xx.rcv_error;
+               i = 2 ^ (i << 1);
+
+               /* IPv4/IPv6: Adjust IP offset */
+               if (cvmx_likely(i & 2)) {
+                       i |= work->word2.s.is_v6;
+                       off = work->word2.s.ip_offset;
+               } else {
+                       /* RAWFULL/RAWSCHED should be handled here */
+                       i = 1; /* not-IP */
+                       off = 0;
+               }
+
+               /* Get the right templace */
+               bptr = __cvmx_packet_short_ptr[i];
+               bptr.s.addr -= off;
+               bptr.s.back = bptr.s.addr >> 7;
+
+               /* Add actual WQE paddr to the templace offset */
+               bptr.s.addr += cvmx_ptr_to_phys(work);
+
+               /* Adjust word2.bufs so that _free_data() handles it
+                * in the same way as PKO
+                */
+               work->word2.s.bufs = 1;
+
+               /* Store the new buffer pointer back into WQE */
+               work->packet_ptr = bptr;
+
+               /* Returned the synthetic buffer_pointer */
+               return bptr;
+       }
+}
+
+void cvmx_wqe_free(cvmx_wqe_t *work)
+{
+       unsigned int bufs, ncl = 1;
+       u64 paddr, paddr1;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (void *)work;
+               cvmx_fpa3_gaura_t aura;
+               cvmx_buf_ptr_pki_t bptr;
+
+               bufs = wqe->word0.bufs;
+
+               if (!wqe->pki_wqe_translated && bufs != 0) {
+                       /* Handle cn78xx native untralsated WQE */
+
+                       bptr = wqe->packet_ptr;
+
+                       /* Do nothing - first packet buffer shares WQE buffer */
+                       if (!bptr.packet_outside_wqe)
+                               return;
+               } else if (cvmx_likely(bufs != 0)) {
+                       /* Handle translated 78XX WQE */
+                       paddr = (work->packet_ptr.s.addr & (~0x7full)) -
+                               (work->packet_ptr.s.back << 7);
+                       paddr1 = cvmx_ptr_to_phys(work);
+
+                       /* do not free WQE if contains first data buffer */
+                       if (paddr == paddr1)
+                               return;
+               }
+
+               /* WQE is separate from packet buffer, free it */
+               aura = __cvmx_fpa3_gaura(wqe->word0.aura >> 10, wqe->word0.aura & 0x3ff);
+
+               cvmx_fpa3_free(work, aura, ncl);
+       } else {
+               /* handle legacy WQE */
+               bufs = work->word2.s_cn38xx.bufs;
+
+               if (cvmx_likely(bufs != 0)) {
+                       /* Check if the first data buffer is inside WQE */
+                       paddr = (work->packet_ptr.s.addr & (~0x7full)) -
+                               (work->packet_ptr.s.back << 7);
+                       paddr1 = cvmx_ptr_to_phys(work);
+
+                       /* do not free WQE if contains first data buffer */
+                       if (paddr == paddr1)
+                               return;
+               }
+
+               /* precalculate packet_ptr, WQE pool number */
+               if (cvmx_unlikely(__cvmx_wqe_pool < 0))
+                       cvmx_packet_short_ptr_calculate();
+               cvmx_fpa1_free(work, __cvmx_wqe_pool, ncl);
+       }
+}
+
+/**
+ * Free the packet buffers contained in a work queue entry.
+ * The work queue entry is also freed if it contains packet data.
+ * If however the packet starts outside the WQE, the WQE will
+ * not be freed. The application should call cvmx_wqe_free()
+ * to free the WQE buffer that contains no packet data.
+ *
+ * @param work   Work queue entry with packet to free
+ */
+void cvmx_helper_free_packet_data(cvmx_wqe_t *work)
+{
+       u64 number_buffers;
+       u64 start_of_buffer;
+       u64 next_buffer_ptr;
+       cvmx_fpa3_gaura_t aura;
+       unsigned int ncl;
+       cvmx_buf_ptr_t buffer_ptr;
+       cvmx_buf_ptr_pki_t bptr;
+       cvmx_wqe_78xx_t *wqe = (void *)work;
+       int o3_pki_wqe = 0;
+
+       number_buffers = cvmx_wqe_get_bufs(work);
+
+       buffer_ptr.u64 = work->packet_ptr.u64;
+
+       /* Zero-out WQE WORD3 so that the WQE is freed by cvmx_wqe_free() */
+       work->packet_ptr.u64 = 0;
+
+       if (number_buffers == 0)
+               return;
+
+       /* Interpret PKI-style bufptr unless it has been translated */
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE) &&
+           !wqe->pki_wqe_translated) {
+               o3_pki_wqe = 1;
+               cvmx_wqe_pki_errata_20776(work);
+               aura = __cvmx_fpa3_gaura(wqe->word0.aura >> 10,
+                                        wqe->word0.aura & 0x3ff);
+       } else {
+               start_of_buffer = ((buffer_ptr.s.addr >> 7) -
+                                  buffer_ptr.s.back) << 7;
+               next_buffer_ptr =
+                       *(uint64_t *)cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
+               /*
+                * Since the number of buffers is not zero, we know this is not
+                * a dynamic short packet. We need to check if it is a packet
+                * received with IPD_CTL_STATUS[NO_WPTR]. If this is true,
+                * we need to free all buffers except for the first one.
+                * The caller doesn't expect their WQE pointer to be freed
+                */
+               if (cvmx_ptr_to_phys(work) == start_of_buffer) {
+                       buffer_ptr.u64 = next_buffer_ptr;
+                       number_buffers--;
+               }
+       }
+       while (number_buffers--) {
+               if (o3_pki_wqe) {
+                       bptr.u64 = buffer_ptr.u64;
+
+                       ncl = (bptr.size + CVMX_CACHE_LINE_SIZE - 1) /
+                               CVMX_CACHE_LINE_SIZE;
+
+                       /* XXX- assumes the buffer is cache-line aligned */
+                       start_of_buffer = (bptr.addr >> 7) << 7;
+
+                       /*
+                        * Read pointer to next buffer before we free the
+                        * current buffer.
+                        */
+                       next_buffer_ptr = *(uint64_t *)cvmx_phys_to_ptr(bptr.addr - 8);
+                       /* FPA AURA comes from WQE, includes node */
+                       cvmx_fpa3_free(cvmx_phys_to_ptr(start_of_buffer),
+                                      aura, ncl);
+               } else {
+                       ncl = (buffer_ptr.s.size + CVMX_CACHE_LINE_SIZE - 1) /
+                                     CVMX_CACHE_LINE_SIZE +
+                             buffer_ptr.s.back;
+                       /*
+                        * Calculate buffer start using "back" offset,
+                        * Remember the back pointer is in cache lines,
+                        * not 64bit words
+                        */
+                       start_of_buffer = ((buffer_ptr.s.addr >> 7) -
+                                          buffer_ptr.s.back) << 7;
+                       /*
+                        * Read pointer to next buffer before we free
+                        * the current buffer.
+                        */
+                       next_buffer_ptr =
+                               *(uint64_t *)cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
+                       /* FPA pool comes from buf_ptr itself */
+                       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+                               aura = cvmx_fpa1_pool_to_fpa3_aura(buffer_ptr.s.pool);
+                               cvmx_fpa3_free(cvmx_phys_to_ptr(start_of_buffer),
+                                              aura, ncl);
+                       } else {
+                               cvmx_fpa1_free(cvmx_phys_to_ptr(start_of_buffer),
+                                              buffer_ptr.s.pool, ncl);
+                       }
+               }
+               buffer_ptr.u64 = next_buffer_ptr;
+       }
+}
+
+void cvmx_helper_setup_legacy_red(int pass_thresh, int drop_thresh)
+{
+       unsigned int node = cvmx_get_node_num();
+       int aura, bpid;
+       int buf_cnt;
+       bool ena_red = 0, ena_drop = 0, ena_bp = 0;
+
+#define FPA_RED_AVG_DLY 1
+#define FPA_RED_LVL_DLY 3
+#define FPA_QOS_AVRG   0
+       /* Trying to make it backward compatible with older chips */
+
+       /* Setting up avg_dly and prb_dly, enable bits */
+       if (octeon_has_feature(OCTEON_FEATURE_FPA3)) {
+               cvmx_fpa3_config_red_params(node, FPA_QOS_AVRG,
+                                           FPA_RED_LVL_DLY, FPA_RED_AVG_DLY);
+       }
+
+       /* Disable backpressure on queued buffers which is aura in 78xx*/
+       /*
+        * Assumption is that all packets from all interface and ports goes
+        * in same poolx/aurax for backward compatibility
+        */
+       aura = cvmx_fpa_get_packet_pool();
+       buf_cnt = cvmx_fpa_get_packet_pool_buffer_count();
+       pass_thresh = buf_cnt - pass_thresh;
+       drop_thresh = buf_cnt - drop_thresh;
+       /* Map aura to bpid 0*/
+       bpid = 0;
+       cvmx_pki_write_aura_bpid(node, aura, bpid);
+       /* Don't enable back pressure */
+       ena_bp = 0;
+       /* enable RED */
+       ena_red = 1;
+       /*
+        * This will enable RED on all interfaces since
+        * they all have packet buffer coming from  same aura
+        */
+       cvmx_helper_setup_aura_qos(node, aura, ena_red, ena_drop, pass_thresh,
+                                  drop_thresh, ena_bp, 0);
+}
+
+/**
+ * Setup Random Early Drop to automatically begin dropping packets.
+ *
+ * @param pass_thresh
+ *               Packets will begin slowly dropping when there are less than
+ *               this many packet buffers free in FPA 0.
+ * @param drop_thresh
+ *               All incoming packets will be dropped when there are less
+ *               than this many free packet buffers in FPA 0.
+ * @return Zero on success. Negative on failure
+ */
+int cvmx_helper_setup_red(int pass_thresh, int drop_thresh)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_PKI))
+               cvmx_helper_setup_legacy_red(pass_thresh, drop_thresh);
+       else
+               cvmx_ipd_setup_red(pass_thresh, drop_thresh);
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ * Setup the common GMX settings that determine the number of
+ * ports. These setting apply to almost all configurations of all
+ * chips.
+ *
+ * @param xiface Interface to configure
+ * @param num_ports Number of ports on the interface
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_setup_gmx(int xiface, int num_ports)
+{
+       union cvmx_gmxx_tx_prts gmx_tx_prts;
+       union cvmx_gmxx_rx_prts gmx_rx_prts;
+       union cvmx_pko_reg_gmx_port_mode pko_mode;
+       union cvmx_gmxx_txx_thresh gmx_tx_thresh;
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int index;
+
+       /*
+        * The common BGX settings are already done in the appropriate
+        * enable functions, nothing to do here.
+        */
+       if (octeon_has_feature(OCTEON_FEATURE_BGX))
+               return 0;
+
+       /* Tell GMX the number of TX ports on this interface */
+       gmx_tx_prts.u64 = csr_rd(CVMX_GMXX_TX_PRTS(xi.interface));
+       gmx_tx_prts.s.prts = num_ports;
+       csr_wr(CVMX_GMXX_TX_PRTS(xi.interface), gmx_tx_prts.u64);
+
+       /*
+        * Tell GMX the number of RX ports on this interface.  This only applies
+        * to *GMII and XAUI ports.
+        */
+       switch (cvmx_helper_interface_get_mode(xiface)) {
+       case CVMX_HELPER_INTERFACE_MODE_RGMII:
+       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+       case CVMX_HELPER_INTERFACE_MODE_QSGMII:
+       case CVMX_HELPER_INTERFACE_MODE_GMII:
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+       case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+               if (num_ports > 4) {
+                       debug("%s: Illegal num_ports\n", __func__);
+                       return -1;
+               }
+
+               gmx_rx_prts.u64 = csr_rd(CVMX_GMXX_RX_PRTS(xi.interface));
+               gmx_rx_prts.s.prts = num_ports;
+               csr_wr(CVMX_GMXX_RX_PRTS(xi.interface), gmx_rx_prts.u64);
+               break;
+
+       default:
+               break;
+       }
+
+       /*
+        * Skip setting CVMX_PKO_REG_GMX_PORT_MODE on 30XX, 31XX, 50XX,
+        * and 68XX.
+        */
+       if (!OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+               /* Tell PKO the number of ports on this interface */
+               pko_mode.u64 = csr_rd(CVMX_PKO_REG_GMX_PORT_MODE);
+               if (xi.interface == 0) {
+                       if (num_ports == 1)
+                               pko_mode.s.mode0 = 4;
+                       else if (num_ports == 2)
+                               pko_mode.s.mode0 = 3;
+                       else if (num_ports <= 4)
+                               pko_mode.s.mode0 = 2;
+                       else if (num_ports <= 8)
+                               pko_mode.s.mode0 = 1;
+                       else
+                               pko_mode.s.mode0 = 0;
+               } else {
+                       if (num_ports == 1)
+                               pko_mode.s.mode1 = 4;
+                       else if (num_ports == 2)
+                               pko_mode.s.mode1 = 3;
+                       else if (num_ports <= 4)
+                               pko_mode.s.mode1 = 2;
+                       else if (num_ports <= 8)
+                               pko_mode.s.mode1 = 1;
+                       else
+                               pko_mode.s.mode1 = 0;
+               }
+               csr_wr(CVMX_PKO_REG_GMX_PORT_MODE, pko_mode.u64);
+       }
+
+       /*
+        * Set GMX to buffer as much data as possible before starting
+        * transmit. This reduces the chances that we have a TX under run
+        * due to memory contention. Any packet that fits entirely in the
+        * GMX FIFO can never have an under run regardless of memory load.
+        */
+       gmx_tx_thresh.u64 = csr_rd(CVMX_GMXX_TXX_THRESH(0, xi.interface));
+       /* ccn - common cnt numberator */
+       int ccn = 0x100;
+
+       /* Choose the max value for the number of ports */
+       if (num_ports <= 1)
+               gmx_tx_thresh.s.cnt = ccn / 1;
+       else if (num_ports == 2)
+               gmx_tx_thresh.s.cnt = ccn / 2;
+       else
+               gmx_tx_thresh.s.cnt = ccn / 4;
+
+       /*
+        * SPI and XAUI can have lots of ports but the GMX hardware
+        * only ever has a max of 4
+        */
+       if (num_ports > 4)
+               num_ports = 4;
+       for (index = 0; index < num_ports; index++)
+               csr_wr(CVMX_GMXX_TXX_THRESH(index, xi.interface), gmx_tx_thresh.u64);
+
+       /*
+        * For o68, we need to setup the pipes
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX) && xi.interface < CVMX_HELPER_MAX_GMX) {
+               union cvmx_gmxx_txx_pipe config;
+
+               for (index = 0; index < num_ports; index++) {
+                       config.u64 = 0;
+
+                       if (__cvmx_helper_cfg_pko_port_base(xiface, index) >= 0) {
+                               config.u64 = csr_rd(CVMX_GMXX_TXX_PIPE(index,
+                                                                      xi.interface));
+                               config.s.nump = __cvmx_helper_cfg_pko_port_num(xiface,
+                                                                              index);
+                               config.s.base = __cvmx_helper_cfg_pko_port_base(xiface,
+                                                                               index);
+                               csr_wr(CVMX_GMXX_TXX_PIPE(index, xi.interface),
+                                      config.u64);
+                       }
+               }
+       }
+
+       return 0;
+}
+
+int cvmx_helper_get_pko_port(int interface, int port)
+{
+       return cvmx_pko_get_base_pko_port(interface, port);
+}
+
+int cvmx_helper_get_ipd_port(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               const struct ipd_port_map *port_map;
+               int ipd_port;
+
+               if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+                       port_map = ipd_port_map_68xx;
+                       ipd_port = 0;
+               } else if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+                       port_map = ipd_port_map_78xx;
+                       ipd_port = cvmx_helper_node_to_ipd_port(xi.node, 0);
+               } else if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+                       port_map = ipd_port_map_73xx;
+                       ipd_port = 0;
+               } else if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+                       port_map = ipd_port_map_75xx;
+                       ipd_port = 0;
+               } else {
+                       return -1;
+               }
+
+               ipd_port += port_map[xi.interface].first_ipd_port;
+               if (port_map[xi.interface].type == GMII) {
+                       cvmx_helper_interface_mode_t mode;
+
+                       mode = cvmx_helper_interface_get_mode(xiface);
+                       if (mode == CVMX_HELPER_INTERFACE_MODE_XAUI ||
+                           (mode == CVMX_HELPER_INTERFACE_MODE_RXAUI &&
+                            OCTEON_IS_MODEL(OCTEON_CN68XX))) {
+                               ipd_port += port_map[xi.interface].ipd_port_adj;
+                               return ipd_port;
+                       } else {
+                               return ipd_port + (index * 16);
+                       }
+               } else if (port_map[xi.interface].type == ILK) {
+                       return ipd_port + index;
+               } else if (port_map[xi.interface].type == NPI) {
+                       return ipd_port + index;
+               } else if (port_map[xi.interface].type == SRIO) {
+                       return ipd_port + index;
+               } else if (port_map[xi.interface].type == LB) {
+                       return ipd_port + index;
+               }
+
+               debug("ERROR: %s: interface %u:%u bad mode\n",
+                     __func__, xi.node, xi.interface);
+               return -1;
+       } else if (cvmx_helper_interface_get_mode(xiface) ==
+                  CVMX_HELPER_INTERFACE_MODE_AGL) {
+               return 24;
+       }
+
+       switch (xi.interface) {
+       case 0:
+               return index;
+       case 1:
+               return index + 16;
+       case 2:
+               return index + 32;
+       case 3:
+               return index + 36;
+       case 4:
+               return index + 40;
+       case 5:
+               return index + 42;
+       case 6:
+               return index + 44;
+       case 7:
+               return index + 46;
+       }
+       return -1;
+}
+
+int cvmx_helper_get_pknd(int xiface, int index)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_PKND))
+               return __cvmx_helper_cfg_pknd(xiface, index);
+
+       return CVMX_INVALID_PKND;
+}
+
+int cvmx_helper_get_bpid(int interface, int port)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_PKND))
+               return __cvmx_helper_cfg_bpid(interface, port);
+
+       return CVMX_INVALID_BPID;
+}
+
+/**
+ * Display interface statistics.
+ *
+ * @param port IPD/PKO port number
+ *
+ * @return none
+ */
+void cvmx_helper_show_stats(int port)
+{
+       cvmx_pip_port_status_t status;
+       cvmx_pko_port_status_t pko_status;
+
+       /* ILK stats */
+       if (octeon_has_feature(OCTEON_FEATURE_ILK))
+               __cvmx_helper_ilk_show_stats();
+
+       /* PIP stats */
+       cvmx_pip_get_port_stats(port, 0, &status);
+       debug("port %d: the number of packets - ipd: %d\n", port,
+             (int)status.packets);
+
+       /* PKO stats */
+       cvmx_pko_get_port_status(port, 0, &pko_status);
+       debug("port %d: the number of packets - pko: %d\n", port,
+             (int)pko_status.packets);
+
+       /* TODO: other stats */
+}
+
+/**
+ * Returns the interface number for an IPD/PKO port number.
+ *
+ * @param ipd_port IPD/PKO port number
+ *
+ * @return Interface number
+ */
+int cvmx_helper_get_interface_num(int ipd_port)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+               const struct ipd_port_map *port_map;
+               int i;
+               struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+               port_map = ipd_port_map_68xx;
+               for (i = 0; i < CVMX_HELPER_MAX_IFACE; i++) {
+                       if (xp.port >= port_map[i].first_ipd_port &&
+                           xp.port <= port_map[i].last_ipd_port)
+                               return i;
+               }
+               return -1;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               const struct ipd_port_map *port_map;
+               int i;
+               struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+               port_map = ipd_port_map_78xx;
+               for (i = 0; i < CVMX_HELPER_MAX_IFACE; i++) {
+                       if (xp.port >= port_map[i].first_ipd_port &&
+                           xp.port <= port_map[i].last_ipd_port)
+                               return cvmx_helper_node_interface_to_xiface(xp.node, i);
+               }
+               return -1;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+               const struct ipd_port_map *port_map;
+               int i;
+               struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+               port_map = ipd_port_map_73xx;
+               for (i = 0; i < CVMX_HELPER_MAX_IFACE; i++) {
+                       if (xp.port >= port_map[i].first_ipd_port &&
+                           xp.port <= port_map[i].last_ipd_port)
+                               return i;
+               }
+               return -1;
+       } else if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               const struct ipd_port_map *port_map;
+               int i;
+               struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+               port_map = ipd_port_map_75xx;
+               for (i = 0; i < CVMX_HELPER_MAX_IFACE; i++) {
+                       if (xp.port >= port_map[i].first_ipd_port &&
+                           xp.port <= port_map[i].last_ipd_port)
+                               return i;
+               }
+               return -1;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN70XX) && ipd_port == 24) {
+               return 4;
+       }
+
+       if (ipd_port < 16)
+               return 0;
+       else if (ipd_port < 32)
+               return 1;
+       else if (ipd_port < 36)
+               return 2;
+       else if (ipd_port < 40)
+               return 3;
+       else if (ipd_port < 42)
+               return 4;
+       else if (ipd_port < 44)
+               return 5;
+       else if (ipd_port < 46)
+               return 6;
+       else if (ipd_port < 48)
+               return 7;
+
+       debug("%s: Illegal IPD port number %d\n", __func__, ipd_port);
+       return -1;
+}
+
+/**
+ * Returns the interface index number for an IPD/PKO port
+ * number.
+ *
+ * @param ipd_port IPD/PKO port number
+ *
+ * @return Interface index number
+ */
+int cvmx_helper_get_interface_index_num(int ipd_port)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               const struct ipd_port_map *port_map;
+               int port;
+               enum port_map_if_type type = INVALID_IF_TYPE;
+               int i;
+               int num_interfaces;
+
+               if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+                       port_map = ipd_port_map_68xx;
+               } else if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+                       struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+                       port_map = ipd_port_map_78xx;
+                       ipd_port = xp.port;
+               } else if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+                       struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+                       port_map = ipd_port_map_73xx;
+                       ipd_port = xp.port;
+               } else if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+                       struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+                       port_map = ipd_port_map_75xx;
+                       ipd_port = xp.port;
+               } else {
+                       return -1;
+               }
+
+               num_interfaces = cvmx_helper_get_number_of_interfaces();
+
+               /* Get the interface type of the ipd port */
+               for (i = 0; i < num_interfaces; i++) {
+                       if (ipd_port >= port_map[i].first_ipd_port &&
+                           ipd_port <= port_map[i].last_ipd_port) {
+                               type = port_map[i].type;
+                               break;
+                       }
+               }
+
+               /* Convert the ipd port to the interface port */
+               switch (type) {
+               /* Ethernet interfaces have a channel in lower 4 bits
+                * that is does not discriminate traffic, and is ignored.
+                */
+               case GMII:
+                       port = ipd_port - port_map[i].first_ipd_port;
+
+                       /* CN68XX adds 0x40 to IPD_PORT when in XAUI/RXAUI
+                        * mode of operation, adjust for that case
+                        */
+                       if (port >= port_map[i].ipd_port_adj)
+                               port -= port_map[i].ipd_port_adj;
+
+                       port >>= 4;
+                       return port;
+
+               /*
+                * These interfaces do not have physical ports,
+                * but have logical channels instead that separate
+                * traffic into logical streams
+                */
+               case ILK:
+               case SRIO:
+               case NPI:
+               case LB:
+                       port = ipd_port - port_map[i].first_ipd_port;
+                       return port;
+
+               default:
+                       printf("ERROR: %s: Illegal IPD port number %#x\n",
+                              __func__, ipd_port);
+                       return -1;
+               }
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN70XX))
+               return ipd_port & 3;
+       if (ipd_port < 32)
+               return ipd_port & 15;
+       else if (ipd_port < 40)
+               return ipd_port & 3;
+       else if (ipd_port < 48)
+               return ipd_port & 1;
+
+       debug("%s: Illegal IPD port number\n", __func__);
+
+       return -1;
+}
+
+/**
+ * Prints out a buffer with the address, hex bytes, and ASCII
+ *
+ * @param      addr    Start address to print on the left
+ * @param[in]  buffer  array of bytes to print
+ * @param      count   Number of bytes to print
+ */
+void cvmx_print_buffer_u8(unsigned int addr, const uint8_t *buffer,
+                         size_t count)
+{
+       uint i;
+
+       while (count) {
+               unsigned int linelen = count < 16 ? count : 16;
+
+               debug("%08x:", addr);
+
+               for (i = 0; i < linelen; i++)
+                       debug(" %0*x", 2, buffer[i]);
+
+               while (i++ < 17)
+                       debug("   ");
+
+               for (i = 0; i < linelen; i++) {
+                       if (buffer[i] >= 0x20 && buffer[i] < 0x7f)
+                               debug("%c", buffer[i]);
+                       else
+                               debug(".");
+               }
+               debug("\n");
+               addr += linelen;
+               buffer += linelen;
+               count -= linelen;
+       }
+}
diff --git a/arch/mips/mach-octeon/cvmx-helper.c b/arch/mips/mach-octeon/cvmx-helper.c
new file mode 100644 (file)
index 0000000..529e03a
--- /dev/null
@@ -0,0 +1,2611 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper functions for common, but complicated tasks.
+ */
+
+#include <log.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-csr.h>
+#include <mach/cvmx-bootmem.h>
+#include <mach/octeon-model.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/cvmx-pcie.h>
+#include <mach/cvmx-coremask.h>
+
+#include <mach/cvmx-agl-defs.h>
+#include <mach/cvmx-asxx-defs.h>
+#include <mach/cvmx-bgxx-defs.h>
+#include <mach/cvmx-dbg-defs.h>
+#include <mach/cvmx-gmxx-defs.h>
+#include <mach/cvmx-gserx-defs.h>
+#include <mach/cvmx-ipd-defs.h>
+#include <mach/cvmx-l2c-defs.h>
+#include <mach/cvmx-npi-defs.h>
+#include <mach/cvmx-pcsx-defs.h>
+#include <mach/cvmx-pexp-defs.h>
+#include <mach/cvmx-pki-defs.h>
+#include <mach/cvmx-pko-defs.h>
+#include <mach/cvmx-smix-defs.h>
+#include <mach/cvmx-sriox-defs.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-board.h>
+#include <mach/cvmx-helper-fdt.h>
+#include <mach/cvmx-helper-bgx.h>
+#include <mach/cvmx-helper-cfg.h>
+#include <mach/cvmx-helper-ipd.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-helper-pki.h>
+#include <mach/cvmx-helper-pko.h>
+#include <mach/cvmx-helper-pko3.h>
+#include <mach/cvmx-global-resources.h>
+#include <mach/cvmx-pko-internal-ports-range.h>
+#include <mach/cvmx-pko3-queue.h>
+#include <mach/cvmx-gmx.h>
+#include <mach/cvmx-hwpko.h>
+#include <mach/cvmx-ilk.h>
+#include <mach/cvmx-ipd.h>
+#include <mach/cvmx-pip.h>
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by an interface.
+ *
+ * @param mode         Interface mode.
+ *
+ * @param enumerate    Method the get number of interface ports.
+ *
+ * @param probe                Method to probe an interface to get the number of
+ *                     connected ports.
+ *
+ * @param enable       Method to enable an interface
+ *
+ * @param link_get     Method to get the state of an interface link.
+ *
+ * @param link_set     Method to configure an interface link to the specified
+ *                     state.
+ *
+ * @param loopback     Method to configure a port in loopback.
+ */
+struct iface_ops {
+       cvmx_helper_interface_mode_t mode;
+       int (*enumerate)(int xiface);
+       int (*probe)(int xiface);
+       int (*enable)(int xiface);
+       cvmx_helper_link_info_t (*link_get)(int ipd_port);
+       int (*link_set)(int ipd_port, cvmx_helper_link_info_t link_info);
+       int (*loopback)(int ipd_port, int en_in, int en_ex);
+};
+
+/**
+ * @INTERNAL
+ * This structure is used by disabled interfaces.
+ */
+static const struct iface_ops iface_ops_dis = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_DISABLED,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as gmii.
+ */
+static const struct iface_ops iface_ops_gmii = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_GMII,
+       .enumerate = __cvmx_helper_rgmii_probe,
+       .probe = __cvmx_helper_rgmii_probe,
+       .enable = __cvmx_helper_rgmii_enable,
+       .link_get = __cvmx_helper_gmii_link_get,
+       .link_set = __cvmx_helper_rgmii_link_set,
+       .loopback = __cvmx_helper_rgmii_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as rgmii.
+ */
+static const struct iface_ops iface_ops_rgmii = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_RGMII,
+       .enumerate = __cvmx_helper_rgmii_probe,
+       .probe = __cvmx_helper_rgmii_probe,
+       .enable = __cvmx_helper_rgmii_enable,
+       .link_get = __cvmx_helper_rgmii_link_get,
+       .link_set = __cvmx_helper_rgmii_link_set,
+       .loopback = __cvmx_helper_rgmii_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as sgmii that use the gmx mac.
+ */
+static const struct iface_ops iface_ops_sgmii = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_SGMII,
+       .enumerate = __cvmx_helper_sgmii_enumerate,
+       .probe = __cvmx_helper_sgmii_probe,
+       .enable = __cvmx_helper_sgmii_enable,
+       .link_get = __cvmx_helper_sgmii_link_get,
+       .link_set = __cvmx_helper_sgmii_link_set,
+       .loopback = __cvmx_helper_sgmii_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as sgmii that use the bgx mac.
+ */
+static const struct iface_ops iface_ops_bgx_sgmii = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_SGMII,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_sgmii_enable,
+       .link_get = __cvmx_helper_bgx_sgmii_link_get,
+       .link_set = __cvmx_helper_bgx_sgmii_link_set,
+       .loopback = __cvmx_helper_bgx_sgmii_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as qsgmii.
+ */
+static const struct iface_ops iface_ops_qsgmii = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_QSGMII,
+       .enumerate = __cvmx_helper_sgmii_enumerate,
+       .probe = __cvmx_helper_sgmii_probe,
+       .enable = __cvmx_helper_sgmii_enable,
+       .link_get = __cvmx_helper_sgmii_link_get,
+       .link_set = __cvmx_helper_sgmii_link_set,
+       .loopback = __cvmx_helper_sgmii_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as xaui using the gmx mac.
+ */
+static const struct iface_ops iface_ops_xaui = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_XAUI,
+       .enumerate = __cvmx_helper_xaui_enumerate,
+       .probe = __cvmx_helper_xaui_probe,
+       .enable = __cvmx_helper_xaui_enable,
+       .link_get = __cvmx_helper_xaui_link_get,
+       .link_set = __cvmx_helper_xaui_link_set,
+       .loopback = __cvmx_helper_xaui_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as xaui using the gmx mac.
+ */
+static const struct iface_ops iface_ops_bgx_xaui = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_XAUI,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_xaui_enable,
+       .link_get = __cvmx_helper_bgx_xaui_link_get,
+       .link_set = __cvmx_helper_bgx_xaui_link_set,
+       .loopback = __cvmx_helper_bgx_xaui_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as rxaui.
+ */
+static const struct iface_ops iface_ops_rxaui = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_RXAUI,
+       .enumerate = __cvmx_helper_xaui_enumerate,
+       .probe = __cvmx_helper_xaui_probe,
+       .enable = __cvmx_helper_xaui_enable,
+       .link_get = __cvmx_helper_xaui_link_get,
+       .link_set = __cvmx_helper_xaui_link_set,
+       .loopback = __cvmx_helper_xaui_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as xaui using the gmx mac.
+ */
+static const struct iface_ops iface_ops_bgx_rxaui = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_RXAUI,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_xaui_enable,
+       .link_get = __cvmx_helper_bgx_xaui_link_get,
+       .link_set = __cvmx_helper_bgx_xaui_link_set,
+       .loopback = __cvmx_helper_bgx_xaui_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as xlaui.
+ */
+static const struct iface_ops iface_ops_bgx_xlaui = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_XLAUI,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_xaui_enable,
+       .link_get = __cvmx_helper_bgx_xaui_link_get,
+       .link_set = __cvmx_helper_bgx_xaui_link_set,
+       .loopback = __cvmx_helper_bgx_xaui_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as xfi.
+ */
+static const struct iface_ops iface_ops_bgx_xfi = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_XFI,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_xaui_enable,
+       .link_get = __cvmx_helper_bgx_xaui_link_get,
+       .link_set = __cvmx_helper_bgx_xaui_link_set,
+       .loopback = __cvmx_helper_bgx_xaui_configure_loopback,
+};
+
+static const struct iface_ops iface_ops_bgx_10G_KR = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_10G_KR,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_xaui_enable,
+       .link_get = __cvmx_helper_bgx_xaui_link_get,
+       .link_set = __cvmx_helper_bgx_xaui_link_set,
+       .loopback = __cvmx_helper_bgx_xaui_configure_loopback,
+};
+
+static const struct iface_ops iface_ops_bgx_40G_KR4 = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_40G_KR4,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_xaui_enable,
+       .link_get = __cvmx_helper_bgx_xaui_link_get,
+       .link_set = __cvmx_helper_bgx_xaui_link_set,
+       .loopback = __cvmx_helper_bgx_xaui_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as ilk.
+ */
+static const struct iface_ops iface_ops_ilk = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_ILK,
+       .enumerate = __cvmx_helper_ilk_enumerate,
+       .probe = __cvmx_helper_ilk_probe,
+       .enable = __cvmx_helper_ilk_enable,
+       .link_get = __cvmx_helper_ilk_link_get,
+       .link_set = __cvmx_helper_ilk_link_set,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as npi.
+ */
+static const struct iface_ops iface_ops_npi = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_NPI,
+       .enumerate = __cvmx_helper_npi_probe,
+       .probe = __cvmx_helper_npi_probe,
+       .enable = __cvmx_helper_npi_enable,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as srio.
+ */
+static const struct iface_ops iface_ops_srio = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_SRIO,
+       .enumerate = __cvmx_helper_srio_probe,
+       .probe = __cvmx_helper_srio_probe,
+       .enable = __cvmx_helper_srio_enable,
+       .link_get = __cvmx_helper_srio_link_get,
+       .link_set = __cvmx_helper_srio_link_set,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as agl.
+ */
+static const struct iface_ops iface_ops_agl = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_AGL,
+       .enumerate = __cvmx_helper_agl_enumerate,
+       .probe = __cvmx_helper_agl_probe,
+       .enable = __cvmx_helper_agl_enable,
+       .link_get = __cvmx_helper_agl_link_get,
+       .link_set = __cvmx_helper_agl_link_set,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as mixed mode, some ports are sgmii and some are xfi.
+ */
+static const struct iface_ops iface_ops_bgx_mixed = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_MIXED,
+       .enumerate = __cvmx_helper_bgx_enumerate,
+       .probe = __cvmx_helper_bgx_probe,
+       .enable = __cvmx_helper_bgx_mixed_enable,
+       .link_get = __cvmx_helper_bgx_mixed_link_get,
+       .link_set = __cvmx_helper_bgx_mixed_link_set,
+       .loopback = __cvmx_helper_bgx_mixed_configure_loopback,
+};
+
+/**
+ * @INTERNAL
+ * This structure specifies the interface methods used by interfaces
+ * configured as loop.
+ */
+static const struct iface_ops iface_ops_loop = {
+       .mode = CVMX_HELPER_INTERFACE_MODE_LOOP,
+       .enumerate = __cvmx_helper_loop_enumerate,
+       .probe = __cvmx_helper_loop_probe,
+};
+
+const struct iface_ops *iface_node_ops[CVMX_MAX_NODES][CVMX_HELPER_MAX_IFACE];
+#define iface_ops iface_node_ops[0]
+
+struct cvmx_iface {
+       int cvif_ipd_nports;
+       int cvif_has_fcs; /* PKO fcs for this interface. */
+       enum cvmx_pko_padding cvif_padding;
+       cvmx_helper_link_info_t *cvif_ipd_port_link_info;
+};
+
+/*
+ * This has to be static as u-boot expects to probe an interface and
+ * gets the number of its ports.
+ */
+static struct cvmx_iface cvmx_interfaces[CVMX_MAX_NODES][CVMX_HELPER_MAX_IFACE];
+
+int __cvmx_helper_get_num_ipd_ports(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_iface *piface;
+
+       if (xi.interface >= cvmx_helper_get_number_of_interfaces())
+               return -1;
+
+       piface = &cvmx_interfaces[xi.node][xi.interface];
+       return piface->cvif_ipd_nports;
+}
+
+enum cvmx_pko_padding __cvmx_helper_get_pko_padding(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_iface *piface;
+
+       if (xi.interface >= cvmx_helper_get_number_of_interfaces())
+               return CVMX_PKO_PADDING_NONE;
+
+       piface = &cvmx_interfaces[xi.node][xi.interface];
+       return piface->cvif_padding;
+}
+
+int __cvmx_helper_init_interface(int xiface, int num_ipd_ports, int has_fcs,
+                                enum cvmx_pko_padding pad)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_iface *piface;
+       cvmx_helper_link_info_t *p;
+       int i;
+       int sz;
+       u64 addr;
+       char name[32];
+
+       if (xi.interface >= cvmx_helper_get_number_of_interfaces())
+               return -1;
+
+       piface = &cvmx_interfaces[xi.node][xi.interface];
+       piface->cvif_ipd_nports = num_ipd_ports;
+       piface->cvif_padding = pad;
+
+       piface->cvif_has_fcs = has_fcs;
+
+       /*
+        * allocate the per-ipd_port link_info structure
+        */
+       sz = piface->cvif_ipd_nports * sizeof(cvmx_helper_link_info_t);
+       snprintf(name, sizeof(name), "__int_%d_link_info", xi.interface);
+       addr = CAST64(cvmx_bootmem_alloc_named_range_once(sz, 0, 0,
+                                                         __alignof(cvmx_helper_link_info_t),
+                                                         name, NULL));
+       piface->cvif_ipd_port_link_info =
+               (cvmx_helper_link_info_t *)__cvmx_phys_addr_to_ptr(addr, sz);
+       if (!piface->cvif_ipd_port_link_info) {
+               if (sz != 0)
+                       debug("iface %d failed to alloc link info\n", xi.interface);
+               return -1;
+       }
+
+       /* Initialize them */
+       p = piface->cvif_ipd_port_link_info;
+
+       for (i = 0; i < piface->cvif_ipd_nports; i++) {
+               (*p).u64 = 0;
+               p++;
+       }
+       return 0;
+}
+
+/*
+ * Shut down the interfaces; free the resources.
+ * @INTERNAL
+ */
+void __cvmx_helper_shutdown_interfaces_node(unsigned int node)
+{
+       int i;
+       int nifaces; /* number of interfaces */
+       struct cvmx_iface *piface;
+
+       nifaces = cvmx_helper_get_number_of_interfaces();
+       for (i = 0; i < nifaces; i++) {
+               piface = &cvmx_interfaces[node][i];
+
+               /*
+                * For SE apps, bootmem was meant to be allocated and never
+                * freed.
+                */
+               piface->cvif_ipd_port_link_info = 0;
+       }
+}
+
+void __cvmx_helper_shutdown_interfaces(void)
+{
+       unsigned int node = cvmx_get_node_num();
+
+       __cvmx_helper_shutdown_interfaces_node(node);
+}
+
+int __cvmx_helper_set_link_info(int xiface, int index, cvmx_helper_link_info_t link_info)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_iface *piface;
+
+       if (xi.interface >= cvmx_helper_get_number_of_interfaces())
+               return -1;
+
+       piface = &cvmx_interfaces[xi.node][xi.interface];
+
+       if (piface->cvif_ipd_port_link_info) {
+               piface->cvif_ipd_port_link_info[index] = link_info;
+               return 0;
+       }
+
+       return -1;
+}
+
+cvmx_helper_link_info_t __cvmx_helper_get_link_info(int xiface, int port)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_iface *piface;
+       cvmx_helper_link_info_t err;
+
+       err.u64 = 0;
+
+       if (xi.interface >= cvmx_helper_get_number_of_interfaces())
+               return err;
+       piface = &cvmx_interfaces[xi.node][xi.interface];
+
+       if (piface->cvif_ipd_port_link_info)
+               return piface->cvif_ipd_port_link_info[port];
+
+       return err;
+}
+
+/**
+ * Returns if FCS is enabled for the specified interface and port
+ *
+ * @param xiface - interface to check
+ *
+ * @return zero if FCS is not used, otherwise FCS is used.
+ */
+int __cvmx_helper_get_has_fcs(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       return cvmx_interfaces[xi.node][xi.interface].cvif_has_fcs;
+}
+
+u64 cvmx_rgmii_backpressure_dis = 1;
+
+typedef int (*cvmx_export_config_t)(void);
+cvmx_export_config_t cvmx_export_app_config;
+
+void cvmx_rgmii_set_back_pressure(uint64_t backpressure_dis)
+{
+       cvmx_rgmii_backpressure_dis = backpressure_dis;
+}
+
+/*
+ * internal functions that are not exported in the .h file but must be
+ * declared to make gcc happy.
+ */
+extern cvmx_helper_link_info_t __cvmx_helper_get_link_info(int interface, int port);
+
+/**
+ * cvmx_override_iface_phy_mode(int interface, int index) is a function pointer.
+ * It is meant to allow customization of interfaces which do not have a PHY.
+ *
+ * @returns 0 if MAC decides TX_CONFIG_REG or 1 if PHY decides  TX_CONFIG_REG.
+ *
+ * If this function pointer is NULL then it defaults to the MAC.
+ */
+int (*cvmx_override_iface_phy_mode)(int interface, int index);
+
+/**
+ * cvmx_override_ipd_port_setup(int ipd_port) is a function
+ * pointer. It is meant to allow customization of the IPD
+ * port/port kind setup before packet input/output comes online.
+ * It is called after cvmx-helper does the default IPD configuration,
+ * but before IPD is enabled. Users should set this pointer to a
+ * function before calling any cvmx-helper operations.
+ */
+void (*cvmx_override_ipd_port_setup)(int ipd_port) = NULL;
+
+/**
+ * Return the number of interfaces the chip has. Each interface
+ * may have multiple ports. Most chips support two interfaces,
+ * but the CNX0XX and CNX1XX are exceptions. These only support
+ * one interface.
+ *
+ * @return Number of interfaces on chip
+ */
+int cvmx_helper_get_number_of_interfaces(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               return 9;
+       else if (OCTEON_IS_MODEL(OCTEON_CN66XX))
+               if (OCTEON_IS_MODEL(OCTEON_CN66XX_PASS1_0))
+                       return 7;
+               else
+                       return 8;
+       else if (OCTEON_IS_MODEL(OCTEON_CN63XX))
+               return 6;
+       else if (OCTEON_IS_MODEL(OCTEON_CN61XX) || OCTEON_IS_MODEL(OCTEON_CNF71XX))
+               return 4;
+       else if (OCTEON_IS_MODEL(OCTEON_CN70XX))
+               return 5;
+       else if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 10;
+       else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return 5;
+       else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return 5;
+       else
+               return 3;
+}
+
+int __cvmx_helper_early_ports_on_interface(int interface)
+{
+       int ports;
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKND))
+               return cvmx_helper_interface_enumerate(interface);
+
+       ports = cvmx_helper_interface_enumerate(interface);
+       ports = __cvmx_helper_board_interface_probe(interface, ports);
+
+       return ports;
+}
+
+/**
+ * Return the number of ports on an interface. Depending on the
+ * chip and configuration, this can be 1-16. A value of 0
+ * specifies that the interface doesn't exist or isn't usable.
+ *
+ * @param xiface xiface to get the port count for
+ *
+ * @return Number of ports on interface. Can be Zero.
+ */
+int cvmx_helper_ports_on_interface(int xiface)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_PKND))
+               return cvmx_helper_interface_enumerate(xiface);
+       else
+               return __cvmx_helper_get_num_ipd_ports(xiface);
+}
+
+/**
+ * @INTERNAL
+ * Return interface mode for CN70XX.
+ */
+static cvmx_helper_interface_mode_t __cvmx_get_mode_cn70xx(int interface)
+{
+       /* SGMII/RXAUI/QSGMII */
+       if (interface < 2) {
+               enum cvmx_qlm_mode qlm_mode =
+                       cvmx_qlm_get_dlm_mode(0, interface);
+
+               if (qlm_mode == CVMX_QLM_MODE_SGMII)
+                       iface_ops[interface] = &iface_ops_sgmii;
+               else if (qlm_mode == CVMX_QLM_MODE_QSGMII)
+                       iface_ops[interface] = &iface_ops_qsgmii;
+               else if (qlm_mode == CVMX_QLM_MODE_RXAUI)
+                       iface_ops[interface] = &iface_ops_rxaui;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+       } else if (interface == 2) { /* DPI */
+               iface_ops[interface] = &iface_ops_npi;
+       } else if (interface == 3) { /* LOOP */
+               iface_ops[interface] = &iface_ops_loop;
+       } else if (interface == 4) { /* RGMII (AGL) */
+               cvmx_agl_prtx_ctl_t prtx_ctl;
+
+               prtx_ctl.u64 = csr_rd(CVMX_AGL_PRTX_CTL(0));
+               if (prtx_ctl.s.mode == 0)
+                       iface_ops[interface] = &iface_ops_agl;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+       } else {
+               iface_ops[interface] = &iface_ops_dis;
+       }
+
+       return iface_ops[interface]->mode;
+}
+
+/**
+ * @INTERNAL
+ * Return interface mode for CN78XX.
+ */
+static cvmx_helper_interface_mode_t __cvmx_get_mode_cn78xx(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       /* SGMII/RXAUI/XAUI */
+       if (xi.interface < 6) {
+               int qlm = cvmx_qlm_lmac(xiface, 0);
+               enum cvmx_qlm_mode qlm_mode;
+
+               if (qlm == -1) {
+                       iface_node_ops[xi.node][xi.interface] = &iface_ops_dis;
+                       return iface_node_ops[xi.node][xi.interface]->mode;
+               }
+               qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, qlm);
+
+               if (qlm_mode == CVMX_QLM_MODE_SGMII)
+                       iface_node_ops[xi.node][xi.interface] = &iface_ops_bgx_sgmii;
+               else if (qlm_mode == CVMX_QLM_MODE_XAUI)
+                       iface_node_ops[xi.node][xi.interface] = &iface_ops_bgx_xaui;
+               else if (qlm_mode == CVMX_QLM_MODE_XLAUI)
+                       iface_node_ops[xi.node][xi.interface] = &iface_ops_bgx_xlaui;
+               else if (qlm_mode == CVMX_QLM_MODE_XFI)
+                       iface_node_ops[xi.node][xi.interface] = &iface_ops_bgx_xfi;
+               else if (qlm_mode == CVMX_QLM_MODE_RXAUI)
+                       iface_node_ops[xi.node][xi.interface] = &iface_ops_bgx_rxaui;
+               else
+                       iface_node_ops[xi.node][xi.interface] = &iface_ops_dis;
+       } else if (xi.interface < 8) {
+               enum cvmx_qlm_mode qlm_mode;
+               int found = 0;
+               int i;
+               int intf, lane_mask;
+
+               if (xi.interface == 6) {
+                       intf = 6;
+                       lane_mask = cvmx_ilk_lane_mask[xi.node][0];
+               } else {
+                       intf = 7;
+                       lane_mask = cvmx_ilk_lane_mask[xi.node][1];
+               }
+               switch (lane_mask) {
+               default:
+               case 0x0:
+                       iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xf:
+                       qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, 4);
+                       if (qlm_mode == CVMX_QLM_MODE_ILK)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xff:
+                       found = 0;
+                       for (i = 4; i < 6; i++) {
+                               qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, i);
+                               if (qlm_mode == CVMX_QLM_MODE_ILK)
+                                       found++;
+                       }
+                       if (found == 2)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xfff:
+                       found = 0;
+                       for (i = 4; i < 7; i++) {
+                               qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, i);
+                               if (qlm_mode == CVMX_QLM_MODE_ILK)
+                                       found++;
+                       }
+                       if (found == 3)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xff00:
+                       found = 0;
+                       for (i = 6; i < 8; i++) {
+                               qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, i);
+                               if (qlm_mode == CVMX_QLM_MODE_ILK)
+                                       found++;
+                       }
+                       if (found == 2)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xf0:
+                       qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, 5);
+                       if (qlm_mode == CVMX_QLM_MODE_ILK)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xf00:
+                       qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, 6);
+                       if (qlm_mode == CVMX_QLM_MODE_ILK)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xf000:
+                       qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, 7);
+                       if (qlm_mode == CVMX_QLM_MODE_ILK)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               case 0xfff0:
+                       found = 0;
+                       for (i = 5; i < 8; i++) {
+                               qlm_mode = cvmx_qlm_get_mode_cn78xx(xi.node, i);
+                               if (qlm_mode == CVMX_QLM_MODE_ILK)
+                                       found++;
+                       }
+                       if (found == 3)
+                               iface_node_ops[xi.node][intf] = &iface_ops_ilk;
+                       else
+                               iface_node_ops[xi.node][intf] = &iface_ops_dis;
+                       break;
+               }
+       } else if (xi.interface == 8) { /* DPI */
+               int qlm = 0;
+
+               for (qlm = 0; qlm < 5; qlm++) {
+                       /* if GSERX_CFG[pcie] == 1, then enable npi */
+                       if (csr_rd_node(xi.node, CVMX_GSERX_CFG(qlm)) & 0x1) {
+                               iface_node_ops[xi.node][xi.interface] =
+                                       &iface_ops_npi;
+                               return iface_node_ops[xi.node][xi.interface]->mode;
+                       }
+               }
+               iface_node_ops[xi.node][xi.interface] = &iface_ops_dis;
+       } else if (xi.interface == 9) { /* LOOP */
+               iface_node_ops[xi.node][xi.interface] = &iface_ops_loop;
+       } else {
+               iface_node_ops[xi.node][xi.interface] = &iface_ops_dis;
+       }
+
+       return iface_node_ops[xi.node][xi.interface]->mode;
+}
+
+/**
+ * @INTERNAL
+ * Return interface mode for CN73XX.
+ */
+static cvmx_helper_interface_mode_t __cvmx_get_mode_cn73xx(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int interface = xi.interface;
+
+       /* SGMII/XAUI/XLAUI/XFI */
+       if (interface < 3) {
+               int qlm = cvmx_qlm_lmac(xiface, 0);
+               enum cvmx_qlm_mode qlm_mode;
+
+               if (qlm == -1) {
+                       iface_ops[interface] = &iface_ops_dis;
+                       return iface_ops[interface]->mode;
+               }
+               qlm_mode = cvmx_qlm_get_mode(qlm);
+
+               switch (qlm_mode) {
+               case CVMX_QLM_MODE_SGMII:
+               case CVMX_QLM_MODE_SGMII_2X1:
+               case CVMX_QLM_MODE_RGMII_SGMII:
+               case CVMX_QLM_MODE_RGMII_SGMII_1X1:
+                       iface_ops[interface] = &iface_ops_bgx_sgmii;
+                       break;
+               case CVMX_QLM_MODE_XAUI:
+               case CVMX_QLM_MODE_RGMII_XAUI:
+                       iface_ops[interface] = &iface_ops_bgx_xaui;
+                       break;
+               case CVMX_QLM_MODE_RXAUI:
+               case CVMX_QLM_MODE_RXAUI_1X2:
+               case CVMX_QLM_MODE_RGMII_RXAUI:
+                       iface_ops[interface] = &iface_ops_bgx_rxaui;
+                       break;
+               case CVMX_QLM_MODE_XLAUI:
+               case CVMX_QLM_MODE_RGMII_XLAUI:
+                       iface_ops[interface] = &iface_ops_bgx_xlaui;
+                       break;
+               case CVMX_QLM_MODE_XFI:
+               case CVMX_QLM_MODE_XFI_1X2:
+               case CVMX_QLM_MODE_RGMII_XFI:
+                       iface_ops[interface] = &iface_ops_bgx_xfi;
+                       break;
+               case CVMX_QLM_MODE_10G_KR:
+               case CVMX_QLM_MODE_10G_KR_1X2:
+               case CVMX_QLM_MODE_RGMII_10G_KR:
+                       iface_ops[interface] = &iface_ops_bgx_10G_KR;
+                       break;
+               case CVMX_QLM_MODE_40G_KR4:
+               case CVMX_QLM_MODE_RGMII_40G_KR4:
+                       iface_ops[interface] = &iface_ops_bgx_40G_KR4;
+                       break;
+               case CVMX_QLM_MODE_MIXED:
+                       iface_ops[interface] = &iface_ops_bgx_mixed;
+                       break;
+               default:
+                       iface_ops[interface] = &iface_ops_dis;
+                       break;
+               }
+       } else if (interface == 3) { /* DPI */
+               iface_ops[interface] = &iface_ops_npi;
+       } else if (interface == 4) { /* LOOP */
+               iface_ops[interface] = &iface_ops_loop;
+       } else {
+               iface_ops[interface] = &iface_ops_dis;
+       }
+
+       return iface_ops[interface]->mode;
+}
+
+/**
+ * @INTERNAL
+ * Return interface mode for CNF75XX.
+ *
+ * CNF75XX has a single BGX block, which is attached to two DLMs,
+ * the first, GSER4 only supports SGMII mode, while the second,
+ * GSER5 supports 1G/10G single late modes, i.e. SGMII, XFI, 10G-KR.
+ * Each half-BGX is thus designated as a separate interface with two ports each.
+ */
+static cvmx_helper_interface_mode_t __cvmx_get_mode_cnf75xx(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int interface = xi.interface;
+
+       /* BGX0: SGMII (DLM4/DLM5)/XFI(DLM5)  */
+       if (interface < 1) {
+               enum cvmx_qlm_mode qlm_mode;
+               int qlm = cvmx_qlm_lmac(xiface, 0);
+
+               if (qlm == -1) {
+                       iface_ops[interface] = &iface_ops_dis;
+                       return iface_ops[interface]->mode;
+               }
+               qlm_mode = cvmx_qlm_get_mode(qlm);
+
+               switch (qlm_mode) {
+               case CVMX_QLM_MODE_SGMII:
+               case CVMX_QLM_MODE_SGMII_2X1:
+                       iface_ops[interface] = &iface_ops_bgx_sgmii;
+                       break;
+               case CVMX_QLM_MODE_XFI_1X2:
+                       iface_ops[interface] = &iface_ops_bgx_xfi;
+                       break;
+               case CVMX_QLM_MODE_10G_KR_1X2:
+                       iface_ops[interface] = &iface_ops_bgx_10G_KR;
+                       break;
+               case CVMX_QLM_MODE_MIXED:
+                       iface_ops[interface] = &iface_ops_bgx_mixed;
+                       break;
+               default:
+                       iface_ops[interface] = &iface_ops_dis;
+                       break;
+               }
+       } else if ((interface < 3) && OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               cvmx_sriox_status_reg_t sriox_status_reg;
+               int srio_port = interface - 1;
+
+               sriox_status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(srio_port));
+
+               if (sriox_status_reg.s.srio)
+                       iface_ops[interface] = &iface_ops_srio;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+       } else if (interface == 3) { /* DPI */
+               iface_ops[interface] = &iface_ops_npi;
+       } else if (interface == 4) { /* LOOP */
+               iface_ops[interface] = &iface_ops_loop;
+       } else {
+               iface_ops[interface] = &iface_ops_dis;
+       }
+
+       return iface_ops[interface]->mode;
+}
+
+/**
+ * @INTERNAL
+ * Return interface mode for CN68xx.
+ */
+static cvmx_helper_interface_mode_t __cvmx_get_mode_cn68xx(int interface)
+{
+       union cvmx_mio_qlmx_cfg qlm_cfg;
+
+       switch (interface) {
+       case 0:
+               qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(0));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlm_cfg.s.qlm_spd == 15)
+                       iface_ops[interface] = &iface_ops_dis;
+               else if (qlm_cfg.s.qlm_cfg == 7)
+                       iface_ops[interface] = &iface_ops_rxaui;
+               else if (qlm_cfg.s.qlm_cfg == 2)
+                       iface_ops[interface] = &iface_ops_sgmii;
+               else if (qlm_cfg.s.qlm_cfg == 3)
+                       iface_ops[interface] = &iface_ops_xaui;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+               break;
+
+       case 1:
+               qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(0));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlm_cfg.s.qlm_spd == 15)
+                       iface_ops[interface] = &iface_ops_dis;
+               else if (qlm_cfg.s.qlm_cfg == 7)
+                       iface_ops[interface] = &iface_ops_rxaui;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+               break;
+
+       case 2:
+       case 3:
+       case 4:
+               qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(interface));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlm_cfg.s.qlm_spd == 15)
+                       iface_ops[interface] = &iface_ops_dis;
+               else if (qlm_cfg.s.qlm_cfg == 2)
+                       iface_ops[interface] = &iface_ops_sgmii;
+               else if (qlm_cfg.s.qlm_cfg == 3)
+                       iface_ops[interface] = &iface_ops_xaui;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+               break;
+
+       case 5:
+       case 6:
+               qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(interface - 4));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlm_cfg.s.qlm_spd == 15)
+                       iface_ops[interface] = &iface_ops_dis;
+               else if (qlm_cfg.s.qlm_cfg == 1)
+                       iface_ops[interface] = &iface_ops_ilk;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+               break;
+
+       case 7: {
+               union cvmx_mio_qlmx_cfg qlm_cfg1;
+               /* Check if PCIe0/PCIe1 is configured for PCIe */
+               qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(3));
+               qlm_cfg1.u64 = csr_rd(CVMX_MIO_QLMX_CFG(1));
+               /* QLM is disabled when QLM SPD is 15. */
+               if ((qlm_cfg.s.qlm_spd != 15 && qlm_cfg.s.qlm_cfg == 0) ||
+                   (qlm_cfg1.s.qlm_spd != 15 && qlm_cfg1.s.qlm_cfg == 0))
+                       iface_ops[interface] = &iface_ops_npi;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+       } break;
+
+       case 8:
+               iface_ops[interface] = &iface_ops_loop;
+               break;
+
+       default:
+               iface_ops[interface] = &iface_ops_dis;
+               break;
+       }
+
+       return iface_ops[interface]->mode;
+}
+
+/**
+ * @INTERNAL
+ * Return interface mode for an Octeon II
+ */
+static cvmx_helper_interface_mode_t __cvmx_get_mode_octeon2(int interface)
+{
+       union cvmx_gmxx_inf_mode mode;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               return __cvmx_get_mode_cn68xx(interface);
+
+       if (interface == 2) {
+               iface_ops[interface] = &iface_ops_npi;
+       } else if (interface == 3) {
+               iface_ops[interface] = &iface_ops_loop;
+       } else if ((OCTEON_IS_MODEL(OCTEON_CN63XX) &&
+                   (interface == 4 || interface == 5)) ||
+                  (OCTEON_IS_MODEL(OCTEON_CN66XX) && interface >= 4 &&
+                   interface <= 7)) {
+               /* Only present in CN63XX & CN66XX Octeon model */
+               union cvmx_sriox_status_reg sriox_status_reg;
+
+               /* cn66xx pass1.0 has only 2 SRIO interfaces. */
+               if ((interface == 5 || interface == 7) &&
+                   OCTEON_IS_MODEL(OCTEON_CN66XX_PASS1_0)) {
+                       iface_ops[interface] = &iface_ops_dis;
+               } else if (interface == 5 && OCTEON_IS_MODEL(OCTEON_CN66XX)) {
+                       /*
+                        * Later passes of cn66xx support SRIO0 - x4/x2/x1,
+                        * SRIO2 - x2/x1, SRIO3 - x1
+                        */
+                       iface_ops[interface] = &iface_ops_dis;
+               } else {
+                       sriox_status_reg.u64 =
+                               csr_rd(CVMX_SRIOX_STATUS_REG(interface - 4));
+                       if (sriox_status_reg.s.srio)
+                               iface_ops[interface] = &iface_ops_srio;
+                       else
+                               iface_ops[interface] = &iface_ops_dis;
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN66XX)) {
+               union cvmx_mio_qlmx_cfg mio_qlm_cfg;
+
+               /* QLM2 is SGMII0 and QLM1 is SGMII1 */
+               if (interface == 0) {
+                       mio_qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(2));
+               } else if (interface == 1) {
+                       mio_qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(1));
+               } else {
+                       iface_ops[interface] = &iface_ops_dis;
+                       return iface_ops[interface]->mode;
+               }
+
+               if (mio_qlm_cfg.s.qlm_spd == 15)
+                       iface_ops[interface] = &iface_ops_dis;
+               else if (mio_qlm_cfg.s.qlm_cfg == 9)
+                       iface_ops[interface] = &iface_ops_sgmii;
+               else if (mio_qlm_cfg.s.qlm_cfg == 11)
+                       iface_ops[interface] = &iface_ops_xaui;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN61XX)) {
+               union cvmx_mio_qlmx_cfg qlm_cfg;
+
+               if (interface == 0) {
+                       qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(2));
+               } else if (interface == 1) {
+                       qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(0));
+               } else {
+                       iface_ops[interface] = &iface_ops_dis;
+                       return iface_ops[interface]->mode;
+               }
+
+               if (qlm_cfg.s.qlm_spd == 15)
+                       iface_ops[interface] = &iface_ops_dis;
+               else if (qlm_cfg.s.qlm_cfg == 2)
+                       iface_ops[interface] = &iface_ops_sgmii;
+               else if (qlm_cfg.s.qlm_cfg == 3)
+                       iface_ops[interface] = &iface_ops_xaui;
+               else
+                       iface_ops[interface] = &iface_ops_dis;
+       } else if (OCTEON_IS_MODEL(OCTEON_CNF71XX)) {
+               if (interface == 0) {
+                       union cvmx_mio_qlmx_cfg qlm_cfg;
+
+                       qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(0));
+                       if (qlm_cfg.s.qlm_cfg == 2)
+                               iface_ops[interface] = &iface_ops_sgmii;
+                       else
+                               iface_ops[interface] = &iface_ops_dis;
+               } else {
+                       iface_ops[interface] = &iface_ops_dis;
+               }
+       } else if (interface == 1 && OCTEON_IS_MODEL(OCTEON_CN63XX)) {
+               iface_ops[interface] = &iface_ops_dis;
+       } else {
+               mode.u64 = csr_rd(CVMX_GMXX_INF_MODE(interface));
+
+               if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
+                       switch (mode.cn63xx.mode) {
+                       case 0:
+                               iface_ops[interface] = &iface_ops_sgmii;
+                               break;
+
+                       case 1:
+                               iface_ops[interface] = &iface_ops_xaui;
+                               break;
+
+                       default:
+                               iface_ops[interface] = &iface_ops_dis;
+                               break;
+                       }
+               } else {
+                       if (!mode.s.en)
+                               iface_ops[interface] = &iface_ops_dis;
+                       else if (mode.s.type)
+                               iface_ops[interface] = &iface_ops_gmii;
+                       else
+                               iface_ops[interface] = &iface_ops_rgmii;
+               }
+       }
+
+       return iface_ops[interface]->mode;
+}
+
+/**
+ * Get the operating mode of an interface. Depending on the Octeon
+ * chip and configuration, this function returns an enumeration
+ * of the type of packet I/O supported by an interface.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Mode of the interface. Unknown or unsupported interfaces return
+ *         DISABLED.
+ */
+cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (xi.interface < 0 ||
+           xi.interface >= cvmx_helper_get_number_of_interfaces())
+               return CVMX_HELPER_INTERFACE_MODE_DISABLED;
+
+       /*
+        * Check if the interface mode has been already cached. If it has,
+        * simply return it. Otherwise, fall through the rest of the code to
+        * determine the interface mode and cache it in iface_ops.
+        */
+       if (iface_node_ops[xi.node][xi.interface]) {
+               cvmx_helper_interface_mode_t mode;
+
+               mode = iface_node_ops[xi.node][xi.interface]->mode;
+               return mode;
+       }
+
+       /*
+        * OCTEON III models
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN70XX))
+               return __cvmx_get_mode_cn70xx(xi.interface);
+
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return __cvmx_get_mode_cn78xx(xiface);
+
+       if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               cvmx_helper_interface_mode_t mode;
+
+               mode = __cvmx_get_mode_cnf75xx(xiface);
+               return mode;
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+               cvmx_helper_interface_mode_t mode;
+
+               mode = __cvmx_get_mode_cn73xx(xiface);
+               return mode;
+       }
+
+       /*
+        * Octeon II models
+        */
+       if (OCTEON_IS_OCTEON2())
+               return __cvmx_get_mode_octeon2(xi.interface);
+
+       /*
+        * Octeon and Octeon Plus models
+        */
+       if (xi.interface == 2) {
+               iface_ops[xi.interface] = &iface_ops_npi;
+       } else if (xi.interface == 3) {
+               iface_ops[xi.interface] = &iface_ops_dis;
+       } else {
+               union cvmx_gmxx_inf_mode mode;
+
+               mode.u64 = csr_rd(CVMX_GMXX_INF_MODE(xi.interface));
+
+               if (!mode.s.en)
+                       iface_ops[xi.interface] = &iface_ops_dis;
+               else if (mode.s.type)
+                       iface_ops[xi.interface] = &iface_ops_gmii;
+               else
+                       iface_ops[xi.interface] = &iface_ops_rgmii;
+       }
+
+       return iface_ops[xi.interface]->mode;
+}
+
+/**
+ * Determine the actual number of hardware ports connected to an
+ * interface. It doesn't setup the ports or enable them.
+ *
+ * @param xiface Interface to enumerate
+ *
+ * @return The number of ports on the interface, negative on failure
+ */
+int cvmx_helper_interface_enumerate(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int result = 0;
+
+       cvmx_helper_interface_get_mode(xiface);
+       if (iface_node_ops[xi.node][xi.interface]->enumerate)
+               result = iface_node_ops[xi.node][xi.interface]->enumerate(xiface);
+
+       return result;
+}
+
+/**
+ * This function probes an interface to determine the actual number of
+ * hardware ports connected to it. It does some setup the ports but
+ * doesn't enable them. The main goal here is to set the global
+ * interface_port_count[interface] correctly. Final hardware setup of
+ * the ports will be performed later.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_interface_probe(int xiface)
+{
+       /*
+        * At this stage in the game we don't want packets to be
+        * moving yet.  The following probe calls should perform
+        * hardware setup needed to determine port counts. Receive
+        * must still be disabled.
+        */
+       int nports;
+       int has_fcs;
+       enum cvmx_pko_padding padding = CVMX_PKO_PADDING_NONE;
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       nports = -1;
+       has_fcs = 0;
+
+       cvmx_helper_interface_get_mode(xiface);
+       if (iface_node_ops[xi.node][xi.interface]->probe)
+               nports = iface_node_ops[xi.node][xi.interface]->probe(xiface);
+
+       switch (iface_node_ops[xi.node][xi.interface]->mode) {
+               /* These types don't support ports to IPD/PKO */
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               nports = 0;
+               break;
+               /* XAUI is a single high speed port */
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+       case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+       case CVMX_HELPER_INTERFACE_MODE_XLAUI:
+       case CVMX_HELPER_INTERFACE_MODE_XFI:
+       case CVMX_HELPER_INTERFACE_MODE_10G_KR:
+       case CVMX_HELPER_INTERFACE_MODE_40G_KR4:
+       case CVMX_HELPER_INTERFACE_MODE_MIXED:
+               has_fcs = 1;
+               padding = CVMX_PKO_PADDING_60;
+               break;
+               /*
+                * RGMII/GMII/MII are all treated about the same. Most
+                * functions refer to these ports as RGMII.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_RGMII:
+       case CVMX_HELPER_INTERFACE_MODE_GMII:
+               padding = CVMX_PKO_PADDING_60;
+               break;
+               /*
+                * SPI4 can have 1-16 ports depending on the device at
+                * the other end.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+               padding = CVMX_PKO_PADDING_60;
+               break;
+               /*
+                * SGMII can have 1-4 ports depending on how many are
+                * hooked up.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+       case CVMX_HELPER_INTERFACE_MODE_QSGMII:
+               padding = CVMX_PKO_PADDING_60;
+       case CVMX_HELPER_INTERFACE_MODE_PICMG:
+               has_fcs = 1;
+               break;
+               /* PCI target Network Packet Interface */
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+               break;
+               /*
+                * Special loopback only ports. These are not the same
+                * as other ports in loopback mode.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               break;
+               /* SRIO has 2^N ports, where N is number of interfaces */
+       case CVMX_HELPER_INTERFACE_MODE_SRIO:
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_ILK:
+               padding = CVMX_PKO_PADDING_60;
+               has_fcs = 1;
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_AGL:
+               has_fcs = 1;
+               break;
+       }
+
+       if (nports == -1)
+               return -1;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_PKND))
+               has_fcs = 0;
+
+       nports = __cvmx_helper_board_interface_probe(xiface, nports);
+       __cvmx_helper_init_interface(xiface, nports, has_fcs, padding);
+       /* Make sure all global variables propagate to other cores */
+       CVMX_SYNCWS;
+
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ * Setup backpressure.
+ *
+ * @return Zero on success, negative on failure
+ */
+static int __cvmx_helper_global_setup_backpressure(int node)
+{
+       cvmx_qos_proto_t qos_proto;
+       cvmx_qos_pkt_mode_t qos_mode;
+       int port, xipdport;
+       unsigned int bpmask;
+       int interface, xiface, ports;
+       int num_interfaces = cvmx_helper_get_number_of_interfaces();
+
+       if (cvmx_rgmii_backpressure_dis) {
+               qos_proto = CVMX_QOS_PROTO_NONE;
+               qos_mode = CVMX_QOS_PKT_MODE_DROP;
+       } else {
+               qos_proto = CVMX_QOS_PROTO_PAUSE;
+               qos_mode = CVMX_QOS_PKT_MODE_HWONLY;
+       }
+
+       for (interface = 0; interface < num_interfaces; interface++) {
+               xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+               ports = cvmx_helper_ports_on_interface(xiface);
+
+               switch (cvmx_helper_interface_get_mode(xiface)) {
+               case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+               case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               case CVMX_HELPER_INTERFACE_MODE_SRIO:
+               case CVMX_HELPER_INTERFACE_MODE_ILK:
+               case CVMX_HELPER_INTERFACE_MODE_NPI:
+               case CVMX_HELPER_INTERFACE_MODE_PICMG:
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+               case CVMX_HELPER_INTERFACE_MODE_XLAUI:
+               case CVMX_HELPER_INTERFACE_MODE_XFI:
+               case CVMX_HELPER_INTERFACE_MODE_10G_KR:
+               case CVMX_HELPER_INTERFACE_MODE_40G_KR4:
+                       bpmask = (cvmx_rgmii_backpressure_dis) ? 0xF : 0;
+                       if (octeon_has_feature(OCTEON_FEATURE_BGX)) {
+                               for (port = 0; port < ports; port++) {
+                                       xipdport = cvmx_helper_get_ipd_port(xiface, port);
+                                       cvmx_bgx_set_flowctl_mode(xipdport, qos_proto, qos_mode);
+                               }
+                               cvmx_bgx_set_backpressure_override(xiface, bpmask);
+                       }
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_RGMII:
+               case CVMX_HELPER_INTERFACE_MODE_GMII:
+               case CVMX_HELPER_INTERFACE_MODE_SPI:
+               case CVMX_HELPER_INTERFACE_MODE_SGMII:
+               case CVMX_HELPER_INTERFACE_MODE_QSGMII:
+               case CVMX_HELPER_INTERFACE_MODE_MIXED:
+                       bpmask = (cvmx_rgmii_backpressure_dis) ? 0xF : 0;
+                       if (octeon_has_feature(OCTEON_FEATURE_BGX)) {
+                               for (port = 0; port < ports; port++) {
+                                       xipdport = cvmx_helper_get_ipd_port(xiface, port);
+                                       cvmx_bgx_set_flowctl_mode(xipdport, qos_proto, qos_mode);
+                               }
+                               cvmx_bgx_set_backpressure_override(xiface, bpmask);
+                       } else {
+                               cvmx_gmx_set_backpressure_override(interface, bpmask);
+                       }
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_AGL:
+                       bpmask = (cvmx_rgmii_backpressure_dis) ? 0x1 : 0;
+                       cvmx_agl_set_backpressure_override(interface, bpmask);
+                       break;
+               }
+       }
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ * Verify the per port IPD backpressure is aligned properly.
+ * @return Zero if working, non zero if misaligned
+ */
+int __cvmx_helper_backpressure_is_misaligned(void)
+{
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ * Enable packet input/output from the hardware. This function is
+ * called after all internal setup is complete and IPD is enabled.
+ * After this function completes, packets will be accepted from the
+ * hardware ports. PKO should still be disabled to make sure packets
+ * aren't sent out partially setup hardware.
+ *
+ * @param xiface Interface to enable
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_packet_hardware_enable(int xiface)
+{
+       int result = 0;
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (iface_node_ops[xi.node][xi.interface]->enable)
+               result = iface_node_ops[xi.node][xi.interface]->enable(xiface);
+       result |= __cvmx_helper_board_hardware_enable(xiface);
+       return result;
+}
+
+int cvmx_helper_ipd_and_packet_input_enable(void)
+{
+       return cvmx_helper_ipd_and_packet_input_enable_node(cvmx_get_node_num());
+}
+
+/**
+ * Called after all internal packet IO paths are setup. This
+ * function enables IPD/PIP and begins packet input and output.
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_ipd_and_packet_input_enable_node(int node)
+{
+       int num_interfaces;
+       int interface;
+       int num_ports;
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKI)) {
+               cvmx_helper_pki_enable(node);
+       } else {
+               /* Enable IPD */
+               cvmx_ipd_enable();
+       }
+
+       /*
+        * Time to enable hardware ports packet input and output. Note
+        * that at this point IPD/PIP must be fully functional and PKO
+        * must be disabled .
+        */
+       num_interfaces = cvmx_helper_get_number_of_interfaces();
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+
+               num_ports = cvmx_helper_ports_on_interface(xiface);
+               if (num_ports > 0)
+                       __cvmx_helper_packet_hardware_enable(xiface);
+       }
+
+       /* Finally enable PKO now that the entire path is up and running */
+       /* enable pko */
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               ; // cvmx_pko_enable_78xx(0); already enabled
+       else
+               cvmx_pko_enable();
+
+       return 0;
+}
+
+/**
+ * Initialize the PIP, IPD, and PKO hardware to support
+ * simple priority based queues for the ethernet ports. Each
+ * port is configured with a number of priority queues based
+ * on CVMX_PKO_QUEUES_PER_PORT_* where each queue is lower
+ * priority than the previous.
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_node(unsigned int node)
+{
+       int result = 0;
+       int interface;
+       int xiface;
+       union cvmx_l2c_cfg l2c_cfg;
+       union cvmx_smix_en smix_en;
+       const int num_interfaces = cvmx_helper_get_number_of_interfaces();
+
+       /*
+        * Tell L2 to give the IOB statically higher priority compared
+        * to the cores. This avoids conditions where IO blocks might
+        * be starved under very high L2 loads.
+        */
+       if (OCTEON_IS_OCTEON2() || OCTEON_IS_OCTEON3()) {
+               union cvmx_l2c_ctl l2c_ctl;
+
+               l2c_ctl.u64 = csr_rd_node(node, CVMX_L2C_CTL);
+               l2c_ctl.s.rsp_arb_mode = 1;
+               l2c_ctl.s.xmc_arb_mode = 0;
+               csr_wr_node(node, CVMX_L2C_CTL, l2c_ctl.u64);
+       } else {
+               l2c_cfg.u64 = csr_rd(CVMX_L2C_CFG);
+               l2c_cfg.s.lrf_arb_mode = 0;
+               l2c_cfg.s.rfb_arb_mode = 0;
+               csr_wr(CVMX_L2C_CFG, l2c_cfg.u64);
+       }
+
+       int smi_inf;
+       int i;
+
+       /* Newer chips have more than one SMI/MDIO interface */
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX) || OCTEON_IS_MODEL(OCTEON_CN78XX))
+               smi_inf = 4;
+       else if (OCTEON_IS_MODEL(OCTEON_CN73XX) || OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               smi_inf = 2;
+       else
+               smi_inf = 2;
+
+       for (i = 0; i < smi_inf; i++) {
+               /* Make sure SMI/MDIO is enabled so we can query PHYs */
+               smix_en.u64 = csr_rd_node(node, CVMX_SMIX_EN(i));
+               if (!smix_en.s.en) {
+                       smix_en.s.en = 1;
+                       csr_wr_node(node, CVMX_SMIX_EN(i), smix_en.u64);
+               }
+       }
+
+       //vinita_to_do ask it need to be modify for multinode
+       __cvmx_helper_init_port_valid();
+
+       for (interface = 0; interface < num_interfaces; interface++) {
+               xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+               result |= cvmx_helper_interface_probe(xiface);
+       }
+
+       /* PKO3 init precedes that of interfaces */
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               __cvmx_helper_init_port_config_data(node);
+               result = cvmx_helper_pko3_init_global(node);
+       } else {
+               result = cvmx_helper_pko_init();
+       }
+
+       /* Errata SSO-29000, Disabling power saving SSO conditional clocking */
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_sso_ws_cfg_t cfg;
+
+               cfg.u64 = csr_rd_node(node, CVMX_SSO_WS_CFG);
+               cfg.s.sso_cclk_dis = 1;
+               csr_wr_node(node, CVMX_SSO_WS_CFG, cfg.u64);
+       }
+
+       if (result < 0)
+               return result;
+
+       for (interface = 0; interface < num_interfaces; interface++) {
+               xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+               /* Skip invalid/disabled interfaces */
+               if (cvmx_helper_ports_on_interface(xiface) <= 0)
+                       continue;
+               printf("Node %d Interface %d has %d ports (%s)\n", node, interface,
+                      cvmx_helper_ports_on_interface(xiface),
+                      cvmx_helper_interface_mode_to_string(
+                              cvmx_helper_interface_get_mode(xiface)));
+
+               result |= __cvmx_helper_ipd_setup_interface(xiface);
+               if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+                       result |= cvmx_helper_pko3_init_interface(xiface);
+               else
+                       result |= __cvmx_helper_interface_setup_pko(interface);
+       }
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKI))
+               result |= __cvmx_helper_pki_global_setup(node);
+       else
+               result |= __cvmx_helper_ipd_global_setup();
+
+       /* Enable any flow control and backpressure */
+       result |= __cvmx_helper_global_setup_backpressure(node);
+
+       /* export app config if set */
+       if (cvmx_export_app_config)
+               result |= (*cvmx_export_app_config)();
+
+       if (cvmx_ipd_cfg.ipd_enable && cvmx_pki_dflt_init[node])
+               result |= cvmx_helper_ipd_and_packet_input_enable_node(node);
+       return result;
+}
+
+/**
+ * Initialize the PIP, IPD, and PKO hardware to support
+ * simple priority based queues for the ethernet ports. Each
+ * port is configured with a number of priority queues based
+ * on CVMX_PKO_QUEUES_PER_PORT_* where each queue is lower
+ * priority than the previous.
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_global(void)
+{
+       unsigned int node = cvmx_get_node_num();
+
+       return cvmx_helper_initialize_packet_io_node(node);
+}
+
+/**
+ * Does core local initialization for packet io
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_local(void)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               __cvmx_pko3_dq_table_setup();
+
+       return 0;
+}
+
+struct cvmx_buffer_list {
+       struct cvmx_buffer_list *next;
+};
+
+/**
+ * Disables the sending of flow control (pause) frames on the specified
+ * GMX port(s).
+ *
+ * @param interface Which interface (0 or 1)
+ * @param port_mask Mask (4bits) of which ports on the interface to disable
+ *                  backpressure on.
+ *                  1 => disable backpressure
+ *                  0 => enable backpressure
+ *
+ * @return 0 on success
+ *         -1 on error
+ */
+int cvmx_gmx_set_backpressure_override(u32 interface, uint32_t port_mask)
+{
+       union cvmx_gmxx_tx_ovr_bp gmxx_tx_ovr_bp;
+       /* Check for valid arguments */
+       if (port_mask & ~0xf || interface & ~0x1)
+               return -1;
+       if (interface >= CVMX_HELPER_MAX_GMX)
+               return -1;
+
+       gmxx_tx_ovr_bp.u64 = 0;
+       gmxx_tx_ovr_bp.s.en = port_mask;       /* Per port Enable back pressure override */
+       gmxx_tx_ovr_bp.s.ign_full = port_mask; /* Ignore the RX FIFO full when computing BP */
+       csr_wr(CVMX_GMXX_TX_OVR_BP(interface), gmxx_tx_ovr_bp.u64);
+       return 0;
+}
+
+/**
+ * Disables the sending of flow control (pause) frames on the specified
+ * AGL (RGMII) port(s).
+ *
+ * @param interface Which interface (0 or 1)
+ * @param port_mask Mask (4bits) of which ports on the interface to disable
+ *                  backpressure on.
+ *                  1 => disable backpressure
+ *                  0 => enable backpressure
+ *
+ * @return 0 on success
+ *         -1 on error
+ */
+int cvmx_agl_set_backpressure_override(u32 interface, uint32_t port_mask)
+{
+       union cvmx_agl_gmx_tx_ovr_bp agl_gmx_tx_ovr_bp;
+       int port = cvmx_helper_agl_get_port(interface);
+
+       if (port == -1)
+               return -1;
+       /* Check for valid arguments */
+       agl_gmx_tx_ovr_bp.u64 = 0;
+       /* Per port Enable back pressure override */
+       agl_gmx_tx_ovr_bp.s.en = port_mask;
+       /* Ignore the RX FIFO full when computing BP */
+       agl_gmx_tx_ovr_bp.s.ign_full = port_mask;
+       csr_wr(CVMX_GMXX_TX_OVR_BP(port), agl_gmx_tx_ovr_bp.u64);
+       return 0;
+}
+
+/**
+ * Helper function for global packet IO shutdown
+ */
+int cvmx_helper_shutdown_packet_io_global_cn78xx(int node)
+{
+       int num_interfaces = cvmx_helper_get_number_of_interfaces();
+       cvmx_wqe_t *work;
+       int interface;
+       int result = 0;
+
+       /* Shut down all interfaces and disable TX and RX on all ports */
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+               int index;
+               int num_ports = cvmx_helper_ports_on_interface(xiface);
+
+               if (num_ports > 4)
+                       num_ports = 4;
+
+               cvmx_bgx_set_backpressure_override(xiface, 0);
+               for (index = 0; index < num_ports; index++) {
+                       cvmx_helper_link_info_t link_info;
+
+                       if (!cvmx_helper_is_port_valid(xiface, index))
+                               continue;
+
+                       cvmx_helper_bgx_shutdown_port(xiface, index);
+
+                       /* Turn off link LEDs */
+                       link_info.u64 = 0;
+                       cvmx_helper_update_link_led(xiface, index, link_info);
+               }
+       }
+
+       /* Stop input first */
+       cvmx_helper_pki_shutdown(node);
+
+       /* Retrieve all packets from the SSO and free them */
+       result = 0;
+       while ((work = cvmx_pow_work_request_sync(CVMX_POW_WAIT))) {
+               cvmx_helper_free_pki_pkt_data(work);
+               cvmx_wqe_pki_free(work);
+               result++;
+       }
+
+       if (result > 0)
+               debug("%s: Purged %d packets from SSO\n", __func__, result);
+
+       /*
+        * No need to wait for PKO queues to drain,
+        * dq_close() drains the queues to NULL.
+        */
+
+       /* Shutdown PKO interfaces */
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+
+               cvmx_helper_pko3_shut_interface(xiface);
+       }
+
+       /* Disable MAC address filtering */
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+
+               switch (cvmx_helper_interface_get_mode(xiface)) {
+               case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+               case CVMX_HELPER_INTERFACE_MODE_XLAUI:
+               case CVMX_HELPER_INTERFACE_MODE_XFI:
+               case CVMX_HELPER_INTERFACE_MODE_10G_KR:
+               case CVMX_HELPER_INTERFACE_MODE_40G_KR4:
+               case CVMX_HELPER_INTERFACE_MODE_SGMII:
+               case CVMX_HELPER_INTERFACE_MODE_MIXED: {
+                       int index;
+                       int num_ports = cvmx_helper_ports_on_interface(xiface);
+
+                       for (index = 0; index < num_ports; index++) {
+                               if (!cvmx_helper_is_port_valid(xiface, index))
+                                       continue;
+
+                               /* Reset MAC filtering */
+                               cvmx_helper_bgx_rx_adr_ctl(node, interface, index, 0, 0, 0);
+                       }
+                       break;
+               }
+               default:
+                       break;
+               }
+       }
+
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int index;
+               int xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+               int num_ports = cvmx_helper_ports_on_interface(xiface);
+
+               for (index = 0; index < num_ports; index++) {
+                       /* Doing this twice should clear it since no packets
+                        * can be received.
+                        */
+                       cvmx_update_rx_activity_led(xiface, index, false);
+                       cvmx_update_rx_activity_led(xiface, index, false);
+               }
+       }
+
+       /* Shutdown the PKO unit */
+       result = cvmx_helper_pko3_shutdown(node);
+
+       /* Release interface structures */
+       __cvmx_helper_shutdown_interfaces();
+
+       return result;
+}
+
+/**
+ * Undo the initialization performed in
+ * cvmx_helper_initialize_packet_io_global(). After calling this routine and the
+ * local version on each core, packet IO for Octeon will be disabled and placed
+ * in the initial reset state. It will then be safe to call the initialize
+ * later on. Note that this routine does not empty the FPA pools. It frees all
+ * buffers used by the packet IO hardware to the FPA so a function emptying the
+ * FPA after shutdown should find all packet buffers in the FPA.
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_helper_shutdown_packet_io_global(void)
+{
+       const int timeout = 5; /* Wait up to 5 seconds for timeouts */
+       int result = 0;
+       int num_interfaces = cvmx_helper_get_number_of_interfaces();
+       int interface;
+       int num_ports;
+       int index;
+       struct cvmx_buffer_list *pool0_buffers;
+       struct cvmx_buffer_list *pool0_buffers_tail;
+       cvmx_wqe_t *work;
+       union cvmx_ipd_ctl_status ipd_ctl_status;
+       int wqe_pool = (int)cvmx_fpa_get_wqe_pool();
+       int node = cvmx_get_node_num();
+       cvmx_pcsx_mrx_control_reg_t control_reg;
+
+       if (octeon_has_feature(OCTEON_FEATURE_BGX))
+               return cvmx_helper_shutdown_packet_io_global_cn78xx(node);
+
+       /* Step 1: Disable all backpressure */
+       for (interface = 0; interface < num_interfaces; interface++) {
+               cvmx_helper_interface_mode_t mode =
+                       cvmx_helper_interface_get_mode(interface);
+
+               if (mode == CVMX_HELPER_INTERFACE_MODE_AGL)
+                       cvmx_agl_set_backpressure_override(interface, 0x1);
+               else if (mode != CVMX_HELPER_INTERFACE_MODE_DISABLED)
+                       cvmx_gmx_set_backpressure_override(interface, 0xf);
+       }
+
+       /* Step 2: Wait for the PKO queues to drain */
+       result = __cvmx_helper_pko_drain();
+       if (result < 0) {
+               debug("WARNING: %s: Failed to drain some PKO queues\n",
+                     __func__);
+       }
+
+       /* Step 3: Disable TX and RX on all ports */
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int xiface = cvmx_helper_node_interface_to_xiface(node,
+                                                                 interface);
+
+               switch (cvmx_helper_interface_get_mode(interface)) {
+               case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+               case CVMX_HELPER_INTERFACE_MODE_PCIE:
+                       /* Not a packet interface */
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_NPI:
+               case CVMX_HELPER_INTERFACE_MODE_SRIO:
+               case CVMX_HELPER_INTERFACE_MODE_ILK:
+                       /*
+                        * We don't handle the NPI/NPEI/SRIO packet
+                        * engines. The caller must know these are
+                        * idle.
+                        */
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_LOOP:
+                       /*
+                        * Nothing needed. Once PKO is idle, the
+                        * loopback devices must be idle.
+                        */
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_SPI:
+                       /*
+                        * SPI cannot be disabled from Octeon. It is
+                        * the responsibility of the caller to make
+                        * sure SPI is idle before doing shutdown.
+                        *
+                        * Fall through and do the same processing as
+                        * RGMII/GMII.
+                        */
+                       fallthrough;
+               case CVMX_HELPER_INTERFACE_MODE_GMII:
+               case CVMX_HELPER_INTERFACE_MODE_RGMII:
+                       /* Disable outermost RX at the ASX block */
+                       csr_wr(CVMX_ASXX_RX_PRT_EN(interface), 0);
+                       num_ports = cvmx_helper_ports_on_interface(xiface);
+                       if (num_ports > 4)
+                               num_ports = 4;
+                       for (index = 0; index < num_ports; index++) {
+                               union cvmx_gmxx_prtx_cfg gmx_cfg;
+
+                               if (!cvmx_helper_is_port_valid(interface, index))
+                                       continue;
+                               gmx_cfg.u64 = csr_rd(CVMX_GMXX_PRTX_CFG(index, interface));
+                               gmx_cfg.s.en = 0;
+                               csr_wr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
+                               /* Poll the GMX state machine waiting for it to become idle */
+                               csr_wr(CVMX_NPI_DBG_SELECT,
+                                      interface * 0x800 + index * 0x100 + 0x880);
+                               if (CVMX_WAIT_FOR_FIELD64(CVMX_DBG_DATA, union cvmx_dbg_data,
+                                                         data & 7, ==, 0, timeout * 1000000)) {
+                                       debug("GMX RX path timeout waiting for idle\n");
+                                       result = -1;
+                               }
+                               if (CVMX_WAIT_FOR_FIELD64(CVMX_DBG_DATA, union cvmx_dbg_data,
+                                                         data & 0xf, ==, 0, timeout * 1000000)) {
+                                       debug("GMX TX path timeout waiting for idle\n");
+                                       result = -1;
+                               }
+                       }
+                       /* Disable outermost TX at the ASX block */
+                       csr_wr(CVMX_ASXX_TX_PRT_EN(interface), 0);
+                       /* Disable interrupts for interface */
+                       csr_wr(CVMX_ASXX_INT_EN(interface), 0);
+                       csr_wr(CVMX_GMXX_TX_INT_EN(interface), 0);
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+               case CVMX_HELPER_INTERFACE_MODE_SGMII:
+               case CVMX_HELPER_INTERFACE_MODE_QSGMII:
+               case CVMX_HELPER_INTERFACE_MODE_PICMG:
+                       num_ports = cvmx_helper_ports_on_interface(xiface);
+                       if (num_ports > 4)
+                               num_ports = 4;
+                       for (index = 0; index < num_ports; index++) {
+                               union cvmx_gmxx_prtx_cfg gmx_cfg;
+
+                               if (!cvmx_helper_is_port_valid(interface, index))
+                                       continue;
+                               gmx_cfg.u64 = csr_rd(CVMX_GMXX_PRTX_CFG(index, interface));
+                               gmx_cfg.s.en = 0;
+                               csr_wr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
+                               if (CVMX_WAIT_FOR_FIELD64(CVMX_GMXX_PRTX_CFG(index, interface),
+                                                         union cvmx_gmxx_prtx_cfg, rx_idle, ==, 1,
+                                                         timeout * 1000000)) {
+                                       debug("GMX RX path timeout waiting for idle\n");
+                                       result = -1;
+                               }
+                               if (CVMX_WAIT_FOR_FIELD64(CVMX_GMXX_PRTX_CFG(index, interface),
+                                                         union cvmx_gmxx_prtx_cfg, tx_idle, ==, 1,
+                                                         timeout * 1000000)) {
+                                       debug("GMX TX path timeout waiting for idle\n");
+                                       result = -1;
+                               }
+                               /* For SGMII some PHYs require that the PCS
+                                * interface be powered down and reset (i.e.
+                                * Atheros/Qualcomm PHYs).
+                                */
+                               if (cvmx_helper_interface_get_mode(interface) ==
+                                   CVMX_HELPER_INTERFACE_MODE_SGMII) {
+                                       u64 reg;
+
+                                       reg = CVMX_PCSX_MRX_CONTROL_REG(index, interface);
+                                       /* Power down the interface */
+                                       control_reg.u64 = csr_rd(reg);
+                                       control_reg.s.pwr_dn = 1;
+                                       csr_wr(reg, control_reg.u64);
+                                       csr_rd(reg);
+                               }
+                       }
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_AGL: {
+                       int port = cvmx_helper_agl_get_port(interface);
+                       union cvmx_agl_gmx_prtx_cfg agl_gmx_cfg;
+
+                       agl_gmx_cfg.u64 = csr_rd(CVMX_AGL_GMX_PRTX_CFG(port));
+                       agl_gmx_cfg.s.en = 0;
+                       csr_wr(CVMX_AGL_GMX_PRTX_CFG(port), agl_gmx_cfg.u64);
+                       if (CVMX_WAIT_FOR_FIELD64(CVMX_AGL_GMX_PRTX_CFG(port),
+                                                 union cvmx_agl_gmx_prtx_cfg, rx_idle, ==, 1,
+                                                 timeout * 1000000)) {
+                               debug("AGL RX path timeout waiting for idle\n");
+                               result = -1;
+                       }
+                       if (CVMX_WAIT_FOR_FIELD64(CVMX_AGL_GMX_PRTX_CFG(port),
+                                                 union cvmx_agl_gmx_prtx_cfg, tx_idle, ==, 1,
+                                                 timeout * 1000000)) {
+                               debug("AGL TX path timeout waiting for idle\n");
+                               result = -1;
+                       }
+               } break;
+               default:
+                       break;
+               }
+       }
+
+       /* Step 4: Retrieve all packets from the POW and free them */
+       while ((work = cvmx_pow_work_request_sync(CVMX_POW_WAIT))) {
+               cvmx_helper_free_packet_data(work);
+               cvmx_fpa1_free(work, wqe_pool, 0);
+       }
+
+       /* Step 5 */
+       cvmx_ipd_disable();
+
+       /*
+        * Step 6: Drain all prefetched buffers from IPD/PIP. Note that IPD/PIP
+        * have not been reset yet
+        */
+       __cvmx_ipd_free_ptr();
+
+       /* Step 7: Free the PKO command buffers and put PKO in reset */
+       cvmx_pko_shutdown();
+
+       /* Step 8: Disable MAC address filtering */
+       for (interface = 0; interface < num_interfaces; interface++) {
+               int xiface = cvmx_helper_node_interface_to_xiface(node, interface);
+
+               switch (cvmx_helper_interface_get_mode(interface)) {
+               case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+               case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               case CVMX_HELPER_INTERFACE_MODE_SRIO:
+               case CVMX_HELPER_INTERFACE_MODE_ILK:
+               case CVMX_HELPER_INTERFACE_MODE_NPI:
+               case CVMX_HELPER_INTERFACE_MODE_LOOP:
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               case CVMX_HELPER_INTERFACE_MODE_RXAUI:
+               case CVMX_HELPER_INTERFACE_MODE_GMII:
+               case CVMX_HELPER_INTERFACE_MODE_RGMII:
+               case CVMX_HELPER_INTERFACE_MODE_SPI:
+               case CVMX_HELPER_INTERFACE_MODE_SGMII:
+               case CVMX_HELPER_INTERFACE_MODE_QSGMII:
+               case CVMX_HELPER_INTERFACE_MODE_PICMG:
+                       num_ports = cvmx_helper_ports_on_interface(xiface);
+                       if (num_ports > 4)
+                               num_ports = 4;
+                       for (index = 0; index < num_ports; index++) {
+                               if (!cvmx_helper_is_port_valid(interface, index))
+                                       continue;
+                               csr_wr(CVMX_GMXX_RXX_ADR_CTL(index, interface), 1);
+                               csr_wr(CVMX_GMXX_RXX_ADR_CAM_EN(index, interface), 0);
+                               csr_wr(CVMX_GMXX_RXX_ADR_CAM0(index, interface), 0);
+                               csr_wr(CVMX_GMXX_RXX_ADR_CAM1(index, interface), 0);
+                               csr_wr(CVMX_GMXX_RXX_ADR_CAM2(index, interface), 0);
+                               csr_wr(CVMX_GMXX_RXX_ADR_CAM3(index, interface), 0);
+                               csr_wr(CVMX_GMXX_RXX_ADR_CAM4(index, interface), 0);
+                               csr_wr(CVMX_GMXX_RXX_ADR_CAM5(index, interface), 0);
+                       }
+                       break;
+               case CVMX_HELPER_INTERFACE_MODE_AGL: {
+                       int port = cvmx_helper_agl_get_port(interface);
+
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CTL(port), 1);
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CAM_EN(port), 0);
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CAM0(port), 0);
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CAM1(port), 0);
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CAM2(port), 0);
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CAM3(port), 0);
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CAM4(port), 0);
+                       csr_wr(CVMX_AGL_GMX_RXX_ADR_CAM5(port), 0);
+               } break;
+               default:
+                       break;
+               }
+       }
+
+       /*
+        * Step 9: Drain all FPA buffers out of pool 0 before we reset
+        * IPD/PIP.  This is needed to keep IPD_QUE0_FREE_PAGE_CNT in
+        * sync. We temporarily keep the buffers in the pool0_buffers
+        * list.
+        */
+       pool0_buffers = NULL;
+       pool0_buffers_tail = NULL;
+       while (1) {
+               struct cvmx_buffer_list *buffer = cvmx_fpa1_alloc(0);
+
+               if (buffer) {
+                       buffer->next = NULL;
+
+                       if (!pool0_buffers)
+                               pool0_buffers = buffer;
+                       else
+                               pool0_buffers_tail->next = buffer;
+
+                       pool0_buffers_tail = buffer;
+               } else {
+                       break;
+               }
+       }
+
+       /* Step 10: Reset IPD and PIP */
+       ipd_ctl_status.u64 = csr_rd(CVMX_IPD_CTL_STATUS);
+       ipd_ctl_status.s.reset = 1;
+       csr_wr(CVMX_IPD_CTL_STATUS, ipd_ctl_status.u64);
+
+       /* Make sure IPD has finished reset. */
+       if (OCTEON_IS_OCTEON2() || OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               if (CVMX_WAIT_FOR_FIELD64(CVMX_IPD_CTL_STATUS, union cvmx_ipd_ctl_status, rst_done,
+                                         ==, 0, 1000)) {
+                       debug("IPD reset timeout waiting for idle\n");
+                       result = -1;
+               }
+       }
+
+       /* Step 11: Restore the FPA buffers into pool 0 */
+       while (pool0_buffers) {
+               struct cvmx_buffer_list *n = pool0_buffers->next;
+
+               cvmx_fpa1_free(pool0_buffers, 0, 0);
+               pool0_buffers = n;
+       }
+
+       /* Step 12: Release interface structures */
+       __cvmx_helper_shutdown_interfaces();
+
+       return result;
+}
+
+/**
+ * Does core local shutdown of packet io
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_shutdown_packet_io_local(void)
+{
+       /*
+        * Currently there is nothing to do per core. This may change
+        * in the future.
+        */
+       return 0;
+}
+
+/**
+ * Auto configure an IPD/PKO port link state and speed. This
+ * function basically does the equivalent of:
+ * cvmx_helper_link_set(ipd_port, cvmx_helper_link_get(ipd_port));
+ *
+ * @param xipd_port IPD/PKO port to auto configure
+ *
+ * @return Link state after configure
+ */
+cvmx_helper_link_info_t cvmx_helper_link_autoconf(int xipd_port)
+{
+       cvmx_helper_link_info_t link_info;
+       int xiface = cvmx_helper_get_interface_num(xipd_port);
+       int index = cvmx_helper_get_interface_index_num(xipd_port);
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int interface = xi.interface;
+
+       if (interface == -1 || index == -1 || index >= cvmx_helper_ports_on_interface(xiface)) {
+               link_info.u64 = 0;
+               return link_info;
+       }
+
+       link_info = cvmx_helper_link_get(xipd_port);
+       if (link_info.u64 == (__cvmx_helper_get_link_info(xiface, index)).u64)
+               return link_info;
+
+       if (!link_info.s.link_up)
+               cvmx_error_disable_group(CVMX_ERROR_GROUP_ETHERNET, xipd_port);
+
+       /* If we fail to set the link speed, port_link_info will not change */
+       cvmx_helper_link_set(xipd_port, link_info);
+
+       if (link_info.s.link_up)
+               cvmx_error_enable_group(CVMX_ERROR_GROUP_ETHERNET, xipd_port);
+
+       return link_info;
+}
+
+/**
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param xipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t cvmx_helper_link_get(int xipd_port)
+{
+       cvmx_helper_link_info_t result;
+       int xiface = cvmx_helper_get_interface_num(xipd_port);
+       int index = cvmx_helper_get_interface_index_num(xipd_port);
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       struct cvmx_fdt_sfp_info *sfp_info;
+
+       /*
+        * The default result will be a down link unless the code
+        * below changes it.
+        */
+       result.u64 = 0;
+
+       if (__cvmx_helper_xiface_is_null(xiface) || index == -1 ||
+           index >= cvmx_helper_ports_on_interface(xiface)) {
+               return result;
+       }
+
+       if (iface_node_ops[xi.node][xi.interface]->link_get)
+               result = iface_node_ops[xi.node][xi.interface]->link_get(xipd_port);
+
+       if (xipd_port >= 0) {
+               cvmx_helper_update_link_led(xiface, index, result);
+
+               sfp_info = cvmx_helper_cfg_get_sfp_info(xiface, index);
+
+               while (sfp_info) {
+                       if ((!result.s.link_up || (result.s.link_up && sfp_info->last_mod_abs)))
+                               cvmx_sfp_check_mod_abs(sfp_info, sfp_info->mod_abs_data);
+                       sfp_info = sfp_info->next_iface_sfp;
+               }
+       }
+
+       return result;
+}
+
+/**
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param xipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_link_set(int xipd_port, cvmx_helper_link_info_t link_info)
+{
+       int result = -1;
+       int xiface = cvmx_helper_get_interface_num(xipd_port);
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int index = cvmx_helper_get_interface_index_num(xipd_port);
+
+       if (__cvmx_helper_xiface_is_null(xiface) || index == -1 ||
+           index >= cvmx_helper_ports_on_interface(xiface))
+               return -1;
+
+       if (iface_node_ops[xi.node][xi.interface]->link_set)
+               result = iface_node_ops[xi.node][xi.interface]->link_set(xipd_port, link_info);
+
+       /*
+        * Set the port_link_info here so that the link status is
+        * updated no matter how cvmx_helper_link_set is called. We
+        * don't change the value if link_set failed.
+        */
+       if (result == 0)
+               __cvmx_helper_set_link_info(xiface, index, link_info);
+       return result;
+}
+
+/**
+ * Configure a port for internal and/or external loopback. Internal loopback
+ * causes packets sent by the port to be received by Octeon. External loopback
+ * causes packets received from the wire to sent out again.
+ *
+ * @param xipd_port IPD/PKO port to loopback.
+ * @param enable_internal
+ *                 Non zero if you want internal loopback
+ * @param enable_external
+ *                 Non zero if you want external loopback
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_helper_configure_loopback(int xipd_port, int enable_internal, int enable_external)
+{
+       int result = -1;
+       int xiface = cvmx_helper_get_interface_num(xipd_port);
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+       int index = cvmx_helper_get_interface_index_num(xipd_port);
+
+       if (index >= cvmx_helper_ports_on_interface(xiface))
+               return -1;
+
+       cvmx_helper_interface_get_mode(xiface);
+       if (iface_node_ops[xi.node][xi.interface]->loopback)
+               result = iface_node_ops[xi.node][xi.interface]->loopback(xipd_port, enable_internal,
+                                                                        enable_external);
+
+       return result;
+}
+
+void cvmx_helper_setup_simulator_io_buffer_counts(int node, int num_packet_buffers, int pko_buffers)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_PKI)) {
+               cvmx_helper_pki_set_dflt_pool_buffer(node, num_packet_buffers);
+               cvmx_helper_pki_set_dflt_aura_buffer(node, num_packet_buffers);
+
+       } else {
+               cvmx_ipd_set_packet_pool_buffer_count(num_packet_buffers);
+               cvmx_ipd_set_wqe_pool_buffer_count(num_packet_buffers);
+               cvmx_pko_set_cmd_queue_pool_buffer_count(pko_buffers);
+       }
+}
+
+void *cvmx_helper_mem_alloc(int node, uint64_t alloc_size, uint64_t align)
+{
+       s64 paddr;
+
+       paddr = cvmx_bootmem_phy_alloc_range(alloc_size, align, cvmx_addr_on_node(node, 0ull),
+                                            cvmx_addr_on_node(node, 0xffffffffff));
+       if (paddr <= 0ll) {
+               printf("ERROR: %s failed size %u\n", __func__, (unsigned int)alloc_size);
+               return NULL;
+       }
+       return cvmx_phys_to_ptr(paddr);
+}
+
+void cvmx_helper_mem_free(void *buffer, uint64_t size)
+{
+       __cvmx_bootmem_phy_free(cvmx_ptr_to_phys(buffer), size, 0);
+}
+
+int cvmx_helper_qos_config_init(cvmx_qos_proto_t qos_proto, cvmx_qos_config_t *qos_cfg)
+{
+       int i;
+
+       memset(qos_cfg, 0, sizeof(cvmx_qos_config_t));
+       qos_cfg->pkt_mode = CVMX_QOS_PKT_MODE_HWONLY; /* Process PAUSEs in hardware only.*/
+       qos_cfg->pool_mode = CVMX_QOS_POOL_PER_PORT;  /* One Pool per BGX:LMAC.*/
+       qos_cfg->pktbuf_size = 2048;                  /* Fit WQE + MTU in one buffer.*/
+       qos_cfg->aura_size = 1024;      /* 1K buffers typically enough for any application.*/
+       qos_cfg->pko_pfc_en = 1;        /* Enable PKO layout for PFC feature. */
+       qos_cfg->vlan_num = 1;          /* For Stacked VLAN, use 2nd VLAN in the QPG algorithm.*/
+       qos_cfg->qos_proto = qos_proto; /* Use PFC flow-control protocol.*/
+       qos_cfg->qpg_base = -1;         /* QPG Table index is undefined.*/
+       qos_cfg->p_time = 0x60;         /* PAUSE packets time window.*/
+       qos_cfg->p_interval = 0x10;     /* PAUSE packets interval.*/
+       for (i = 0; i < CVMX_QOS_NUM; i++) {
+               qos_cfg->groups[i] = i;       /* SSO Groups = 0...7 */
+               qos_cfg->group_prio[i] = i;   /* SSO Group priority = QOS. */
+               qos_cfg->drop_thresh[i] = 99; /* 99% of the Aura size.*/
+               qos_cfg->red_thresh[i] = 90;  /* 90% of the Aura size.*/
+               qos_cfg->bp_thresh[i] = 70;   /* 70% of the Aura size.*/
+       }
+       return 0;
+}
+
+int cvmx_helper_qos_port_config_update(int xipdport, cvmx_qos_config_t *qos_cfg)
+{
+       cvmx_user_static_pko_queue_config_t pkocfg;
+       cvmx_xport_t xp = cvmx_helper_ipd_port_to_xport(xipdport);
+       int xiface = cvmx_helper_get_interface_num(xipdport);
+       cvmx_xiface_t xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       /* Configure PKO port for PFC SQ layout: */
+       cvmx_helper_pko_queue_config_get(xp.node, &pkocfg);
+       pkocfg.pknd.pko_cfg_iface[xi.interface].pfc_enable = 1;
+       cvmx_helper_pko_queue_config_set(xp.node, &pkocfg);
+       return 0;
+}
+
+int cvmx_helper_qos_port_setup(int xipdport, cvmx_qos_config_t *qos_cfg)
+{
+       const int channles = CVMX_QOS_NUM;
+       int bufsize = qos_cfg->pktbuf_size;
+       int aura_size = qos_cfg->aura_size;
+       cvmx_xport_t xp = cvmx_helper_ipd_port_to_xport(xipdport);
+       int node = xp.node;
+       int ipdport = xp.port;
+       int port = cvmx_helper_get_interface_index_num(xp.port);
+       int xiface = cvmx_helper_get_interface_num(xipdport);
+       cvmx_xiface_t xi = cvmx_helper_xiface_to_node_interface(xiface);
+       cvmx_fpa3_pool_t gpool;
+       cvmx_fpa3_gaura_t gaura;
+       cvmx_bgxx_cmr_rx_ovr_bp_t ovrbp;
+       struct cvmx_pki_qpg_config qpgcfg;
+       struct cvmx_pki_style_config stcfg, stcfg_dflt;
+       struct cvmx_pki_pkind_config pkcfg;
+       int chan, bpid, group, qpg;
+       int bpen, reden, dropen, passthr, dropthr, bpthr;
+       int nbufs, pkind, style;
+       char name[32];
+
+       if (qos_cfg->pool_mode == CVMX_QOS_POOL_PER_PORT) {
+               /* Allocate and setup packet Pool: */
+               nbufs = aura_size * channles;
+               sprintf(name, "QOS.P%d", ipdport);
+               gpool = cvmx_fpa3_setup_fill_pool(node, -1 /*auto*/, name, bufsize, nbufs, NULL);
+               if (!__cvmx_fpa3_pool_valid(gpool)) {
+                       printf("%s: Failed to setup FPA Pool\n", __func__);
+                       return -1;
+               }
+               for (chan = 0; chan < channles; chan++)
+                       qos_cfg->gpools[chan] = gpool;
+       } else {
+               printf("%s: Invalid pool_mode %d\n", __func__, qos_cfg->pool_mode);
+               return -1;
+       }
+       /* Allocate QPG entries: */
+       qos_cfg->qpg_base = cvmx_pki_qpg_entry_alloc(node, -1 /*auto*/, channles);
+       if (qos_cfg->qpg_base < 0) {
+               printf("%s: Failed to allocate QPG entry\n", __func__);
+               return -1;
+       }
+       for (chan = 0; chan < channles; chan++) {
+               /* Allocate and setup Aura, setup BP threshold: */
+               gpool = qos_cfg->gpools[chan];
+               sprintf(name, "QOS.A%d", ipdport + chan);
+               gaura = cvmx_fpa3_set_aura_for_pool(gpool, -1 /*auto*/, name, bufsize, aura_size);
+               if (!__cvmx_fpa3_aura_valid(gaura)) {
+                       printf("%s: Failed to setup FPA Aura for Channel %d\n", __func__, chan);
+                       return -1;
+               }
+               qos_cfg->gauras[chan] = gaura;
+               bpen = 1;
+               reden = 1;
+               dropen = 1;
+               dropthr = (qos_cfg->drop_thresh[chan] * 10 * aura_size) / 1000;
+               passthr = (qos_cfg->red_thresh[chan] * 10 * aura_size) / 1000;
+               bpthr = (qos_cfg->bp_thresh[chan] * 10 * aura_size) / 1000;
+               cvmx_fpa3_setup_aura_qos(gaura, reden, passthr, dropthr, bpen, bpthr);
+               cvmx_pki_enable_aura_qos(node, gaura.laura, reden, dropen, bpen);
+
+               /* Allocate BPID, link Aura and Channel using BPID: */
+               bpid = cvmx_pki_bpid_alloc(node, -1 /*auto*/);
+               if (bpid < 0) {
+                       printf("%s: Failed to allocate BPID for channel %d\n",
+                              __func__, chan);
+                       return -1;
+               }
+               qos_cfg->bpids[chan] = bpid;
+               cvmx_pki_write_aura_bpid(node, gaura.laura, bpid);
+               cvmx_pki_write_channel_bpid(node, ipdport + chan, bpid);
+
+               /* Setup QPG entries: */
+               group = qos_cfg->groups[chan];
+               qpg = qos_cfg->qpg_base + chan;
+               cvmx_pki_read_qpg_entry(node, qpg, &qpgcfg);
+               qpgcfg.port_add = chan;
+               qpgcfg.aura_num = gaura.laura;
+               qpgcfg.grp_ok = (node << CVMX_WQE_GRP_NODE_SHIFT) | group;
+               qpgcfg.grp_bad = (node << CVMX_WQE_GRP_NODE_SHIFT) | group;
+               qpgcfg.grptag_ok = (node << CVMX_WQE_GRP_NODE_SHIFT) | 0;
+               qpgcfg.grptag_bad = (node << CVMX_WQE_GRP_NODE_SHIFT) | 0;
+               cvmx_pki_write_qpg_entry(node, qpg, &qpgcfg);
+       }
+       /* Allocate and setup STYLE: */
+       cvmx_helper_pki_get_dflt_style(node, &stcfg_dflt);
+       style = cvmx_pki_style_alloc(node, -1 /*auto*/);
+       cvmx_pki_read_style_config(node, style, CVMX_PKI_CLUSTER_ALL, &stcfg);
+       stcfg.tag_cfg = stcfg_dflt.tag_cfg;
+       stcfg.parm_cfg.tag_type = CVMX_POW_TAG_TYPE_ORDERED;
+       stcfg.parm_cfg.qpg_qos = CVMX_PKI_QPG_QOS_VLAN;
+       stcfg.parm_cfg.qpg_base = qos_cfg->qpg_base;
+       stcfg.parm_cfg.qpg_port_msb = 0;
+       stcfg.parm_cfg.qpg_port_sh = 0;
+       stcfg.parm_cfg.qpg_dis_grptag = 1;
+       stcfg.parm_cfg.fcs_strip = 1;
+       stcfg.parm_cfg.mbuff_size = bufsize - 64; /* Do not use 100% of the buffer. */
+       stcfg.parm_cfg.force_drop = 0;
+       stcfg.parm_cfg.nodrop = 0;
+       stcfg.parm_cfg.rawdrp = 0;
+       stcfg.parm_cfg.cache_mode = 2; /* 1st buffer in L2 */
+       stcfg.parm_cfg.wqe_vs = qos_cfg->vlan_num;
+       cvmx_pki_write_style_config(node, style, CVMX_PKI_CLUSTER_ALL, &stcfg);
+
+       /* Setup PKIND: */
+       pkind = cvmx_helper_get_pknd(xiface, port);
+       cvmx_pki_read_pkind_config(node, pkind, &pkcfg);
+       pkcfg.cluster_grp = 0; /* OCTEON3 has only one cluster group = 0 */
+       pkcfg.initial_style = style;
+       pkcfg.initial_parse_mode = CVMX_PKI_PARSE_LA_TO_LG;
+       cvmx_pki_write_pkind_config(node, pkind, &pkcfg);
+
+       /* Setup parameters of the QOS packet and enable QOS flow-control: */
+       cvmx_bgx_set_pause_pkt_param(xipdport, 0, 0x0180c2000001, 0x8808, qos_cfg->p_time,
+                                    qos_cfg->p_interval);
+       cvmx_bgx_set_flowctl_mode(xipdport, qos_cfg->qos_proto, qos_cfg->pkt_mode);
+
+       /* Enable PKI channel backpressure in the BGX: */
+       ovrbp.u64 = csr_rd_node(node, CVMX_BGXX_CMR_RX_OVR_BP(xi.interface));
+       ovrbp.s.en &= ~(1 << port);
+       ovrbp.s.ign_fifo_bp &= ~(1 << port);
+       csr_wr_node(node, CVMX_BGXX_CMR_RX_OVR_BP(xi.interface), ovrbp.u64);
+       return 0;
+}
+
+int cvmx_helper_qos_sso_setup(int xipdport, cvmx_qos_config_t *qos_cfg)
+{
+       const int channels = CVMX_QOS_NUM;
+       cvmx_sso_grpx_pri_t grppri;
+       int chan, qos, group;
+       cvmx_xport_t xp = cvmx_helper_ipd_port_to_xport(xipdport);
+       int node = xp.node;
+
+       for (chan = 0; chan < channels; chan++) {
+               qos = cvmx_helper_qos2prio(chan);
+               group = qos_cfg->groups[qos];
+               grppri.u64 = csr_rd_node(node, CVMX_SSO_GRPX_PRI(group));
+               grppri.s.pri = qos_cfg->group_prio[chan];
+               csr_wr_node(node, CVMX_SSO_GRPX_PRI(group), grppri.u64);
+       }
+       return 0;
+}
+
+int cvmx_helper_get_chan_e_name(int chan, char *namebuf, int buflen)
+{
+       int n, dpichans;
+
+       if ((unsigned int)chan >= CVMX_PKO3_IPD_NUM_MAX) {
+               printf("%s: Channel %d is out of range (0..4095)\n", __func__, chan);
+               return -1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               dpichans = 64;
+       else
+               dpichans = 128;
+
+       if (chan >= 0 && chan < 64)
+               n = snprintf(namebuf, buflen, "LBK%d", chan);
+       else if (chan >= 0x100 && chan < (0x100 + dpichans))
+               n = snprintf(namebuf, buflen, "DPI%d", chan - 0x100);
+       else if (chan == 0x200)
+               n = snprintf(namebuf, buflen, "NQM");
+       else if (chan >= 0x240 && chan < (0x240 + (1 << 1) + 2))
+               n = snprintf(namebuf, buflen, "SRIO%d:%d", (chan - 0x240) >> 1,
+                            (chan - 0x240) & 0x1);
+       else if (chan >= 0x400 && chan < (0x400 + (1 << 8) + 256))
+               n = snprintf(namebuf, buflen, "ILK%d:%d", (chan - 0x400) >> 8,
+                            (chan - 0x400) & 0xFF);
+       else if (chan >= 0x800 && chan < (0x800 + (5 << 8) + (3 << 4) + 16))
+               n = snprintf(namebuf, buflen, "BGX%d:%d:%d", (chan - 0x800) >> 8,
+                            ((chan - 0x800) >> 4) & 0x3, (chan - 0x800) & 0xF);
+       else
+               n = snprintf(namebuf, buflen, "--");
+       return n;
+}
+
+#ifdef CVMX_DUMP_DIAGNOSTICS
+void cvmx_helper_dump_for_diagnostics(int node)
+{
+       if (!(OCTEON_IS_OCTEON3() && !OCTEON_IS_MODEL(OCTEON_CN70XX))) {
+               printf("Diagnostics are not implemented for this model\n");
+               return;
+       }
+#ifdef CVMX_DUMP_GSER
+       {
+               int qlm, num_qlms;
+
+               num_qlms = cvmx_qlm_get_num();
+               for (qlm = 0; qlm < num_qlms; qlm++) {
+                       cvmx_dump_gser_config_node(node, qlm);
+                       cvmx_dump_gser_status_node(node, qlm);
+               }
+       }
+#endif
+#ifdef CVMX_DUMP_BGX
+       {
+               int bgx;
+
+               for (bgx = 0; bgx < CVMX_HELPER_MAX_GMX; bgx++) {
+                       cvmx_dump_bgx_config_node(node, bgx);
+                       cvmx_dump_bgx_status_node(node, bgx);
+               }
+       }
+#endif
+#ifdef CVMX_DUMP_PKI
+       cvmx_pki_config_dump(node);
+       cvmx_pki_stats_dump(node);
+#endif
+#ifdef CVMX_DUMP_PKO
+       cvmx_helper_pko3_config_dump(node);
+       cvmx_helper_pko3_stats_dump(node);
+#endif
+#ifdef CVMX_DUMO_SSO
+       cvmx_sso_config_dump(node);
+#endif
+}
+#endif
diff --git a/arch/mips/mach-octeon/cvmx-pcie.c b/arch/mips/mach-octeon/cvmx-pcie.c
new file mode 100644 (file)
index 0000000..f42d44c
--- /dev/null
@@ -0,0 +1,2487 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to PCIe as a host(RC) or target(EP)
+ */
+
+#include <log.h>
+#include <linux/delay.h>
+#include <linux/libfdt.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/octeon-model.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+
+#include <mach/cvmx-helper-fdt.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/octeon-model.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/cvmx-pcie.h>
+#include <mach/cvmx-error.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-bgxx-defs.h>
+#include <mach/cvmx-ciu-defs.h>
+#include <mach/cvmx-gmxx-defs.h>
+#include <mach/cvmx-gserx-defs.h>
+#include <mach/cvmx-mio-defs.h>
+#include <mach/cvmx-pciercx-defs.h>
+#include <mach/cvmx-pcieepx-defs.h>
+#include <mach/cvmx-pemx-defs.h>
+#include <mach/cvmx-pexp-defs.h>
+#include <mach/cvmx-rst-defs.h>
+#include <mach/cvmx-sata-defs.h>
+#include <mach/cvmx-sli-defs.h>
+#include <mach/cvmx-sriomaintx-defs.h>
+#include <mach/cvmx-sriox-defs.h>
+
+#include <mach/cvmx-dpi-defs.h>
+#include <mach/cvmx-sli-defs.h>
+#include <mach/cvmx-dtx-defs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define MRRS_CN6XXX 3 /* 1024 byte Max Read Request Size */
+#define MPS_CN6XXX  0 /* 128 byte Max Packet Size (Limit of most PCs) */
+
+/* Endian swap mode. */
+#define _CVMX_PCIE_ES 1
+
+#define CVMX_READ_CSR(addr)               csr_rd_node(node, addr)
+#define CVMX_WRITE_CSR(addr, val)         csr_wr_node(node, addr, val)
+#define CVMX_PCIE_CFGX_READ(p, addr)      cvmx_pcie_cfgx_read_node(node, p, addr)
+#define CVMX_PCIE_CFGX_WRITE(p, addr, val) cvmx_pcie_cfgx_write_node(node, p, addr, val)
+
+/* #define DEBUG_PCIE */
+
+/* Delay after link up, before issuing first configuration read */
+#define PCIE_DEVICE_READY_WAIT_DELAY_MICROSECONDS 700000
+
+/* Recommended Preset Vector: Drop Preset 10    */
+int pcie_preset_vec[4] = { 0x593, 0x593, 0x593, 0x593 };
+
+/* Number of LTSSM transitions to record, must be a power of 2 */
+#define LTSSM_HISTORY_SIZE 64
+#define MAX_RETRIES       2
+
+bool pcie_link_initialized[CVMX_MAX_NODES][CVMX_PCIE_MAX_PORTS];
+int cvmx_primary_pcie_bus_number = 1;
+
+static uint32_t __cvmx_pcie_config_read32(int node, int pcie_port, int bus, int dev, int func,
+                                         int reg, int lst);
+
+/**
+ * Return the Core virtual base address for PCIe IO access. IOs are
+ * read/written as an offset from this address.
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return 64bit Octeon IO base address for read/write
+ */
+uint64_t cvmx_pcie_get_io_base_address(int pcie_port)
+{
+       cvmx_pcie_address_t pcie_addr;
+
+       pcie_addr.u64 = 0;
+       pcie_addr.io.upper = 0;
+       pcie_addr.io.io = 1;
+       pcie_addr.io.did = 3;
+       pcie_addr.io.subdid = 2;
+       pcie_addr.io.node = (pcie_port >> 4) & 0x3;
+       pcie_addr.io.es = _CVMX_PCIE_ES;
+       pcie_addr.io.port = (pcie_port & 0x3);
+       return pcie_addr.u64;
+}
+
+/**
+ * Size of the IO address region returned at address
+ * cvmx_pcie_get_io_base_address()
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return Size of the IO window
+ */
+uint64_t cvmx_pcie_get_io_size(int pcie_port)
+{
+       return 1ull << 32;
+}
+
+/**
+ * Return the Core virtual base address for PCIe MEM access. Memory is
+ * read/written as an offset from this address.
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return 64bit Octeon IO base address for read/write
+ */
+uint64_t cvmx_pcie_get_mem_base_address(int pcie_port)
+{
+       cvmx_pcie_address_t pcie_addr;
+
+       pcie_addr.u64 = 0;
+       pcie_addr.mem.upper = 0;
+       pcie_addr.mem.io = 1;
+       pcie_addr.mem.did = 3;
+       pcie_addr.mem.subdid = 3 + (pcie_port & 0x3);
+       pcie_addr.mem.node = (pcie_port >> 4) & 0x3;
+       return pcie_addr.u64;
+}
+
+/**
+ * Size of the Mem address region returned at address
+ * cvmx_pcie_get_mem_base_address()
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return Size of the Mem window
+ */
+uint64_t cvmx_pcie_get_mem_size(int pcie_port)
+{
+       return 1ull << 36;
+}
+
+/**
+ * @INTERNAL
+ * Return the QLM number for the PCIE port.
+ *
+ * @param  pcie_port  QLM number to return for.
+ *
+ * @return QLM number.
+ */
+static int __cvmx_pcie_get_qlm(int node, int pcie_port)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+               cvmx_pemx_cfg_t pem_cfg;
+               cvmx_pemx_qlm_t pem_qlm;
+               cvmx_gserx_cfg_t gserx_cfg;
+
+               switch (pcie_port) {
+               case 0: /* PEM0 */
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(0));
+                       if (gserx_cfg.s.pcie)
+                               return 0; /* PEM0 is on QLM0 and possibly QLM1 */
+                       else
+                               return -1; /* PEM0 is disabled */
+               case 1:                    /* PEM1 */
+                       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(0));
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(1));
+                       if (!pem_cfg.cn78xx.lanes8 && gserx_cfg.s.pcie)
+                               return 1; /* PEM1 is on QLM 1 */
+                       else
+                               return -1; /* PEM1 is disabled */
+               case 2:                    /* PEM2 */
+                       pem_qlm.u64 = CVMX_READ_CSR(CVMX_PEMX_QLM(2));
+                       if (pem_qlm.cn73xx.pemdlmsel == 1) {
+                               gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(5));
+                               if (gserx_cfg.s.pcie)
+                                       return 5; /* PEM2 is on DLM5 */
+                               else
+                                       return -1; /* PEM2 is disabled */
+                       }
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(2));
+                       if (gserx_cfg.s.pcie)
+                               return 2; /* PEM2 is on QLM2 and possibly QLM3 */
+                       else
+                               return -1; /* PEM2 is disabled */
+               case 3:                    /* PEM3 */
+                       pem_qlm.u64 = CVMX_READ_CSR(CVMX_PEMX_QLM(3));
+                       if (pem_qlm.cn73xx.pemdlmsel == 1) {
+                               gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(6));
+                               if (gserx_cfg.s.pcie)
+                                       return 6; /* PEM2 is on DLM5 */
+                               else
+                                       return -1; /* PEM2 is disabled */
+                       }
+                       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(2));
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(3));
+                       if (!pem_cfg.cn78xx.lanes8 && gserx_cfg.s.pcie)
+                               return 3; /* PEM2 is on QLM2 and possibly QLM3 */
+                       else
+                               return -1; /* PEM2 is disabled */
+               default:
+                       printf("Invalid %d PCIe port\n", pcie_port);
+                       return -2;
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               cvmx_pemx_cfg_t pem_cfg;
+               cvmx_gserx_cfg_t gserx_cfg;
+
+               switch (pcie_port) {
+               case 0:
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(0));
+                       if (gserx_cfg.s.pcie)
+                               return 0; /* PEM0 is on QLM0 and possibly QLM1 */
+                       else
+                               return -1; /* PEM0 is disabled */
+               case 1:                    /* PEM1 */
+                       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(0));
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(1));
+                       if (!pem_cfg.cn78xx.lanes8 && gserx_cfg.s.pcie)
+                               return 1; /* PEM1 is on QLM 1 */
+                       else
+                               return -1; /* PEM1 is disabled */
+               case 2:                    /* PEM2 */
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(2));
+                       if (gserx_cfg.s.pcie)
+                               return 2; /* PEM2 is on QLM2 and possibly QLM3 */
+                       else
+                               return -1; /* PEM2 is disabled */
+               case 3:                    /* PEM3 */
+               {
+                       cvmx_gserx_cfg_t gser4_cfg;
+
+                       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(2));
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(3));
+                       gser4_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(4));
+                       if (pem_cfg.cn78xx.lanes8) {
+                               if (gser4_cfg.s.pcie)
+                                       return 4; /* PEM3 is on QLM4 */
+                               else
+                                       return -1; /* PEM3 is disabled */
+                       } else {
+                               if (gserx_cfg.s.pcie)
+                                       return 3; /* PEM3 is on QLM3 */
+                               else if (gser4_cfg.s.pcie)
+                                       return 4; /* PEM3 is on QLM4 */
+                               else
+                                       return -1; /* PEM3 is disabled */
+                       }
+               }
+               default:
+                       printf("Invalid %d PCIe port\n", pcie_port);
+                       return -1;
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               enum cvmx_qlm_mode mode1 = cvmx_qlm_get_mode(1);
+               enum cvmx_qlm_mode mode2 = cvmx_qlm_get_mode(2);
+
+               switch (pcie_port) {
+               case 0: /* PCIe0 can be DLM1 with 1, 2 or 4 lanes */
+                       if (mode1 == CVMX_QLM_MODE_PCIE ||     /* Using DLM 1-2 */
+                           mode1 == CVMX_QLM_MODE_PCIE_1X2 || /* Using DLM 1 */
+                           mode1 == CVMX_QLM_MODE_PCIE_2X1 || /* Using DLM 1, lane 0 */
+                           mode1 == CVMX_QLM_MODE_PCIE_1X1) /* Using DLM 1, l0, l1 not used */
+                               return 1;
+                       else
+                               return -1;
+               case 1: /* PCIe1 can be DLM1 1 lane(1), DLM2 1 lane(0) or 2 lanes(0-1) */
+                       if (mode1 == CVMX_QLM_MODE_PCIE_2X1)
+                               return 1;
+                       else if (mode2 == CVMX_QLM_MODE_PCIE_1X2)
+                               return 2;
+                       else if (mode2 == CVMX_QLM_MODE_PCIE_2X1)
+                               return 2;
+                       else
+                               return -1;
+               case 2: /* PCIe2 can be DLM2 1 lanes(1) */
+                       if (mode2 == CVMX_QLM_MODE_PCIE_2X1)
+                               return 2;
+                       else
+                               return -1;
+               default: /* Only three PEM blocks */
+                       return -1;
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               cvmx_gserx_cfg_t gserx_cfg;
+
+               switch (pcie_port) {
+               case 0: /* PEM0 */
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(0));
+                       if (gserx_cfg.s.pcie)
+                               return 0; /* PEM0 is on QLM0 and possibly QLM1 */
+                       else
+                               return -1; /* PEM0 is disabled */
+               case 1:                    /* PEM1 */
+                       gserx_cfg.u64 = CVMX_READ_CSR(CVMX_GSERX_CFG(1));
+                       if (gserx_cfg.s.pcie)
+                               return 1; /* PEM1 is on DLM1 */
+                       else
+                               return -1; /* PEM1 is disabled */
+               default:
+                       return -1;
+               }
+       }
+       return -1;
+}
+
+/**
+ * @INTERNAL
+ * Initialize the RC config space CSRs
+ *
+ * @param node      node
+ * @param pcie_port PCIe port to initialize
+ */
+static void __cvmx_pcie_rc_initialize_config_space(int node, int pcie_port)
+{
+       /* Max Payload Size (PCIE*_CFG030[MPS]) */
+       /* Max Read Request Size (PCIE*_CFG030[MRRS]) */
+       /* Relaxed-order, no-snoop enables (PCIE*_CFG030[RO_EN,NS_EN] */
+       /* Error Message Enables (PCIE*_CFG030[CE_EN,NFE_EN,FE_EN,UR_EN]) */
+       {
+               cvmx_pciercx_cfg030_t pciercx_cfg030;
+
+               pciercx_cfg030.u32 = CVMX_PCIE_CFGX_READ(pcie_port,
+                                                        CVMX_PCIERCX_CFG030(pcie_port));
+               pciercx_cfg030.s.mps = MPS_CN6XXX;
+               pciercx_cfg030.s.mrrs = MRRS_CN6XXX;
+               /*
+                * Enable relaxed order processing. This will allow devices
+                * to affect read response ordering
+                */
+               pciercx_cfg030.s.ro_en = 1;
+               /* Enable no snoop processing. Not used by Octeon */
+               pciercx_cfg030.s.ns_en = 1;
+               /* Correctable error reporting enable. */
+               pciercx_cfg030.s.ce_en = 1;
+               /* Non-fatal error reporting enable. */
+               pciercx_cfg030.s.nfe_en = 1;
+               /* Fatal error reporting enable. */
+               pciercx_cfg030.s.fe_en = 1;
+               /* Unsupported request reporting enable. */
+               pciercx_cfg030.s.ur_en = 1;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG030(pcie_port),
+                                    pciercx_cfg030.u32);
+       }
+
+       /*
+        * Max Payload Size (DPI_SLI_PRTX_CFG[MPS]) must match
+        * PCIE*_CFG030[MPS]
+        */
+       /*
+        * Max Read Request Size (DPI_SLI_PRTX_CFG[MRRS]) must not exceed
+        * PCIE*_CFG030[MRRS]
+        */
+       cvmx_dpi_sli_prtx_cfg_t prt_cfg;
+       cvmx_sli_s2m_portx_ctl_t sli_s2m_portx_ctl;
+
+       prt_cfg.u64 = CVMX_READ_CSR(CVMX_DPI_SLI_PRTX_CFG(pcie_port));
+       prt_cfg.s.mps = MPS_CN6XXX;
+       prt_cfg.s.mrrs = MRRS_CN6XXX;
+       /* Max outstanding load request. */
+       prt_cfg.s.molr = 32;
+       CVMX_WRITE_CSR(CVMX_DPI_SLI_PRTX_CFG(pcie_port), prt_cfg.u64);
+
+       sli_s2m_portx_ctl.u64 = CVMX_READ_CSR(CVMX_PEXP_SLI_S2M_PORTX_CTL(pcie_port));
+       if (!(OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX) ||
+             OCTEON_IS_MODEL(OCTEON_CNF75XX)))
+               sli_s2m_portx_ctl.cn61xx.mrrs = MRRS_CN6XXX;
+       CVMX_WRITE_CSR(CVMX_PEXP_SLI_S2M_PORTX_CTL(pcie_port), sli_s2m_portx_ctl.u64);
+
+       /* ECRC Generation (PCIE*_CFG070[GE,CE]) */
+       {
+               cvmx_pciercx_cfg070_t pciercx_cfg070;
+
+               pciercx_cfg070.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG070(pcie_port));
+               pciercx_cfg070.s.ge = 1; /* ECRC generation enable. */
+               pciercx_cfg070.s.ce = 1; /* ECRC check enable. */
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG070(pcie_port), pciercx_cfg070.u32);
+       }
+
+       /* Access Enables (PCIE*_CFG001[MSAE,ME]) */
+       /* ME and MSAE should always be set. */
+       /* Interrupt Disable (PCIE*_CFG001[I_DIS]) */
+       /* System Error Message Enable (PCIE*_CFG001[SEE]) */
+       {
+               cvmx_pciercx_cfg001_t pciercx_cfg001;
+
+               pciercx_cfg001.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG001(pcie_port));
+               pciercx_cfg001.s.msae = 1;  /* Memory space enable. */
+               pciercx_cfg001.s.me = 1;    /* Bus master enable. */
+               pciercx_cfg001.s.i_dis = 1; /* INTx assertion disable. */
+               pciercx_cfg001.s.see = 1;   /* SERR# enable */
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG001(pcie_port), pciercx_cfg001.u32);
+       }
+
+       /* Advanced Error Recovery Message Enables */
+       /* (PCIE*_CFG066,PCIE*_CFG067,PCIE*_CFG069) */
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG066(pcie_port), 0);
+       /* Use CVMX_PCIERCX_CFG067 hardware default */
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG069(pcie_port), 0);
+
+       /* Active State Power Management (PCIE*_CFG032[ASLPC]) */
+       {
+               cvmx_pciercx_cfg032_t pciercx_cfg032;
+
+               pciercx_cfg032.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
+               pciercx_cfg032.s.aslpc = 0; /* Active state Link PM control. */
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG032(pcie_port), pciercx_cfg032.u32);
+       }
+
+       /* Link Width Mode (PCIERCn_CFG452[LME]) - Set during
+        * cvmx_pcie_rc_initialize_link()
+        */
+       /* Primary Bus Number (PCIERCn_CFG006[PBNUM]) */
+       {
+               /* We set the primary bus number to 1 so IDT bridges are happy.
+                * They don't like zero
+                */
+               cvmx_pciercx_cfg006_t pciercx_cfg006;
+
+               pciercx_cfg006.u32 = 0;
+               pciercx_cfg006.s.pbnum = cvmx_primary_pcie_bus_number;
+               pciercx_cfg006.s.sbnum = cvmx_primary_pcie_bus_number;
+               pciercx_cfg006.s.subbnum = cvmx_primary_pcie_bus_number;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG006(pcie_port), pciercx_cfg006.u32);
+       }
+
+       /* Memory-mapped I/O BAR (PCIERCn_CFG008) */
+       /* Most applications should disable the memory-mapped I/O BAR by */
+       /* setting PCIERCn_CFG008[ML_ADDR] < PCIERCn_CFG008[MB_ADDR] */
+       {
+               cvmx_pciercx_cfg008_t pciercx_cfg008;
+
+               pciercx_cfg008.u32 = 0;
+               pciercx_cfg008.s.mb_addr = 0x100;
+               pciercx_cfg008.s.ml_addr = 0;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG008(pcie_port), pciercx_cfg008.u32);
+       }
+
+       /* Prefetchable BAR (PCIERCn_CFG009,PCIERCn_CFG010,PCIERCn_CFG011) */
+       /* Most applications should disable the prefetchable BAR by setting */
+       /* PCIERCn_CFG011[UMEM_LIMIT],PCIERCn_CFG009[LMEM_LIMIT] < */
+       /* PCIERCn_CFG010[UMEM_BASE],PCIERCn_CFG009[LMEM_BASE] */
+       {
+               cvmx_pciercx_cfg009_t pciercx_cfg009;
+               cvmx_pciercx_cfg010_t pciercx_cfg010;
+               cvmx_pciercx_cfg011_t pciercx_cfg011;
+
+               pciercx_cfg009.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG009(pcie_port));
+               pciercx_cfg010.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG010(pcie_port));
+               pciercx_cfg011.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG011(pcie_port));
+               pciercx_cfg009.s.lmem_base = 0x100;
+               pciercx_cfg009.s.lmem_limit = 0;
+               pciercx_cfg010.s.umem_base = 0x100;
+               pciercx_cfg011.s.umem_limit = 0;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG009(pcie_port), pciercx_cfg009.u32);
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG010(pcie_port), pciercx_cfg010.u32);
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG011(pcie_port), pciercx_cfg011.u32);
+       }
+
+       /* System Error Interrupt Enables (PCIERCn_CFG035[SECEE,SEFEE,SENFEE]) */
+       /* PME Interrupt Enables (PCIERCn_CFG035[PMEIE]) */
+       {
+               cvmx_pciercx_cfg035_t pciercx_cfg035;
+
+               pciercx_cfg035.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG035(pcie_port));
+               pciercx_cfg035.s.secee = 1;  /* System error on correctable error enable. */
+               pciercx_cfg035.s.sefee = 1;  /* System error on fatal error enable. */
+               pciercx_cfg035.s.senfee = 1; /* System error on non-fatal error enable. */
+               pciercx_cfg035.s.pmeie = 1;  /* PME interrupt enable. */
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG035(pcie_port), pciercx_cfg035.u32);
+       }
+
+       /* Advanced Error Recovery Interrupt Enables */
+       /* (PCIERCn_CFG075[CERE,NFERE,FERE]) */
+       {
+               cvmx_pciercx_cfg075_t pciercx_cfg075;
+
+               pciercx_cfg075.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG075(pcie_port));
+               pciercx_cfg075.s.cere = 1;  /* Correctable error reporting enable. */
+               pciercx_cfg075.s.nfere = 1; /* Non-fatal error reporting enable. */
+               pciercx_cfg075.s.fere = 1;  /* Fatal error reporting enable. */
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG075(pcie_port), pciercx_cfg075.u32);
+       }
+
+       /* HP Interrupt Enables (PCIERCn_CFG034[HPINT_EN], */
+       /* PCIERCn_CFG034[DLLS_EN,CCINT_EN]) */
+       {
+               cvmx_pciercx_cfg034_t pciercx_cfg034;
+
+               pciercx_cfg034.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG034(pcie_port));
+               pciercx_cfg034.s.hpint_en = 1; /* Hot-plug interrupt enable. */
+               pciercx_cfg034.s.dlls_en = 1;  /* Data Link Layer state changed enable */
+               pciercx_cfg034.s.ccint_en = 1; /* Command completed interrupt enable. */
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG034(pcie_port), pciercx_cfg034.u32);
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX) ||
+           OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               int qlm = __cvmx_pcie_get_qlm(node, pcie_port);
+               int speed = cvmx_qlm_get_gbaud_mhz(qlm);
+               cvmx_pemx_cfg_t pem_cfg;
+               cvmx_pciercx_cfg031_t cfg031;
+               cvmx_pciercx_cfg040_t cfg040;
+               cvmx_pciercx_cfg452_t cfg452;
+               cvmx_pciercx_cfg089_t cfg089;
+               cvmx_pciercx_cfg090_t cfg090;
+               cvmx_pciercx_cfg091_t cfg091;
+               cvmx_pciercx_cfg092_t cfg092;
+               cvmx_pciercx_cfg554_t cfg554;
+
+               /*
+                * Make sure the PEM agrees with GSERX about the speed
+                * its going to try
+                */
+               switch (speed) {
+               case 2500: /* Gen1 */
+                       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(pcie_port));
+                       pem_cfg.s.md = 0;
+                       CVMX_WRITE_CSR(CVMX_PEMX_CFG(pcie_port), pem_cfg.u64);
+
+                       /* Set the target link speed */
+                       cfg040.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG040(pcie_port));
+                       cfg040.s.tls = 1;
+                       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG040(pcie_port), cfg040.u32);
+                       break;
+               case 5000: /* Gen2 */
+                       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(pcie_port));
+                       pem_cfg.s.md = 1;
+                       CVMX_WRITE_CSR(CVMX_PEMX_CFG(pcie_port), pem_cfg.u64);
+
+                       /* Set the target link speed */
+                       cfg040.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG040(pcie_port));
+                       cfg040.s.tls = 2;
+                       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG040(pcie_port), cfg040.u32);
+                       break;
+               case 8000: /* Gen3 */
+                       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(pcie_port));
+                       pem_cfg.s.md = 2;
+                       CVMX_WRITE_CSR(CVMX_PEMX_CFG(pcie_port), pem_cfg.u64);
+
+                       /* Set the target link speed */
+                       cfg040.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG040(pcie_port));
+                       cfg040.s.tls = 3;
+                       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG040(pcie_port), cfg040.u32);
+                       break;
+               default:
+                       break;
+               }
+
+               /* Link Width Mode (PCIERCn_CFG452[LME]) */
+               pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(pcie_port));
+               cfg452.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG452(pcie_port));
+               if (qlm >= 5)
+                       cfg452.s.lme = 0x3;
+               else
+                       cfg452.s.lme = (pem_cfg.cn78xx.lanes8) ? 0xf : 0x7;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG452(pcie_port), cfg452.u32);
+
+               /* Errata PEM-25990 - Disable ASLPMS */
+               cfg031.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG031(pcie_port));
+               cfg031.s.aslpms = 0;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG031(pcie_port), cfg031.u32);
+
+               /* CFG554.PRV default changed from 16'h7ff to 16'h593. */
+               cfg554.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG554(pcie_port));
+               cfg554.s.prv = pcie_preset_vec[pcie_port];
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG554(pcie_port), cfg554.u32);
+               /* Errata PEM-26189 - Disable the 2ms timer on all chips */
+               cfg554.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG554(pcie_port));
+               cfg554.s.p23td = 1;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG554(pcie_port), cfg554.u32);
+
+               /* Errata PEM-21178 - Change the CFG[089-092] LxUTP & LxDTP defaults. */
+               cfg089.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG089(pcie_port));
+               cfg089.s.l1ddtp = 7;
+               cfg089.s.l1utp = 7;
+               cfg089.s.l0dtp = 7;
+               cfg089.s.l0utp = 7;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG089(pcie_port), cfg089.u32);
+               cfg090.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG090(pcie_port));
+               cfg090.s.l3dtp = 7;
+               cfg090.s.l3utp = 7;
+               cfg090.s.l2dtp = 7;
+               cfg090.s.l2utp = 7;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG090(pcie_port), cfg090.u32);
+               cfg091.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG091(pcie_port));
+               cfg091.s.l5dtp = 7;
+               cfg091.s.l5utp = 7;
+               cfg091.s.l4dtp = 7;
+               cfg091.s.l4utp = 7;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG091(pcie_port), cfg091.u32);
+               cfg092.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG092(pcie_port));
+               cfg092.s.l7dtp = 7;
+               cfg092.s.l7utp = 7;
+               cfg092.s.l6dtp = 7;
+               cfg092.s.l6utp = 7;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG092(pcie_port), cfg092.u32);
+       }
+}
+
+static void __cvmx_increment_ba(cvmx_sli_mem_access_subidx_t *pmas)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               pmas->cn68xx.ba++;
+       else
+               pmas->cn63xx.ba++;
+}
+
+/*
+ * milliseconds to retry PCIe cfg-space access:
+ * Value 32(unscaled) was recommended in HRM, but may be too small for
+ * some PCIe devices. This 200mS default should cover most devices,
+ * but can be extended by bootparam cvmx-pcie.cfg_timeout, or reduced
+ * to speed boot if it is known that no devices need so much time.
+ */
+static int cfg_timeout = 200;
+
+static int cfg_retries(void)
+{
+       static int cfg_ticks = -1;
+
+       if (cfg_ticks < 0) {
+               u64 nS = cfg_timeout * 1000000;
+               const int ceiling = 0xffff;
+
+               cfg_ticks = nS / (gd->bus_clk >> 16);
+               if (cfg_ticks > ceiling)
+                       cfg_ticks = ceiling;
+       }
+
+       return cfg_ticks;
+}
+
+/**
+ * @INTERNAL
+ * Enable/Disable PEMX_PEMON.pemon based on the direction.
+ *
+ * @param node      node
+ * @param pcie_port PCIe port
+ * @param direction 0 to disable, 1 to enable
+ */
+static void __cvmx_pcie_config_pemon(int node, int pcie_port, bool direction)
+{
+       cvmx_pemx_on_t pemon;
+
+       pemon.u64 = CVMX_READ_CSR(CVMX_PEMX_ON(pcie_port));
+       pemon.s.pemon = direction;
+       CVMX_WRITE_CSR(CVMX_PEMX_ON(pcie_port), pemon.u64);
+       pemon.u64 = CVMX_READ_CSR(CVMX_PEMX_ON(pcie_port));
+}
+
+/**
+ * @INTERNAL
+ * De-assert GSER_PHY.phy_reset for a given qlm
+ *
+ * @param node       node
+ * @param qlm        qlm for a given PCIe port
+ */
+static void __cvmx_pcie_gser_phy_config(int node, int pcie_port, int qlm)
+{
+       cvmx_pemx_cfg_t pem_cfg;
+       cvmx_gserx_phy_ctl_t ctrl;
+       int has_8lanes = 0;
+       int is_gen3 = 0;
+
+       ctrl.u64 = CVMX_READ_CSR(CVMX_GSERX_PHY_CTL(qlm));
+
+       /* Assert the reset */
+       ctrl.s.phy_reset = 1;
+       CVMX_WRITE_CSR(CVMX_GSERX_PHY_CTL(qlm), ctrl.u64);
+       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(pcie_port));
+       udelay(10);
+
+       has_8lanes = pem_cfg.cn78xx.lanes8;
+       is_gen3 = pem_cfg.cn78xx.md >= 2;
+
+       if (has_8lanes) {
+               ctrl.u64 = CVMX_READ_CSR(CVMX_GSERX_PHY_CTL(qlm + 1));
+               ctrl.s.phy_reset = 1;
+               CVMX_WRITE_CSR(CVMX_GSERX_PHY_CTL(qlm + 1), ctrl.u64);
+               ctrl.u64 = CVMX_READ_CSR(CVMX_GSERX_PHY_CTL(qlm + 1));
+       }
+       ctrl.u64 = CVMX_READ_CSR(CVMX_GSERX_PHY_CTL(qlm));
+       udelay(10);
+
+       /* Deassert the reset */
+       ctrl.s.phy_reset = 0;
+       CVMX_WRITE_CSR(CVMX_GSERX_PHY_CTL(qlm), ctrl.u64);
+       pem_cfg.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG(pcie_port));
+       udelay(500);
+
+       if (has_8lanes) {
+               ctrl.u64 = CVMX_READ_CSR(CVMX_GSERX_PHY_CTL(qlm + 1));
+               ctrl.s.phy_reset = 0;
+               CVMX_WRITE_CSR(CVMX_GSERX_PHY_CTL(qlm + 1), ctrl.u64);
+       }
+       ctrl.u64 = CVMX_READ_CSR(CVMX_GSERX_PHY_CTL(qlm));
+       udelay(500);
+
+       /* Apply some erratas after PHY reset, only applies to PCIe GEN3 */
+       if (is_gen3) {
+               int i;
+               int high_qlm = has_8lanes ? qlm + 1 : qlm;
+
+               /* Apply workaround for Errata GSER-26150 */
+               if (OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_0)) {
+                       for (i = qlm; i < high_qlm; i++) {
+                               cvmx_gserx_glbl_pll_cfg_3_t pll_cfg_3;
+                               cvmx_gserx_glbl_misc_config_1_t misc_config_1;
+                               /* Update PLL parameters */
+                               /*
+                                * Step 1: Set
+                                * GSER()_GLBL_PLL_CFG_3[PLL_VCTRL_SEL_LCVCO_VAL] = 0x2,
+                                * and
+                                * GSER()_GLBL_PLL_CFG_3[PCS_SDS_PLL_VCO_AMP] = 0
+                                */
+                               pll_cfg_3.u64 = CVMX_READ_CSR(CVMX_GSERX_GLBL_PLL_CFG_3(i));
+                               pll_cfg_3.s.pcs_sds_pll_vco_amp = 0;
+                               pll_cfg_3.s.pll_vctrl_sel_lcvco_val = 2;
+                               CVMX_WRITE_CSR(CVMX_GSERX_GLBL_PLL_CFG_3(i), pll_cfg_3.u64);
+
+                               /*
+                                * Step 2: Set
+                                * GSER()_GLBL_MISC_CONFIG_1[PCS_SDS_TRIM_CHP_REG] = 0x2.
+                                */
+                               misc_config_1.u64 = CVMX_READ_CSR(CVMX_GSERX_GLBL_MISC_CONFIG_1(i));
+                               misc_config_1.s.pcs_sds_trim_chp_reg = 2;
+                               CVMX_WRITE_CSR(CVMX_GSERX_GLBL_MISC_CONFIG_1(i), misc_config_1.u64);
+                       }
+               }
+
+               /* Apply workaround for Errata GSER-25992 */
+               if (OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_X) ||
+                   OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X)) {
+                       for (i = qlm; i < high_qlm; i++)
+                               cvmx_qlm_gser_errata_25992(node, i);
+               }
+       }
+}
+
+/* Get the PCIe LTSSM state for the given port
+ *
+ * @param node      Node to query
+ * @param pcie_port PEM to query
+ *
+ * @return LTSSM state
+ */
+static int __cvmx_pcie_rc_get_ltssm_state(int node, int pcie_port)
+{
+       u64 debug;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX) && pcie_port == 0) {
+               CVMX_WRITE_CSR(CVMX_DTX_SPEM_SELX(0), 0);
+               CVMX_READ_CSR(CVMX_DTX_SPEM_SELX(0));
+               CVMX_WRITE_CSR(CVMX_DTX_SPEM_ENAX(0), 0xfffffffffull);
+               CVMX_READ_CSR(CVMX_DTX_SPEM_ENAX(0));
+
+               /* Read the value */
+               debug = CVMX_READ_CSR(CVMX_DTX_SPEM_DATX(0));
+
+               /* Disable the PEM from driving OCLA signals */
+               CVMX_WRITE_CSR(CVMX_DTX_SPEM_ENAX(0), 0);
+               CVMX_READ_CSR(CVMX_DTX_SPEM_ENAX(0));
+       } else {
+               /* LTSSM state is in debug select 0 */
+               CVMX_WRITE_CSR(CVMX_DTX_PEMX_SELX(0, pcie_port), 0);
+               CVMX_READ_CSR(CVMX_DTX_PEMX_SELX(0, pcie_port));
+               CVMX_WRITE_CSR(CVMX_DTX_PEMX_ENAX(0, pcie_port), 0xfffffffffull);
+               CVMX_READ_CSR(CVMX_DTX_PEMX_ENAX(0, pcie_port));
+
+               /* Read the value */
+               debug = CVMX_READ_CSR(CVMX_DTX_PEMX_DATX(0, pcie_port));
+
+               /* Disable the PEM from driving OCLA signals */
+               CVMX_WRITE_CSR(CVMX_DTX_PEMX_ENAX(0, pcie_port), 0);
+               CVMX_READ_CSR(CVMX_DTX_PEMX_ENAX(0, pcie_port));
+       }
+
+       /* DBGSEL = 0x0, bits[8:3] */
+       return cvmx_bit_extract(debug, 3, 6);
+}
+
+/**
+ * Get the PCIe LTSSM state for the given port
+ *
+ * @param node      Node to query
+ * @param pcie_port PEM to query
+ *
+ * @return LTSSM state
+ */
+static const char *cvmx_pcie_get_ltssm_string(int ltssm)
+{
+       switch (ltssm) {
+       case 0x00:
+               return "DETECT_QUIET";
+       case 0x01:
+               return "DETECT_ACT";
+       case 0x02:
+               return "POLL_ACTIVE";
+       case 0x03:
+               return "POLL_COMPLIANCE";
+       case 0x04:
+               return "POLL_CONFIG";
+       case 0x05:
+               return "PRE_DETECT_QUIET";
+       case 0x06:
+               return "DETECT_WAIT";
+       case 0x07:
+               return "CFG_LINKWD_START";
+       case 0x08:
+               return "CFG_LINKWD_ACEPT";
+       case 0x09:
+               return "CFG_LANENUM_WAIT";
+       case 0x0A:
+               return "CFG_LANENUM_ACEPT";
+       case 0x0B:
+               return "CFG_COMPLETE";
+       case 0x0C:
+               return "CFG_IDLE";
+       case 0x0D:
+               return "RCVRY_LOCK";
+       case 0x0E:
+               return "RCVRY_SPEED";
+       case 0x0F:
+               return "RCVRY_RCVRCFG";
+       case 0x10:
+               return "RCVRY_IDLE";
+       case 0x11:
+               return "L0";
+       case 0x12:
+               return "L0S";
+       case 0x13:
+               return "L123_SEND_EIDLE";
+       case 0x14:
+               return "L1_IDLE";
+       case 0x15:
+               return "L2_IDLE";
+       case 0x16:
+               return "L2_WAKE";
+       case 0x17:
+               return "DISABLED_ENTRY";
+       case 0x18:
+               return "DISABLED_IDLE";
+       case 0x19:
+               return "DISABLED";
+       case 0x1A:
+               return "LPBK_ENTRY";
+       case 0x1B:
+               return "LPBK_ACTIVE";
+       case 0x1C:
+               return "LPBK_EXIT";
+       case 0x1D:
+               return "LPBK_EXIT_TIMEOUT";
+       case 0x1E:
+               return "HOT_RESET_ENTRY";
+       case 0x1F:
+               return "HOT_RESET";
+       case 0x20:
+               return "RCVRY_EQ0";
+       case 0x21:
+               return "RCVRY_EQ1";
+       case 0x22:
+               return "RCVRY_EQ2";
+       case 0x23:
+               return "RCVRY_EQ3";
+       default:
+               return "Unknown";
+       }
+}
+
+/**
+ * During PCIe link initialization we need to make config request to the attached
+ * device to verify its speed and width. These config access happen very early
+ * after the device is taken out of reset, so may fail for some amount of time.
+ * This function automatically retries these config accesses. The normal builtin
+ * hardware retry isn't enough for this very early access.
+ *
+ * @param node      Note to read from
+ * @param pcie_port PCIe port to read from
+ * @param bus       PCIe bus number
+ * @param dev       PCIe device
+ * @param func      PCIe function on the device
+ * @param reg       Register to read
+ *
+ * @return Config register value, or all ones on failure
+ */
+static uint32_t cvmx_pcie_config_read32_retry(int node, int pcie_port, int bus, int dev, int func,
+                                             int reg)
+{
+       /*
+        * Read the PCI config register until we get a valid value. Some cards
+        * require time after link up to return data. Wait at most 3 seconds
+        */
+       u64 timeout = 300;
+       u32 val;
+
+       do {
+               /* Read PCI capability pointer */
+               val = __cvmx_pcie_config_read32(node, pcie_port, bus, dev, func, reg, 0);
+
+               /* Check the read succeeded */
+               if (val != 0xffffffff)
+                       return val;
+               /* Failed, wait a little and try again */
+               mdelay(10);
+       } while (--timeout);
+
+       debug("N%d.PCIe%d: Config read failed, can't communicate with device\n",
+             node, pcie_port);
+
+       return -1;
+}
+
+/**
+ * @INTERNAL
+ * Initialize a host mode PCIe gen 2 link. This function takes a PCIe
+ * port from reset to a link up state. Software can then begin
+ * configuring the rest of the link.
+ *
+ * @param node     node
+ * @param pcie_port PCIe port to initialize
+ *
+ * @return Zero on success
+ */
+static int __cvmx_pcie_rc_initialize_link_gen2(int node, int pcie_port)
+{
+       u64 start_cycle;
+
+       cvmx_pemx_ctl_status_t pem_ctl_status;
+       cvmx_pciercx_cfg032_t pciercx_cfg032;
+       cvmx_pciercx_cfg448_t pciercx_cfg448;
+
+       if (OCTEON_IS_OCTEON3()) {
+               if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_PEMX_ON(pcie_port), cvmx_pemx_on_t,
+                                              pemoor, ==, 1, 100000)) {
+                       printf("%d:PCIe: Port %d PEM not on, skipping\n", node, pcie_port);
+                       return -1;
+               }
+       }
+
+       /* Bring up the link */
+       pem_ctl_status.u64 = CVMX_READ_CSR(CVMX_PEMX_CTL_STATUS(pcie_port));
+       pem_ctl_status.s.lnk_enb = 1;
+       CVMX_WRITE_CSR(CVMX_PEMX_CTL_STATUS(pcie_port), pem_ctl_status.u64);
+
+       /* Wait for the link to come up */
+       start_cycle = get_timer(0);
+       do {
+               if (get_timer(start_cycle) > 1000)
+                       return -1;
+
+               udelay(1000);
+               pciercx_cfg032.u32 = CVMX_PCIE_CFGX_READ(pcie_port,
+                                                        CVMX_PCIERCX_CFG032(pcie_port));
+       } while ((pciercx_cfg032.s.dlla == 0) || (pciercx_cfg032.s.lt == 1));
+
+       /* Update the Replay Time Limit.  Empirically, some PCIe devices take a
+        * little longer to respond than expected under load. As a workaround
+        * for this we configure the Replay Time Limit to the value expected
+        * for a 512 byte MPS instead of our actual 256 byte MPS. The numbers
+        * below are directly from the PCIe spec table 3-4
+        */
+       pciercx_cfg448.u32 = CVMX_PCIE_CFGX_READ(pcie_port,
+                                                CVMX_PCIERCX_CFG448(pcie_port));
+       switch (pciercx_cfg032.s.nlw) {
+       case 1: /* 1 lane */
+               pciercx_cfg448.s.rtl = 1677;
+               break;
+       case 2: /* 2 lanes */
+               pciercx_cfg448.s.rtl = 867;
+               break;
+       case 4: /* 4 lanes */
+               pciercx_cfg448.s.rtl = 462;
+               break;
+       case 8: /* 8 lanes */
+               pciercx_cfg448.s.rtl = 258;
+               break;
+       }
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG448(pcie_port),
+                            pciercx_cfg448.u32);
+
+       return 0;
+}
+
+extern int octeon_pcie_get_qlm_from_fdt(int numa_node, int pcie_port);
+
+static int __cvmx_pcie_check_pcie_port(int node, int pcie_port, enum cvmx_qlm_mode mode)
+{
+       if (mode == CVMX_QLM_MODE_SRIO_1X4 || mode == CVMX_QLM_MODE_SRIO_2X2 ||
+           mode == CVMX_QLM_MODE_SRIO_4X1) {
+               printf("%d:PCIe: Port %d is SRIO, skipping.\n", node, pcie_port);
+               return -1;
+       } else if (mode == CVMX_QLM_MODE_SGMII) {
+               printf("%d:PCIe: Port %d is SGMII, skipping.\n", node, pcie_port);
+               return -1;
+       } else if (mode == CVMX_QLM_MODE_XAUI || mode == CVMX_QLM_MODE_RXAUI) {
+               printf("%d:PCIe: Port %d is XAUI, skipping.\n", node, pcie_port);
+               return -1;
+       } else if (mode == CVMX_QLM_MODE_ILK) {
+               printf("%d:PCIe: Port %d is ILK, skipping.\n", node, pcie_port);
+               return -1;
+       } else if (mode != CVMX_QLM_MODE_PCIE &&
+                  mode != CVMX_QLM_MODE_PCIE_1X8 &&
+                  mode != CVMX_QLM_MODE_PCIE_1X2 &&
+                  mode != CVMX_QLM_MODE_PCIE_2X1 &&
+                  mode != CVMX_QLM_MODE_PCIE_1X1) {
+               printf("%d:PCIe: Port %d is unknown, skipping.\n",
+                      node, pcie_port);
+               return -1;
+       }
+       return 0;
+}
+
+static int __cvmx_pcie_check_qlm_mode(int node, int pcie_port, int qlm)
+{
+       enum cvmx_qlm_mode mode = CVMX_QLM_MODE_DISABLED;
+
+       if (qlm < 0)
+               return -1;
+
+       /* Make sure this interface is PCIe */
+       if (OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               if (cvmx_qlm_get_dlm_mode(1, pcie_port) ==
+                   CVMX_QLM_MODE_DISABLED) {
+                       printf("PCIe: Port %d not in PCIe mode, skipping\n",
+                              pcie_port);
+                       return -1;
+               }
+       } else if (octeon_has_feature(OCTEON_FEATURE_PCIE)) {
+               /*
+                * Requires reading the MIO_QLMX_CFG register to figure
+                * out the port type.
+                */
+               if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+                       qlm = 3 - (pcie_port * 2);
+               } else if (OCTEON_IS_MODEL(OCTEON_CN61XX)) {
+                       cvmx_mio_qlmx_cfg_t qlm_cfg;
+
+                       qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(1));
+                       if (qlm_cfg.s.qlm_cfg == 1)
+                               qlm = 1;
+                       else
+                               qlm = pcie_port;
+               } else if (OCTEON_IS_MODEL(OCTEON_CN66XX) ||
+                          OCTEON_IS_MODEL(OCTEON_CN63XX)) {
+                       qlm = pcie_port;
+               }
+
+               /*
+                * PCIe is allowed only in QLM1, 1 PCIe port in x2 or
+                * 2 PCIe ports in x1
+                */
+               else if (OCTEON_IS_MODEL(OCTEON_CNF71XX))
+                       qlm = 1;
+
+               mode = cvmx_qlm_get_mode(qlm);
+
+               __cvmx_pcie_check_pcie_port(node, pcie_port, mode);
+       }
+       return 0;
+}
+
+static void __cvmx_pcie_sli_config(int node, int pcie_port)
+{
+       cvmx_pemx_bar_ctl_t pemx_bar_ctl;
+       cvmx_pemx_ctl_status_t pemx_ctl_status;
+       cvmx_sli_ctl_portx_t sli_ctl_portx;
+       cvmx_sli_mem_access_ctl_t sli_mem_access_ctl;
+       cvmx_sli_mem_access_subidx_t mem_access_subid;
+       cvmx_pemx_bar1_indexx_t bar1_index;
+       int i;
+
+       /* Store merge control (SLI_MEM_ACCESS_CTL[TIMER,MAX_WORD]) */
+       sli_mem_access_ctl.u64 = CVMX_READ_CSR(CVMX_PEXP_SLI_MEM_ACCESS_CTL);
+       sli_mem_access_ctl.s.max_word = 0; /* Allow 16 words to combine */
+       sli_mem_access_ctl.s.timer = 127;  /* Wait up to 127 cycles for more data */
+       CVMX_WRITE_CSR(CVMX_PEXP_SLI_MEM_ACCESS_CTL, sli_mem_access_ctl.u64);
+
+       /* Setup Mem access SubDIDs */
+       mem_access_subid.u64 = 0;
+       mem_access_subid.s.port = pcie_port;    /* Port the request is sent to. */
+       mem_access_subid.s.nmerge = 0;          /* Allow merging as it works on CN6XXX. */
+       mem_access_subid.s.esr = _CVMX_PCIE_ES; /* Endian-swap for Reads. */
+       mem_access_subid.s.esw = _CVMX_PCIE_ES; /* Endian-swap for Writes. */
+       mem_access_subid.s.wtype = 0;           /* "No snoop" and "Relaxed ordering" are not set */
+       mem_access_subid.s.rtype = 0;           /* "No snoop" and "Relaxed ordering" are not set */
+       /* PCIe Address Bits <63:34>. */
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               mem_access_subid.cn68xx.ba = 0;
+       else
+               mem_access_subid.cn63xx.ba = 0;
+
+       /* Setup mem access 12-15 for port 0, 16-19 for port 1, supplying 36
+        * bits of address space
+        */
+       for (i = 12 + pcie_port * 4; i < 16 + pcie_port * 4; i++) {
+               CVMX_WRITE_CSR(CVMX_PEXP_SLI_MEM_ACCESS_SUBIDX(i), mem_access_subid.u64);
+               /* Set each SUBID to extend the addressable range */
+               __cvmx_increment_ba(&mem_access_subid);
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN63XX) || OCTEON_IS_MODEL(OCTEON_CN66XX) ||
+           OCTEON_IS_MODEL(OCTEON_CN68XX) ||
+           (OCTEON_IS_OCTEON3() && !OCTEON_IS_MODEL(OCTEON_CN70XX))) {
+               /* Disable the peer to peer forwarding register. This must be
+                * setup by the OS after it enumerates the bus and assigns
+                * addresses to the PCIe busses
+                */
+               for (i = 0; i < 4; i++) {
+                       CVMX_WRITE_CSR(CVMX_PEMX_P2P_BARX_START(i, pcie_port), -1);
+                       CVMX_WRITE_CSR(CVMX_PEMX_P2P_BARX_END(i, pcie_port), -1);
+               }
+       }
+
+       /* Set Octeon's BAR0 to decode 0-16KB. It overlaps with Bar2 */
+       CVMX_WRITE_CSR(CVMX_PEMX_P2N_BAR0_START(pcie_port), 0);
+
+       /* Set Octeon's BAR2 to decode 0-2^41. Bar0 and Bar1 take precedence
+        * where they overlap. It also overlaps with the device addresses, so
+        * make sure the peer to peer forwarding is set right
+        */
+       CVMX_WRITE_CSR(CVMX_PEMX_P2N_BAR2_START(pcie_port), 0);
+
+       /* Setup BAR2 attributes */
+       /* Relaxed Ordering (NPEI_CTL_PORTn[PTLP_RO,CTLP_RO, WAIT_COM]) */
+       /* - PTLP_RO,CTLP_RO should normally be set (except for debug). */
+       /* - WAIT_COM=0 will likely work for all applications. */
+       /* Load completion relaxed ordering (NPEI_CTL_PORTn[WAITL_COM]) */
+       pemx_bar_ctl.u64 = CVMX_READ_CSR(CVMX_PEMX_BAR_CTL(pcie_port));
+       pemx_bar_ctl.s.bar1_siz = 3; /* 256MB BAR1 */
+       pemx_bar_ctl.s.bar2_enb = 1;
+       pemx_bar_ctl.s.bar2_esx = _CVMX_PCIE_ES;
+       pemx_bar_ctl.s.bar2_cax = 0;
+       CVMX_WRITE_CSR(CVMX_PEMX_BAR_CTL(pcie_port), pemx_bar_ctl.u64);
+       sli_ctl_portx.u64 = CVMX_READ_CSR(CVMX_PEXP_SLI_CTL_PORTX(pcie_port));
+       sli_ctl_portx.s.ptlp_ro = 1;
+       sli_ctl_portx.s.ctlp_ro = 1;
+       sli_ctl_portx.s.wait_com = 0;
+       sli_ctl_portx.s.waitl_com = 0;
+       CVMX_WRITE_CSR(CVMX_PEXP_SLI_CTL_PORTX(pcie_port), sli_ctl_portx.u64);
+
+       /* BAR1 follows BAR2 */
+       CVMX_WRITE_CSR(CVMX_PEMX_P2N_BAR1_START(pcie_port),
+                      CVMX_PCIE_BAR1_RC_BASE);
+
+       bar1_index.u64 = 0;
+       bar1_index.s.addr_idx = (CVMX_PCIE_BAR1_PHYS_BASE >> 22);
+       bar1_index.s.ca = 1;                  /* Not Cached */
+       bar1_index.s.end_swp = _CVMX_PCIE_ES; /* Endian Swap mode */
+       bar1_index.s.addr_v = 1;              /* Valid entry */
+
+       for (i = 0; i < 16; i++) {
+               CVMX_WRITE_CSR(CVMX_PEMX_BAR1_INDEXX(i, pcie_port),
+                              bar1_index.u64);
+               /* 256MB / 16 >> 22 == 4 */
+               bar1_index.s.addr_idx += (((1ull << 28) / 16ull) >> 22);
+       }
+
+       /* Wait for 200ms */
+       pemx_ctl_status.u64 = CVMX_READ_CSR(CVMX_PEMX_CTL_STATUS(pcie_port));
+       pemx_ctl_status.cn63xx.cfg_rtry = cfg_retries();
+       CVMX_WRITE_CSR(CVMX_PEMX_CTL_STATUS(pcie_port), pemx_ctl_status.u64);
+
+       /*
+        * Here is the second part of the config retry changes. Wait for 700ms
+        * after setting up the link before continuing. PCIe says the devices
+        * may need up to 900ms to come up. 700ms plus 200ms from above gives
+        * us a total of 900ms
+        */
+       if (OCTEON_IS_OCTEON2() || OCTEON_IS_MODEL(OCTEON_CN70XX))
+               udelay(PCIE_DEVICE_READY_WAIT_DELAY_MICROSECONDS);
+}
+
+/**
+ * Initialize a PCIe gen 2 port for use in host(RC) mode. It doesn't enumerate
+ * the bus.
+ *
+ * @param pcie_port PCIe port to initialize
+ *
+ * @return Zero on success
+ */
+static int __cvmx_pcie_rc_initialize_gen2(int pcie_port)
+{
+       cvmx_ciu_soft_prst_t ciu_soft_prst;
+       cvmx_mio_rst_ctlx_t mio_rst_ctl;
+       cvmx_pemx_bist_status_t pemx_bist_status;
+       cvmx_pemx_bist_status2_t pemx_bist_status2;
+       cvmx_pciercx_cfg032_t pciercx_cfg032;
+       cvmx_pciercx_cfg515_t pciercx_cfg515;
+       u64 ciu_soft_prst_reg, rst_ctl_reg;
+       int ep_mode;
+       int qlm = 0;
+       int node = (pcie_port >> 4) & 0x3;
+
+       pcie_port &= 0x3;
+
+       if (pcie_port >= CVMX_PCIE_PORTS) {
+               //debug("Invalid PCIe%d port\n", pcie_port);
+               return -1;
+       }
+
+       if (__cvmx_pcie_check_qlm_mode(node, pcie_port, qlm))
+               return -1;
+
+       /* Make sure we aren't trying to setup a target mode interface in host
+        * mode
+        */
+       if (OCTEON_IS_OCTEON3()) {
+               ciu_soft_prst_reg = CVMX_RST_SOFT_PRSTX(pcie_port);
+               rst_ctl_reg = CVMX_RST_CTLX(pcie_port);
+       } else {
+               ciu_soft_prst_reg = (pcie_port) ? CVMX_CIU_SOFT_PRST1 : CVMX_CIU_SOFT_PRST;
+               rst_ctl_reg = CVMX_MIO_RST_CTLX(pcie_port);
+       }
+       mio_rst_ctl.u64 = CVMX_READ_CSR(rst_ctl_reg);
+
+       ep_mode = ((OCTEON_IS_MODEL(OCTEON_CN61XX) || OCTEON_IS_MODEL(OCTEON_CNF71XX)) ?
+                                (mio_rst_ctl.s.prtmode != 1) :
+                                (!mio_rst_ctl.s.host_mode));
+
+       if (OCTEON_IS_MODEL(OCTEON_CN70XX) && pcie_port) {
+               cvmx_pemx_cfg_t pemx_cfg;
+
+               pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+               if ((pemx_cfg.s.md & 3) == 2) {
+                       printf("PCIe: Port %d in 1x4 mode.\n", pcie_port);
+                       return -1;
+               }
+       }
+
+       if (ep_mode) {
+               printf("%d:PCIe: Port %d in endpoint mode.\n", node, pcie_port);
+               return -1;
+       }
+
+       /* CN63XX Pass 1.0 errata G-14395 requires the QLM De-emphasis be
+        * programmed
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_0)) {
+               if (pcie_port) {
+                       cvmx_ciu_qlm1_t ciu_qlm;
+
+                       ciu_qlm.u64 = csr_rd(CVMX_CIU_QLM1);
+                       ciu_qlm.s.txbypass = 1;
+                       ciu_qlm.s.txdeemph = 5;
+                       ciu_qlm.s.txmargin = 0x17;
+                       csr_wr(CVMX_CIU_QLM1, ciu_qlm.u64);
+               } else {
+                       cvmx_ciu_qlm0_t ciu_qlm;
+
+                       ciu_qlm.u64 = csr_rd(CVMX_CIU_QLM0);
+                       ciu_qlm.s.txbypass = 1;
+                       ciu_qlm.s.txdeemph = 5;
+                       ciu_qlm.s.txmargin = 0x17;
+                       csr_wr(CVMX_CIU_QLM0, ciu_qlm.u64);
+               }
+       }
+
+       /* Bring the PCIe out of reset */
+       ciu_soft_prst.u64 = CVMX_READ_CSR(ciu_soft_prst_reg);
+       /* After a chip reset the PCIe will also be in reset. If it
+        * isn't, most likely someone is trying to init it again
+        * without a proper PCIe reset.
+        */
+       if (ciu_soft_prst.s.soft_prst == 0) {
+               /* Reset the port */
+               ciu_soft_prst.s.soft_prst = 1;
+               CVMX_WRITE_CSR(ciu_soft_prst_reg, ciu_soft_prst.u64);
+
+               /* Read to make sure write happens */
+               ciu_soft_prst.u64 = CVMX_READ_CSR(ciu_soft_prst_reg);
+
+               /* Keep PERST asserted for 2 ms */
+               udelay(2000);
+       }
+
+       /* Deassert PERST */
+       ciu_soft_prst.u64 = CVMX_READ_CSR(ciu_soft_prst_reg);
+       ciu_soft_prst.s.soft_prst = 0;
+       CVMX_WRITE_CSR(ciu_soft_prst_reg, ciu_soft_prst.u64);
+       ciu_soft_prst.u64 = CVMX_READ_CSR(ciu_soft_prst_reg);
+
+       /* Wait 1ms for PCIe reset to complete */
+       udelay(1000);
+
+       /* Set MPLL multiplier as per Errata 20669. */
+       if (OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               int qlm = __cvmx_pcie_get_qlm(0, pcie_port);
+               enum cvmx_qlm_mode mode;
+               int old_mult;
+               u64 meas_refclock = cvmx_qlm_measure_clock(qlm);
+
+               if (meas_refclock > 99000000 && meas_refclock < 101000000) {
+                       old_mult = 35;
+               } else if (meas_refclock > 124000000 &&
+                          meas_refclock < 126000000) {
+                       old_mult = 56;
+               } else if (meas_refclock > 156000000 &&
+                          meas_refclock < 156500000) {
+                       old_mult = 45;
+               } else {
+                       printf("%s: Invalid reference clock for qlm %d\n",
+                              __func__, qlm);
+                       return -1;
+               }
+               mode = cvmx_qlm_get_mode(qlm);
+               __cvmx_qlm_set_mult(qlm, 2500, old_mult);
+               /* Adjust mplls for both dlms when configured as pcie 1x4 */
+               if (mode == CVMX_QLM_MODE_PCIE && pcie_port == 0)
+                       __cvmx_qlm_set_mult(qlm + 1, 2500, old_mult);
+       }
+
+       /*
+        * Check and make sure PCIe came out of reset. If it doesn't the board
+        * probably hasn't wired the clocks up and the interface should be
+        * skipped
+        */
+       if (CVMX_WAIT_FOR_FIELD64_NODE(node, rst_ctl_reg, cvmx_mio_rst_ctlx_t,
+                                      rst_done, ==, 1, 10000)) {
+               printf("%d:PCIe: Port %d stuck in reset, skipping.\n", node, pcie_port);
+               return -1;
+       }
+
+       /* Check BIST status */
+       pemx_bist_status.u64 = CVMX_READ_CSR(CVMX_PEMX_BIST_STATUS(pcie_port));
+       if (pemx_bist_status.u64)
+               printf("%d:PCIe: BIST FAILED for port %d (0x%016llx)\n", node, pcie_port,
+                      CAST64(pemx_bist_status.u64));
+       pemx_bist_status2.u64 = CVMX_READ_CSR(CVMX_PEMX_BIST_STATUS2(pcie_port));
+
+       /*
+        * Errata PCIE-14766 may cause the lower 6 bits to be randomly set on
+        * CN63XXp1
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_X))
+               pemx_bist_status2.u64 &= ~0x3full;
+
+       if (pemx_bist_status2.u64) {
+               printf("%d:PCIe: BIST2 FAILED for port %d (0x%016llx)\n",
+                      node, pcie_port, CAST64(pemx_bist_status2.u64));
+       }
+
+       /* Initialize the config space CSRs */
+       __cvmx_pcie_rc_initialize_config_space(node, pcie_port);
+
+       /* Enable gen2 speed selection */
+       pciercx_cfg515.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG515(pcie_port));
+       pciercx_cfg515.s.dsc = 1;
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG515(pcie_port), pciercx_cfg515.u32);
+
+       /* Bring the link up */
+       if (__cvmx_pcie_rc_initialize_link_gen2(node, pcie_port)) {
+               /* Some gen1 devices don't handle the gen 2 training correctly.
+                * Disable gen2 and try again with only gen1
+                */
+               cvmx_pciercx_cfg031_t pciercx_cfg031;
+
+               pciercx_cfg031.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG031(pcie_port));
+               pciercx_cfg031.s.mls = 1;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG031(pcie_port), pciercx_cfg031.u32);
+               if (__cvmx_pcie_rc_initialize_link_gen2(node, pcie_port)) {
+                       printf("PCIe: Link timeout on port %d, probably the slot is empty\n",
+                              pcie_port);
+                       return -1;
+               }
+       }
+
+       __cvmx_pcie_sli_config(node, pcie_port);
+
+       /* Display the link status */
+       pciercx_cfg032.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
+       printf("PCIe: Port %d link active, %d lanes, speed gen%d\n", pcie_port,
+              pciercx_cfg032.s.nlw, pciercx_cfg032.s.ls);
+
+       pcie_link_initialized[node][pcie_port] = true;
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ * Initialize a host mode PCIe gen 2 link. This function takes a PCIe
+ * port from reset to a link up state. Software can then begin
+ * configuring the rest of the link.
+ *
+ * @param node     node
+ * @param pcie_port PCIe port to initialize
+ *
+ * @return Zero on success
+ */
+static int __cvmx_pcie_rc_initialize_link_gen2_v3(int node, int pcie_port)
+{
+       u8 ltssm_history[LTSSM_HISTORY_SIZE];
+       int ltssm_history_loc;
+       cvmx_pemx_ctl_status_t pem_ctl_status;
+       cvmx_pciercx_cfg006_t pciercx_cfg006;
+       cvmx_pciercx_cfg031_t pciercx_cfg031;
+       cvmx_pciercx_cfg032_t pciercx_cfg032;
+       cvmx_pciercx_cfg068_t pciercx_cfg068;
+       cvmx_pciercx_cfg448_t pciercx_cfg448;
+       cvmx_pciercx_cfg515_t pciercx_cfg515;
+       int max_gen, max_width;
+       u64 hold_time;
+       u64 bounce_allow_time;
+       u64 timeout, good_time, current_time;
+       int neg_gen, neg_width, bus, dev_gen, dev_width;
+       unsigned int cap, cap_next;
+       int ltssm_state, desired_gen;
+       int desired_width;
+       int i, need_speed_change, need_lane_change;
+       int do_retry_speed = 0;
+       int link_up = 0, is_loop_done = 0;
+
+       if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_PEMX_ON(pcie_port), cvmx_pemx_on_t, pemoor, ==, 1,
+                                      100000)) {
+               printf("N%d:PCIe: Port %d PEM not on, skipping\n", node, pcie_port);
+               return -1;
+       }
+
+       /* Record starting LTSSM state for debug */
+       memset(ltssm_history, -1, sizeof(ltssm_history));
+       ltssm_history[0] = __cvmx_pcie_rc_get_ltssm_state(node, pcie_port);
+       ltssm_history_loc = 0;
+
+       pciercx_cfg031.u32 = CVMX_PCIE_CFGX_READ(pcie_port,
+                                                CVMX_PCIERCX_CFG031(pcie_port));
+       /* Max speed of PEM from config (1-3) */
+       max_gen = pciercx_cfg031.s.mls;
+       /* Max lane width of PEM (1-3) */
+       max_width = pciercx_cfg031.s.mlw;
+#ifdef DEBUG_PCIE
+       printf("N%d.PCIe%d: Link supports up to %d lanes, speed gen%d\n",
+              node, pcie_port, max_width, max_gen);
+#endif
+
+       /* Bring up the link */
+#ifdef DEBUG_PCIE
+       printf("N%d.PCIe%d: Enabling the link\n", node, pcie_port);
+#endif
+       pem_ctl_status.u64 = CVMX_READ_CSR(CVMX_PEMX_CTL_STATUS(pcie_port));
+       pem_ctl_status.s.lnk_enb = 1;
+       CVMX_WRITE_CSR(CVMX_PEMX_CTL_STATUS(pcie_port), pem_ctl_status.u64);
+
+       /*
+        * Configure SLI after enabling PCIe link. Is required for reading
+        * PCIe card capabilities.
+        */
+       __cvmx_pcie_sli_config(node, pcie_port);
+
+       /*
+        * After the link is enabled  no prints until link up or error,
+        * Otherwise will miss link state captures
+        */
+
+retry_speed:
+       /* Clear RC Correctable Error Status Register */
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG068(pcie_port), -1);
+
+       /* Wait for the link to come up and link training to be complete */
+#ifdef DEBUG_PCIE
+       printf("N%d.PCIe%d: Waiting for link\n", node, pcie_port);
+#endif
+
+       /* Timeout of 2 secs */
+       timeout = get_timer(0) + 2000;
+
+       /* Records when the link first went good */
+       good_time = 0;
+
+       do {
+               pciercx_cfg032.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
+               /*
+                * Errata PEM-31375 PEM RSL access to PCLK registers can
+                * timeout during speed change. Check for temporary hardware
+                * timeout, and rety if happens
+                */
+               if (pciercx_cfg032.u32 == 0xffffffff)
+                       continue;
+
+               /* Record LTSSM state for debug */
+               ltssm_state = __cvmx_pcie_rc_get_ltssm_state(node, pcie_port);
+
+               if (ltssm_history[ltssm_history_loc] != ltssm_state) {
+                       ltssm_history_loc = (ltssm_history_loc + 1) & (LTSSM_HISTORY_SIZE - 1);
+                       ltssm_history[ltssm_history_loc] = ltssm_state;
+               }
+
+               /* Check if the link is up */
+               //              current_time = cvmx_get_cycle();
+               current_time = get_timer(0);
+               link_up = (pciercx_cfg032.s.dlla && !pciercx_cfg032.s.lt);
+
+               if (link_up) {
+                       /* Is this the first link up? */
+                       if (!good_time) {
+                               /* Mark the time when the link transitioned to good */
+                               good_time = current_time;
+                       } else {
+                               /* Check for a link error */
+                               pciercx_cfg068.u32 = CVMX_PCIE_CFGX_READ(
+                                       pcie_port, CVMX_PCIERCX_CFG068(pcie_port));
+                               if (pciercx_cfg068.s.res) {
+                                       /*
+                                        * Ignore errors before we've been
+                                        * stable for bounce_allow_time
+                                        */
+                                       if (good_time + bounce_allow_time <=
+                                           current_time) {
+#ifdef DEBUG_PCIE
+                                               printf("N%d.PCIe%d: Link errors after link up\n",
+                                                      node, pcie_port);
+#endif
+                                               /* Link error, signal a retry */
+                                               return 1;
+                                       }
+
+                                       /*
+                                        * Clear RC Correctable Error
+                                        * Status Register
+                                        */
+                                       CVMX_PCIE_CFGX_WRITE(pcie_port,
+                                                            CVMX_PCIERCX_CFG068(pcie_port),
+                                                            -1);
+#ifdef DEBUG_PCIE
+                                       printf("N%d.PCIe%d: Ignored error during settling time\n",
+                                              node, pcie_port);
+#endif
+                               }
+                       }
+               } else if (good_time) {
+                       if (good_time + bounce_allow_time <= current_time) {
+                               /*
+                                * We allow bounces for bounce_allow_time after
+                                * the link is good. Once this time passes any
+                                * bounce requires a retry
+                                */
+#ifdef DEBUG_PCIE
+                               printf("N%d.PCIe%d: Link bounce detected\n",
+                                      node, pcie_port);
+#endif
+                               return 1; /* Link bounce, signal a retry */
+                       }
+
+#ifdef DEBUG_PCIE
+                       printf("N%d.PCIe%d: Ignored bounce during settling time\n",
+                              node, pcie_port);
+#endif
+               }
+
+               /* Determine if we've hit the timeout */
+               is_loop_done = (current_time >= timeout);
+
+               /*
+                * Determine if we've had a good link for the required hold
+                * time
+                */
+               is_loop_done |= link_up && (good_time + hold_time <=
+                                           current_time);
+       } while (!is_loop_done);
+
+       /* Trace the LTSSM state */
+#ifdef DEBUG_PCIE
+       printf("N%d.PCIe%d: LTSSM History\n", node, pcie_port);
+#endif
+       for (i = 0; i < LTSSM_HISTORY_SIZE; i++) {
+               ltssm_history_loc = (ltssm_history_loc + 1) & (LTSSM_HISTORY_SIZE - 1);
+#ifdef DEBUG_PCIE
+               if (ltssm_history[ltssm_history_loc] != 0xff)
+                       printf("N%d.PCIe%d: %s\n", node, pcie_port,
+                              cvmx_pcie_get_ltssm_string(ltssm_history[ltssm_history_loc]));
+#endif
+       }
+
+       if (!link_up) {
+               ltssm_state = __cvmx_pcie_rc_get_ltssm_state(node, pcie_port);
+#ifdef DEBUG_PCIE
+               printf("N%d.PCIe%d: Link down, Data link layer %s(DLLA=%d), Link training %s(LT=%d), LTSSM %s\n",
+                      node, pcie_port, pciercx_cfg032.s.dlla ? "active" : "down",
+                      pciercx_cfg032.s.dlla, pciercx_cfg032.s.lt ? "active" : "complete",
+                      pciercx_cfg032.s.lt, cvmx_pcie_get_ltssm_string(ltssm_state));
+#endif
+               return 1; /* Link down, signal a retry */
+       }
+
+       /* Report the negotiated link speed and width */
+       neg_gen = pciercx_cfg032.s.ls;    /* Current speed of PEM (1-3) */
+       neg_width = pciercx_cfg032.s.nlw; /* Current lane width of PEM (1-8) */
+#ifdef DEBUG_PCIE
+       printf("N%d.PCIe%d: Link negotiated %d lanes, speed gen%d\n", node, pcie_port, neg_width,
+              neg_gen);
+#endif
+       /* Determine PCIe bus number the directly attached device uses */
+       pciercx_cfg006.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG006(pcie_port));
+       bus = pciercx_cfg006.s.sbnum;
+
+       /* The SLI has to be initialized so we can read the downstream devices     */
+       dev_gen = 1;   /* Device max speed (1-3) */
+       dev_width = 1; /* Device max lane width (1-16) */
+#ifdef DEBUG_PCIE
+       printf("N%d.PCIe%d: Reading Bus %d device max speed and width\n", node, pcie_port, bus);
+#endif
+
+       /*
+        * Here is the second part of the config retry changes. Wait for 700ms
+        * after setting up the link before continuing. PCIe says the devices
+        * may need up to 900ms to come up. 700ms plus 200ms from above gives
+        * us a total of 900ms
+        */
+       udelay(PCIE_DEVICE_READY_WAIT_DELAY_MICROSECONDS);
+
+       /* Read PCI capability pointer at offset 0x34 of target */
+       cap = cvmx_pcie_config_read32_retry(node, pcie_port, bus, 0, 0, 0x34);
+
+       /* Check if we were able to read capabilities pointer */
+       if (cap == 0xffffffff)
+               return 1; /* Signal retry needed */
+
+       /* Read device max speed and width */
+       cap_next = cap & 0xff;
+       while (cap_next) {
+               cap = cvmx_pcie_config_read32_retry(node, pcie_port, bus,
+                                                   0, 0, cap_next);
+               if (cap == 0xffffffff)
+                       return 1; /* Signal retry needed */
+
+               /* Is this a PCIe capability (0x10)? */
+               if ((cap & 0xff) == 0x10) {
+#ifdef DEBUG_PCIE
+                       printf("N%d.PCIe%d: Found PCIe capability at offset 0x%x\n",
+                              node, pcie_port, cap_next);
+#endif
+                       /* Offset 0xc contains the max link info */
+                       cap = cvmx_pcie_config_read32_retry(node, pcie_port, bus, 0, 0,
+                                                           cap_next + 0xc);
+                       if (cap == 0xffffffff)
+                               return 1;              /* Signal retry needed */
+                       dev_gen = cap & 0xf;           /* Max speed of PEM from config (1-3) */
+                       dev_width = (cap >> 4) & 0x3f; /* Max lane width of PEM (1-16) */
+#ifdef DEBUG_PCIE
+                       printf("N%d.PCIe%d: Device supports %d lanes, speed gen%d\n", node,
+                              pcie_port, dev_width, dev_gen);
+#endif
+                       break;
+               }
+               /* Move to next capability */
+               cap_next = (cap >> 8) & 0xff;
+       }
+
+       /*
+        * Desired link speed and width is either limited by the device or our
+        * PEM configuration. Choose the most restrictive limit
+        */
+       desired_gen = (dev_gen < max_gen) ? dev_gen : max_gen;
+       desired_width = (dev_width < max_width) ? dev_width : max_width;
+
+       /*
+        * We need a change if we don't match the desired speed or width.
+        * Note that we allow better than expected in case the device lied
+        * about its capabilities
+        */
+       need_speed_change = (neg_gen < desired_gen);
+       need_lane_change = (neg_width < desired_width);
+
+       if (need_lane_change) {
+               /* We didn't get the maximum number of lanes */
+#ifdef DEBUG_PCIE
+               printf("N%d.PCIe%d: Link width (%d) less that supported (%d)\n",
+                      node, pcie_port, neg_width, desired_width);
+#endif
+               return 2; /* Link wrong width, signal a retry */
+       } else if (need_speed_change) {
+               if (do_retry_speed) {
+#ifdef DEBUG_PCIE
+                       printf("N%d.PCIe%d: Link speed (gen%d) less that supported (gen%d)\n", node,
+                              pcie_port, neg_gen, desired_gen);
+#endif
+                       return 1; /* Link at width, but speed low. Request a retry */
+               }
+
+               /* We didn't get the maximum speed. Request a speed change */
+#ifdef DEBUG_PCIE
+               printf("N%d.PCIe%d: Link speed (gen%d) less that supported (gen%d), requesting a speed change\n",
+                      node, pcie_port, neg_gen, desired_gen);
+#endif
+               pciercx_cfg515.u32 =
+                       CVMX_PCIE_CFGX_READ(pcie_port,
+                                           CVMX_PCIERCX_CFG515(pcie_port));
+               pciercx_cfg515.s.dsc = 1;
+               CVMX_PCIE_CFGX_WRITE(pcie_port,
+                                    CVMX_PCIERCX_CFG515(pcie_port),
+                                    pciercx_cfg515.u32);
+               mdelay(100);
+               do_retry_speed = true;
+               goto retry_speed;
+       } else {
+#ifdef DEBUG_PCIE
+               printf("N%d.PCIe%d: Link at best speed and width\n",
+                      node, pcie_port);
+#endif
+               /* For gen3 links check if we are getting errors over the link */
+               if (neg_gen == 3) {
+                       /* Read RC Correctable Error Status Register */
+                       pciercx_cfg068.u32 =
+                               CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG068(pcie_port));
+                       if (pciercx_cfg068.s.res) {
+#ifdef DEBUG_PCIE
+                               printf("N%d.PCIe%d: Link reporting error status\n", node,
+                                      pcie_port);
+#endif
+                               return 1; /* Getting receiver errors, request a retry */
+                       }
+               }
+               return 0; /* Link at correct speed and width */
+       }
+
+       /* Update the Replay Time Limit.  Empirically, some PCIe devices take a
+        * little longer to respond than expected under load. As a workaround
+        * for this we configure the Replay Time Limit to the value expected
+        * for a 512 byte MPS instead of our actual 256 byte MPS. The numbers
+        * below are directly from the PCIe spec table 3-4
+        */
+       pciercx_cfg448.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG448(pcie_port));
+       switch (pciercx_cfg032.s.nlw) {
+       case 1: /* 1 lane */
+               pciercx_cfg448.s.rtl = 1677;
+               break;
+       case 2: /* 2 lanes */
+               pciercx_cfg448.s.rtl = 867;
+               break;
+       case 4: /* 4 lanes */
+               pciercx_cfg448.s.rtl = 462;
+               break;
+       case 8: /* 8 lanes */
+               pciercx_cfg448.s.rtl = 258;
+               break;
+       }
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG448(pcie_port), pciercx_cfg448.u32);
+
+       return 0;
+}
+
+static int __cvmx_pcie_rc_initialize_gen2_v3(int pcie_port)
+{
+       cvmx_rst_ctlx_t rst_ctl;
+       cvmx_rst_soft_prstx_t rst_soft_prst;
+       cvmx_pciercx_cfg031_t pciercx_cfg031;
+       cvmx_pciercx_cfg032_t pciercx_cfg032;
+       cvmx_pciercx_cfg038_t pciercx_cfg038;
+       cvmx_pciercx_cfg040_t pciercx_cfg040;
+       cvmx_pciercx_cfg515_t pciercx_cfg515;
+       cvmx_pciercx_cfg548_t pciercx_cfg548;
+       cvmx_pemx_bist_status_t pemx_bist_status;
+       u64 rst_soft_prst_reg;
+       int qlm;
+       int node = (pcie_port >> 4) & 0x3;
+       bool requires_pem_reset = 0;
+       enum cvmx_qlm_mode mode = CVMX_QLM_MODE_DISABLED;
+       int retry_count = 0;
+       int result = 0;
+
+       pcie_port &= 0x3;
+
+       /* Assume link down until proven up */
+       pcie_link_initialized[node][pcie_port] = false;
+
+       /* Attempt link initialization up to 3 times */
+       while (retry_count <= MAX_RETRIES) {
+#ifdef DEBUG_PCIE
+               if (retry_count)
+                       printf("N%d:PCIE%d: Starting link retry %d\n", node, pcie_port,
+                              retry_count);
+#endif
+               if (pcie_port >= CVMX_PCIE_PORTS) {
+#ifdef DEBUG_PCIE
+                       printf("Invalid PCIe%d port\n", pcie_port);
+#endif
+                       return -1;
+               }
+
+               qlm = __cvmx_pcie_get_qlm(node, pcie_port);
+
+               if (qlm < 0)
+                       return -1;
+
+               mode = cvmx_qlm_get_mode(qlm);
+               if (__cvmx_pcie_check_pcie_port(node, pcie_port, mode))
+                       return -1;
+
+               rst_soft_prst_reg = CVMX_RST_SOFT_PRSTX(pcie_port);
+               rst_ctl.u64 = CVMX_READ_CSR(CVMX_RST_CTLX(pcie_port));
+
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+                       CVMX_WRITE_CSR(CVMX_DTX_PEMX_SELX(0, pcie_port), 0x17);
+                       CVMX_WRITE_CSR(CVMX_DTX_PEMX_SELX(1, pcie_port), 0);
+               }
+
+               if (!rst_ctl.s.host_mode) {
+                       printf("N%d:PCIE: Port %d in endpoint mode.\n",
+                              node, pcie_port);
+                       return -1;
+               }
+
+               /* Bring the PCIe out of reset */
+               rst_soft_prst.u64 = CVMX_READ_CSR(rst_soft_prst_reg);
+
+               /*
+                * After a chip reset the PCIe will also be in reset. If it
+                * isn't, most likely someone is trying to init it again
+                * without a proper PCIe reset.
+                */
+               if (rst_soft_prst.s.soft_prst == 0) {
+                       /* Disable the MAC controller before resetting */
+                       __cvmx_pcie_config_pemon(node, pcie_port, 0);
+
+                       /* Reset the port */
+                       rst_soft_prst.s.soft_prst = 1;
+                       CVMX_WRITE_CSR(rst_soft_prst_reg, rst_soft_prst.u64);
+
+                       /* Read to make sure write happens */
+                       rst_soft_prst.u64 = CVMX_READ_CSR(rst_soft_prst_reg);
+
+                       /* Keep PERST asserted for 2 ms */
+                       udelay(2000);
+
+                       /* Reset GSER_PHY to put in a clean state */
+                       __cvmx_pcie_gser_phy_config(node, pcie_port, qlm);
+                       requires_pem_reset = 1;
+
+                       /* Enable MAC controller before taking pcie out of reset */
+                       __cvmx_pcie_config_pemon(node, pcie_port, 1);
+               }
+
+               /* Deassert PERST */
+               rst_soft_prst.u64 = CVMX_READ_CSR(rst_soft_prst_reg);
+               rst_soft_prst.s.soft_prst = 0;
+               CVMX_WRITE_CSR(rst_soft_prst_reg, rst_soft_prst.u64);
+               rst_soft_prst.u64 = CVMX_READ_CSR(rst_soft_prst_reg);
+
+               /* Check if PLLs are locked after GSER_PHY reset. */
+               if (requires_pem_reset) {
+                       cvmx_pemx_cfg_t pemx_cfg;
+
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(pcie_port));
+                       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
+                                                 rst_rdy, ==, 1, 10000)) {
+                               printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
+                               return -1;
+                       }
+                       if (pemx_cfg.cn78xx.lanes8 &&
+                           (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm + 1),
+                                                  cvmx_gserx_qlm_stat_t, rst_rdy, ==, 1, 10000))) {
+                               printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n",
+                                      qlm + 1);
+                               return -1;
+                       }
+               }
+
+               /* Wait 1ms for PCIe reset to complete */
+               udelay(1000);
+
+               /*
+                * Check and make sure PCIe came out of reset. If it doesn't
+                * the board probably hasn't wired the clocks up and the
+                * interface should be skipped
+                */
+               if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_RST_CTLX(pcie_port),
+                                              cvmx_rst_ctlx_t,
+                                              rst_done, ==, 1, 10000)) {
+                       printf("N%d:PCIE: Port %d stuck in reset, skipping.\n", node, pcie_port);
+                       return -1;
+               }
+
+               /* Check BIST status */
+               pemx_bist_status.u64 = CVMX_READ_CSR(CVMX_PEMX_BIST_STATUS(pcie_port));
+               if (pemx_bist_status.u64)
+                       printf("N%d:PCIE: BIST FAILED for port %d (0x%016llx)\n", node, pcie_port,
+                              CAST64(pemx_bist_status.u64));
+
+                       /* Initialize the config space CSRs */
+#ifdef DEBUG_PCIE
+               printf("N%d:PCIE%d Initialize Config Space\n", node, pcie_port);
+#endif
+               __cvmx_pcie_rc_initialize_config_space(node, pcie_port);
+
+               /* Enable gen2 speed selection */
+               pciercx_cfg515.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG515(pcie_port));
+               pciercx_cfg515.s.dsc = 1;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG515(pcie_port), pciercx_cfg515.u32);
+
+               /* Do the link retries on the PCIe interface */
+               if (retry_count == MAX_RETRIES) {
+                       /*
+                        * This has to be done AFTER the QLM/PHY interface
+                        * initialized
+                        */
+                       pciercx_cfg031.u32 =
+                               CVMX_PCIE_CFGX_READ(pcie_port,
+                                                   CVMX_PCIERCX_CFG031(pcie_port));
+                       /*
+                        * Drop speed to gen2 if link bouncing
+                        * Result = -1  PEM in reset
+                        * Result = 0:  link speed and width ok no retry needed
+                        * Result = 1:  link errors or speed change needed
+                        * Result = 2:  lane width error
+                        */
+                       if (pciercx_cfg031.s.mls == 3 && result != 2) {
+#ifdef DEBUG_PCIE
+                               printf("N%d:PCIE%d: Dropping speed to gen2\n", node, pcie_port);
+#endif
+                               pciercx_cfg031.s.mls = 2;
+                               CVMX_PCIE_CFGX_WRITE(pcie_port,
+                                                    CVMX_PCIERCX_CFG031(pcie_port),
+                                                    pciercx_cfg031.u32);
+
+                               /* Set the target link speed */
+                               pciercx_cfg040.u32 = CVMX_PCIE_CFGX_READ(
+                                       pcie_port, CVMX_PCIERCX_CFG040(pcie_port));
+                               pciercx_cfg040.s.tls = 2;
+                               CVMX_PCIE_CFGX_WRITE(pcie_port,
+                                                    CVMX_PCIERCX_CFG040(pcie_port),
+                                                    pciercx_cfg040.u32);
+                       }
+               }
+
+               /* Bring the link up */
+               result = __cvmx_pcie_rc_initialize_link_gen2_v3(node, pcie_port);
+               if (result == 0) {
+#ifdef DEBUG_PCIE
+                       printf("N%d:PCIE%d: Link does not need a retry\n", node, pcie_port);
+#endif
+                       break;
+               } else if (result > 0) {
+                       if (retry_count >= MAX_RETRIES) {
+                               int link_up;
+#ifdef DEBUG_PCIE
+                               printf("N%d:PCIE%d: Link requested a retry, but hit the max retries\n",
+                                      node, pcie_port);
+#endif
+                               /* If the link is down, report failure */
+                               pciercx_cfg032.u32 = CVMX_PCIE_CFGX_READ(
+                                       pcie_port,
+                                       CVMX_PCIERCX_CFG032(pcie_port));
+                               link_up = (pciercx_cfg032.s.dlla && !pciercx_cfg032.s.lt);
+                               if (!link_up)
+                                       result = -1;
+                       }
+#ifdef DEBUG_PCIE
+                       else
+                               printf("N%d.PCIE%d: Link requested a retry\n", node, pcie_port);
+#endif
+               }
+               if (result < 0) {
+                       int ltssm_state = __cvmx_pcie_rc_get_ltssm_state(node, pcie_port);
+
+                       printf("N%d:PCIE%d: Link timeout, probably the slot is empty (LTSSM %s)\n",
+                              node, pcie_port, cvmx_pcie_get_ltssm_string(ltssm_state));
+                       return -1;
+               }
+               retry_count++;
+       }
+
+       pciercx_cfg032.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
+       /*
+        * Errata PEM-28816: Link retrain initiated at GEN1 can cause PCIE
+        * link to hang. For Gen1 links we must disable equalization
+        */
+       if (pciercx_cfg032.s.ls == 1) {
+#ifdef DEBUG_PCIE
+               printf("N%d:PCIE%d: Disabling equalization for GEN1 Link\n", node, pcie_port);
+#endif
+               pciercx_cfg548.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG548(pcie_port));
+               pciercx_cfg548.s.ed = 1;
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG548(pcie_port), pciercx_cfg548.u32);
+       }
+
+       /* Errata PCIE-29440: Atomic operations to work properly */
+       pciercx_cfg038.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG038(pcie_port));
+       pciercx_cfg038.s.atom_op_eb = 0;
+       pciercx_cfg038.s.atom_op = 1;
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG038(pcie_port), pciercx_cfg038.u32);
+
+       /* Errata PCIE-29566 PEM Link Hangs after going into L1 */
+       pciercx_cfg548.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG548(pcie_port));
+       pciercx_cfg548.s.grizdnc = 0;
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIERCX_CFG548(pcie_port), pciercx_cfg548.u32);
+
+       if (result < 0)
+               return result;
+
+       /* Display the link status */
+       pciercx_cfg032.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
+       printf("N%d:PCIe: Port %d link active, %d lanes, speed gen%d\n", node, pcie_port,
+              pciercx_cfg032.s.nlw, pciercx_cfg032.s.ls);
+
+       pcie_link_initialized[node][pcie_port] = true;
+       return 0;
+}
+
+/**
+ * Initialize a PCIe port for use in host(RC) mode. It doesn't enumerate the bus.
+ *
+ * @param pcie_port PCIe port to initialize for a node
+ *
+ * @return Zero on success
+ */
+int cvmx_pcie_rc_initialize(int pcie_port)
+{
+       int result;
+
+       if (OCTEON_IS_OCTEON2() || OCTEON_IS_MODEL(OCTEON_CN70XX))
+               result = __cvmx_pcie_rc_initialize_gen2(pcie_port);
+       else
+               result = __cvmx_pcie_rc_initialize_gen2_v3(pcie_port);
+
+       if (result == 0)
+               cvmx_error_enable_group(CVMX_ERROR_GROUP_PCI, pcie_port);
+       return result;
+}
+
+/**
+ * Shutdown a PCIe port and put it in reset
+ *
+ * @param pcie_port PCIe port to shutdown for a node
+ *
+ * @return Zero on success
+ */
+int cvmx_pcie_rc_shutdown(int pcie_port)
+{
+       u64 ciu_soft_prst_reg;
+       cvmx_ciu_soft_prst_t ciu_soft_prst;
+       int node;
+
+       /* Shutdown only if PEM is in RC mode */
+       if (!cvmx_pcie_is_host_mode(pcie_port))
+               return -1;
+
+       node = (pcie_port >> 4) & 0x3;
+       pcie_port &= 0x3;
+       cvmx_error_disable_group(CVMX_ERROR_GROUP_PCI, pcie_port);
+       /* Wait for all pending operations to complete */
+       if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_PEMX_CPL_LUT_VALID(pcie_port),
+                                      cvmx_pemx_cpl_lut_valid_t, tag, ==,
+                                      0, 2000))
+               debug("PCIe: Port %d shutdown timeout\n", pcie_port);
+
+       if (OCTEON_IS_OCTEON3()) {
+               ciu_soft_prst_reg = CVMX_RST_SOFT_PRSTX(pcie_port);
+       } else {
+               ciu_soft_prst_reg = (pcie_port) ? CVMX_CIU_SOFT_PRST1 :
+                       CVMX_CIU_SOFT_PRST;
+       }
+
+       /* Force reset */
+       ciu_soft_prst.u64 = CVMX_READ_CSR(ciu_soft_prst_reg);
+       ciu_soft_prst.s.soft_prst = 1;
+       CVMX_WRITE_CSR(ciu_soft_prst_reg, ciu_soft_prst.u64);
+
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ * Build a PCIe config space request address for a device
+ *
+ * @param node     node
+ * @param port     PCIe port (relative to the node) to access
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ *
+ * @return 64bit Octeon IO address
+ */
+static uint64_t __cvmx_pcie_build_config_addr(int node, int port, int bus, int dev, int fn, int reg)
+{
+       cvmx_pcie_address_t pcie_addr;
+       cvmx_pciercx_cfg006_t pciercx_cfg006;
+
+       pciercx_cfg006.u32 = cvmx_pcie_cfgx_read_node(node, port,
+                                                     CVMX_PCIERCX_CFG006(port));
+       if (bus <= pciercx_cfg006.s.pbnum && dev != 0)
+               return 0;
+
+       pcie_addr.u64 = 0;
+       pcie_addr.config.upper = 2;
+       pcie_addr.config.io = 1;
+       pcie_addr.config.did = 3;
+       pcie_addr.config.subdid = 1;
+       pcie_addr.config.node = node;
+       pcie_addr.config.es = _CVMX_PCIE_ES;
+       pcie_addr.config.port = port;
+       /* Always use config type 0 */
+       if (pciercx_cfg006.s.pbnum == 0)
+               pcie_addr.config.ty = (bus > pciercx_cfg006.s.pbnum + 1);
+       else
+               pcie_addr.config.ty = (bus > pciercx_cfg006.s.pbnum);
+       pcie_addr.config.bus = bus;
+       pcie_addr.config.dev = dev;
+       pcie_addr.config.func = fn;
+       pcie_addr.config.reg = reg;
+       return pcie_addr.u64;
+}
+
+/**
+ * Read 8bits from a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ *
+ * @return Result of the read
+ */
+uint8_t cvmx_pcie_config_read8(int pcie_port, int bus, int dev, int fn, int reg)
+{
+       u64 address;
+       int node = (pcie_port >> 4) & 0x3;
+
+       pcie_port &= 0x3;
+       address = __cvmx_pcie_build_config_addr(node, pcie_port, bus, dev, fn, reg);
+       if (address)
+               return cvmx_read64_uint8(address);
+       else
+               return 0xff;
+}
+
+/**
+ * Read 16bits from a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ *
+ * @return Result of the read
+ */
+uint16_t cvmx_pcie_config_read16(int pcie_port, int bus, int dev, int fn, int reg)
+{
+       u64 address;
+       int node = (pcie_port >> 4) & 0x3;
+
+       pcie_port &= 0x3;
+       address = __cvmx_pcie_build_config_addr(node, pcie_port, bus, dev, fn, reg);
+       if (address)
+               return le16_to_cpu(cvmx_read64_uint16(address));
+       else
+               return 0xffff;
+}
+
+static uint32_t __cvmx_pcie_config_read32(int node, int pcie_port, int bus, int dev, int func,
+                                         int reg, int lst)
+{
+       u64 address;
+
+       address = __cvmx_pcie_build_config_addr(node, pcie_port, bus, dev, func, reg);
+       if (lst) {
+               if (address && pcie_link_initialized[node][pcie_port])
+                       return le32_to_cpu(cvmx_read64_uint32(address));
+               else
+                       return 0xffffffff;
+       } else if (address) {
+               return le32_to_cpu(cvmx_read64_uint32(address));
+       } else {
+               return 0xffffffff;
+       }
+}
+
+/**
+ * Read 32bits from a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ *
+ * @return Result of the read
+ */
+uint32_t cvmx_pcie_config_read32(int pcie_port, int bus, int dev, int fn, int reg)
+{
+       int node = (pcie_port >> 4) & 0x3;
+
+       pcie_port &= 0x3;
+       return __cvmx_pcie_config_read32(node, pcie_port, bus, dev, fn, reg,
+                                        pcie_link_initialized[node][pcie_port]);
+}
+
+/**
+ * Write 8bits to a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ * @param val       Value to write
+ */
+void cvmx_pcie_config_write8(int pcie_port, int bus, int dev, int fn, int reg, uint8_t val)
+{
+       u64 address;
+       int node = (pcie_port >> 4) & 0x3;
+
+       pcie_port &= 0x3;
+       address = __cvmx_pcie_build_config_addr(node, pcie_port, bus, dev, fn, reg);
+       if (address)
+               cvmx_write64_uint8(address, val);
+}
+
+/**
+ * Write 16bits to a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ * @param val       Value to write
+ */
+void cvmx_pcie_config_write16(int pcie_port, int bus, int dev, int fn, int reg, uint16_t val)
+{
+       u64 address;
+       int node = (pcie_port >> 4) & 0x3;
+
+       pcie_port &= 0x3;
+       address = __cvmx_pcie_build_config_addr(node, pcie_port, bus, dev, fn, reg);
+       if (address)
+               cvmx_write64_uint16(address, cpu_to_le16(val));
+}
+
+/**
+ * Write 32bits to a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ * @param val       Value to write
+ */
+void cvmx_pcie_config_write32(int pcie_port, int bus, int dev, int fn, int reg, uint32_t val)
+{
+       u64 address;
+       int node = (pcie_port >> 4) & 0x3;
+
+       pcie_port &= 0x3;
+       address = __cvmx_pcie_build_config_addr(node, pcie_port, bus, dev, fn, reg);
+       if (address)
+               cvmx_write64_uint32(address, cpu_to_le32(val));
+}
+
+/**
+ * Read a PCIe config space register indirectly. This is used for
+ * registers of the form PCIEEP_CFG??? and PCIERC?_CFG???.
+ *
+ * @param pcie_port  PCIe port to read from
+ * @param cfg_offset Address to read
+ *
+ * @return Value read
+ */
+uint32_t cvmx_pcie_cfgx_read(int pcie_port, uint32_t cfg_offset)
+{
+       return cvmx_pcie_cfgx_read_node(0, pcie_port, cfg_offset);
+}
+
+uint32_t cvmx_pcie_cfgx_read_node(int node, int pcie_port, uint32_t cfg_offset)
+{
+       cvmx_pemx_cfg_rd_t pemx_cfg_rd;
+
+       pemx_cfg_rd.u64 = 0;
+       pemx_cfg_rd.s.addr = cfg_offset;
+       CVMX_WRITE_CSR(CVMX_PEMX_CFG_RD(pcie_port), pemx_cfg_rd.u64);
+       pemx_cfg_rd.u64 = CVMX_READ_CSR(CVMX_PEMX_CFG_RD(pcie_port));
+
+       return pemx_cfg_rd.s.data;
+}
+
+/**
+ * Write a PCIe config space register indirectly. This is used for
+ * registers of the form PCIEEP_CFG??? and PCIERC?_CFG???.
+ *
+ * @param pcie_port  PCIe port to write to
+ * @param cfg_offset Address to write
+ * @param val        Value to write
+ */
+void cvmx_pcie_cfgx_write(int pcie_port, uint32_t cfg_offset, uint32_t val)
+{
+       cvmx_pcie_cfgx_write_node(0, pcie_port, cfg_offset, val);
+}
+
+void cvmx_pcie_cfgx_write_node(int node, int pcie_port, uint32_t cfg_offset, uint32_t val)
+{
+       cvmx_pemx_cfg_wr_t pemx_cfg_wr;
+
+       pemx_cfg_wr.u64 = 0;
+       pemx_cfg_wr.s.addr = cfg_offset;
+       pemx_cfg_wr.s.data = val;
+       CVMX_WRITE_CSR(CVMX_PEMX_CFG_WR(pcie_port), pemx_cfg_wr.u64);
+}
+
+extern int cvmx_pcie_is_host_mode(int pcie_port);
+
+/**
+ * Initialize a PCIe port for use in target(EP) mode.
+ *
+ * @param pcie_port PCIe port to initialize for a node
+ *
+ * @return Zero on success
+ */
+int cvmx_pcie_ep_initialize(int pcie_port)
+{
+       int node = (pcie_port >> 4) & 0x3;
+
+       if (cvmx_pcie_is_host_mode(pcie_port))
+               return -1;
+
+       pcie_port &= 0x3;
+
+       /* CN63XX Pass 1.0 errata G-14395 requires the QLM De-emphasis be
+        * programmed
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_0)) {
+               if (pcie_port) {
+                       cvmx_ciu_qlm1_t ciu_qlm;
+
+                       ciu_qlm.u64 = csr_rd(CVMX_CIU_QLM1);
+                       ciu_qlm.s.txbypass = 1;
+                       ciu_qlm.s.txdeemph = 5;
+                       ciu_qlm.s.txmargin = 0x17;
+                       csr_wr(CVMX_CIU_QLM1, ciu_qlm.u64);
+               } else {
+                       cvmx_ciu_qlm0_t ciu_qlm;
+
+                       ciu_qlm.u64 = csr_rd(CVMX_CIU_QLM0);
+                       ciu_qlm.s.txbypass = 1;
+                       ciu_qlm.s.txdeemph = 5;
+                       ciu_qlm.s.txmargin = 0x17;
+                       csr_wr(CVMX_CIU_QLM0, ciu_qlm.u64);
+               }
+       }
+
+       /* Enable bus master and memory */
+       CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIEEPX_CFG001(pcie_port), 0x6);
+
+       /* Max Payload Size (PCIE*_CFG030[MPS]) */
+       /* Max Read Request Size (PCIE*_CFG030[MRRS]) */
+       /* Relaxed-order, no-snoop enables (PCIE*_CFG030[RO_EN,NS_EN] */
+       /* Error Message Enables (PCIE*_CFG030[CE_EN,NFE_EN,FE_EN,UR_EN]) */
+       {
+               cvmx_pcieepx_cfg030_t pcieepx_cfg030;
+
+               pcieepx_cfg030.u32 = CVMX_PCIE_CFGX_READ(pcie_port, CVMX_PCIEEPX_CFG030(pcie_port));
+               pcieepx_cfg030.s.mps = MPS_CN6XXX;
+               pcieepx_cfg030.s.mrrs = MRRS_CN6XXX;
+               pcieepx_cfg030.s.ro_en = 1;  /* Enable relaxed ordering. */
+               pcieepx_cfg030.s.ns_en = 1;  /* Enable no snoop. */
+               pcieepx_cfg030.s.ce_en = 1;  /* Correctable error reporting enable. */
+               pcieepx_cfg030.s.nfe_en = 1; /* Non-fatal error reporting enable. */
+               pcieepx_cfg030.s.fe_en = 1;  /* Fatal error reporting enable. */
+               pcieepx_cfg030.s.ur_en = 1;  /* Unsupported request reporting enable. */
+               CVMX_PCIE_CFGX_WRITE(pcie_port, CVMX_PCIEEPX_CFG030(pcie_port), pcieepx_cfg030.u32);
+       }
+
+       /* Max Payload Size (DPI_SLI_PRTX_CFG[MPS]) must match
+        * PCIE*_CFG030[MPS]
+        */
+       /* Max Read Request Size (DPI_SLI_PRTX_CFG[MRRS]) must not
+        * exceed PCIE*_CFG030[MRRS]
+        */
+       cvmx_dpi_sli_prtx_cfg_t prt_cfg;
+       cvmx_sli_s2m_portx_ctl_t sli_s2m_portx_ctl;
+
+       prt_cfg.u64 = CVMX_READ_CSR(CVMX_DPI_SLI_PRTX_CFG(pcie_port));
+       prt_cfg.s.mps = MPS_CN6XXX;
+       prt_cfg.s.mrrs = MRRS_CN6XXX;
+       /* Max outstanding load request. */
+       prt_cfg.s.molr = 32;
+       CVMX_WRITE_CSR(CVMX_DPI_SLI_PRTX_CFG(pcie_port), prt_cfg.u64);
+
+       sli_s2m_portx_ctl.u64 = CVMX_READ_CSR(CVMX_PEXP_SLI_S2M_PORTX_CTL(pcie_port));
+       if (!(OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX) ||
+             OCTEON_IS_MODEL(OCTEON_CNF75XX)))
+               sli_s2m_portx_ctl.cn61xx.mrrs = MRRS_CN6XXX;
+       CVMX_WRITE_CSR(CVMX_PEXP_SLI_S2M_PORTX_CTL(pcie_port), sli_s2m_portx_ctl.u64);
+
+       /* Setup Mem access SubDID 12 to access Host memory */
+       cvmx_sli_mem_access_subidx_t mem_access_subid;
+
+       mem_access_subid.u64 = 0;
+       mem_access_subid.s.port = pcie_port; /* Port the request is sent to. */
+       mem_access_subid.s.nmerge = 0;       /* Merging is allowed in this window. */
+       mem_access_subid.s.esr = 0;          /* Endian-swap for Reads. */
+       mem_access_subid.s.esw = 0;          /* Endian-swap for Writes. */
+       mem_access_subid.s.wtype = 0;        /* "No snoop" and "Relaxed ordering" are not set */
+       mem_access_subid.s.rtype = 0;        /* "No snoop" and "Relaxed ordering" are not set */
+       /* PCIe Address Bits <63:34>. */
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               mem_access_subid.cn68xx.ba = 0;
+       else
+               mem_access_subid.cn63xx.ba = 0;
+       CVMX_WRITE_CSR(CVMX_PEXP_SLI_MEM_ACCESS_SUBIDX(12 + pcie_port * 4), mem_access_subid.u64);
+
+       return 0;
+}
+
+/**
+ * Wait for posted PCIe read/writes to reach the other side of
+ * the internal PCIe switch. This will insure that core
+ * read/writes are posted before anything after this function
+ * is called. This may be necessary when writing to memory that
+ * will later be read using the DMA/PKT engines.
+ *
+ * @param pcie_port PCIe port to wait for
+ */
+void cvmx_pcie_wait_for_pending(int pcie_port)
+{
+       cvmx_sli_data_out_cnt_t sli_data_out_cnt;
+       int a;
+       int b;
+       int c;
+
+       sli_data_out_cnt.u64 = csr_rd(CVMX_PEXP_SLI_DATA_OUT_CNT);
+       if (pcie_port) {
+               if (!sli_data_out_cnt.s.p1_fcnt)
+                       return;
+               a = sli_data_out_cnt.s.p1_ucnt;
+               b = (a + sli_data_out_cnt.s.p1_fcnt - 1) & 0xffff;
+       } else {
+               if (!sli_data_out_cnt.s.p0_fcnt)
+                       return;
+               a = sli_data_out_cnt.s.p0_ucnt;
+               b = (a + sli_data_out_cnt.s.p0_fcnt - 1) & 0xffff;
+       }
+
+       while (1) {
+               sli_data_out_cnt.u64 = csr_rd(CVMX_PEXP_SLI_DATA_OUT_CNT);
+               c = (pcie_port) ? sli_data_out_cnt.s.p1_ucnt :
+                       sli_data_out_cnt.s.p0_ucnt;
+               if (a <= b) {
+                       if (c < a || c > b)
+                               return;
+               } else {
+                       if (c > b && c < a)
+                               return;
+               }
+       }
+}
+
+/**
+ * Returns if a PCIe port is in host or target mode.
+ *
+ * @param pcie_port PCIe port number (PEM number)
+ *
+ * @return 0 if PCIe port is in target mode, !0 if in host mode.
+ */
+int cvmx_pcie_is_host_mode(int pcie_port)
+{
+       int node = (pcie_port >> 4) & 0x3;
+       cvmx_mio_rst_ctlx_t mio_rst_ctl;
+
+       pcie_port &= 0x3;
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+               cvmx_pemx_strap_t strap;
+
+               strap.u64 = CVMX_READ_CSR(CVMX_PEMX_STRAP(pcie_port));
+               return (strap.cn78xx.pimode == 3);
+       } else if (OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               cvmx_rst_ctlx_t rst_ctl;
+
+               rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(pcie_port));
+               return !!rst_ctl.s.host_mode;
+       }
+
+       mio_rst_ctl.u64 = csr_rd(CVMX_MIO_RST_CTLX(pcie_port));
+       if (OCTEON_IS_MODEL(OCTEON_CN61XX) || OCTEON_IS_MODEL(OCTEON_CNF71XX))
+               return mio_rst_ctl.s.prtmode != 0;
+       else
+               return !!mio_rst_ctl.s.host_mode;
+}
diff --git a/arch/mips/mach-octeon/cvmx-qlm.c b/arch/mips/mach-octeon/cvmx-qlm.c
new file mode 100644 (file)
index 0000000..970e34a
--- /dev/null
@@ -0,0 +1,2350 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper utilities for qlm.
+ */
+
+#include <log.h>
+#include <time.h>
+#include <asm/global_data.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/octeon-model.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/cvmx-pcie.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-bgxx-defs.h>
+#include <mach/cvmx-ciu-defs.h>
+#include <mach/cvmx-gmxx-defs.h>
+#include <mach/cvmx-gserx-defs.h>
+#include <mach/cvmx-mio-defs.h>
+#include <mach/cvmx-pciercx-defs.h>
+#include <mach/cvmx-pemx-defs.h>
+#include <mach/cvmx-pexp-defs.h>
+#include <mach/cvmx-rst-defs.h>
+#include <mach/cvmx-sata-defs.h>
+#include <mach/cvmx-sli-defs.h>
+#include <mach/cvmx-sriomaintx-defs.h>
+#include <mach/cvmx-sriox-defs.h>
+
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-jtag.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Their is a copy of this in bootloader qlm configuration, make sure
+ * to update both the places till i figure out
+ */
+#define R_25G_REFCLK100                 0x0
+#define R_5G_REFCLK100          0x1
+#define R_8G_REFCLK100          0x2
+#define R_125G_REFCLK15625_KX   0x3
+#define R_3125G_REFCLK15625_XAUI 0x4
+#define R_103125G_REFCLK15625_KR 0x5
+#define R_125G_REFCLK15625_SGMII 0x6
+#define R_5G_REFCLK15625_QSGMII         0x7
+#define R_625G_REFCLK15625_RXAUI 0x8
+#define R_25G_REFCLK125                 0x9
+#define R_5G_REFCLK125          0xa
+#define R_8G_REFCLK125          0xb
+
+static const int REF_100MHZ = 100000000;
+static const int REF_125MHZ = 125000000;
+static const int REF_156MHZ = 156250000;
+
+static qlm_jtag_uint32_t *__cvmx_qlm_jtag_xor_ref;
+
+/**
+ * Return the number of QLMs supported by the chip
+ *
+ * @return  Number of QLMs
+ */
+int cvmx_qlm_get_num(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               return 5;
+       else if (OCTEON_IS_MODEL(OCTEON_CN66XX))
+               return 3;
+       else if (OCTEON_IS_MODEL(OCTEON_CN63XX))
+               return 3;
+       else if (OCTEON_IS_MODEL(OCTEON_CN61XX))
+               return 3;
+       else if (OCTEON_IS_MODEL(OCTEON_CNF71XX))
+               return 2;
+       else if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 8;
+       else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return 7;
+       else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return 9;
+       return 0;
+}
+
+/**
+ * Return the qlm number based on the interface
+ *
+ * @param xiface  interface to look up
+ *
+ * @return the qlm number based on the xiface
+ */
+int cvmx_qlm_interface(int xiface)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (OCTEON_IS_MODEL(OCTEON_CN61XX)) {
+               return (xi.interface == 0) ? 2 : 0;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN63XX) || OCTEON_IS_MODEL(OCTEON_CN66XX)) {
+               return 2 - xi.interface;
+       } else if (OCTEON_IS_MODEL(OCTEON_CNF71XX)) {
+               if (xi.interface == 0)
+                       return 0;
+
+               debug("Warning: %s: Invalid interface %d\n",
+                     __func__, xi.interface);
+       } else if (octeon_has_feature(OCTEON_FEATURE_BGX)) {
+               debug("Warning: not supported\n");
+               return -1;
+       }
+
+       /* Must be cn68XX */
+       switch (xi.interface) {
+       case 1:
+               return 0;
+       default:
+               return xi.interface;
+       }
+
+       return -1;
+}
+
+/**
+ * Return the qlm number based for a port in the interface
+ *
+ * @param xiface  interface to look up
+ * @param index  index in an interface
+ *
+ * @return the qlm number based on the xiface
+ */
+int cvmx_qlm_lmac(int xiface, int index)
+{
+       struct cvmx_xiface xi = cvmx_helper_xiface_to_node_interface(xiface);
+
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               cvmx_bgxx_cmr_global_config_t gconfig;
+               cvmx_gserx_phy_ctl_t phy_ctl;
+               cvmx_gserx_cfg_t gserx_cfg;
+               int qlm;
+
+               if (xi.interface < 6) {
+                       if (xi.interface < 2) {
+                               gconfig.u64 =
+                                       csr_rd_node(xi.node,
+                                                   CVMX_BGXX_CMR_GLOBAL_CONFIG(xi.interface));
+                               if (gconfig.s.pmux_sds_sel)
+                                       qlm = xi.interface + 2; /* QLM 2 or 3 */
+                               else
+                                       qlm = xi.interface; /* QLM 0 or 1 */
+                       } else {
+                               qlm = xi.interface + 2; /* QLM 4-7 */
+                       }
+
+                       /* make sure the QLM is powered up and out of reset */
+                       phy_ctl.u64 = csr_rd_node(xi.node, CVMX_GSERX_PHY_CTL(qlm));
+                       if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+                               return -1;
+                       gserx_cfg.u64 = csr_rd_node(xi.node, CVMX_GSERX_CFG(qlm));
+                       if (gserx_cfg.s.bgx)
+                               return qlm;
+                       else
+                               return -1;
+               } else if (xi.interface <= 7) { /* ILK */
+                       int qlm;
+
+                       for (qlm = 4; qlm < 8; qlm++) {
+                               /* Make sure the QLM is powered and out of reset */
+                               phy_ctl.u64 = csr_rd_node(xi.node, CVMX_GSERX_PHY_CTL(qlm));
+                               if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+                                       continue;
+                               /* Make sure the QLM is in ILK mode */
+                               gserx_cfg.u64 = csr_rd_node(xi.node, CVMX_GSERX_CFG(qlm));
+                               if (gserx_cfg.s.ila)
+                                       return qlm;
+                       }
+               }
+               return -1;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+               cvmx_gserx_phy_ctl_t phy_ctl;
+               cvmx_gserx_cfg_t gserx_cfg;
+               int qlm;
+
+               /* (interface)0->QLM2, 1->QLM3, 2->DLM5/3->DLM6 */
+               if (xi.interface < 2) {
+                       qlm = xi.interface + 2; /* (0,1)->ret(2,3) */
+
+                       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+                       if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+                               return -1;
+
+                       gserx_cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+                       if (gserx_cfg.s.bgx)
+                               return qlm;
+                       else
+                               return -1;
+               } else if (xi.interface == 2) {
+                       cvmx_gserx_cfg_t g1, g2;
+
+                       g1.u64 = csr_rd(CVMX_GSERX_CFG(5));
+                       g2.u64 = csr_rd(CVMX_GSERX_CFG(6));
+                       /* Check if both QLM5 & QLM6 are BGX2 */
+                       if (g2.s.bgx) {
+                               if (g1.s.bgx) {
+                                       cvmx_gserx_phy_ctl_t phy_ctl1;
+
+                                       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(5));
+                                       phy_ctl1.u64 = csr_rd(CVMX_GSERX_PHY_CTL(6));
+                                       if ((phy_ctl.s.phy_pd || phy_ctl.s.phy_reset) &&
+                                           (phy_ctl1.s.phy_pd || phy_ctl1.s.phy_reset))
+                                               return -1;
+                                       if (index >= 2)
+                                               return 6;
+                                       return 5;
+                               } else { /* QLM6 is BGX2 */
+                                       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(6));
+                                       if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+                                               return -1;
+                                       return 6;
+                               }
+                       } else if (g1.s.bgx) {
+                               phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(5));
+                               if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+                                       return -1;
+                               return 5;
+                       }
+               }
+               return -1;
+       } else if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               cvmx_gserx_phy_ctl_t phy_ctl;
+               cvmx_gserx_cfg_t gserx_cfg;
+               int qlm;
+
+               if (xi.interface == 0) {
+                       cvmx_gserx_cfg_t g1, g2;
+
+                       g1.u64 = csr_rd(CVMX_GSERX_CFG(4));
+                       g2.u64 = csr_rd(CVMX_GSERX_CFG(5));
+                       /* Check if both QLM4 & QLM5 are BGX0 */
+                       if (g2.s.bgx) {
+                               if (g1.s.bgx) {
+                                       cvmx_gserx_phy_ctl_t phy_ctl1;
+
+                                       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(4));
+                                       phy_ctl1.u64 = csr_rd(CVMX_GSERX_PHY_CTL(5));
+                                       if ((phy_ctl.s.phy_pd || phy_ctl.s.phy_reset) &&
+                                           (phy_ctl1.s.phy_pd || phy_ctl1.s.phy_reset))
+                                               return -1;
+                                       if (index >= 2)
+                                               return 5;
+                                       return 4;
+                               }
+
+                               /* QLM5 is BGX0 */
+                               phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(5));
+                               if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+                                       return -1;
+                               return 5;
+                       } else if (g1.s.bgx) {
+                               phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(4));
+                               if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+                                       return -1;
+                               return 4;
+                       }
+               } else if (xi.interface < 2) {
+                       qlm = (xi.interface == 1) ? 2 : 3;
+                       gserx_cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+                       if (gserx_cfg.s.srio)
+                               return qlm;
+               }
+               return -1;
+       }
+       return -1;
+}
+
+/**
+ * Return if only DLM5/DLM6/DLM5+DLM6 is used by BGX
+ *
+ * @param BGX  BGX to search for.
+ *
+ * @return muxes used 0 = DLM5+DLM6, 1 = DLM5, 2 = DLM6.
+ */
+int cvmx_qlm_mux_interface(int bgx)
+{
+       int mux = 0;
+       cvmx_gserx_cfg_t gser1, gser2;
+       int qlm1, qlm2;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX) && bgx != 2)
+               return -1;
+       else if (OCTEON_IS_MODEL(OCTEON_CNF75XX) && bgx != 0)
+               return -1;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+               qlm1 = 5;
+               qlm2 = 6;
+       } else if (OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               qlm1 = 4;
+               qlm2 = 5;
+       } else {
+               return -1;
+       }
+
+       gser1.u64 = csr_rd(CVMX_GSERX_CFG(qlm1));
+       gser2.u64 = csr_rd(CVMX_GSERX_CFG(qlm2));
+
+       if (gser1.s.bgx && gser2.s.bgx)
+               mux = 0;
+       else if (gser1.s.bgx)
+               mux = 1; // BGX2 is using DLM5 only
+       else if (gser2.s.bgx)
+               mux = 2; // BGX2 is using DLM6 only
+
+       return mux;
+}
+
+/**
+ * Return number of lanes for a given qlm
+ *
+ * @param qlm    QLM to examine
+ *
+ * @return  Number of lanes
+ */
+int cvmx_qlm_get_lanes(int qlm)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN61XX) && qlm == 1)
+               return 2;
+       else if (OCTEON_IS_MODEL(OCTEON_CNF71XX))
+               return 2;
+       else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return (qlm < 4) ? 4 /*QLM0,1,2,3*/ : 2 /*DLM4,5,6*/;
+       else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return (qlm == 2 || qlm == 3) ? 4 /*QLM2,3*/ : 2 /*DLM0,1,4,5*/;
+       return 4;
+}
+
+/**
+ * Get the QLM JTAG fields based on Octeon model on the supported chips.
+ *
+ * @return  qlm_jtag_field_t structure
+ */
+const __cvmx_qlm_jtag_field_t *cvmx_qlm_jtag_get_field(void)
+{
+       /* Figure out which JTAG chain description we're using */
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+               return __cvmx_qlm_jtag_field_cn68xx;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN66XX) || OCTEON_IS_MODEL(OCTEON_CN61XX) ||
+                  OCTEON_IS_MODEL(OCTEON_CNF71XX)) {
+               return __cvmx_qlm_jtag_field_cn66xx;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
+               return __cvmx_qlm_jtag_field_cn63xx;
+       }
+
+       return NULL;
+}
+
+/**
+ * Get the QLM JTAG length by going through qlm_jtag_field for each
+ * Octeon model that is supported
+ *
+ * @return return the length.
+ */
+int cvmx_qlm_jtag_get_length(void)
+{
+       const __cvmx_qlm_jtag_field_t *qlm_ptr = cvmx_qlm_jtag_get_field();
+       int length = 0;
+
+       /* Figure out how many bits are in the JTAG chain */
+       while (qlm_ptr && qlm_ptr->name) {
+               if (qlm_ptr->stop_bit > length)
+                       length = qlm_ptr->stop_bit + 1;
+               qlm_ptr++;
+       }
+       return length;
+}
+
+/**
+ * Initialize the QLM layer
+ */
+void cvmx_qlm_init(void)
+{
+       if (OCTEON_IS_OCTEON3())
+               return;
+
+       /* ToDo: No support for non-Octeon 3 yet */
+       printf("Please add support for unsupported Octeon SoC\n");
+}
+
+/**
+ * Lookup the bit information for a JTAG field name
+ *
+ * @param name   Name to lookup
+ *
+ * @return Field info, or NULL on failure
+ */
+static const __cvmx_qlm_jtag_field_t *__cvmx_qlm_lookup_field(const char *name)
+{
+       const __cvmx_qlm_jtag_field_t *ptr = cvmx_qlm_jtag_get_field();
+
+       while (ptr->name) {
+               if (strcmp(name, ptr->name) == 0)
+                       return ptr;
+               ptr++;
+       }
+
+       debug("%s: Illegal field name %s\n", __func__, name);
+       return NULL;
+}
+
+/**
+ * Get a field in a QLM JTAG chain
+ *
+ * @param qlm    QLM to get
+ * @param lane   Lane in QLM to get
+ * @param name   String name of field
+ *
+ * @return JTAG field value
+ */
+uint64_t cvmx_qlm_jtag_get(int qlm, int lane, const char *name)
+{
+       const __cvmx_qlm_jtag_field_t *field = __cvmx_qlm_lookup_field(name);
+       int qlm_jtag_length = cvmx_qlm_jtag_get_length();
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+
+       if (!field)
+               return 0;
+
+       /* Capture the current settings */
+       cvmx_helper_qlm_jtag_capture(qlm);
+       /*
+        * Shift past lanes we don't care about. CN6XXX/7XXX shifts lane 0 first,
+        * CN3XXX/5XXX shifts lane 3 first
+        */
+       /* Shift to the start of the field */
+       cvmx_helper_qlm_jtag_shift_zeros(qlm,
+                                        qlm_jtag_length * (num_lanes - 1 - lane));
+       cvmx_helper_qlm_jtag_shift_zeros(qlm, field->start_bit);
+       /* Shift out the value and return it */
+       return cvmx_helper_qlm_jtag_shift(qlm, field->stop_bit - field->start_bit + 1, 0);
+}
+
+/**
+ * Set a field in a QLM JTAG chain
+ *
+ * @param qlm    QLM to set
+ * @param lane   Lane in QLM to set, or -1 for all lanes
+ * @param name   String name of field
+ * @param value  Value of the field
+ */
+void cvmx_qlm_jtag_set(int qlm, int lane, const char *name, uint64_t value)
+{
+       int i, l;
+       u32 shift_values[CVMX_QLM_JTAG_UINT32];
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+       const __cvmx_qlm_jtag_field_t *field = __cvmx_qlm_lookup_field(name);
+       int qlm_jtag_length = cvmx_qlm_jtag_get_length();
+       int total_length = qlm_jtag_length * num_lanes;
+       int bits = 0;
+
+       if (!field)
+               return;
+
+       /* Get the current state */
+       cvmx_helper_qlm_jtag_capture(qlm);
+       for (i = 0; i < CVMX_QLM_JTAG_UINT32; i++)
+               shift_values[i] = cvmx_helper_qlm_jtag_shift(qlm, 32, 0);
+
+       /* Put new data in our local array */
+       for (l = 0; l < num_lanes; l++) {
+               u64 new_value = value;
+               int bits;
+               int adj_lanes;
+
+               if (l != lane && lane != -1)
+                       continue;
+
+               adj_lanes = (num_lanes - 1 - l) * qlm_jtag_length;
+
+               for (bits = field->start_bit + adj_lanes; bits <= field->stop_bit + adj_lanes;
+                    bits++) {
+                       if (new_value & 1)
+                               shift_values[bits / 32] |= 1 << (bits & 31);
+                       else
+                               shift_values[bits / 32] &= ~(1 << (bits & 31));
+                       new_value >>= 1;
+               }
+       }
+
+       /* Shift out data and xor with reference */
+       while (bits < total_length) {
+               u32 shift = shift_values[bits / 32] ^ __cvmx_qlm_jtag_xor_ref[qlm][bits / 32];
+               int width = total_length - bits;
+
+               if (width > 32)
+                       width = 32;
+               cvmx_helper_qlm_jtag_shift(qlm, width, shift);
+               bits += 32;
+       }
+
+       /* Update the new data */
+       cvmx_helper_qlm_jtag_update(qlm);
+
+       /*
+        * Always give the QLM 1ms to settle after every update. This may not
+        * always be needed, but some of the options make significant
+        * electrical changes
+        */
+       udelay(1000);
+}
+
+/**
+ * Errata G-16094: QLM Gen2 Equalizer Default Setting Change.
+ * CN68XX pass 1.x and CN66XX pass 1.x QLM tweak. This function tweaks the
+ * JTAG setting for a QLMs to run better at 5 and 6.25Ghz.
+ */
+void __cvmx_qlm_speed_tweak(void)
+{
+       cvmx_mio_qlmx_cfg_t qlm_cfg;
+       int num_qlms = cvmx_qlm_get_num();
+       int qlm;
+
+       /* Workaround for Errata (G-16467) */
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS2_X)) {
+               for (qlm = 0; qlm < num_qlms; qlm++) {
+                       int ir50dac;
+
+                       /*
+                        * This workaround only applies to QLMs running at
+                        * 6.25Ghz
+                        */
+                       if (cvmx_qlm_get_gbaud_mhz(qlm) == 6250) {
+#ifdef CVMX_QLM_DUMP_STATE
+                               debug("%s:%d: QLM%d: Applying workaround for Errata G-16467\n",
+                                     __func__, __LINE__, qlm);
+                               cvmx_qlm_display_registers(qlm);
+                               debug("\n");
+#endif
+                               cvmx_qlm_jtag_set(qlm, -1, "cfg_cdr_trunc", 0);
+                               /* Hold the QLM in reset */
+                               cvmx_qlm_jtag_set(qlm, -1, "cfg_rst_n_set", 0);
+                               cvmx_qlm_jtag_set(qlm, -1, "cfg_rst_n_clr", 1);
+                               /* Forcfe TX to be idle */
+                               cvmx_qlm_jtag_set(qlm, -1, "cfg_tx_idle_clr", 0);
+                               cvmx_qlm_jtag_set(qlm, -1, "cfg_tx_idle_set", 1);
+                               if (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS2_0)) {
+                                       ir50dac = cvmx_qlm_jtag_get(qlm, 0, "ir50dac");
+                                       while (++ir50dac <= 31)
+                                               cvmx_qlm_jtag_set(qlm, -1, "ir50dac", ir50dac);
+                               }
+                               cvmx_qlm_jtag_set(qlm, -1, "div4_byp", 0);
+                               cvmx_qlm_jtag_set(qlm, -1, "clkf_byp", 16);
+                               cvmx_qlm_jtag_set(qlm, -1, "serdes_pll_byp", 1);
+                               cvmx_qlm_jtag_set(qlm, -1, "spdsel_byp", 1);
+#ifdef CVMX_QLM_DUMP_STATE
+                               debug("%s:%d: QLM%d: Done applying workaround for Errata G-16467\n",
+                                     __func__, __LINE__, qlm);
+                               cvmx_qlm_display_registers(qlm);
+                               debug("\n\n");
+#endif
+                               /*
+                                * The QLM will be taken out of reset later
+                                * when ILK/XAUI are initialized.
+                                */
+                       }
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS1_X) ||
+                  OCTEON_IS_MODEL(OCTEON_CN66XX_PASS1_X)) {
+               /* Loop through the QLMs */
+               for (qlm = 0; qlm < num_qlms; qlm++) {
+                       /* Read the QLM speed */
+                       qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
+
+                       /* If the QLM is at 6.25Ghz or 5Ghz then program JTAG */
+                       if (qlm_cfg.s.qlm_spd == 5 || qlm_cfg.s.qlm_spd == 12 ||
+                           qlm_cfg.s.qlm_spd == 0 || qlm_cfg.s.qlm_spd == 6 ||
+                           qlm_cfg.s.qlm_spd == 11) {
+                               cvmx_qlm_jtag_set(qlm, -1, "rx_cap_gen2", 0x1);
+                               cvmx_qlm_jtag_set(qlm, -1, "rx_eq_gen2", 0x8);
+                       }
+               }
+       }
+}
+
+/**
+ * Errata G-16174: QLM Gen2 PCIe IDLE DAC change.
+ * CN68XX pass 1.x, CN66XX pass 1.x and CN63XX pass 1.0-2.2 QLM tweak.
+ * This function tweaks the JTAG setting for a QLMs for PCIe to run better.
+ */
+void __cvmx_qlm_pcie_idle_dac_tweak(void)
+{
+       int num_qlms = 0;
+       int qlm;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS1_X))
+               num_qlms = 5;
+       else if (OCTEON_IS_MODEL(OCTEON_CN66XX_PASS1_X))
+               num_qlms = 3;
+       else if (OCTEON_IS_MODEL(OCTEON_CN63XX))
+               num_qlms = 3;
+       else
+               return;
+
+       /* Loop through the QLMs */
+       for (qlm = 0; qlm < num_qlms; qlm++)
+               cvmx_qlm_jtag_set(qlm, -1, "idle_dac", 0x2);
+}
+
+void __cvmx_qlm_pcie_cfg_rxd_set_tweak(int qlm, int lane)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF71XX))
+               cvmx_qlm_jtag_set(qlm, lane, "cfg_rxd_set", 0x1);
+}
+
+/**
+ * Get the speed (Gbaud) of the QLM in Mhz for a given node.
+ *
+ * @param node   node of the QLM
+ * @param qlm    QLM to examine
+ *
+ * @return Speed in Mhz
+ */
+int cvmx_qlm_get_gbaud_mhz_node(int node, int qlm)
+{
+       cvmx_gserx_lane_mode_t lane_mode;
+       cvmx_gserx_cfg_t cfg;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_MULTINODE))
+               return 0;
+
+       if (qlm >= 8)
+               return -1; /* FIXME for OCI */
+       /* Check if QLM is configured */
+       cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
+       if (cfg.u64 == 0)
+               return -1;
+       if (cfg.s.pcie) {
+               int pem = 0;
+               cvmx_pemx_cfg_t pemx_cfg;
+
+               switch (qlm) {
+               case 0: /* Either PEM0 x4 of PEM0 x8 */
+                       pem = 0;
+                       break;
+               case 1: /* Either PEM0 x4 of PEM1 x4 */
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
+                       if (pemx_cfg.cn78xx.lanes8)
+                               pem = 0;
+                       else
+                               pem = 1;
+                       break;
+               case 2: /* Either PEM2 x4 of PEM2 x8 */
+                       pem = 2;
+                       break;
+               case 3: /* Either PEM2 x8 of PEM3 x4 or x8 */
+                       /* Can be last 4 lanes of PEM2 */
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               pem = 2;
+                       } else {
+                               pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
+                               if (pemx_cfg.cn78xx.lanes8)
+                                       pem = 3;
+                               else
+                                       pem = 2;
+                       }
+                       break;
+               case 4: /* Either PEM3 x8 of PEM3 x4 */
+                       pem = 3;
+                       break;
+               default:
+                       debug("QLM%d: Should be in PCIe mode\n", qlm);
+                       break;
+               }
+               pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
+               switch (pemx_cfg.s.md) {
+               case 0: /* Gen1 */
+                       return 2500;
+               case 1: /* Gen2 */
+                       return 5000;
+               case 2: /* Gen3 */
+                       return 8000;
+               default:
+                       return 0;
+               }
+       } else {
+               lane_mode.u64 = csr_rd_node(node, CVMX_GSERX_LANE_MODE(qlm));
+               switch (lane_mode.s.lmode) {
+               case R_25G_REFCLK100:
+                       return 2500;
+               case R_5G_REFCLK100:
+                       return 5000;
+               case R_8G_REFCLK100:
+                       return 8000;
+               case R_125G_REFCLK15625_KX:
+                       return 1250;
+               case R_3125G_REFCLK15625_XAUI:
+                       return 3125;
+               case R_103125G_REFCLK15625_KR:
+                       return 10312;
+               case R_125G_REFCLK15625_SGMII:
+                       return 1250;
+               case R_5G_REFCLK15625_QSGMII:
+                       return 5000;
+               case R_625G_REFCLK15625_RXAUI:
+                       return 6250;
+               case R_25G_REFCLK125:
+                       return 2500;
+               case R_5G_REFCLK125:
+                       return 5000;
+               case R_8G_REFCLK125:
+                       return 8000;
+               default:
+                       return 0;
+               }
+       }
+}
+
+/**
+ * Get the speed (Gbaud) of the QLM in Mhz.
+ *
+ * @param qlm    QLM to examine
+ *
+ * @return Speed in Mhz
+ */
+int cvmx_qlm_get_gbaud_mhz(int qlm)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
+               if (qlm == 2) {
+                       cvmx_gmxx_inf_mode_t inf_mode;
+
+                       inf_mode.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
+                       switch (inf_mode.s.speed) {
+                       case 0:
+                               return 5000; /* 5     Gbaud */
+                       case 1:
+                               return 2500; /* 2.5   Gbaud */
+                       case 2:
+                               return 2500; /* 2.5   Gbaud */
+                       case 3:
+                               return 1250; /* 1.25  Gbaud */
+                       case 4:
+                               return 1250; /* 1.25  Gbaud */
+                       case 5:
+                               return 6250; /* 6.25  Gbaud */
+                       case 6:
+                               return 5000; /* 5     Gbaud */
+                       case 7:
+                               return 2500; /* 2.5   Gbaud */
+                       case 8:
+                               return 3125; /* 3.125 Gbaud */
+                       case 9:
+                               return 2500; /* 2.5   Gbaud */
+                       case 10:
+                               return 1250; /* 1.25  Gbaud */
+                       case 11:
+                               return 5000; /* 5     Gbaud */
+                       case 12:
+                               return 6250; /* 6.25  Gbaud */
+                       case 13:
+                               return 3750; /* 3.75  Gbaud */
+                       case 14:
+                               return 3125; /* 3.125 Gbaud */
+                       default:
+                               return 0; /* Disabled */
+                       }
+               } else {
+                       cvmx_sriox_status_reg_t status_reg;
+
+                       status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(qlm));
+                       if (status_reg.s.srio) {
+                               cvmx_sriomaintx_port_0_ctl2_t sriomaintx_port_0_ctl2;
+
+                               sriomaintx_port_0_ctl2.u32 =
+                                       csr_rd(CVMX_SRIOMAINTX_PORT_0_CTL2(qlm));
+                               switch (sriomaintx_port_0_ctl2.s.sel_baud) {
+                               case 1:
+                                       return 1250; /* 1.25  Gbaud */
+                               case 2:
+                                       return 2500; /* 2.5   Gbaud */
+                               case 3:
+                                       return 3125; /* 3.125 Gbaud */
+                               case 4:
+                                       return 5000; /* 5     Gbaud */
+                               case 5:
+                                       return 6250; /* 6.250 Gbaud */
+                               default:
+                                       return 0; /* Disabled */
+                               }
+                       } else {
+                               cvmx_pciercx_cfg032_t pciercx_cfg032;
+
+                               pciercx_cfg032.u32 = csr_rd(CVMX_PCIERCX_CFG032(qlm));
+                               switch (pciercx_cfg032.s.ls) {
+                               case 1:
+                                       return 2500;
+                               case 2:
+                                       return 5000;
+                               case 4:
+                                       return 8000;
+                               default: {
+                                       cvmx_mio_rst_boot_t mio_rst_boot;
+
+                                       mio_rst_boot.u64 = csr_rd(CVMX_MIO_RST_BOOT);
+                                       if (qlm == 0 && mio_rst_boot.s.qlm0_spd == 0xf)
+                                               return 0;
+
+                                       if (qlm == 1 && mio_rst_boot.s.qlm1_spd == 0xf)
+                                               return 0;
+
+                                       /* Best guess I can make */
+                                       return 5000;
+                               }
+                               }
+                       }
+               }
+       } else if (OCTEON_IS_OCTEON2()) {
+               cvmx_mio_qlmx_cfg_t qlm_cfg;
+
+               qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
+               switch (qlm_cfg.s.qlm_spd) {
+               case 0:
+                       return 5000; /* 5     Gbaud */
+               case 1:
+                       return 2500; /* 2.5   Gbaud */
+               case 2:
+                       return 2500; /* 2.5   Gbaud */
+               case 3:
+                       return 1250; /* 1.25  Gbaud */
+               case 4:
+                       return 1250; /* 1.25  Gbaud */
+               case 5:
+                       return 6250; /* 6.25  Gbaud */
+               case 6:
+                       return 5000; /* 5     Gbaud */
+               case 7:
+                       return 2500; /* 2.5   Gbaud */
+               case 8:
+                       return 3125; /* 3.125 Gbaud */
+               case 9:
+                       return 2500; /* 2.5   Gbaud */
+               case 10:
+                       return 1250; /* 1.25  Gbaud */
+               case 11:
+                       return 5000; /* 5     Gbaud */
+               case 12:
+                       return 6250; /* 6.25  Gbaud */
+               case 13:
+                       return 3750; /* 3.75  Gbaud */
+               case 14:
+                       return 3125; /* 3.125 Gbaud */
+               default:
+                       return 0; /* Disabled */
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
+               u64 meas_refclock;
+               u64 freq;
+
+               /* Measure the reference clock */
+               meas_refclock = cvmx_qlm_measure_clock(qlm);
+               /* Multiply to get the final frequency */
+               mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
+               freq = meas_refclock * mpll_multiplier.s.mpll_multiplier;
+               freq = (freq + 500000) / 1000000;
+
+               return freq;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               return cvmx_qlm_get_gbaud_mhz_node(cvmx_get_node_num(), qlm);
+       } else if (OCTEON_IS_MODEL(OCTEON_CN73XX) || OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               cvmx_gserx_lane_mode_t lane_mode;
+
+               lane_mode.u64 = csr_rd(CVMX_GSERX_LANE_MODE(qlm));
+               switch (lane_mode.s.lmode) {
+               case R_25G_REFCLK100:
+                       return 2500;
+               case R_5G_REFCLK100:
+                       return 5000;
+               case R_8G_REFCLK100:
+                       return 8000;
+               case R_125G_REFCLK15625_KX:
+                       return 1250;
+               case R_3125G_REFCLK15625_XAUI:
+                       return 3125;
+               case R_103125G_REFCLK15625_KR:
+                       return 10312;
+               case R_125G_REFCLK15625_SGMII:
+                       return 1250;
+               case R_5G_REFCLK15625_QSGMII:
+                       return 5000;
+               case R_625G_REFCLK15625_RXAUI:
+                       return 6250;
+               case R_25G_REFCLK125:
+                       return 2500;
+               case R_5G_REFCLK125:
+                       return 5000;
+               case R_8G_REFCLK125:
+                       return 8000;
+               default:
+                       return 0;
+               }
+       }
+       return 0;
+}
+
+static enum cvmx_qlm_mode __cvmx_qlm_get_mode_cn70xx(int qlm)
+{
+       switch (qlm) {
+       case 0: /* DLM0/DLM1 - SGMII/QSGMII/RXAUI */
+       {
+               union cvmx_gmxx_inf_mode inf_mode0, inf_mode1;
+
+               inf_mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
+               inf_mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
+
+               /* SGMII0 SGMII1 */
+               switch (inf_mode0.s.mode) {
+               case CVMX_GMX_INF_MODE_SGMII:
+                       switch (inf_mode1.s.mode) {
+                       case CVMX_GMX_INF_MODE_SGMII:
+                               return CVMX_QLM_MODE_SGMII_SGMII;
+                       case CVMX_GMX_INF_MODE_QSGMII:
+                               return CVMX_QLM_MODE_SGMII_QSGMII;
+                       default:
+                               return CVMX_QLM_MODE_SGMII_DISABLED;
+                       }
+               case CVMX_GMX_INF_MODE_QSGMII:
+                       switch (inf_mode1.s.mode) {
+                       case CVMX_GMX_INF_MODE_SGMII:
+                               return CVMX_QLM_MODE_QSGMII_SGMII;
+                       case CVMX_GMX_INF_MODE_QSGMII:
+                               return CVMX_QLM_MODE_QSGMII_QSGMII;
+                       default:
+                               return CVMX_QLM_MODE_QSGMII_DISABLED;
+                       }
+               case CVMX_GMX_INF_MODE_RXAUI:
+                       return CVMX_QLM_MODE_RXAUI_1X2;
+               default:
+                       switch (inf_mode1.s.mode) {
+                       case CVMX_GMX_INF_MODE_SGMII:
+                               return CVMX_QLM_MODE_DISABLED_SGMII;
+                       case CVMX_GMX_INF_MODE_QSGMII:
+                               return CVMX_QLM_MODE_DISABLED_QSGMII;
+                       default:
+                               return CVMX_QLM_MODE_DISABLED;
+                       }
+               }
+       }
+       case 1: /* Sata / pem0 */
+       {
+               union cvmx_gserx_sata_cfg sata_cfg;
+               union cvmx_pemx_cfg pem0_cfg;
+
+               sata_cfg.u64 = csr_rd(CVMX_GSERX_SATA_CFG(0));
+               pem0_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+
+               switch (pem0_cfg.cn70xx.md) {
+               case CVMX_PEM_MD_GEN2_2LANE:
+               case CVMX_PEM_MD_GEN1_2LANE:
+                       return CVMX_QLM_MODE_PCIE_1X2;
+               case CVMX_PEM_MD_GEN2_1LANE:
+               case CVMX_PEM_MD_GEN1_1LANE:
+                       if (sata_cfg.s.sata_en)
+                               /* Both PEM0 and PEM1 */
+                               return CVMX_QLM_MODE_PCIE_2X1;
+
+                       /* Only PEM0 */
+                       return CVMX_QLM_MODE_PCIE_1X1;
+               case CVMX_PEM_MD_GEN2_4LANE:
+               case CVMX_PEM_MD_GEN1_4LANE:
+                       return CVMX_QLM_MODE_PCIE;
+               default:
+                       return CVMX_QLM_MODE_DISABLED;
+               }
+       }
+       case 2: {
+               union cvmx_gserx_sata_cfg sata_cfg;
+               union cvmx_pemx_cfg pem0_cfg, pem1_cfg, pem2_cfg;
+
+               sata_cfg.u64 = csr_rd(CVMX_GSERX_SATA_CFG(0));
+               pem0_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+               pem1_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
+               pem2_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
+
+               if (sata_cfg.s.sata_en)
+                       return CVMX_QLM_MODE_SATA_2X1;
+               if (pem0_cfg.cn70xx.md == CVMX_PEM_MD_GEN2_4LANE ||
+                   pem0_cfg.cn70xx.md == CVMX_PEM_MD_GEN1_4LANE)
+                       return CVMX_QLM_MODE_PCIE;
+               if (pem1_cfg.cn70xx.md == CVMX_PEM_MD_GEN2_2LANE ||
+                   pem1_cfg.cn70xx.md == CVMX_PEM_MD_GEN1_2LANE) {
+                       return CVMX_QLM_MODE_PCIE_1X2;
+               }
+               if (pem1_cfg.cn70xx.md == CVMX_PEM_MD_GEN2_1LANE ||
+                   pem1_cfg.cn70xx.md == CVMX_PEM_MD_GEN1_1LANE) {
+                       if (pem2_cfg.cn70xx.md == CVMX_PEM_MD_GEN2_1LANE ||
+                           pem2_cfg.cn70xx.md == CVMX_PEM_MD_GEN1_1LANE) {
+                               return CVMX_QLM_MODE_PCIE_2X1;
+                       } else {
+                               return CVMX_QLM_MODE_PCIE_1X1;
+                       }
+               }
+               if (pem2_cfg.cn70xx.md == CVMX_PEM_MD_GEN2_1LANE ||
+                   pem2_cfg.cn70xx.md == CVMX_PEM_MD_GEN1_1LANE)
+                       return CVMX_QLM_MODE_PCIE_2X1;
+               return CVMX_QLM_MODE_DISABLED;
+       }
+       default:
+               return CVMX_QLM_MODE_DISABLED;
+       }
+
+       return CVMX_QLM_MODE_DISABLED;
+}
+
+/*
+ * Get the DLM mode for the interface based on the interface type.
+ *
+ * @param interface_type   0 - SGMII/QSGMII/RXAUI interface
+ *                         1 - PCIe
+ *                         2 - SATA
+ * @param interface        interface to use
+ * @return  the qlm mode the interface is
+ */
+enum cvmx_qlm_mode cvmx_qlm_get_dlm_mode(int interface_type, int interface)
+{
+       switch (interface_type) {
+       case 0: /* SGMII/QSGMII/RXAUI */
+       {
+               enum cvmx_qlm_mode qlm_mode = __cvmx_qlm_get_mode_cn70xx(0);
+
+               switch (interface) {
+               case 0:
+                       switch (qlm_mode) {
+                       case CVMX_QLM_MODE_SGMII_SGMII:
+                       case CVMX_QLM_MODE_SGMII_DISABLED:
+                       case CVMX_QLM_MODE_SGMII_QSGMII:
+                               return CVMX_QLM_MODE_SGMII;
+                       case CVMX_QLM_MODE_QSGMII_QSGMII:
+                       case CVMX_QLM_MODE_QSGMII_DISABLED:
+                       case CVMX_QLM_MODE_QSGMII_SGMII:
+                               return CVMX_QLM_MODE_QSGMII;
+                       case CVMX_QLM_MODE_RXAUI_1X2:
+                               return CVMX_QLM_MODE_RXAUI;
+                       default:
+                               return CVMX_QLM_MODE_DISABLED;
+                       }
+               case 1:
+                       switch (qlm_mode) {
+                       case CVMX_QLM_MODE_SGMII_SGMII:
+                       case CVMX_QLM_MODE_DISABLED_SGMII:
+                       case CVMX_QLM_MODE_QSGMII_SGMII:
+                               return CVMX_QLM_MODE_SGMII;
+                       case CVMX_QLM_MODE_QSGMII_QSGMII:
+                       case CVMX_QLM_MODE_DISABLED_QSGMII:
+                       case CVMX_QLM_MODE_SGMII_QSGMII:
+                               return CVMX_QLM_MODE_QSGMII;
+                       default:
+                               return CVMX_QLM_MODE_DISABLED;
+                       }
+               default:
+                       return qlm_mode;
+               }
+       }
+       case 1: /* PCIe */
+       {
+               enum cvmx_qlm_mode qlm_mode1 = __cvmx_qlm_get_mode_cn70xx(1);
+               enum cvmx_qlm_mode qlm_mode2 = __cvmx_qlm_get_mode_cn70xx(2);
+
+               switch (interface) {
+               case 0: /* PCIe0 can be DLM1 with 1, 2 or 4 lanes */
+                       return qlm_mode1;
+               case 1:
+                       /*
+                        * PCIe1 can be in DLM1 1 lane(1), DLM2 1 lane(0)
+                        * or 2 lanes(0-1)
+                        */
+                       if (qlm_mode1 == CVMX_QLM_MODE_PCIE_2X1)
+                               return CVMX_QLM_MODE_PCIE_2X1;
+                       else if (qlm_mode2 == CVMX_QLM_MODE_PCIE_1X2 ||
+                                qlm_mode2 == CVMX_QLM_MODE_PCIE_2X1)
+                               return qlm_mode2;
+                       else
+                               return CVMX_QLM_MODE_DISABLED;
+               case 2: /* PCIe2 can be DLM2 1 lanes(1) */
+                       if (qlm_mode2 == CVMX_QLM_MODE_PCIE_2X1)
+                               return qlm_mode2;
+                       else
+                               return CVMX_QLM_MODE_DISABLED;
+               default:
+                       return CVMX_QLM_MODE_DISABLED;
+               }
+       }
+       case 2: /* SATA */
+       {
+               enum cvmx_qlm_mode qlm_mode = __cvmx_qlm_get_mode_cn70xx(2);
+
+               if (qlm_mode == CVMX_QLM_MODE_SATA_2X1)
+                       return CVMX_QLM_MODE_SATA_2X1;
+               else
+                       return CVMX_QLM_MODE_DISABLED;
+       }
+       default:
+               return CVMX_QLM_MODE_DISABLED;
+       }
+}
+
+static enum cvmx_qlm_mode __cvmx_qlm_get_mode_cn6xxx(int qlm)
+{
+       cvmx_mio_qlmx_cfg_t qlmx_cfg;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+               qlmx_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlmx_cfg.s.qlm_spd == 15)
+                       return CVMX_QLM_MODE_DISABLED;
+
+               switch (qlmx_cfg.s.qlm_cfg) {
+               case 0: /* PCIE */
+                       return CVMX_QLM_MODE_PCIE;
+               case 1: /* ILK */
+                       return CVMX_QLM_MODE_ILK;
+               case 2: /* SGMII */
+                       return CVMX_QLM_MODE_SGMII;
+               case 3: /* XAUI */
+                       return CVMX_QLM_MODE_XAUI;
+               case 7: /* RXAUI */
+                       return CVMX_QLM_MODE_RXAUI;
+               default:
+                       return CVMX_QLM_MODE_DISABLED;
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN66XX)) {
+               qlmx_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlmx_cfg.s.qlm_spd == 15)
+                       return CVMX_QLM_MODE_DISABLED;
+
+               switch (qlmx_cfg.s.qlm_cfg) {
+               case 0x9: /* SGMII */
+                       return CVMX_QLM_MODE_SGMII;
+               case 0xb: /* XAUI */
+                       return CVMX_QLM_MODE_XAUI;
+               case 0x0: /* PCIE gen2 */
+               case 0x8: /* PCIE gen2 (alias) */
+               case 0x2: /* PCIE gen1 */
+               case 0xa: /* PCIE gen1 (alias) */
+                       return CVMX_QLM_MODE_PCIE;
+               case 0x1: /* SRIO 1x4 short */
+               case 0x3: /* SRIO 1x4 long */
+                       return CVMX_QLM_MODE_SRIO_1X4;
+               case 0x4: /* SRIO 2x2 short */
+               case 0x6: /* SRIO 2x2 long */
+                       return CVMX_QLM_MODE_SRIO_2X2;
+               case 0x5: /* SRIO 4x1 short */
+               case 0x7: /* SRIO 4x1 long */
+                       if (!OCTEON_IS_MODEL(OCTEON_CN66XX_PASS1_0))
+                               return CVMX_QLM_MODE_SRIO_4X1;
+                       fallthrough;
+               default:
+                       return CVMX_QLM_MODE_DISABLED;
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
+               cvmx_sriox_status_reg_t status_reg;
+               /* For now skip qlm2 */
+               if (qlm == 2) {
+                       cvmx_gmxx_inf_mode_t inf_mode;
+
+                       inf_mode.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
+                       if (inf_mode.s.speed == 15)
+                               return CVMX_QLM_MODE_DISABLED;
+                       else if (inf_mode.s.mode == 0)
+                               return CVMX_QLM_MODE_SGMII;
+                       else
+                               return CVMX_QLM_MODE_XAUI;
+               }
+               status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(qlm));
+               if (status_reg.s.srio)
+                       return CVMX_QLM_MODE_SRIO_1X4;
+               else
+                       return CVMX_QLM_MODE_PCIE;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN61XX)) {
+               qlmx_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlmx_cfg.s.qlm_spd == 15)
+                       return CVMX_QLM_MODE_DISABLED;
+
+               switch (qlm) {
+               case 0:
+                       switch (qlmx_cfg.s.qlm_cfg) {
+                       case 0: /* PCIe 1x4 gen2 / gen1 */
+                               return CVMX_QLM_MODE_PCIE;
+                       case 2: /* SGMII */
+                               return CVMX_QLM_MODE_SGMII;
+                       case 3: /* XAUI */
+                               return CVMX_QLM_MODE_XAUI;
+                       default:
+                               return CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               case 1:
+                       switch (qlmx_cfg.s.qlm_cfg) {
+                       case 0: /* PCIe 1x2 gen2 / gen1 */
+                               return CVMX_QLM_MODE_PCIE_1X2;
+                       case 1: /* PCIe 2x1 gen2 / gen1 */
+                               return CVMX_QLM_MODE_PCIE_2X1;
+                       default:
+                               return CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               case 2:
+                       switch (qlmx_cfg.s.qlm_cfg) {
+                       case 2: /* SGMII */
+                               return CVMX_QLM_MODE_SGMII;
+                       case 3: /* XAUI */
+                               return CVMX_QLM_MODE_XAUI;
+                       default:
+                               return CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CNF71XX)) {
+               qlmx_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
+               /* QLM is disabled when QLM SPD is 15. */
+               if (qlmx_cfg.s.qlm_spd == 15)
+                       return CVMX_QLM_MODE_DISABLED;
+
+               switch (qlm) {
+               case 0:
+                       if (qlmx_cfg.s.qlm_cfg == 2) /* SGMII */
+                               return CVMX_QLM_MODE_SGMII;
+                       break;
+               case 1:
+                       switch (qlmx_cfg.s.qlm_cfg) {
+                       case 0: /* PCIe 1x2 gen2 / gen1 */
+                               return CVMX_QLM_MODE_PCIE_1X2;
+                       case 1: /* PCIe 2x1 gen2 / gen1 */
+                               return CVMX_QLM_MODE_PCIE_2X1;
+                       default:
+                               return CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               }
+       }
+       return CVMX_QLM_MODE_DISABLED;
+}
+
+/**
+ * @INTERNAL
+ * Decrement the MPLL Multiplier for the DLM as per Errata G-20669
+ *
+ * @param qlm            DLM to configure
+ * @param baud_mhz       Speed of the DLM configured at
+ * @param old_multiplier MPLL_MULTIPLIER value to decrement
+ */
+void __cvmx_qlm_set_mult(int qlm, int baud_mhz, int old_multiplier)
+{
+       cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
+       cvmx_gserx_dlmx_ref_clkdiv2_t clkdiv;
+       u64 meas_refclock, mult;
+
+       if (!OCTEON_IS_MODEL(OCTEON_CN70XX))
+               return;
+
+       if (qlm == -1)
+               return;
+
+       meas_refclock = cvmx_qlm_measure_clock(qlm);
+       if (meas_refclock == 0) {
+               printf("DLM%d: Reference clock not running\n", qlm);
+               return;
+       }
+
+       /*
+        * The baud rate multiplier needs to be adjusted on the CN70XX if
+        * the reference clock is > 100MHz.
+        */
+       if (qlm == 0) {
+               clkdiv.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
+               if (clkdiv.s.ref_clkdiv2)
+                       baud_mhz *= 2;
+       }
+       mult = (uint64_t)baud_mhz * 1000000 + (meas_refclock / 2);
+       mult /= meas_refclock;
+
+       /*
+        * 6. Decrease MPLL_MULTIPLIER by one continually until it reaches
+        * the desired long-term setting, ensuring that each MPLL_MULTIPLIER
+        * value is constant for at least 1 msec before changing to the next
+        * value. The desired long-term setting is as indicated in HRM tables
+        * 21-1, 21-2, and 21-3. This is not required with the HRM
+        * sequence.
+        */
+       do {
+               mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
+               mpll_multiplier.s.mpll_multiplier = --old_multiplier;
+               csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
+               /* Wait for 1 ms */
+               udelay(1000);
+       } while (old_multiplier > (int)mult);
+}
+
+enum cvmx_qlm_mode cvmx_qlm_get_mode_cn78xx(int node, int qlm)
+{
+       cvmx_gserx_cfg_t gserx_cfg;
+       int qlm_mode[2][9] = { { -1, -1, -1, -1, -1, -1, -1, -1 },
+                              { -1, -1, -1, -1, -1, -1, -1, -1 } };
+
+       if (qlm >= 8)
+               return CVMX_QLM_MODE_OCI;
+
+       if (qlm_mode[node][qlm] != -1)
+               return qlm_mode[node][qlm];
+
+       gserx_cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
+       if (gserx_cfg.s.pcie) {
+               switch (qlm) {
+               case 0: /* Either PEM0 x4 or PEM0 x8 */
+               case 1: /* Either PEM0 x8 or PEM1 x4 */
+               {
+                       cvmx_pemx_cfg_t pemx_cfg;
+
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM0 x8 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else {
+                               /* PEM0 x4 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       break;
+               }
+               case 2: /* Either PEM2 x4 or PEM2 x8 */
+               {
+                       cvmx_pemx_cfg_t pemx_cfg;
+
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM2 x8 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else {
+                               /* PEM2 x4 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       break;
+               }
+               case 3: /* Either PEM2 x8 or PEM3 x4 or PEM3 x8 */
+               {
+                       cvmx_pemx_cfg_t pemx_cfg;
+
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM2 x8 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       }
+
+                       /* Can be first 4 lanes of PEM3 */
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM3 x8 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else {
+                               /* PEM2 x4 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       break;
+               }
+               case 4: /* Either PEM3 x8 or PEM3 x4 */
+               {
+                       cvmx_pemx_cfg_t pemx_cfg;
+
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM3 x8 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else {
+                               /* PEM3 x4 */
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       break;
+               }
+               default:
+                       qlm_mode[node][qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               }
+       } else if (gserx_cfg.s.ila) {
+               qlm_mode[node][qlm] = CVMX_QLM_MODE_ILK;
+       } else if (gserx_cfg.s.bgx) {
+               cvmx_bgxx_cmrx_config_t cmr_config;
+               cvmx_bgxx_spux_br_pmd_control_t pmd_control;
+               int bgx = (qlm < 2) ? qlm : qlm - 2;
+
+               cmr_config.u64 = csr_rd_node(node, CVMX_BGXX_CMRX_CONFIG(0, bgx));
+               pmd_control.u64 = csr_rd_node(node, CVMX_BGXX_SPUX_BR_PMD_CONTROL(0, bgx));
+
+               switch (cmr_config.s.lmac_type) {
+               case 0:
+                       qlm_mode[node][qlm] = CVMX_QLM_MODE_SGMII;
+                       break;
+               case 1:
+                       qlm_mode[node][qlm] = CVMX_QLM_MODE_XAUI;
+                       break;
+               case 2:
+                       qlm_mode[node][qlm] = CVMX_QLM_MODE_RXAUI;
+                       break;
+               case 3:
+                       /*
+                        * Use training to determine if we're in 10GBASE-KR
+                        * or XFI
+                        */
+                       if (pmd_control.s.train_en)
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_10G_KR;
+                       else
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_XFI;
+                       break;
+               case 4:
+                       /*
+                        * Use training to determine if we're in 40GBASE-KR
+                        * or XLAUI
+                        */
+                       if (pmd_control.s.train_en)
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_40G_KR4;
+                       else
+                               qlm_mode[node][qlm] = CVMX_QLM_MODE_XLAUI;
+                       break;
+               default:
+                       qlm_mode[node][qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               }
+       } else {
+               qlm_mode[node][qlm] = CVMX_QLM_MODE_DISABLED;
+       }
+
+       return qlm_mode[node][qlm];
+}
+
+enum cvmx_qlm_mode __cvmx_qlm_get_mode_cn73xx(int qlm)
+{
+       cvmx_gserx_cfg_t gserx_cfg;
+       int qlm_mode[7] = { -1, -1, -1, -1, -1, -1, -1 };
+
+       if (qlm_mode[qlm] != -1)
+               return qlm_mode[qlm];
+
+       if (qlm > 6) {
+               debug("Invalid QLM(%d) passed\n", qlm);
+               return -1;
+       }
+
+       gserx_cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+       if (gserx_cfg.s.pcie) {
+               cvmx_pemx_cfg_t pemx_cfg;
+
+               switch (qlm) {
+               case 0: /* Either PEM0 x4 or PEM0 x8 */
+               case 1: /* Either PEM0 x8 or PEM1 x4 */
+               {
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM0 x8 */
+                               qlm_mode[qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else {
+                               /* PEM0/PEM1 x4 */
+                               qlm_mode[qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       break;
+               }
+               case 2: /* Either PEM2 x4 or PEM2 x8 */
+               {
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM2 x8 */
+                               qlm_mode[qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else {
+                               /* PEM2 x4 */
+                               qlm_mode[qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       break;
+               }
+               case 5:
+               case 6:                                         /* PEM3 x2 */
+                       qlm_mode[qlm] = CVMX_QLM_MODE_PCIE_1X2; /* PEM3 x2 */
+                       break;
+               case 3: /* Either PEM2 x8 or PEM3 x4 */
+               {
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* PEM2 x8 */
+                               qlm_mode[qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else {
+                               /* PEM3 x4 */
+                               qlm_mode[qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       break;
+               }
+               default:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               }
+       } else if (gserx_cfg.s.bgx) {
+               cvmx_bgxx_cmrx_config_t cmr_config;
+               cvmx_bgxx_cmr_rx_lmacs_t bgx_cmr_rx_lmacs;
+               cvmx_bgxx_spux_br_pmd_control_t pmd_control;
+               int bgx = 0;
+               int start = 0, end = 4, index;
+               int lane_mask = 0, train_mask = 0;
+               int mux = 0; // 0:BGX2 (DLM5/DLM6), 1:BGX2(DLM5), 2:BGX2(DLM6)
+
+               if (qlm < 4) {
+                       bgx = qlm - 2;
+               } else if (qlm == 5 || qlm == 6) {
+                       bgx = 2;
+                       mux = cvmx_qlm_mux_interface(bgx);
+                       if (mux == 0) {
+                               start = 0;
+                               end = 4;
+                       } else if (mux == 1) {
+                               start = 0;
+                               end = 2;
+                       } else if (mux == 2) {
+                               start = 2;
+                               end = 4;
+                       } else {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                               return qlm_mode[qlm];
+                       }
+               }
+
+               for (index = start; index < end; index++) {
+                       cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, bgx));
+                       pmd_control.u64 = csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
+                       lane_mask |= (cmr_config.s.lmac_type << (index * 4));
+                       train_mask |= (pmd_control.s.train_en << (index * 4));
+               }
+
+               /* Need to include DLM5 lmacs when only DLM6 DLM is used */
+               if (mux == 2)
+                       bgx_cmr_rx_lmacs.u64 = csr_rd(CVMX_BGXX_CMR_RX_LMACS(2));
+               switch (lane_mask) {
+               case 0:
+                       if (mux == 1) {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_SGMII_2X1;
+                       } else if (mux == 2) {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_SGMII_2X1;
+                               bgx_cmr_rx_lmacs.s.lmacs = 4;
+                       }
+                       qlm_mode[qlm] = CVMX_QLM_MODE_SGMII;
+                       break;
+               case 0x1:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_XAUI;
+                       break;
+               case 0x2:
+                       if (mux == 1) {
+                               // NONE+RXAUI
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RXAUI_1X2;
+                       } else if (mux == 0) {
+                               // RXAUI+SGMII
+                               qlm_mode[qlm] = CVMX_QLM_MODE_MIXED;
+                       } else {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               case 0x202:
+                       if (mux == 2) {
+                               // RXAUI+RXAUI
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RXAUI_1X2;
+                               bgx_cmr_rx_lmacs.s.lmacs = 4;
+                       } else if (mux == 1) {
+                               // RXAUI+RXAUI
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RXAUI_1X2;
+                       } else if (mux == 0) {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RXAUI;
+                       } else {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               case 0x22:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_RXAUI;
+                       break;
+               case 0x3333:
+                       /*
+                        * Use training to determine if we're in 10GBASE-KR
+                        * or XFI
+                        */
+                       if (train_mask)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_10G_KR;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_XFI;
+                       break;
+               case 0x4:
+                       /*
+                        * Use training to determine if we're in 40GBASE-KR
+                        * or XLAUI
+                        */
+                       if (train_mask)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_40G_KR4;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_XLAUI;
+                       break;
+               case 0x0005:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_SGMII;
+                       break;
+               case 0x3335:
+                       if (train_mask)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_10G_KR;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_XFI;
+                       break;
+               case 0x45:
+                       if (train_mask)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_40G_KR4;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_XLAUI;
+                       break;
+               case 0x225:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_RXAUI;
+                       break;
+               case 0x15:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_XAUI;
+                       break;
+
+               case 0x200:
+                       if (mux == 2) {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RXAUI_1X2;
+                               bgx_cmr_rx_lmacs.s.lmacs = 4;
+                       } else
+               case 0x205:
+               case 0x233:
+               case 0x3302:
+               case 0x3305:
+                       if (mux == 0)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_MIXED;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               case 0x3300:
+                       if (mux == 0) {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_MIXED;
+                       } else if (mux == 2) {
+                               if (train_mask)
+                                       qlm_mode[qlm] = CVMX_QLM_MODE_10G_KR_1X2;
+                               else
+                                       qlm_mode[qlm] = CVMX_QLM_MODE_XFI_1X2;
+                               bgx_cmr_rx_lmacs.s.lmacs = 4;
+                       } else {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               case 0x33:
+                       if (mux == 1 || mux == 2) {
+                               if (train_mask)
+                                       qlm_mode[qlm] = CVMX_QLM_MODE_10G_KR_1X2;
+                               else
+                                       qlm_mode[qlm] = CVMX_QLM_MODE_XFI_1X2;
+                               if (mux == 2)
+                                       bgx_cmr_rx_lmacs.s.lmacs = 4;
+                       } else {
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       }
+                       break;
+               case 0x0035:
+                       if (mux == 0)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_MIXED;
+                       else if (train_mask)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_10G_KR_1X1;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_RGMII_XFI_1X1;
+                       break;
+               case 0x235:
+                       if (mux == 0)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_MIXED;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               default:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               }
+               if (mux == 2) {
+                       csr_wr(CVMX_BGXX_CMR_RX_LMACS(2), bgx_cmr_rx_lmacs.u64);
+                       csr_wr(CVMX_BGXX_CMR_TX_LMACS(2), bgx_cmr_rx_lmacs.u64);
+               }
+       } else if (gserx_cfg.s.sata) {
+               qlm_mode[qlm] = CVMX_QLM_MODE_SATA_2X1;
+       } else {
+               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+       }
+
+       return qlm_mode[qlm];
+}
+
+enum cvmx_qlm_mode __cvmx_qlm_get_mode_cnf75xx(int qlm)
+{
+       cvmx_gserx_cfg_t gserx_cfg;
+       int qlm_mode[9] = { -1, -1, -1, -1, -1, -1, -1 };
+
+       if (qlm_mode[qlm] != -1)
+               return qlm_mode[qlm];
+
+       if (qlm > 9) {
+               debug("Invalid QLM(%d) passed\n", qlm);
+               return -1;
+       }
+
+       if ((qlm == 2 || qlm == 3) && (OCTEON_IS_MODEL(OCTEON_CNF75XX))) {
+               cvmx_sriox_status_reg_t status_reg;
+               int port = (qlm == 2) ? 0 : 1;
+
+               status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(port));
+               /* FIXME add different width */
+               if (status_reg.s.srio)
+                       qlm_mode[qlm] = CVMX_QLM_MODE_SRIO_1X4;
+               else
+                       qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+               return qlm_mode[qlm];
+       }
+
+       gserx_cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+       if (gserx_cfg.s.pcie) {
+               switch (qlm) {
+               case 0: /* Either PEM0 x2 or PEM0 x4 */
+               case 1: /* Either PEM1 x2 or PEM0 x4 */
+               {
+                       /* FIXME later */
+                       qlm_mode[qlm] = CVMX_QLM_MODE_PCIE;
+                       break;
+               }
+               default:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               }
+       } else if (gserx_cfg.s.bgx) {
+               cvmx_bgxx_cmrx_config_t cmr_config;
+               cvmx_bgxx_spux_br_pmd_control_t pmd_control;
+               int bgx = 0;
+               int start = 0, end = 4, index;
+               int lane_mask = 0, train_mask = 0;
+               int mux = 0; // 0:BGX0 (DLM4/DLM5), 1:BGX0(DLM4), 2:BGX0(DLM5)
+               cvmx_gserx_cfg_t gser1, gser2;
+
+               gser1.u64 = csr_rd(CVMX_GSERX_CFG(4));
+               gser2.u64 = csr_rd(CVMX_GSERX_CFG(5));
+               if (gser1.s.bgx && gser2.s.bgx) {
+                       start = 0;
+                       end = 4;
+               } else if (gser1.s.bgx) {
+                       start = 0;
+                       end = 2;
+                       mux = 1;
+               } else if (gser2.s.bgx) {
+                       start = 2;
+                       end = 4;
+                       mux = 2;
+               } else {
+                       qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       return qlm_mode[qlm];
+               }
+
+               for (index = start; index < end; index++) {
+                       cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, bgx));
+                       pmd_control.u64 = csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
+                       lane_mask |= (cmr_config.s.lmac_type << (index * 4));
+                       train_mask |= (pmd_control.s.train_en << (index * 4));
+               }
+
+               switch (lane_mask) {
+               case 0:
+                       if (mux == 1 || mux == 2)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_SGMII_2X1;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_SGMII;
+                       break;
+               case 0x3300:
+                       if (mux == 0)
+                               qlm_mode[qlm] = CVMX_QLM_MODE_MIXED;
+                       else if (mux == 2)
+                               if (train_mask)
+                                       qlm_mode[qlm] = CVMX_QLM_MODE_10G_KR_1X2;
+                               else
+                                       qlm_mode[qlm] = CVMX_QLM_MODE_XFI_1X2;
+                       else
+                               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               default:
+                       qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+                       break;
+               }
+       } else {
+               qlm_mode[qlm] = CVMX_QLM_MODE_DISABLED;
+       }
+
+       return qlm_mode[qlm];
+}
+
+/*
+ * Read QLM and return mode.
+ */
+enum cvmx_qlm_mode cvmx_qlm_get_mode(int qlm)
+{
+       if (OCTEON_IS_OCTEON2())
+               return __cvmx_qlm_get_mode_cn6xxx(qlm);
+       else if (OCTEON_IS_MODEL(OCTEON_CN70XX))
+               return __cvmx_qlm_get_mode_cn70xx(qlm);
+       else if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return cvmx_qlm_get_mode_cn78xx(cvmx_get_node_num(), qlm);
+       else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return __cvmx_qlm_get_mode_cn73xx(qlm);
+       else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return __cvmx_qlm_get_mode_cnf75xx(qlm);
+
+       return CVMX_QLM_MODE_DISABLED;
+}
+
+int cvmx_qlm_measure_clock_cn7xxx(int node, int qlm)
+{
+       cvmx_gserx_cfg_t cfg;
+       cvmx_gserx_refclk_sel_t refclk_sel;
+       cvmx_gserx_lane_mode_t lane_mode;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX)) {
+               if (node != 0 || qlm >= 7)
+                       return -1;
+       } else if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               if (qlm >= 8 || node > 1)
+                       return -1; /* FIXME for OCI */
+       } else {
+               debug("%s: Unsupported OCTEON model\n", __func__);
+               return -1;
+       }
+
+       cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
+
+       if (cfg.s.pcie) {
+               refclk_sel.u64 = csr_rd_node(node, CVMX_GSERX_REFCLK_SEL(qlm));
+               if (refclk_sel.s.pcie_refclk125)
+                       return REF_125MHZ; /* Ref 125 Mhz */
+               else
+                       return REF_100MHZ; /* Ref 100Mhz */
+       }
+
+       lane_mode.u64 = csr_rd_node(node, CVMX_GSERX_LANE_MODE(qlm));
+       switch (lane_mode.s.lmode) {
+       case R_25G_REFCLK100:
+               return REF_100MHZ;
+       case R_5G_REFCLK100:
+               return REF_100MHZ;
+       case R_8G_REFCLK100:
+               return REF_100MHZ;
+       case R_125G_REFCLK15625_KX:
+               return REF_156MHZ;
+       case R_3125G_REFCLK15625_XAUI:
+               return REF_156MHZ;
+       case R_103125G_REFCLK15625_KR:
+               return REF_156MHZ;
+       case R_125G_REFCLK15625_SGMII:
+               return REF_156MHZ;
+       case R_5G_REFCLK15625_QSGMII:
+               return REF_156MHZ;
+       case R_625G_REFCLK15625_RXAUI:
+               return REF_156MHZ;
+       case R_25G_REFCLK125:
+               return REF_125MHZ;
+       case R_5G_REFCLK125:
+               return REF_125MHZ;
+       case R_8G_REFCLK125:
+               return REF_125MHZ;
+       default:
+               return 0;
+       }
+}
+
+/**
+ * Measure the reference clock of a QLM on a multi-node setup
+ *
+ * @param node   node to measure
+ * @param qlm    QLM to measure
+ *
+ * @return Clock rate in Hz
+ */
+int cvmx_qlm_measure_clock_node(int node, int qlm)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_MULTINODE))
+               return cvmx_qlm_measure_clock_cn7xxx(node, qlm);
+       else
+               return cvmx_qlm_measure_clock(qlm);
+}
+
+/**
+ * Measure the reference clock of a QLM
+ *
+ * @param qlm    QLM to measure
+ *
+ * @return Clock rate in Hz
+ */
+int cvmx_qlm_measure_clock(int qlm)
+{
+       cvmx_mio_ptp_clock_cfg_t ptp_clock;
+       u64 count;
+       u64 start_cycle, stop_cycle;
+       int evcnt_offset = 0x10;
+       int incr_count = 1;
+       int ref_clock[16] = { 0 };
+
+       if (ref_clock[qlm])
+               return ref_clock[qlm];
+
+       if (OCTEON_IS_OCTEON3() && !OCTEON_IS_MODEL(OCTEON_CN70XX))
+               return cvmx_qlm_measure_clock_cn7xxx(cvmx_get_node_num(), qlm);
+
+       if (OCTEON_IS_MODEL(OCTEON_CN70XX) && qlm == 0) {
+               cvmx_gserx_dlmx_ref_clkdiv2_t ref_clkdiv2;
+
+               ref_clkdiv2.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
+               if (ref_clkdiv2.s.ref_clkdiv2)
+                       incr_count = 2;
+       }
+
+       /* Fix reference clock for OCI QLMs */
+
+       /* Disable the PTP event counter while we configure it */
+       ptp_clock.u64 = csr_rd(CVMX_MIO_PTP_CLOCK_CFG); /* For CN63XXp1 errata */
+       ptp_clock.s.evcnt_en = 0;
+       csr_wr(CVMX_MIO_PTP_CLOCK_CFG, ptp_clock.u64);
+
+       /* Count on rising edge, Choose which QLM to count */
+       ptp_clock.u64 = csr_rd(CVMX_MIO_PTP_CLOCK_CFG); /* For CN63XXp1 errata */
+       ptp_clock.s.evcnt_edge = 0;
+       ptp_clock.s.evcnt_in = evcnt_offset + qlm;
+       csr_wr(CVMX_MIO_PTP_CLOCK_CFG, ptp_clock.u64);
+
+       /* Clear MIO_PTP_EVT_CNT */
+       csr_rd(CVMX_MIO_PTP_EVT_CNT); /* For CN63XXp1 errata */
+       count = csr_rd(CVMX_MIO_PTP_EVT_CNT);
+       csr_wr(CVMX_MIO_PTP_EVT_CNT, -count);
+
+       /* Set MIO_PTP_EVT_CNT to 1 billion */
+       csr_wr(CVMX_MIO_PTP_EVT_CNT, 1000000000);
+
+       /* Enable the PTP event counter */
+       ptp_clock.u64 = csr_rd(CVMX_MIO_PTP_CLOCK_CFG); /* For CN63XXp1 errata */
+       ptp_clock.s.evcnt_en = 1;
+       csr_wr(CVMX_MIO_PTP_CLOCK_CFG, ptp_clock.u64);
+
+       start_cycle = get_ticks();
+       /* Wait for 50ms */
+       mdelay(50);
+
+       /* Read the counter */
+       csr_rd(CVMX_MIO_PTP_EVT_CNT); /* For CN63XXp1 errata */
+       count = csr_rd(CVMX_MIO_PTP_EVT_CNT);
+       stop_cycle = get_ticks();
+
+       /* Disable the PTP event counter */
+       ptp_clock.u64 = csr_rd(CVMX_MIO_PTP_CLOCK_CFG); /* For CN63XXp1 errata */
+       ptp_clock.s.evcnt_en = 0;
+       csr_wr(CVMX_MIO_PTP_CLOCK_CFG, ptp_clock.u64);
+
+       /* Clock counted down, so reverse it */
+       count = 1000000000 - count;
+       count *= incr_count;
+
+       /* Return the rate */
+       ref_clock[qlm] = count * gd->cpu_clk / (stop_cycle - start_cycle);
+
+       return ref_clock[qlm];
+}
+
+/*
+ * Perform RX equalization on a QLM
+ *
+ * @param node Node the QLM is on
+ * @param qlm  QLM to perform RX equalization on
+ * @param lane Lane to use, or -1 for all lanes
+ *
+ * @return Zero on success, negative if any lane failed RX equalization
+ */
+int __cvmx_qlm_rx_equalization(int node, int qlm, int lane)
+{
+       cvmx_gserx_phy_ctl_t phy_ctl;
+       cvmx_gserx_br_rxx_ctl_t rxx_ctl;
+       cvmx_gserx_br_rxx_eer_t rxx_eer;
+       cvmx_gserx_rx_eie_detsts_t eie_detsts;
+       int fail, gbaud, l, lane_mask;
+       enum cvmx_qlm_mode mode;
+       int max_lanes = cvmx_qlm_get_lanes(qlm);
+       cvmx_gserx_lane_mode_t lmode;
+       cvmx_gserx_lane_px_mode_1_t pmode_1;
+       int pending = 0;
+       u64 timeout;
+
+       /* Don't touch QLMs if it is reset or powered down */
+       phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
+       if (phy_ctl.s.phy_pd || phy_ctl.s.phy_reset)
+               return -1;
+
+       /*
+        * Check whether GSER PRBS pattern matcher is enabled on any of the
+        * applicable lanes. Can't complete RX Equalization while pattern
+        * matcher is enabled because it causes errors
+        */
+       for (l = 0; l < max_lanes; l++) {
+               cvmx_gserx_lanex_lbert_cfg_t lbert_cfg;
+
+               if (lane != -1 && lane != l)
+                       continue;
+
+               lbert_cfg.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_LBERT_CFG(l, qlm));
+               if (lbert_cfg.s.lbert_pm_en == 1)
+                       return -1;
+       }
+
+       /* Get Lane Mode */
+       lmode.u64 = csr_rd_node(node, CVMX_GSERX_LANE_MODE(qlm));
+
+       /*
+        * Check to see if in VMA manual mode is set. If in VMA manual mode
+        * don't complete rx equalization
+        */
+       pmode_1.u64 = csr_rd_node(node, CVMX_GSERX_LANE_PX_MODE_1(lmode.s.lmode, qlm));
+       if (pmode_1.s.vma_mm == 1) {
+#ifdef DEBUG_QLM
+               debug("N%d:QLM%d: VMA Manual (manual DFE) selected. Not completing Rx equalization\n",
+                     node, qlm);
+#endif
+               return 0;
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX)) {
+               gbaud = cvmx_qlm_get_gbaud_mhz_node(node, qlm);
+               mode = cvmx_qlm_get_mode_cn78xx(node, qlm);
+       } else {
+               gbaud = cvmx_qlm_get_gbaud_mhz(qlm);
+               mode = cvmx_qlm_get_mode(qlm);
+       }
+
+       /* Apply RX Equalization for speed >= 8G */
+       if (qlm < 8) {
+               if (gbaud < 6250)
+                       return 0;
+       }
+
+       /* Don't run on PCIe Links */
+       if (mode == CVMX_QLM_MODE_PCIE || mode == CVMX_QLM_MODE_PCIE_1X8 ||
+           mode == CVMX_QLM_MODE_PCIE_1X2 || mode == CVMX_QLM_MODE_PCIE_2X1)
+               return -1;
+
+       fail = 0;
+
+       /*
+        * Before completing Rx equalization wait for
+        * GSERx_RX_EIE_DETSTS[CDRLOCK] to be set.
+        * This ensures the rx data is valid
+        */
+       if (lane == -1) {
+               /*
+                * check all 4 Lanes (cdrlock = 1111/b) for CDR Lock with
+                * lane == -1
+                */
+               if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_RX_EIE_DETSTS(qlm),
+                                              cvmx_gserx_rx_eie_detsts_t, cdrlock, ==,
+                                              (1 << max_lanes) - 1, 500)) {
+#ifdef DEBUG_QLM
+                       eie_detsts.u64 = csr_rd_node(node, CVMX_GSERX_RX_EIE_DETSTS(qlm));
+                       debug("ERROR: %d:QLM%d: CDR Lock not detected for all 4 lanes. CDR_LOCK(0x%x)\n",
+                             node, qlm, eie_detsts.s.cdrlock);
+#endif
+                       return -1;
+               }
+       } else {
+               if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_RX_EIE_DETSTS(qlm),
+                                              cvmx_gserx_rx_eie_detsts_t, cdrlock, &, (1 << lane),
+                                              500)) {
+#ifdef DEBUG_QLM
+                       eie_detsts.u64 = csr_rd_node(node, CVMX_GSERX_RX_EIE_DETSTS(qlm));
+                       debug("ERROR: %d:QLM%d: CDR Lock not detected for Lane%d CDR_LOCK(0x%x)\n",
+                             node, qlm, lane, eie_detsts.s.cdrlock);
+#endif
+                       return -1;
+               }
+       }
+
+       /*
+        * Errata (GSER-20075) GSER(0..13)_BR_RX3_EER[RXT_ERR] is
+        * GSER(0..13)_BR_RX2_EER[RXT_ERR]. Since lanes 2-3 trigger at the
+        * same time, we need to setup lane 3 before we loop through the lanes
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) && (lane == -1 || lane == 3)) {
+               /* Enable software control */
+               rxx_ctl.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_CTL(3, qlm));
+               rxx_ctl.s.rxt_swm = 1;
+               csr_wr_node(node, CVMX_GSERX_BR_RXX_CTL(3, qlm), rxx_ctl.u64);
+
+               /* Clear the completion flag */
+               rxx_eer.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_EER(3, qlm));
+               rxx_eer.s.rxt_esv = 0;
+               csr_wr_node(node, CVMX_GSERX_BR_RXX_EER(3, qlm), rxx_eer.u64);
+               /* Initiate a new request on lane 2 */
+               if (lane == 3) {
+                       rxx_eer.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_EER(2, qlm));
+                       rxx_eer.s.rxt_eer = 1;
+                       csr_wr_node(node, CVMX_GSERX_BR_RXX_EER(2, qlm), rxx_eer.u64);
+               }
+       }
+
+       for (l = 0; l < max_lanes; l++) {
+               if (lane != -1 && lane != l)
+                       continue;
+
+               /*
+                * Skip lane 3 on 78p1.x due to Errata (GSER-20075).
+                * Handled above
+                */
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) && l == 3) {
+                       /*
+                        * Need to add lane 3 to pending list for 78xx
+                        * pass 1.x
+                        */
+                       pending |= 1 << 3;
+                       continue;
+               }
+               /* Enable software control */
+               rxx_ctl.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_CTL(l, qlm));
+               rxx_ctl.s.rxt_swm = 1;
+               csr_wr_node(node, CVMX_GSERX_BR_RXX_CTL(l, qlm), rxx_ctl.u64);
+
+               /* Clear the completion flag and initiate a new request */
+               rxx_eer.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_EER(l, qlm));
+               rxx_eer.s.rxt_esv = 0;
+               rxx_eer.s.rxt_eer = 1;
+               csr_wr_node(node, CVMX_GSERX_BR_RXX_EER(l, qlm), rxx_eer.u64);
+               pending |= 1 << l;
+       }
+
+       /*
+        * Wait for 250ms, approx 10x times measured value, as XFI/XLAUI
+        * can take 21-23ms, other interfaces can take 2-3ms.
+        */
+       timeout = get_timer(0);
+
+       lane_mask = 0;
+       while (pending) {
+               /* Wait for RX equalization to complete */
+               for (l = 0; l < max_lanes; l++) {
+                       lane_mask = 1 << l;
+                       /* Only check lanes that are pending */
+                       if (!(pending & lane_mask))
+                               continue;
+
+                       /*
+                        * Read the registers for checking Electrical Idle/CDR
+                        * lock and the status of the RX equalization
+                        */
+                       eie_detsts.u64 = csr_rd_node(node, CVMX_GSERX_RX_EIE_DETSTS(qlm));
+                       rxx_eer.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_EER(l, qlm));
+
+                       /*
+                        * Mark failure if lane entered Electrical Idle or lost
+                        * CDR Lock. The bit for the lane will have cleared in
+                        * either EIESTS or CDRLOCK
+                        */
+                       if (!(eie_detsts.s.eiests & eie_detsts.s.cdrlock & lane_mask)) {
+                               fail |= lane_mask;
+                               pending &= ~lane_mask;
+                       } else if (rxx_eer.s.rxt_esv) {
+                               pending &= ~lane_mask;
+                       }
+               }
+
+               /* Breakout of the loop on timeout */
+               if (get_timer(timeout) > 250)
+                       break;
+       }
+
+       lane_mask = 0;
+       /* Cleanup and report status */
+       for (l = 0; l < max_lanes; l++) {
+               if (lane != -1 && lane != l)
+                       continue;
+
+               lane_mask = 1 << l;
+               rxx_eer.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_EER(l, qlm));
+               /* Switch back to hardware control */
+               rxx_ctl.u64 = csr_rd_node(node, CVMX_GSERX_BR_RXX_CTL(l, qlm));
+               rxx_ctl.s.rxt_swm = 0;
+               csr_wr_node(node, CVMX_GSERX_BR_RXX_CTL(l, qlm), rxx_ctl.u64);
+
+               /* Report status */
+               if (fail & lane_mask) {
+#ifdef DEBUG_QLM
+                       debug("%d:QLM%d: Lane%d RX equalization lost CDR Lock or entered Electrical Idle\n",
+                             node, qlm, l);
+#endif
+               } else if ((pending & lane_mask) || !rxx_eer.s.rxt_esv) {
+#ifdef DEBUG_QLM
+                       debug("%d:QLM%d: Lane %d RX equalization timeout\n", node, qlm, l);
+#endif
+                       fail |= 1 << l;
+               } else {
+#ifdef DEBUG_QLM
+                       char *dir_label[4] = { "Hold", "Inc", "Dec", "Hold" };
+#ifdef DEBUG_QLM_RX
+                       cvmx_gserx_lanex_rx_aeq_out_0_t rx_aeq_out_0;
+                       cvmx_gserx_lanex_rx_aeq_out_1_t rx_aeq_out_1;
+                       cvmx_gserx_lanex_rx_aeq_out_2_t rx_aeq_out_2;
+                       cvmx_gserx_lanex_rx_vma_status_0_t rx_vma_status_0;
+#endif
+                       debug("%d:QLM%d: Lane%d: RX equalization completed.\n", node, qlm, l);
+                       debug("    Tx Direction Hints TXPRE: %s, TXMAIN: %s, TXPOST: %s, Figure of Merit: %d\n",
+                             dir_label[(rxx_eer.s.rxt_esm) & 0x3],
+                             dir_label[((rxx_eer.s.rxt_esm) >> 2) & 0x3],
+                             dir_label[((rxx_eer.s.rxt_esm) >> 4) & 0x3], rxx_eer.s.rxt_esm >> 6);
+
+#ifdef DEBUG_QLM_RX
+                       rx_aeq_out_0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_AEQ_OUT_0(l, qlm));
+                       rx_aeq_out_1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_AEQ_OUT_1(l, qlm));
+                       rx_aeq_out_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_AEQ_OUT_2(l, qlm));
+                       rx_vma_status_0.u64 =
+                               csr_rd_node(node, CVMX_GSERX_LANEX_RX_VMA_STATUS_0(l, qlm));
+                       debug("    DFE Tap1:%lu, Tap2:%ld, Tap3:%ld, Tap4:%ld, Tap5:%ld\n",
+                             (unsigned int long)cvmx_bit_extract(rx_aeq_out_1.u64, 0, 5),
+                             (unsigned int long)cvmx_bit_extract_smag(rx_aeq_out_1.u64, 5, 9),
+                             (unsigned int long)cvmx_bit_extract_smag(rx_aeq_out_1.u64, 10, 14),
+                             (unsigned int long)cvmx_bit_extract_smag(rx_aeq_out_0.u64, 0, 4),
+                             (unsigned int long)cvmx_bit_extract_smag(rx_aeq_out_0.u64, 5, 9));
+                       debug("    Pre-CTLE Gain:%lu, Post-CTLE Gain:%lu, CTLE Peak:%lu, CTLE Pole:%lu\n",
+                             (unsigned int long)cvmx_bit_extract(rx_aeq_out_2.u64, 4, 4),
+                             (unsigned int long)cvmx_bit_extract(rx_aeq_out_2.u64, 0, 4),
+                             (unsigned int long)cvmx_bit_extract(rx_vma_status_0.u64, 2, 4),
+                             (unsigned int long)cvmx_bit_extract(rx_vma_status_0.u64, 0, 2));
+#endif
+#endif
+               }
+       }
+
+       return (fail) ? -1 : 0;
+}
+
+/**
+ * Errata GSER-27882 -GSER 10GBASE-KR Transmit Equalizer
+ * Training may not update PHY Tx Taps. This function is not static
+ * so we can share it with BGX KR
+ *
+ * @param node Node to apply errata workaround
+ * @param qlm  QLM to apply errata workaround
+ * @param lane Lane to apply the errata
+ */
+int cvmx_qlm_gser_errata_27882(int node, int qlm, int lane)
+{
+       cvmx_gserx_lanex_pcs_ctlifc_0_t clifc0;
+       cvmx_gserx_lanex_pcs_ctlifc_2_t clifc2;
+
+       if (!(OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_0) || OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_1) ||
+             OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_2) || OCTEON_IS_MODEL(OCTEON_CNF75XX_PASS1_0) ||
+             OCTEON_IS_MODEL(OCTEON_CN78XX)))
+               return 0;
+
+       if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_RX_EIE_DETSTS(qlm),
+                                      cvmx_gserx_rx_eie_detsts_t, cdrlock, &,
+                                      (1 << lane), 200))
+               return -1;
+
+       clifc0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(lane, qlm));
+       clifc0.s.cfg_tx_coeff_req_ovrrd_val = 1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(lane, qlm), clifc0.u64);
+       clifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       clifc2.s.cfg_tx_coeff_req_ovrrd_en = 1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), clifc2.u64);
+       clifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       clifc2.s.ctlifc_ovrrd_req = 1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), clifc2.u64);
+       clifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       clifc2.s.cfg_tx_coeff_req_ovrrd_en = 0;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), clifc2.u64);
+       clifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       clifc2.s.ctlifc_ovrrd_req = 1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), clifc2.u64);
+       return 0;
+}
+
+/**
+ * Updates the RX EQ Default Settings Update (CTLE Bias) to support longer
+ * SERDES channels
+ *
+ * @INTERNAL
+ *
+ * @param node Node number to configure
+ * @param qlm  QLM number to configure
+ */
+void cvmx_qlm_gser_errata_25992(int node, int qlm)
+{
+       int lane;
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+
+       if (!(OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_0) || OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_1) ||
+             OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_2) || OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X)))
+               return;
+
+       for (lane = 0; lane < num_lanes; lane++) {
+               cvmx_gserx_lanex_rx_ctle_ctrl_t rx_ctle_ctrl;
+               cvmx_gserx_lanex_rx_cfg_4_t rx_cfg_4;
+
+               rx_ctle_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CTLE_CTRL(lane, qlm));
+               rx_ctle_ctrl.s.pcs_sds_rx_ctle_bias_ctrl = 3;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_CTLE_CTRL(lane, qlm), rx_ctle_ctrl.u64);
+
+               rx_cfg_4.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CFG_4(lane, qlm));
+               rx_cfg_4.s.cfg_rx_errdet_ctrl = 0xcd6f;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_CFG_4(lane, qlm), rx_cfg_4.u64);
+       }
+}
+
+void cvmx_qlm_display_registers(int qlm)
+{
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+       int lane;
+       const __cvmx_qlm_jtag_field_t *ptr = cvmx_qlm_jtag_get_field();
+
+       debug("%29s", "Field[<stop bit>:<start bit>]");
+       for (lane = 0; lane < num_lanes; lane++)
+               debug("\t      Lane %d", lane);
+       debug("\n");
+
+       while (ptr && ptr->name) {
+               debug("%20s[%3d:%3d]", ptr->name, ptr->stop_bit, ptr->start_bit);
+               for (lane = 0; lane < num_lanes; lane++) {
+                       u64 val;
+                       int tx_byp = 0;
+
+                       /*
+                        * Make sure serdes_tx_byp is set for displaying
+                        * TX amplitude and TX demphasis field values.
+                        */
+                       if (strncmp(ptr->name, "biasdrv_", 8) == 0 ||
+                           strncmp(ptr->name, "tcoeff_", 7) == 0) {
+                               tx_byp = cvmx_qlm_jtag_get(qlm, lane, "serdes_tx_byp");
+                               if (tx_byp == 0) {
+                                       debug("\t \t");
+                                       continue;
+                               }
+                       }
+                       val = cvmx_qlm_jtag_get(qlm, lane, ptr->name);
+                       debug("\t%4llu (0x%04llx)", (unsigned long long)val,
+                             (unsigned long long)val);
+               }
+               debug("\n");
+               ptr++;
+       }
+}
+
+/* ToDo: CVMX_DUMP_GSER removed for now (unused!) */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-address.h b/arch/mips/mach-octeon/include/mach/cvmx-address.h
new file mode 100644 (file)
index 0000000..984f574
--- /dev/null
@@ -0,0 +1,209 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Typedefs and defines for working with Octeon physical addresses.
+ */
+
+#ifndef __CVMX_ADDRESS_H__
+#define __CVMX_ADDRESS_H__
+
+typedef enum {
+       CVMX_MIPS_SPACE_XKSEG = 3LL,
+       CVMX_MIPS_SPACE_XKPHYS = 2LL,
+       CVMX_MIPS_SPACE_XSSEG = 1LL,
+       CVMX_MIPS_SPACE_XUSEG = 0LL
+} cvmx_mips_space_t;
+
+typedef enum {
+       CVMX_MIPS_XKSEG_SPACE_KSEG0 = 0LL,
+       CVMX_MIPS_XKSEG_SPACE_KSEG1 = 1LL,
+       CVMX_MIPS_XKSEG_SPACE_SSEG = 2LL,
+       CVMX_MIPS_XKSEG_SPACE_KSEG3 = 3LL
+} cvmx_mips_xkseg_space_t;
+
+/* decodes <14:13> of a kseg3 window address */
+typedef enum {
+       CVMX_ADD_WIN_SCR = 0L,
+       CVMX_ADD_WIN_DMA = 1L,
+       CVMX_ADD_WIN_UNUSED = 2L,
+       CVMX_ADD_WIN_UNUSED2 = 3L
+} cvmx_add_win_dec_t;
+
+/* decode within DMA space */
+typedef enum {
+       CVMX_ADD_WIN_DMA_ADD = 0L,
+       CVMX_ADD_WIN_DMA_SENDMEM = 1L,
+       /* store data must be normal DRAM memory space address in this case */
+       CVMX_ADD_WIN_DMA_SENDDMA = 2L,
+       /* see CVMX_ADD_WIN_DMA_SEND_DEC for data contents */
+       CVMX_ADD_WIN_DMA_SENDIO = 3L,
+       /* store data must be normal IO space address in this case */
+       CVMX_ADD_WIN_DMA_SENDSINGLE = 4L,
+       /* no write buffer data needed/used */
+} cvmx_add_win_dma_dec_t;
+
+/**
+ *   Physical Address Decode
+ *
+ * Octeon-I HW never interprets this X (<39:36> reserved
+ * for future expansion), software should set to 0.
+ *
+ *  - 0x0 XXX0 0000 0000 to      DRAM         Cached
+ *  - 0x0 XXX0 0FFF FFFF
+ *
+ *  - 0x0 XXX0 1000 0000 to      Boot Bus     Uncached  (Converted to 0x1 00X0 1000 0000
+ *  - 0x0 XXX0 1FFF FFFF         + EJTAG                           to 0x1 00X0 1FFF FFFF)
+ *
+ *  - 0x0 XXX0 2000 0000 to      DRAM         Cached
+ *  - 0x0 XXXF FFFF FFFF
+ *
+ *  - 0x1 00X0 0000 0000 to      Boot Bus     Uncached
+ *  - 0x1 00XF FFFF FFFF
+ *
+ *  - 0x1 01X0 0000 0000 to      Other NCB    Uncached
+ *  - 0x1 FFXF FFFF FFFF         devices
+ *
+ * Decode of all Octeon addresses
+ */
+typedef union {
+       u64 u64;
+       struct {
+               cvmx_mips_space_t R : 2;
+               u64 offset : 62;
+       } sva;
+
+       struct {
+               u64 zeroes : 33;
+               u64 offset : 31;
+       } suseg;
+
+       struct {
+               u64 ones : 33;
+               cvmx_mips_xkseg_space_t sp : 2;
+               u64 offset : 29;
+       } sxkseg;
+
+       struct {
+               cvmx_mips_space_t R : 2;
+               u64 cca : 3;
+               u64 mbz : 10;
+               u64 pa : 49;
+       } sxkphys;
+
+       struct {
+               u64 mbz : 15;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 unaddr : 4;
+               u64 offset : 36;
+       } sphys;
+
+       struct {
+               u64 zeroes : 24;
+               u64 unaddr : 4;
+               u64 offset : 36;
+       } smem;
+
+       struct {
+               u64 mem_region : 2;
+               u64 mbz : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 unaddr : 4;
+               u64 offset : 36;
+       } sio;
+
+       struct {
+               u64 ones : 49;
+               cvmx_add_win_dec_t csrdec : 2;
+               u64 addr : 13;
+       } sscr;
+
+       /* there should only be stores to IOBDMA space, no loads */
+       struct {
+               u64 ones : 49;
+               cvmx_add_win_dec_t csrdec : 2;
+               u64 unused2 : 3;
+               cvmx_add_win_dma_dec_t type : 3;
+               u64 addr : 7;
+       } sdma;
+
+       struct {
+               u64 didspace : 24;
+               u64 unused : 40;
+       } sfilldidspace;
+} cvmx_addr_t;
+
+/* These macros for used by 32 bit applications */
+
+#define CVMX_MIPS32_SPACE_KSEG0             1l
+#define CVMX_ADD_SEG32(segment, add) (((s32)segment << 31) | (s32)(add))
+
+/*
+ * Currently all IOs are performed using XKPHYS addressing. Linux uses the
+ * CvmMemCtl register to enable XKPHYS addressing to IO space from user mode.
+ * Future OSes may need to change the upper bits of IO addresses. The
+ * following define controls the upper two bits for all IO addresses generated
+ * by the simple executive library
+ */
+#define CVMX_IO_SEG CVMX_MIPS_SPACE_XKPHYS
+
+/* These macros simplify the process of creating common IO addresses */
+#define CVMX_ADD_SEG(segment, add) ((((u64)segment) << 62) | (add))
+
+#define CVMX_ADD_IO_SEG(add) (add)
+
+#define CVMX_ADDR_DIDSPACE(did)           (((CVMX_IO_SEG) << 22) | ((1ULL) << 8) | (did))
+#define CVMX_ADDR_DID(did)        (CVMX_ADDR_DIDSPACE(did) << 40)
+#define CVMX_FULL_DID(did, subdid) (((did) << 3) | (subdid))
+
+/* from include/ncb_rsl_id.v */
+#define CVMX_OCT_DID_MIS  0ULL /* misc stuff */
+#define CVMX_OCT_DID_GMX0 1ULL
+#define CVMX_OCT_DID_GMX1 2ULL
+#define CVMX_OCT_DID_PCI  3ULL
+#define CVMX_OCT_DID_KEY  4ULL
+#define CVMX_OCT_DID_FPA  5ULL
+#define CVMX_OCT_DID_DFA  6ULL
+#define CVMX_OCT_DID_ZIP  7ULL
+#define CVMX_OCT_DID_RNG  8ULL
+#define CVMX_OCT_DID_IPD  9ULL
+#define CVMX_OCT_DID_PKT  10ULL
+#define CVMX_OCT_DID_TIM  11ULL
+#define CVMX_OCT_DID_TAG  12ULL
+/* the rest are not on the IO bus */
+#define CVMX_OCT_DID_L2C  16ULL
+#define CVMX_OCT_DID_LMC  17ULL
+#define CVMX_OCT_DID_SPX0 18ULL
+#define CVMX_OCT_DID_SPX1 19ULL
+#define CVMX_OCT_DID_PIP  20ULL
+#define CVMX_OCT_DID_ASX0 22ULL
+#define CVMX_OCT_DID_ASX1 23ULL
+#define CVMX_OCT_DID_IOB  30ULL
+
+#define CVMX_OCT_DID_PKT_SEND   CVMX_FULL_DID(CVMX_OCT_DID_PKT, 2ULL)
+#define CVMX_OCT_DID_TAG_SWTAG  CVMX_FULL_DID(CVMX_OCT_DID_TAG, 0ULL)
+#define CVMX_OCT_DID_TAG_TAG1   CVMX_FULL_DID(CVMX_OCT_DID_TAG, 1ULL)
+#define CVMX_OCT_DID_TAG_TAG2   CVMX_FULL_DID(CVMX_OCT_DID_TAG, 2ULL)
+#define CVMX_OCT_DID_TAG_TAG3   CVMX_FULL_DID(CVMX_OCT_DID_TAG, 3ULL)
+#define CVMX_OCT_DID_TAG_NULL_RD CVMX_FULL_DID(CVMX_OCT_DID_TAG, 4ULL)
+#define CVMX_OCT_DID_TAG_TAG5   CVMX_FULL_DID(CVMX_OCT_DID_TAG, 5ULL)
+#define CVMX_OCT_DID_TAG_CSR    CVMX_FULL_DID(CVMX_OCT_DID_TAG, 7ULL)
+#define CVMX_OCT_DID_FAU_FAI    CVMX_FULL_DID(CVMX_OCT_DID_IOB, 0ULL)
+#define CVMX_OCT_DID_TIM_CSR    CVMX_FULL_DID(CVMX_OCT_DID_TIM, 0ULL)
+#define CVMX_OCT_DID_KEY_RW     CVMX_FULL_DID(CVMX_OCT_DID_KEY, 0ULL)
+#define CVMX_OCT_DID_PCI_6      CVMX_FULL_DID(CVMX_OCT_DID_PCI, 6ULL)
+#define CVMX_OCT_DID_MIS_BOO    CVMX_FULL_DID(CVMX_OCT_DID_MIS, 0ULL)
+#define CVMX_OCT_DID_PCI_RML    CVMX_FULL_DID(CVMX_OCT_DID_PCI, 0ULL)
+#define CVMX_OCT_DID_IPD_CSR    CVMX_FULL_DID(CVMX_OCT_DID_IPD, 7ULL)
+#define CVMX_OCT_DID_DFA_CSR    CVMX_FULL_DID(CVMX_OCT_DID_DFA, 7ULL)
+#define CVMX_OCT_DID_MIS_CSR    CVMX_FULL_DID(CVMX_OCT_DID_MIS, 7ULL)
+#define CVMX_OCT_DID_ZIP_CSR    CVMX_FULL_DID(CVMX_OCT_DID_ZIP, 0ULL)
+
+/* Cast to unsigned long long, mainly for use in printfs. */
+#define CAST_ULL(v) ((unsigned long long)(v))
+
+#define UNMAPPED_PTR(x) ((1ULL << 63) | (x))
+
+#endif /* __CVMX_ADDRESS_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-agl-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-agl-defs.h
new file mode 100644 (file)
index 0000000..bbf1f59
--- /dev/null
@@ -0,0 +1,3135 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon agl.
+ *
+ */
+
+#ifndef __CVMX_AGL_DEFS_H__
+#define __CVMX_AGL_DEFS_H__
+
+#define CVMX_AGL_GMX_BAD_REG                       (0x00011800E0000518ull)
+#define CVMX_AGL_GMX_BIST                          (0x00011800E0000400ull)
+#define CVMX_AGL_GMX_DRV_CTL                       (0x00011800E00007F0ull)
+#define CVMX_AGL_GMX_INF_MODE                      (0x00011800E00007F8ull)
+#define CVMX_AGL_GMX_PRTX_CFG(offset)              (0x00011800E0000010ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CAM0(offset)          (0x00011800E0000180ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CAM1(offset)          (0x00011800E0000188ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CAM2(offset)          (0x00011800E0000190ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CAM3(offset)          (0x00011800E0000198ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CAM4(offset)          (0x00011800E00001A0ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CAM5(offset)          (0x00011800E00001A8ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CAM_EN(offset)        (0x00011800E0000108ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_ADR_CTL(offset)           (0x00011800E0000100ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_DECISION(offset)          (0x00011800E0000040ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_FRM_CHK(offset)           (0x00011800E0000020ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_FRM_CTL(offset)           (0x00011800E0000018ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_FRM_MAX(offset)           (0x00011800E0000030ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_FRM_MIN(offset)           (0x00011800E0000028ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_IFG(offset)               (0x00011800E0000058ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_INT_EN(offset)                    (0x00011800E0000008ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_INT_REG(offset)           (0x00011800E0000000ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_JABBER(offset)                    (0x00011800E0000038ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_PAUSE_DROP_TIME(offset)    (0x00011800E0000068ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_RX_INBND(offset)          (0x00011800E0000060ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_CTL(offset)         (0x00011800E0000050ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_OCTS(offset)        (0x00011800E0000088ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_OCTS_CTL(offset)            (0x00011800E0000098ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_OCTS_DMAC(offset)    (0x00011800E00000A8ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_OCTS_DRP(offset)            (0x00011800E00000B8ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_PKTS(offset)        (0x00011800E0000080ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_PKTS_BAD(offset)            (0x00011800E00000C0ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_PKTS_CTL(offset)            (0x00011800E0000090ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_PKTS_DMAC(offset)    (0x00011800E00000A0ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_STATS_PKTS_DRP(offset)            (0x00011800E00000B0ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RXX_UDD_SKP(offset)           (0x00011800E0000048ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_RX_BP_DROPX(offset)           (0x00011800E0000420ull + ((offset) & 1) * 8)
+#define CVMX_AGL_GMX_RX_BP_OFFX(offset)                    (0x00011800E0000460ull + ((offset) & 1) * 8)
+#define CVMX_AGL_GMX_RX_BP_ONX(offset)             (0x00011800E0000440ull + ((offset) & 1) * 8)
+#define CVMX_AGL_GMX_RX_PRT_INFO                   (0x00011800E00004E8ull)
+#define CVMX_AGL_GMX_RX_TX_STATUS                  (0x00011800E00007E8ull)
+#define CVMX_AGL_GMX_SMACX(offset)                 (0x00011800E0000230ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_STAT_BP                       (0x00011800E0000520ull)
+#define CVMX_AGL_GMX_TXX_APPEND(offset)                    (0x00011800E0000218ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_CLK(offset)               (0x00011800E0000208ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_CTL(offset)               (0x00011800E0000270ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_MIN_PKT(offset)           (0x00011800E0000240ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_PAUSE_PKT_INTERVAL(offset) (0x00011800E0000248ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_PAUSE_PKT_TIME(offset)            (0x00011800E0000238ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_PAUSE_TOGO(offset)        (0x00011800E0000258ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_PAUSE_ZERO(offset)        (0x00011800E0000260ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_SOFT_PAUSE(offset)        (0x00011800E0000250ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT0(offset)             (0x00011800E0000280ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT1(offset)             (0x00011800E0000288ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT2(offset)             (0x00011800E0000290ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT3(offset)             (0x00011800E0000298ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT4(offset)             (0x00011800E00002A0ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT5(offset)             (0x00011800E00002A8ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT6(offset)             (0x00011800E00002B0ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT7(offset)             (0x00011800E00002B8ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT8(offset)             (0x00011800E00002C0ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STAT9(offset)             (0x00011800E00002C8ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_STATS_CTL(offset)         (0x00011800E0000268ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TXX_THRESH(offset)                    (0x00011800E0000210ull + ((offset) & 1) * 2048)
+#define CVMX_AGL_GMX_TX_BP                         (0x00011800E00004D0ull)
+#define CVMX_AGL_GMX_TX_COL_ATTEMPT                (0x00011800E0000498ull)
+#define CVMX_AGL_GMX_TX_IFG                        (0x00011800E0000488ull)
+#define CVMX_AGL_GMX_TX_INT_EN                     (0x00011800E0000508ull)
+#define CVMX_AGL_GMX_TX_INT_REG                            (0x00011800E0000500ull)
+#define CVMX_AGL_GMX_TX_JAM                        (0x00011800E0000490ull)
+#define CVMX_AGL_GMX_TX_LFSR                       (0x00011800E00004F8ull)
+#define CVMX_AGL_GMX_TX_OVR_BP                     (0x00011800E00004C8ull)
+#define CVMX_AGL_GMX_TX_PAUSE_PKT_DMAC             (0x00011800E00004A0ull)
+#define CVMX_AGL_GMX_TX_PAUSE_PKT_TYPE             (0x00011800E00004A8ull)
+#define CVMX_AGL_GMX_WOL_CTL                       (0x00011800E0000780ull)
+#define CVMX_AGL_PRTX_CTL(offset)                  (0x00011800E0002000ull + ((offset) & 1) * 8)
+
+/**
+ * cvmx_agl_gmx_bad_reg
+ *
+ * AGL_GMX_BAD_REG = A collection of things that have gone very, very wrong
+ *
+ *
+ * Notes:
+ * OUT_OVR[0], LOSTSTAT[0], OVRFLW, TXPOP, TXPSH    will be reset when MIX0_CTL[RESET] is set to 1.
+ * OUT_OVR[1], LOSTSTAT[1], OVRFLW1, TXPOP1, TXPSH1 will be reset when MIX1_CTL[RESET] is set to 1.
+ * STATOVR will be reset when both MIX0/1_CTL[RESET] are set to 1.
+ */
+union cvmx_agl_gmx_bad_reg {
+       u64 u64;
+       struct cvmx_agl_gmx_bad_reg_s {
+               u64 reserved_38_63 : 26;
+               u64 txpsh1 : 1;
+               u64 txpop1 : 1;
+               u64 ovrflw1 : 1;
+               u64 txpsh : 1;
+               u64 txpop : 1;
+               u64 ovrflw : 1;
+               u64 reserved_27_31 : 5;
+               u64 statovr : 1;
+               u64 reserved_24_25 : 2;
+               u64 loststat : 2;
+               u64 reserved_4_21 : 18;
+               u64 out_ovr : 2;
+               u64 reserved_0_1 : 2;
+       } s;
+       struct cvmx_agl_gmx_bad_reg_cn52xx {
+               u64 reserved_38_63 : 26;
+               u64 txpsh1 : 1;
+               u64 txpop1 : 1;
+               u64 ovrflw1 : 1;
+               u64 txpsh : 1;
+               u64 txpop : 1;
+               u64 ovrflw : 1;
+               u64 reserved_27_31 : 5;
+               u64 statovr : 1;
+               u64 reserved_23_25 : 3;
+               u64 loststat : 1;
+               u64 reserved_4_21 : 18;
+               u64 out_ovr : 2;
+               u64 reserved_0_1 : 2;
+       } cn52xx;
+       struct cvmx_agl_gmx_bad_reg_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_bad_reg_cn56xx {
+               u64 reserved_35_63 : 29;
+               u64 txpsh : 1;
+               u64 txpop : 1;
+               u64 ovrflw : 1;
+               u64 reserved_27_31 : 5;
+               u64 statovr : 1;
+               u64 reserved_23_25 : 3;
+               u64 loststat : 1;
+               u64 reserved_3_21 : 19;
+               u64 out_ovr : 1;
+               u64 reserved_0_1 : 2;
+       } cn56xx;
+       struct cvmx_agl_gmx_bad_reg_cn56xx cn56xxp1;
+       struct cvmx_agl_gmx_bad_reg_s cn61xx;
+       struct cvmx_agl_gmx_bad_reg_s cn63xx;
+       struct cvmx_agl_gmx_bad_reg_s cn63xxp1;
+       struct cvmx_agl_gmx_bad_reg_s cn66xx;
+       struct cvmx_agl_gmx_bad_reg_s cn68xx;
+       struct cvmx_agl_gmx_bad_reg_s cn68xxp1;
+       struct cvmx_agl_gmx_bad_reg_cn56xx cn70xx;
+       struct cvmx_agl_gmx_bad_reg_cn56xx cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_bad_reg cvmx_agl_gmx_bad_reg_t;
+
+/**
+ * cvmx_agl_gmx_bist
+ *
+ * AGL_GMX_BIST = GMX BIST Results
+ *
+ *
+ * Notes:
+ * Not reset when MIX*_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_bist {
+       u64 u64;
+       struct cvmx_agl_gmx_bist_s {
+               u64 reserved_25_63 : 39;
+               u64 status : 25;
+       } s;
+       struct cvmx_agl_gmx_bist_cn52xx {
+               u64 reserved_10_63 : 54;
+               u64 status : 10;
+       } cn52xx;
+       struct cvmx_agl_gmx_bist_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_bist_cn52xx cn56xx;
+       struct cvmx_agl_gmx_bist_cn52xx cn56xxp1;
+       struct cvmx_agl_gmx_bist_s cn61xx;
+       struct cvmx_agl_gmx_bist_s cn63xx;
+       struct cvmx_agl_gmx_bist_s cn63xxp1;
+       struct cvmx_agl_gmx_bist_s cn66xx;
+       struct cvmx_agl_gmx_bist_s cn68xx;
+       struct cvmx_agl_gmx_bist_s cn68xxp1;
+       struct cvmx_agl_gmx_bist_s cn70xx;
+       struct cvmx_agl_gmx_bist_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_bist cvmx_agl_gmx_bist_t;
+
+/**
+ * cvmx_agl_gmx_drv_ctl
+ *
+ * AGL_GMX_DRV_CTL = GMX Drive Control
+ *
+ *
+ * Notes:
+ * NCTL, PCTL, BYP_EN    will be reset when MIX0_CTL[RESET] is set to 1.
+ * NCTL1, PCTL1, BYP_EN1 will be reset when MIX1_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_drv_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_drv_ctl_s {
+               u64 reserved_49_63 : 15;
+               u64 byp_en1 : 1;
+               u64 reserved_45_47 : 3;
+               u64 pctl1 : 5;
+               u64 reserved_37_39 : 3;
+               u64 nctl1 : 5;
+               u64 reserved_17_31 : 15;
+               u64 byp_en : 1;
+               u64 reserved_13_15 : 3;
+               u64 pctl : 5;
+               u64 reserved_5_7 : 3;
+               u64 nctl : 5;
+       } s;
+       struct cvmx_agl_gmx_drv_ctl_s cn52xx;
+       struct cvmx_agl_gmx_drv_ctl_s cn52xxp1;
+       struct cvmx_agl_gmx_drv_ctl_cn56xx {
+               u64 reserved_17_63 : 47;
+               u64 byp_en : 1;
+               u64 reserved_13_15 : 3;
+               u64 pctl : 5;
+               u64 reserved_5_7 : 3;
+               u64 nctl : 5;
+       } cn56xx;
+       struct cvmx_agl_gmx_drv_ctl_cn56xx cn56xxp1;
+};
+
+typedef union cvmx_agl_gmx_drv_ctl cvmx_agl_gmx_drv_ctl_t;
+
+/**
+ * cvmx_agl_gmx_inf_mode
+ *
+ * AGL_GMX_INF_MODE = Interface Mode
+ *
+ *
+ * Notes:
+ * Not reset when MIX*_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_inf_mode {
+       u64 u64;
+       struct cvmx_agl_gmx_inf_mode_s {
+               u64 reserved_2_63 : 62;
+               u64 en : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_agl_gmx_inf_mode_s cn52xx;
+       struct cvmx_agl_gmx_inf_mode_s cn52xxp1;
+       struct cvmx_agl_gmx_inf_mode_s cn56xx;
+       struct cvmx_agl_gmx_inf_mode_s cn56xxp1;
+};
+
+typedef union cvmx_agl_gmx_inf_mode cvmx_agl_gmx_inf_mode_t;
+
+/**
+ * cvmx_agl_gmx_prt#_cfg
+ *
+ * AGL_GMX_PRT_CFG = Port description
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_prtx_cfg {
+       u64 u64;
+       struct cvmx_agl_gmx_prtx_cfg_s {
+               u64 reserved_14_63 : 50;
+               u64 tx_idle : 1;
+               u64 rx_idle : 1;
+               u64 reserved_9_11 : 3;
+               u64 speed_msb : 1;
+               u64 reserved_7_7 : 1;
+               u64 burst : 1;
+               u64 tx_en : 1;
+               u64 rx_en : 1;
+               u64 slottime : 1;
+               u64 duplex : 1;
+               u64 speed : 1;
+               u64 en : 1;
+       } s;
+       struct cvmx_agl_gmx_prtx_cfg_cn52xx {
+               u64 reserved_6_63 : 58;
+               u64 tx_en : 1;
+               u64 rx_en : 1;
+               u64 slottime : 1;
+               u64 duplex : 1;
+               u64 speed : 1;
+               u64 en : 1;
+       } cn52xx;
+       struct cvmx_agl_gmx_prtx_cfg_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_prtx_cfg_cn52xx cn56xx;
+       struct cvmx_agl_gmx_prtx_cfg_cn52xx cn56xxp1;
+       struct cvmx_agl_gmx_prtx_cfg_s cn61xx;
+       struct cvmx_agl_gmx_prtx_cfg_s cn63xx;
+       struct cvmx_agl_gmx_prtx_cfg_s cn63xxp1;
+       struct cvmx_agl_gmx_prtx_cfg_s cn66xx;
+       struct cvmx_agl_gmx_prtx_cfg_s cn68xx;
+       struct cvmx_agl_gmx_prtx_cfg_s cn68xxp1;
+       struct cvmx_agl_gmx_prtx_cfg_s cn70xx;
+       struct cvmx_agl_gmx_prtx_cfg_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_prtx_cfg cvmx_agl_gmx_prtx_cfg_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_cam0
+ *
+ * AGL_GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_agl_gmx_rxx_adr_cam0 {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_cam0_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_cam0 cvmx_agl_gmx_rxx_adr_cam0_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_cam1
+ *
+ * AGL_GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_agl_gmx_rxx_adr_cam1 {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_cam1_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_cam1 cvmx_agl_gmx_rxx_adr_cam1_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_cam2
+ *
+ * AGL_GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_agl_gmx_rxx_adr_cam2 {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_cam2_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_cam2 cvmx_agl_gmx_rxx_adr_cam2_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_cam3
+ *
+ * AGL_GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_agl_gmx_rxx_adr_cam3 {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_cam3_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_cam3 cvmx_agl_gmx_rxx_adr_cam3_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_cam4
+ *
+ * AGL_GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_agl_gmx_rxx_adr_cam4 {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_cam4_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_cam4 cvmx_agl_gmx_rxx_adr_cam4_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_cam5
+ *
+ * AGL_GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_agl_gmx_rxx_adr_cam5 {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_cam5_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_cam5 cvmx_agl_gmx_rxx_adr_cam5_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_cam_en
+ *
+ * AGL_GMX_RX_ADR_CAM_EN = Address Filtering Control Enable
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rxx_adr_cam_en {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s {
+               u64 reserved_8_63 : 56;
+               u64 en : 8;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_cam_en_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_cam_en cvmx_agl_gmx_rxx_adr_cam_en_t;
+
+/**
+ * cvmx_agl_gmx_rx#_adr_ctl
+ *
+ * AGL_GMX_RX_ADR_CTL = Address Filtering Control
+ *
+ *
+ * Notes:
+ * * ALGORITHM
+ *   Here is some pseudo code that represents the address filter behavior.
+ *
+ *      @verbatim
+ *      bool dmac_addr_filter(uint8 prt, uint48 dmac) [
+ *        ASSERT(prt >= 0 && prt <= 3);
+ *        if (is_bcst(dmac))                               // broadcast accept
+ *          return (AGL_GMX_RX[prt]_ADR_CTL[BCST] ? ACCEPT : REJECT);
+ *        if (is_mcst(dmac) & AGL_GMX_RX[prt]_ADR_CTL[MCST] == 1)   // multicast reject
+ *          return REJECT;
+ *        if (is_mcst(dmac) & AGL_GMX_RX[prt]_ADR_CTL[MCST] == 2)   // multicast accept
+ *          return ACCEPT;
+ *
+ *        cam_hit = 0;
+ *
+ *        for (i=0; i<8; i++) [
+ *          if (AGL_GMX_RX[prt]_ADR_CAM_EN[EN<i>] == 0)
+ *            continue;
+ *          uint48 unswizzled_mac_adr = 0x0;
+ *          for (j=5; j>=0; j--) [
+ *             unswizzled_mac_adr = (unswizzled_mac_adr << 8) | AGL_GMX_RX[prt]_ADR_CAM[j][ADR<i*8+7:i*8>];
+ *          ]
+ *          if (unswizzled_mac_adr == dmac) [
+ *            cam_hit = 1;
+ *            break;
+ *          ]
+ *        ]
+ *
+ *        if (cam_hit)
+ *          return (AGL_GMX_RX[prt]_ADR_CTL[CAM_MODE] ? ACCEPT : REJECT);
+ *        else
+ *          return (AGL_GMX_RX[prt]_ADR_CTL[CAM_MODE] ? REJECT : ACCEPT);
+ *      ]
+ *      @endverbatim
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_adr_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s {
+               u64 reserved_4_63 : 60;
+               u64 cam_mode : 1;
+               u64 mcst : 2;
+               u64 bcst : 1;
+       } s;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn52xx;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn56xx;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn61xx;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn63xx;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn66xx;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn68xx;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn70xx;
+       struct cvmx_agl_gmx_rxx_adr_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_adr_ctl cvmx_agl_gmx_rxx_adr_ctl_t;
+
+/**
+ * cvmx_agl_gmx_rx#_decision
+ *
+ * AGL_GMX_RX_DECISION = The byte count to decide when to accept or filter a packet
+ *
+ *
+ * Notes:
+ * As each byte in a packet is received by GMX, the L2 byte count is compared
+ * against the AGL_GMX_RX_DECISION[CNT].  The L2 byte count is the number of bytes
+ * from the beginning of the L2 header (DMAC).  In normal operation, the L2
+ * header begins after the PREAMBLE+SFD (AGL_GMX_RX_FRM_CTL[PRE_CHK]=1) and any
+ * optional UDD skip data (AGL_GMX_RX_UDD_SKP[LEN]).
+ *
+ * When AGL_GMX_RX_FRM_CTL[PRE_CHK] is clear, PREAMBLE+SFD are prepended to the
+ * packet and would require UDD skip length to account for them.
+ *
+ *                                                 L2 Size
+ * Port Mode             <=AGL_GMX_RX_DECISION bytes (default=24)  >AGL_GMX_RX_DECISION bytes (default=24)
+ *
+ * MII/Full Duplex       accept packet                             apply filters
+ *                       no filtering is applied                   accept packet based on DMAC and PAUSE packet filters
+ *
+ * MII/Half Duplex       drop packet                               apply filters
+ *                       packet is unconditionally dropped         accept packet based on DMAC
+ *
+ * where l2_size = MAX(0, total_packet_size - AGL_GMX_RX_UDD_SKP[LEN] - ((AGL_GMX_RX_FRM_CTL[PRE_CHK]==1)*8)
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_decision {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_decision_s {
+               u64 reserved_5_63 : 59;
+               u64 cnt : 5;
+       } s;
+       struct cvmx_agl_gmx_rxx_decision_s cn52xx;
+       struct cvmx_agl_gmx_rxx_decision_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_decision_s cn56xx;
+       struct cvmx_agl_gmx_rxx_decision_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_decision_s cn61xx;
+       struct cvmx_agl_gmx_rxx_decision_s cn63xx;
+       struct cvmx_agl_gmx_rxx_decision_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_decision_s cn66xx;
+       struct cvmx_agl_gmx_rxx_decision_s cn68xx;
+       struct cvmx_agl_gmx_rxx_decision_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_decision_s cn70xx;
+       struct cvmx_agl_gmx_rxx_decision_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_decision cvmx_agl_gmx_rxx_decision_t;
+
+/**
+ * cvmx_agl_gmx_rx#_frm_chk
+ *
+ * AGL_GMX_RX_FRM_CHK = Which frame errors will set the ERR bit of the frame
+ *
+ *
+ * Notes:
+ * If AGL_GMX_RX_UDD_SKP[LEN] != 0, then LENERR will be forced to zero in HW.
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_frm_chk {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_frm_chk_s {
+               u64 reserved_10_63 : 54;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_agl_gmx_rxx_frm_chk_cn52xx {
+               u64 reserved_9_63 : 55;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 reserved_1_1 : 1;
+               u64 minerr : 1;
+       } cn52xx;
+       struct cvmx_agl_gmx_rxx_frm_chk_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_rxx_frm_chk_cn52xx cn56xx;
+       struct cvmx_agl_gmx_rxx_frm_chk_cn52xx cn56xxp1;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn61xx;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn63xx;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn66xx;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn68xx;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn70xx;
+       struct cvmx_agl_gmx_rxx_frm_chk_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_frm_chk cvmx_agl_gmx_rxx_frm_chk_t;
+
+/**
+ * cvmx_agl_gmx_rx#_frm_ctl
+ *
+ * AGL_GMX_RX_FRM_CTL = Frame Control
+ *
+ *
+ * Notes:
+ * * PRE_STRP
+ *   When PRE_CHK is set (indicating that the PREAMBLE will be sent), PRE_STRP
+ *   determines if the PREAMBLE+SFD bytes are thrown away or sent to the Octane
+ *   core as part of the packet.
+ *
+ *   In either mode, the PREAMBLE+SFD bytes are not counted toward the packet
+ *   size when checking against the MIN and MAX bounds.  Furthermore, the bytes
+ *   are skipped when locating the start of the L2 header for DMAC and Control
+ *   frame recognition.
+ *
+ * * CTL_BCK/CTL_DRP
+ *   These bits control how the HW handles incoming PAUSE packets.  Here are
+ *   the most common modes of operation:
+ *     CTL_BCK=1,CTL_DRP=1   - HW does it all
+ *     CTL_BCK=0,CTL_DRP=0   - SW sees all pause frames
+ *     CTL_BCK=0,CTL_DRP=1   - all pause frames are completely ignored
+ *
+ *   These control bits should be set to CTL_BCK=0,CTL_DRP=0 in halfdup mode.
+ *   Since PAUSE packets only apply to fulldup operation, any PAUSE packet
+ *   would constitute an exception which should be handled by the processing
+ *   cores.  PAUSE packets should not be forwarded.
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_frm_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s {
+               u64 reserved_13_63 : 51;
+               u64 ptp_mode : 1;
+               u64 reserved_11_11 : 1;
+               u64 null_dis : 1;
+               u64 pre_align : 1;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } s;
+       struct cvmx_agl_gmx_rxx_frm_ctl_cn52xx {
+               u64 reserved_10_63 : 54;
+               u64 pre_align : 1;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } cn52xx;
+       struct cvmx_agl_gmx_rxx_frm_ctl_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_rxx_frm_ctl_cn52xx cn56xx;
+       struct cvmx_agl_gmx_rxx_frm_ctl_cn52xx cn56xxp1;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn61xx;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn63xx;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn66xx;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn68xx;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn70xx;
+       struct cvmx_agl_gmx_rxx_frm_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_frm_ctl cvmx_agl_gmx_rxx_frm_ctl_t;
+
+/**
+ * cvmx_agl_gmx_rx#_frm_max
+ *
+ * AGL_GMX_RX_FRM_MAX = Frame Max length
+ *
+ *
+ * Notes:
+ * When changing the LEN field, be sure that LEN does not exceed
+ * AGL_GMX_RX_JABBER[CNT]. Failure to meet this constraint will cause packets that
+ * are within the maximum length parameter to be rejected because they exceed
+ * the AGL_GMX_RX_JABBER[CNT] limit.
+ *
+ * Notes:
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_frm_max {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_frm_max_s {
+               u64 reserved_16_63 : 48;
+               u64 len : 16;
+       } s;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn52xx;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn56xx;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn61xx;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn63xx;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn66xx;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn68xx;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn70xx;
+       struct cvmx_agl_gmx_rxx_frm_max_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_frm_max cvmx_agl_gmx_rxx_frm_max_t;
+
+/**
+ * cvmx_agl_gmx_rx#_frm_min
+ *
+ * AGL_GMX_RX_FRM_MIN = Frame Min length
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rxx_frm_min {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_frm_min_s {
+               u64 reserved_16_63 : 48;
+               u64 len : 16;
+       } s;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn52xx;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn56xx;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn61xx;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn63xx;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn66xx;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn68xx;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn70xx;
+       struct cvmx_agl_gmx_rxx_frm_min_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_frm_min cvmx_agl_gmx_rxx_frm_min_t;
+
+/**
+ * cvmx_agl_gmx_rx#_ifg
+ *
+ * AGL_GMX_RX_IFG = RX Min IFG
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rxx_ifg {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_ifg_s {
+               u64 reserved_4_63 : 60;
+               u64 ifg : 4;
+       } s;
+       struct cvmx_agl_gmx_rxx_ifg_s cn52xx;
+       struct cvmx_agl_gmx_rxx_ifg_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_ifg_s cn56xx;
+       struct cvmx_agl_gmx_rxx_ifg_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_ifg_s cn61xx;
+       struct cvmx_agl_gmx_rxx_ifg_s cn63xx;
+       struct cvmx_agl_gmx_rxx_ifg_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_ifg_s cn66xx;
+       struct cvmx_agl_gmx_rxx_ifg_s cn68xx;
+       struct cvmx_agl_gmx_rxx_ifg_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_ifg_s cn70xx;
+       struct cvmx_agl_gmx_rxx_ifg_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_ifg cvmx_agl_gmx_rxx_ifg_t;
+
+/**
+ * cvmx_agl_gmx_rx#_int_en
+ *
+ * AGL_GMX_RX_INT_EN = Interrupt Enable
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rxx_int_en {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_int_en_s {
+               u64 reserved_30_63 : 34;
+               u64 wol : 1;
+               u64 reserved_20_28 : 9;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_agl_gmx_rxx_int_en_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 reserved_1_1 : 1;
+               u64 minerr : 1;
+       } cn52xx;
+       struct cvmx_agl_gmx_rxx_int_en_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_rxx_int_en_cn52xx cn56xx;
+       struct cvmx_agl_gmx_rxx_int_en_cn52xx cn56xxp1;
+       struct cvmx_agl_gmx_rxx_int_en_cn61xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn61xx;
+       struct cvmx_agl_gmx_rxx_int_en_cn61xx cn63xx;
+       struct cvmx_agl_gmx_rxx_int_en_cn61xx cn63xxp1;
+       struct cvmx_agl_gmx_rxx_int_en_cn61xx cn66xx;
+       struct cvmx_agl_gmx_rxx_int_en_cn61xx cn68xx;
+       struct cvmx_agl_gmx_rxx_int_en_cn61xx cn68xxp1;
+       struct cvmx_agl_gmx_rxx_int_en_s cn70xx;
+       struct cvmx_agl_gmx_rxx_int_en_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_int_en cvmx_agl_gmx_rxx_int_en_t;
+
+/**
+ * cvmx_agl_gmx_rx#_int_reg
+ *
+ * AGL_GMX_RX_INT_REG = Interrupt Register
+ *
+ *
+ * Notes:
+ * (1) exceptions will only be raised to the control processor if the
+ *     corresponding bit in the AGL_GMX_RX_INT_EN register is set.
+ *
+ * (2) exception conditions 10:0 can also set the rcv/opcode in the received
+ *     packet's workQ entry.  The AGL_GMX_RX_FRM_CHK register provides a bit mask
+ *     for configuring which conditions set the error.
+ *
+ * (3) in half duplex operation, the expectation is that collisions will appear
+ *     as MINERRs.
+ *
+ * (4) JABBER - An RX Jabber error indicates that a packet was received which
+ *              is longer than the maximum allowed packet as defined by the
+ *              system.  GMX will truncate the packet at the JABBER count.
+ *              Failure to do so could lead to system instabilty.
+ *
+ * (6) MAXERR - for untagged frames, the total frame DA+SA+TL+DATA+PAD+FCS >
+ *              AGL_GMX_RX_FRM_MAX.  For tagged frames, DA+SA+VLAN+TL+DATA+PAD+FCS
+ *              > AGL_GMX_RX_FRM_MAX + 4*VLAN_VAL + 4*VLAN_STACKED.
+ *
+ * (7) MINERR - total frame DA+SA+TL+DATA+PAD+FCS < AGL_GMX_RX_FRM_MIN.
+ *
+ * (8) ALNERR - Indicates that the packet received was not an integer number of
+ *              bytes.  If FCS checking is enabled, ALNERR will only assert if
+ *              the FCS is bad.  If FCS checking is disabled, ALNERR will
+ *              assert in all non-integer frame cases.
+ *
+ * (9) Collisions - Collisions can only occur in half-duplex mode.  A collision
+ *                  is assumed by the receiver when the received
+ *                  frame < AGL_GMX_RX_FRM_MIN - this is normally a MINERR
+ *
+ * (A) LENERR - Length errors occur when the received packet does not match the
+ *              length field.  LENERR is only checked for packets between 64
+ *              and 1500 bytes.  For untagged frames, the length must exact
+ *              match.  For tagged frames the length or length+4 must match.
+ *
+ * (B) PCTERR - checks that the frame begins with a valid PREAMBLE sequence.
+ *              Does not check the number of PREAMBLE cycles.
+ *
+ * (C) OVRERR -
+ *
+ *              OVRERR is an architectural assertion check internal to GMX to
+ *              make sure no assumption was violated.  In a correctly operating
+ *              system, this interrupt can never fire.
+ *
+ *              GMX has an internal arbiter which selects which of 4 ports to
+ *              buffer in the main RX FIFO.  If we normally buffer 8 bytes,
+ *              then each port will typically push a tick every 8 cycles - if
+ *              the packet interface is going as fast as possible.  If there
+ *              are four ports, they push every two cycles.  So that's the
+ *              assumption.  That the inbound module will always be able to
+ *              consume the tick before another is produced.  If that doesn't
+ *              happen - that's when OVRERR will assert.
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_int_reg {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_int_reg_s {
+               u64 reserved_30_63 : 34;
+               u64 wol : 1;
+               u64 reserved_20_28 : 9;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_agl_gmx_rxx_int_reg_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 reserved_1_1 : 1;
+               u64 minerr : 1;
+       } cn52xx;
+       struct cvmx_agl_gmx_rxx_int_reg_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_rxx_int_reg_cn52xx cn56xx;
+       struct cvmx_agl_gmx_rxx_int_reg_cn52xx cn56xxp1;
+       struct cvmx_agl_gmx_rxx_int_reg_cn61xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn61xx;
+       struct cvmx_agl_gmx_rxx_int_reg_cn61xx cn63xx;
+       struct cvmx_agl_gmx_rxx_int_reg_cn61xx cn63xxp1;
+       struct cvmx_agl_gmx_rxx_int_reg_cn61xx cn66xx;
+       struct cvmx_agl_gmx_rxx_int_reg_cn61xx cn68xx;
+       struct cvmx_agl_gmx_rxx_int_reg_cn61xx cn68xxp1;
+       struct cvmx_agl_gmx_rxx_int_reg_s cn70xx;
+       struct cvmx_agl_gmx_rxx_int_reg_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_int_reg cvmx_agl_gmx_rxx_int_reg_t;
+
+/**
+ * cvmx_agl_gmx_rx#_jabber
+ *
+ * AGL_GMX_RX_JABBER = The max size packet after which GMX will truncate
+ *
+ *
+ * Notes:
+ * CNT must be 8-byte aligned such that CNT[2:0] == 0
+ *
+ *   The packet that will be sent to the packet input logic will have an
+ *   additionl 8 bytes if AGL_GMX_RX_FRM_CTL[PRE_CHK] is set and
+ *   AGL_GMX_RX_FRM_CTL[PRE_STRP] is clear.  The max packet that will be sent is
+ *   defined as...
+ *
+ *        max_sized_packet = AGL_GMX_RX_JABBER[CNT]+((AGL_GMX_RX_FRM_CTL[PRE_CHK] & !AGL_GMX_RX_FRM_CTL[PRE_STRP])*8)
+ *
+ *   Be sure the CNT field value is at least as large as the
+ *   AGL_GMX_RX_FRM_MAX[LEN] value. Failure to meet this constraint will cause
+ *   packets that are within the AGL_GMX_RX_FRM_MAX[LEN] length to be rejected
+ *   because they exceed the CNT limit.
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_jabber {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_jabber_s {
+               u64 reserved_16_63 : 48;
+               u64 cnt : 16;
+       } s;
+       struct cvmx_agl_gmx_rxx_jabber_s cn52xx;
+       struct cvmx_agl_gmx_rxx_jabber_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_jabber_s cn56xx;
+       struct cvmx_agl_gmx_rxx_jabber_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_jabber_s cn61xx;
+       struct cvmx_agl_gmx_rxx_jabber_s cn63xx;
+       struct cvmx_agl_gmx_rxx_jabber_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_jabber_s cn66xx;
+       struct cvmx_agl_gmx_rxx_jabber_s cn68xx;
+       struct cvmx_agl_gmx_rxx_jabber_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_jabber_s cn70xx;
+       struct cvmx_agl_gmx_rxx_jabber_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_jabber cvmx_agl_gmx_rxx_jabber_t;
+
+/**
+ * cvmx_agl_gmx_rx#_pause_drop_time
+ *
+ * AGL_GMX_RX_PAUSE_DROP_TIME = The TIME field in a PAUSE Packet which was dropped due to GMX RX FIFO full condition
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rxx_pause_drop_time {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s {
+               u64 reserved_16_63 : 48;
+               u64 status : 16;
+       } s;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn52xx;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn56xx;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn61xx;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn63xx;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn66xx;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn68xx;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn70xx;
+       struct cvmx_agl_gmx_rxx_pause_drop_time_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_pause_drop_time cvmx_agl_gmx_rxx_pause_drop_time_t;
+
+/**
+ * cvmx_agl_gmx_rx#_rx_inbnd
+ *
+ * AGL_GMX_RX_INBND = RGMII InBand Link Status
+ *
+ */
+union cvmx_agl_gmx_rxx_rx_inbnd {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s {
+               u64 reserved_4_63 : 60;
+               u64 duplex : 1;
+               u64 speed : 2;
+               u64 status : 1;
+       } s;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn61xx;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn63xx;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn66xx;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn68xx;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn70xx;
+       struct cvmx_agl_gmx_rxx_rx_inbnd_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_rx_inbnd cvmx_agl_gmx_rxx_rx_inbnd_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_ctl
+ *
+ * AGL_GMX_RX_STATS_CTL = RX Stats Control register
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rxx_stats_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 rd_clr : 1;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_ctl cvmx_agl_gmx_rxx_stats_ctl_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_octs
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_stats_octs {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_octs_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_octs cvmx_agl_gmx_rxx_stats_octs_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_octs_ctl
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_stats_octs_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_octs_ctl cvmx_agl_gmx_rxx_stats_octs_ctl_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_octs_dmac
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_stats_octs_dmac {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_dmac_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_octs_dmac cvmx_agl_gmx_rxx_stats_octs_dmac_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_octs_drp
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_stats_octs_drp {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_octs_drp_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_octs_drp cvmx_agl_gmx_rxx_stats_octs_drp_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_pkts
+ *
+ * Count of good received packets - packets that are not recognized as PAUSE
+ * packets, dropped due the DMAC filter, dropped due FIFO full status, or
+ * have any other OPCODE (FCS, Length, etc).
+ */
+union cvmx_agl_gmx_rxx_stats_pkts {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_pkts cvmx_agl_gmx_rxx_stats_pkts_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_pkts_bad
+ *
+ * Count of all packets received with some error that were not dropped
+ * either due to the dmac filter or lack of room in the receive FIFO.
+ */
+union cvmx_agl_gmx_rxx_stats_pkts_bad {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_bad_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_pkts_bad cvmx_agl_gmx_rxx_stats_pkts_bad_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_pkts_ctl
+ *
+ * Count of all packets received that were recognized as Flow Control or
+ * PAUSE packets.  PAUSE packets with any kind of error are counted in
+ * AGL_GMX_RX_STATS_PKTS_BAD.  Pause packets can be optionally dropped or
+ * forwarded based on the AGL_GMX_RX_FRM_CTL[CTL_DRP] bit.  This count
+ * increments regardless of whether the packet is dropped.  Pause packets
+ * will never be counted in AGL_GMX_RX_STATS_PKTS.  Packets dropped due the dmac
+ * filter will be counted in AGL_GMX_RX_STATS_PKTS_DMAC and not here.
+ */
+union cvmx_agl_gmx_rxx_stats_pkts_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_pkts_ctl cvmx_agl_gmx_rxx_stats_pkts_ctl_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_pkts_dmac
+ *
+ * Count of all packets received that were dropped by the dmac filter.
+ * Packets that match the DMAC will be dropped and counted here regardless
+ * of if they were bad packets.  These packets will never be counted in
+ * AGL_GMX_RX_STATS_PKTS.
+ * Some packets that were not able to satisify the DECISION_CNT may not
+ * actually be dropped by Octeon, but they will be counted here as if they
+ * were dropped.
+ */
+union cvmx_agl_gmx_rxx_stats_pkts_dmac {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_dmac_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_pkts_dmac cvmx_agl_gmx_rxx_stats_pkts_dmac_t;
+
+/**
+ * cvmx_agl_gmx_rx#_stats_pkts_drp
+ *
+ * Count of all packets received that were dropped due to a full receive
+ * FIFO.  This counts good and bad packets received - all packets dropped by
+ * the FIFO.  It does not count packets dropped by the dmac or pause packet
+ * filters.
+ */
+union cvmx_agl_gmx_rxx_stats_pkts_drp {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn52xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn56xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn61xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn63xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn66xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn68xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn70xx;
+       struct cvmx_agl_gmx_rxx_stats_pkts_drp_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_stats_pkts_drp cvmx_agl_gmx_rxx_stats_pkts_drp_t;
+
+/**
+ * cvmx_agl_gmx_rx#_udd_skp
+ *
+ * AGL_GMX_RX_UDD_SKP = Amount of User-defined data before the start of the L2 data
+ *
+ *
+ * Notes:
+ * (1) The skip bytes are part of the packet and will be sent down the NCB
+ *     packet interface and will be handled by PKI.
+ *
+ * (2) The system can determine if the UDD bytes are included in the FCS check
+ *     by using the FCSSEL field - if the FCS check is enabled.
+ *
+ * (3) Assume that the preamble/sfd is always at the start of the frame - even
+ *     before UDD bytes.  In most cases, there will be no preamble in these
+ *     cases since it will be MII to MII communication without a PHY
+ *     involved.
+ *
+ * (4) We can still do address filtering and control packet filtering is the
+ *     user desires.
+ *
+ * (5) UDD_SKP must be 0 in half-duplex operation unless
+ *     AGL_GMX_RX_FRM_CTL[PRE_CHK] is clear.  If AGL_GMX_RX_FRM_CTL[PRE_CHK] is set,
+ *     then UDD_SKP will normally be 8.
+ *
+ * (6) In all cases, the UDD bytes will be sent down the packet interface as
+ *     part of the packet.  The UDD bytes are never stripped from the actual
+ *     packet.
+ *
+ * (7) If LEN != 0, then AGL_GMX_RX_FRM_CHK[LENERR] will be disabled and AGL_GMX_RX_INT_REG[LENERR] will be zero
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rxx_udd_skp {
+       u64 u64;
+       struct cvmx_agl_gmx_rxx_udd_skp_s {
+               u64 reserved_9_63 : 55;
+               u64 fcssel : 1;
+               u64 reserved_7_7 : 1;
+               u64 len : 7;
+       } s;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn52xx;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn52xxp1;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn56xx;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn56xxp1;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn61xx;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn63xx;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn63xxp1;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn66xx;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn68xx;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn68xxp1;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn70xx;
+       struct cvmx_agl_gmx_rxx_udd_skp_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rxx_udd_skp cvmx_agl_gmx_rxx_udd_skp_t;
+
+/**
+ * cvmx_agl_gmx_rx_bp_drop#
+ *
+ * AGL_GMX_RX_BP_DROP = FIFO mark for packet drop
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rx_bp_dropx {
+       u64 u64;
+       struct cvmx_agl_gmx_rx_bp_dropx_s {
+               u64 reserved_6_63 : 58;
+               u64 mark : 6;
+       } s;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn52xx;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn52xxp1;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn56xx;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn56xxp1;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn61xx;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn63xx;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn63xxp1;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn66xx;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn68xx;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn68xxp1;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn70xx;
+       struct cvmx_agl_gmx_rx_bp_dropx_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rx_bp_dropx cvmx_agl_gmx_rx_bp_dropx_t;
+
+/**
+ * cvmx_agl_gmx_rx_bp_off#
+ *
+ * AGL_GMX_RX_BP_OFF = Lowater mark for packet drop
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rx_bp_offx {
+       u64 u64;
+       struct cvmx_agl_gmx_rx_bp_offx_s {
+               u64 reserved_6_63 : 58;
+               u64 mark : 6;
+       } s;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn52xx;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn52xxp1;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn56xx;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn56xxp1;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn61xx;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn63xx;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn63xxp1;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn66xx;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn68xx;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn68xxp1;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn70xx;
+       struct cvmx_agl_gmx_rx_bp_offx_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rx_bp_offx cvmx_agl_gmx_rx_bp_offx_t;
+
+/**
+ * cvmx_agl_gmx_rx_bp_on#
+ *
+ * AGL_GMX_RX_BP_ON = Hiwater mark for port/interface backpressure
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_rx_bp_onx {
+       u64 u64;
+       struct cvmx_agl_gmx_rx_bp_onx_s {
+               u64 reserved_9_63 : 55;
+               u64 mark : 9;
+       } s;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn52xx;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn52xxp1;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn56xx;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn56xxp1;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn61xx;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn63xx;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn63xxp1;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn66xx;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn68xx;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn68xxp1;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn70xx;
+       struct cvmx_agl_gmx_rx_bp_onx_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rx_bp_onx cvmx_agl_gmx_rx_bp_onx_t;
+
+/**
+ * cvmx_agl_gmx_rx_prt_info
+ *
+ * AGL_GMX_RX_PRT_INFO = state information for the ports
+ *
+ *
+ * Notes:
+ * COMMIT[0], DROP[0] will be reset when MIX0_CTL[RESET] is set to 1.
+ * COMMIT[1], DROP[1] will be reset when MIX1_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rx_prt_info {
+       u64 u64;
+       struct cvmx_agl_gmx_rx_prt_info_s {
+               u64 reserved_18_63 : 46;
+               u64 drop : 2;
+               u64 reserved_2_15 : 14;
+               u64 commit : 2;
+       } s;
+       struct cvmx_agl_gmx_rx_prt_info_s cn52xx;
+       struct cvmx_agl_gmx_rx_prt_info_s cn52xxp1;
+       struct cvmx_agl_gmx_rx_prt_info_cn56xx {
+               u64 reserved_17_63 : 47;
+               u64 drop : 1;
+               u64 reserved_1_15 : 15;
+               u64 commit : 1;
+       } cn56xx;
+       struct cvmx_agl_gmx_rx_prt_info_cn56xx cn56xxp1;
+       struct cvmx_agl_gmx_rx_prt_info_s cn61xx;
+       struct cvmx_agl_gmx_rx_prt_info_s cn63xx;
+       struct cvmx_agl_gmx_rx_prt_info_s cn63xxp1;
+       struct cvmx_agl_gmx_rx_prt_info_s cn66xx;
+       struct cvmx_agl_gmx_rx_prt_info_s cn68xx;
+       struct cvmx_agl_gmx_rx_prt_info_s cn68xxp1;
+       struct cvmx_agl_gmx_rx_prt_info_cn56xx cn70xx;
+       struct cvmx_agl_gmx_rx_prt_info_cn56xx cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rx_prt_info cvmx_agl_gmx_rx_prt_info_t;
+
+/**
+ * cvmx_agl_gmx_rx_tx_status
+ *
+ * AGL_GMX_RX_TX_STATUS = GMX RX/TX Status
+ *
+ *
+ * Notes:
+ * RX[0], TX[0] will be reset when MIX0_CTL[RESET] is set to 1.
+ * RX[1], TX[1] will be reset when MIX1_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_rx_tx_status {
+       u64 u64;
+       struct cvmx_agl_gmx_rx_tx_status_s {
+               u64 reserved_6_63 : 58;
+               u64 tx : 2;
+               u64 reserved_2_3 : 2;
+               u64 rx : 2;
+       } s;
+       struct cvmx_agl_gmx_rx_tx_status_s cn52xx;
+       struct cvmx_agl_gmx_rx_tx_status_s cn52xxp1;
+       struct cvmx_agl_gmx_rx_tx_status_cn56xx {
+               u64 reserved_5_63 : 59;
+               u64 tx : 1;
+               u64 reserved_1_3 : 3;
+               u64 rx : 1;
+       } cn56xx;
+       struct cvmx_agl_gmx_rx_tx_status_cn56xx cn56xxp1;
+       struct cvmx_agl_gmx_rx_tx_status_s cn61xx;
+       struct cvmx_agl_gmx_rx_tx_status_s cn63xx;
+       struct cvmx_agl_gmx_rx_tx_status_s cn63xxp1;
+       struct cvmx_agl_gmx_rx_tx_status_s cn66xx;
+       struct cvmx_agl_gmx_rx_tx_status_s cn68xx;
+       struct cvmx_agl_gmx_rx_tx_status_s cn68xxp1;
+       struct cvmx_agl_gmx_rx_tx_status_cn56xx cn70xx;
+       struct cvmx_agl_gmx_rx_tx_status_cn56xx cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_rx_tx_status cvmx_agl_gmx_rx_tx_status_t;
+
+/**
+ * cvmx_agl_gmx_smac#
+ *
+ * AGL_GMX_SMAC = Packet SMAC
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_smacx {
+       u64 u64;
+       struct cvmx_agl_gmx_smacx_s {
+               u64 reserved_48_63 : 16;
+               u64 smac : 48;
+       } s;
+       struct cvmx_agl_gmx_smacx_s cn52xx;
+       struct cvmx_agl_gmx_smacx_s cn52xxp1;
+       struct cvmx_agl_gmx_smacx_s cn56xx;
+       struct cvmx_agl_gmx_smacx_s cn56xxp1;
+       struct cvmx_agl_gmx_smacx_s cn61xx;
+       struct cvmx_agl_gmx_smacx_s cn63xx;
+       struct cvmx_agl_gmx_smacx_s cn63xxp1;
+       struct cvmx_agl_gmx_smacx_s cn66xx;
+       struct cvmx_agl_gmx_smacx_s cn68xx;
+       struct cvmx_agl_gmx_smacx_s cn68xxp1;
+       struct cvmx_agl_gmx_smacx_s cn70xx;
+       struct cvmx_agl_gmx_smacx_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_smacx cvmx_agl_gmx_smacx_t;
+
+/**
+ * cvmx_agl_gmx_stat_bp
+ *
+ * AGL_GMX_STAT_BP = Number of cycles that the TX/Stats block has help up operation
+ *
+ *
+ * Notes:
+ * Additionally reset when both MIX0/1_CTL[RESET] are set to 1.
+ *
+ *
+ *
+ * It has no relationship with the TX FIFO per se.  The TX engine sends packets
+ * from PKO and upon completion, sends a command to the TX stats block for an
+ * update based on the packet size.  The stats operation can take a few cycles -
+ * normally not enough to be visible considering the 64B min packet size that is
+ * ethernet convention.
+ *
+ * In the rare case in which SW attempted to schedule really, really, small packets
+ * or the sclk (6xxx) is running ass-slow, then the stats updates may not happen in
+ * real time and can back up the TX engine.
+ *
+ * This counter is the number of cycles in which the TX engine was stalled.  In
+ * normal operation, it should always be zeros.
+ */
+union cvmx_agl_gmx_stat_bp {
+       u64 u64;
+       struct cvmx_agl_gmx_stat_bp_s {
+               u64 reserved_17_63 : 47;
+               u64 bp : 1;
+               u64 cnt : 16;
+       } s;
+       struct cvmx_agl_gmx_stat_bp_s cn52xx;
+       struct cvmx_agl_gmx_stat_bp_s cn52xxp1;
+       struct cvmx_agl_gmx_stat_bp_s cn56xx;
+       struct cvmx_agl_gmx_stat_bp_s cn56xxp1;
+       struct cvmx_agl_gmx_stat_bp_s cn61xx;
+       struct cvmx_agl_gmx_stat_bp_s cn63xx;
+       struct cvmx_agl_gmx_stat_bp_s cn63xxp1;
+       struct cvmx_agl_gmx_stat_bp_s cn66xx;
+       struct cvmx_agl_gmx_stat_bp_s cn68xx;
+       struct cvmx_agl_gmx_stat_bp_s cn68xxp1;
+       struct cvmx_agl_gmx_stat_bp_s cn70xx;
+       struct cvmx_agl_gmx_stat_bp_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_stat_bp cvmx_agl_gmx_stat_bp_t;
+
+/**
+ * cvmx_agl_gmx_tx#_append
+ *
+ * AGL_GMX_TX_APPEND = Packet TX Append Control
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_append {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_append_s {
+               u64 reserved_4_63 : 60;
+               u64 force_fcs : 1;
+               u64 fcs : 1;
+               u64 pad : 1;
+               u64 preamble : 1;
+       } s;
+       struct cvmx_agl_gmx_txx_append_s cn52xx;
+       struct cvmx_agl_gmx_txx_append_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_append_s cn56xx;
+       struct cvmx_agl_gmx_txx_append_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_append_s cn61xx;
+       struct cvmx_agl_gmx_txx_append_s cn63xx;
+       struct cvmx_agl_gmx_txx_append_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_append_s cn66xx;
+       struct cvmx_agl_gmx_txx_append_s cn68xx;
+       struct cvmx_agl_gmx_txx_append_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_append_s cn70xx;
+       struct cvmx_agl_gmx_txx_append_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_append cvmx_agl_gmx_txx_append_t;
+
+/**
+ * cvmx_agl_gmx_tx#_clk
+ *
+ * AGL_GMX_TX_CLK = RGMII TX Clock Generation Register
+ *
+ *
+ * Notes:
+ * Normal Programming Values:
+ *  (1) RGMII, 1000Mbs   (AGL_GMX_PRT_CFG[SPEED]==1), CLK_CNT == 1
+ *  (2) RGMII, 10/100Mbs (AGL_GMX_PRT_CFG[SPEED]==0), CLK_CNT == 50/5
+ *  (3) MII,   10/100Mbs (AGL_GMX_PRT_CFG[SPEED]==0), CLK_CNT == 1
+ *
+ * RGMII Example:
+ *  Given a 125MHz PLL reference clock...
+ *   CLK_CNT ==  1 ==> 125.0MHz TXC clock period (8ns* 1)
+ *   CLK_CNT ==  5 ==>  25.0MHz TXC clock period (8ns* 5)
+ *   CLK_CNT == 50 ==>   2.5MHz TXC clock period (8ns*50)
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_clk {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_clk_s {
+               u64 reserved_6_63 : 58;
+               u64 clk_cnt : 6;
+       } s;
+       struct cvmx_agl_gmx_txx_clk_s cn61xx;
+       struct cvmx_agl_gmx_txx_clk_s cn63xx;
+       struct cvmx_agl_gmx_txx_clk_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_clk_s cn66xx;
+       struct cvmx_agl_gmx_txx_clk_s cn68xx;
+       struct cvmx_agl_gmx_txx_clk_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_clk_s cn70xx;
+       struct cvmx_agl_gmx_txx_clk_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_clk cvmx_agl_gmx_txx_clk_t;
+
+/**
+ * cvmx_agl_gmx_tx#_ctl
+ *
+ * AGL_GMX_TX_CTL = TX Control register
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 xsdef_en : 1;
+               u64 xscol_en : 1;
+       } s;
+       struct cvmx_agl_gmx_txx_ctl_s cn52xx;
+       struct cvmx_agl_gmx_txx_ctl_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_ctl_s cn56xx;
+       struct cvmx_agl_gmx_txx_ctl_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_ctl_s cn61xx;
+       struct cvmx_agl_gmx_txx_ctl_s cn63xx;
+       struct cvmx_agl_gmx_txx_ctl_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_ctl_s cn66xx;
+       struct cvmx_agl_gmx_txx_ctl_s cn68xx;
+       struct cvmx_agl_gmx_txx_ctl_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_ctl_s cn70xx;
+       struct cvmx_agl_gmx_txx_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_ctl cvmx_agl_gmx_txx_ctl_t;
+
+/**
+ * cvmx_agl_gmx_tx#_min_pkt
+ *
+ * AGL_GMX_TX_MIN_PKT = Packet TX Min Size Packet (PAD upto min size)
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_min_pkt {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_min_pkt_s {
+               u64 reserved_8_63 : 56;
+               u64 min_size : 8;
+       } s;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn52xx;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn56xx;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn61xx;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn63xx;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn66xx;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn68xx;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn70xx;
+       struct cvmx_agl_gmx_txx_min_pkt_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_min_pkt cvmx_agl_gmx_txx_min_pkt_t;
+
+/**
+ * cvmx_agl_gmx_tx#_pause_pkt_interval
+ *
+ * AGL_GMX_TX_PAUSE_PKT_INTERVAL = Packet TX Pause Packet transmission interval - how often PAUSE packets will be sent
+ *
+ *
+ * Notes:
+ * Choosing proper values of AGL_GMX_TX_PAUSE_PKT_TIME[TIME] and
+ * AGL_GMX_TX_PAUSE_PKT_INTERVAL[INTERVAL] can be challenging to the system
+ * designer.  It is suggested that TIME be much greater than INTERVAL and
+ * AGL_GMX_TX_PAUSE_ZERO[SEND] be set.  This allows a periodic refresh of the PAUSE
+ * count and then when the backpressure condition is lifted, a PAUSE packet
+ * with TIME==0 will be sent indicating that Octane is ready for additional
+ * data.
+ *
+ * If the system chooses to not set AGL_GMX_TX_PAUSE_ZERO[SEND], then it is
+ * suggested that TIME and INTERVAL are programmed such that they satisify the
+ * following rule...
+ *
+ *    INTERVAL <= TIME - (largest_pkt_size + IFG + pause_pkt_size)
+ *
+ * where largest_pkt_size is that largest packet that the system can send
+ * (normally 1518B), IFG is the interframe gap and pause_pkt_size is the size
+ * of the PAUSE packet (normally 64B).
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_pause_pkt_interval {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s {
+               u64 reserved_16_63 : 48;
+               u64 interval : 16;
+       } s;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn52xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn56xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn61xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn63xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn66xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn68xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn70xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_interval_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_pause_pkt_interval cvmx_agl_gmx_txx_pause_pkt_interval_t;
+
+/**
+ * cvmx_agl_gmx_tx#_pause_pkt_time
+ *
+ * AGL_GMX_TX_PAUSE_PKT_TIME = Packet TX Pause Packet pause_time field
+ *
+ *
+ * Notes:
+ * Choosing proper values of AGL_GMX_TX_PAUSE_PKT_TIME[TIME] and
+ * AGL_GMX_TX_PAUSE_PKT_INTERVAL[INTERVAL] can be challenging to the system
+ * designer.  It is suggested that TIME be much greater than INTERVAL and
+ * AGL_GMX_TX_PAUSE_ZERO[SEND] be set.  This allows a periodic refresh of the PAUSE
+ * count and then when the backpressure condition is lifted, a PAUSE packet
+ * with TIME==0 will be sent indicating that Octane is ready for additional
+ * data.
+ *
+ * If the system chooses to not set AGL_GMX_TX_PAUSE_ZERO[SEND], then it is
+ * suggested that TIME and INTERVAL are programmed such that they satisify the
+ * following rule...
+ *
+ *    INTERVAL <= TIME - (largest_pkt_size + IFG + pause_pkt_size)
+ *
+ * where largest_pkt_size is that largest packet that the system can send
+ * (normally 1518B), IFG is the interframe gap and pause_pkt_size is the size
+ * of the PAUSE packet (normally 64B).
+ *
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_pause_pkt_time {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s {
+               u64 reserved_16_63 : 48;
+               u64 time : 16;
+       } s;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn52xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn56xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn61xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn63xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn66xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn68xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn70xx;
+       struct cvmx_agl_gmx_txx_pause_pkt_time_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_pause_pkt_time cvmx_agl_gmx_txx_pause_pkt_time_t;
+
+/**
+ * cvmx_agl_gmx_tx#_pause_togo
+ *
+ * AGL_GMX_TX_PAUSE_TOGO = Packet TX Amount of time remaining to backpressure
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_pause_togo {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_pause_togo_s {
+               u64 reserved_16_63 : 48;
+               u64 time : 16;
+       } s;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn52xx;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn56xx;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn61xx;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn63xx;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn66xx;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn68xx;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn70xx;
+       struct cvmx_agl_gmx_txx_pause_togo_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_pause_togo cvmx_agl_gmx_txx_pause_togo_t;
+
+/**
+ * cvmx_agl_gmx_tx#_pause_zero
+ *
+ * AGL_GMX_TX_PAUSE_ZERO = Packet TX Amount of time remaining to backpressure
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_pause_zero {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_pause_zero_s {
+               u64 reserved_1_63 : 63;
+               u64 send : 1;
+       } s;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn52xx;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn56xx;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn61xx;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn63xx;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn66xx;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn68xx;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn70xx;
+       struct cvmx_agl_gmx_txx_pause_zero_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_pause_zero cvmx_agl_gmx_txx_pause_zero_t;
+
+/**
+ * cvmx_agl_gmx_tx#_soft_pause
+ *
+ * AGL_GMX_TX_SOFT_PAUSE = Packet TX Software Pause
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_soft_pause {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_soft_pause_s {
+               u64 reserved_16_63 : 48;
+               u64 time : 16;
+       } s;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn52xx;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn56xx;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn61xx;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn63xx;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn66xx;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn68xx;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn70xx;
+       struct cvmx_agl_gmx_txx_soft_pause_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_soft_pause cvmx_agl_gmx_txx_soft_pause_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat0
+ *
+ * AGL_GMX_TX_STAT0 = AGL_GMX_TX_STATS_XSDEF / AGL_GMX_TX_STATS_XSCOL
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat0 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat0_s {
+               u64 xsdef : 32;
+               u64 xscol : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat0_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat0_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat0_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat0_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat0_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat0_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat0_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat0_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat0_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat0_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat0_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat0_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat0 cvmx_agl_gmx_txx_stat0_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat1
+ *
+ * AGL_GMX_TX_STAT1 = AGL_GMX_TX_STATS_SCOL  / AGL_GMX_TX_STATS_MCOL
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat1 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat1_s {
+               u64 scol : 32;
+               u64 mcol : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat1_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat1_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat1_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat1_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat1_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat1_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat1_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat1_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat1_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat1_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat1_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat1_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat1 cvmx_agl_gmx_txx_stat1_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat2
+ *
+ * AGL_GMX_TX_STAT2 = AGL_GMX_TX_STATS_OCTS
+ *
+ *
+ * Notes:
+ * - Octect counts are the sum of all data transmitted on the wire including
+ *   packet data, pad bytes, fcs bytes, pause bytes, and jam bytes.  The octect
+ *   counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat2 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat2_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_agl_gmx_txx_stat2_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat2_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat2_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat2_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat2_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat2_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat2_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat2_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat2_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat2_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat2_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat2_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat2 cvmx_agl_gmx_txx_stat2_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat3
+ *
+ * AGL_GMX_TX_STAT3 = AGL_GMX_TX_STATS_PKTS
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat3 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat3_s {
+               u64 reserved_32_63 : 32;
+               u64 pkts : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat3_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat3_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat3_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat3_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat3_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat3_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat3_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat3_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat3_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat3_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat3_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat3_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat3 cvmx_agl_gmx_txx_stat3_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat4
+ *
+ * AGL_GMX_TX_STAT4 = AGL_GMX_TX_STATS_HIST1 (64) / AGL_GMX_TX_STATS_HIST0 (<64)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat4 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat4_s {
+               u64 hist1 : 32;
+               u64 hist0 : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat4_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat4_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat4_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat4_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat4_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat4_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat4_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat4_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat4_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat4_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat4_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat4_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat4 cvmx_agl_gmx_txx_stat4_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat5
+ *
+ * AGL_GMX_TX_STAT5 = AGL_GMX_TX_STATS_HIST3 (128- 255) / AGL_GMX_TX_STATS_HIST2 (65- 127)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat5 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat5_s {
+               u64 hist3 : 32;
+               u64 hist2 : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat5_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat5_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat5_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat5_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat5_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat5_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat5_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat5_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat5_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat5_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat5_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat5_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat5 cvmx_agl_gmx_txx_stat5_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat6
+ *
+ * AGL_GMX_TX_STAT6 = AGL_GMX_TX_STATS_HIST5 (512-1023) / AGL_GMX_TX_STATS_HIST4 (256-511)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat6 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat6_s {
+               u64 hist5 : 32;
+               u64 hist4 : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat6_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat6_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat6_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat6_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat6_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat6_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat6_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat6_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat6_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat6_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat6_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat6_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat6 cvmx_agl_gmx_txx_stat6_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat7
+ *
+ * AGL_GMX_TX_STAT7 = AGL_GMX_TX_STATS_HIST7 (1024-1518) / AGL_GMX_TX_STATS_HIST6 (>1518)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat7 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat7_s {
+               u64 hist7 : 32;
+               u64 hist6 : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat7_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat7_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat7_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat7_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat7_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat7_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat7_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat7_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat7_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat7_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat7_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat7_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat7 cvmx_agl_gmx_txx_stat7_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat8
+ *
+ * AGL_GMX_TX_STAT8 = AGL_GMX_TX_STATS_MCST  / AGL_GMX_TX_STATS_BCST
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Note, GMX determines if the packet is MCST or BCST from the DMAC of the
+ *   packet.  GMX assumes that the DMAC lies in the first 6 bytes of the packet
+ *   as per the 802.3 frame definition.  If the system requires additional data
+ *   before the L2 header, then the MCST and BCST counters may not reflect
+ *   reality and should be ignored by software.
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat8 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat8_s {
+               u64 mcst : 32;
+               u64 bcst : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat8_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat8_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat8_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat8_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat8_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat8_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat8_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat8_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat8_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat8_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat8_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat8_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat8 cvmx_agl_gmx_txx_stat8_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stat9
+ *
+ * AGL_GMX_TX_STAT9 = AGL_GMX_TX_STATS_UNDFLW / AGL_GMX_TX_STATS_CTL
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when AGL_GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Not reset when MIX*_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_txx_stat9 {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stat9_s {
+               u64 undflw : 32;
+               u64 ctl : 32;
+       } s;
+       struct cvmx_agl_gmx_txx_stat9_s cn52xx;
+       struct cvmx_agl_gmx_txx_stat9_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stat9_s cn56xx;
+       struct cvmx_agl_gmx_txx_stat9_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stat9_s cn61xx;
+       struct cvmx_agl_gmx_txx_stat9_s cn63xx;
+       struct cvmx_agl_gmx_txx_stat9_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stat9_s cn66xx;
+       struct cvmx_agl_gmx_txx_stat9_s cn68xx;
+       struct cvmx_agl_gmx_txx_stat9_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stat9_s cn70xx;
+       struct cvmx_agl_gmx_txx_stat9_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stat9 cvmx_agl_gmx_txx_stat9_t;
+
+/**
+ * cvmx_agl_gmx_tx#_stats_ctl
+ *
+ * AGL_GMX_TX_STATS_CTL = TX Stats Control register
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_stats_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_stats_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 rd_clr : 1;
+       } s;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn52xx;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn56xx;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn61xx;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn63xx;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn66xx;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn68xx;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn70xx;
+       struct cvmx_agl_gmx_txx_stats_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_stats_ctl cvmx_agl_gmx_txx_stats_ctl_t;
+
+/**
+ * cvmx_agl_gmx_tx#_thresh
+ *
+ * AGL_GMX_TX_THRESH = Packet TX Threshold
+ *
+ *
+ * Notes:
+ * Additionally reset when MIX<prt>_CTL[RESET] is set to 1.
+ *
+ */
+union cvmx_agl_gmx_txx_thresh {
+       u64 u64;
+       struct cvmx_agl_gmx_txx_thresh_s {
+               u64 reserved_6_63 : 58;
+               u64 cnt : 6;
+       } s;
+       struct cvmx_agl_gmx_txx_thresh_s cn52xx;
+       struct cvmx_agl_gmx_txx_thresh_s cn52xxp1;
+       struct cvmx_agl_gmx_txx_thresh_s cn56xx;
+       struct cvmx_agl_gmx_txx_thresh_s cn56xxp1;
+       struct cvmx_agl_gmx_txx_thresh_s cn61xx;
+       struct cvmx_agl_gmx_txx_thresh_s cn63xx;
+       struct cvmx_agl_gmx_txx_thresh_s cn63xxp1;
+       struct cvmx_agl_gmx_txx_thresh_s cn66xx;
+       struct cvmx_agl_gmx_txx_thresh_s cn68xx;
+       struct cvmx_agl_gmx_txx_thresh_s cn68xxp1;
+       struct cvmx_agl_gmx_txx_thresh_s cn70xx;
+       struct cvmx_agl_gmx_txx_thresh_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_txx_thresh cvmx_agl_gmx_txx_thresh_t;
+
+/**
+ * cvmx_agl_gmx_tx_bp
+ *
+ * AGL_GMX_TX_BP = Packet TX BackPressure Register
+ *
+ *
+ * Notes:
+ * BP[0] will be reset when MIX0_CTL[RESET] is set to 1.
+ * BP[1] will be reset when MIX1_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_tx_bp {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_bp_s {
+               u64 reserved_2_63 : 62;
+               u64 bp : 2;
+       } s;
+       struct cvmx_agl_gmx_tx_bp_s cn52xx;
+       struct cvmx_agl_gmx_tx_bp_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_bp_cn56xx {
+               u64 reserved_1_63 : 63;
+               u64 bp : 1;
+       } cn56xx;
+       struct cvmx_agl_gmx_tx_bp_cn56xx cn56xxp1;
+       struct cvmx_agl_gmx_tx_bp_s cn61xx;
+       struct cvmx_agl_gmx_tx_bp_s cn63xx;
+       struct cvmx_agl_gmx_tx_bp_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_bp_s cn66xx;
+       struct cvmx_agl_gmx_tx_bp_s cn68xx;
+       struct cvmx_agl_gmx_tx_bp_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_bp_cn56xx cn70xx;
+       struct cvmx_agl_gmx_tx_bp_cn56xx cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_bp cvmx_agl_gmx_tx_bp_t;
+
+/**
+ * cvmx_agl_gmx_tx_col_attempt
+ *
+ * AGL_GMX_TX_COL_ATTEMPT = Packet TX collision attempts before dropping frame
+ *
+ *
+ * Notes:
+ * Additionally reset when both MIX0/1_CTL[RESET] are set to 1.
+ *
+ */
+union cvmx_agl_gmx_tx_col_attempt {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_col_attempt_s {
+               u64 reserved_5_63 : 59;
+               u64 limit : 5;
+       } s;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn52xx;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn56xx;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn56xxp1;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn61xx;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn63xx;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn66xx;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn68xx;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn70xx;
+       struct cvmx_agl_gmx_tx_col_attempt_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_col_attempt cvmx_agl_gmx_tx_col_attempt_t;
+
+/**
+ * cvmx_agl_gmx_tx_ifg
+ *
+ * Common
+ * AGL_GMX_TX_IFG = Packet TX Interframe Gap
+ */
+union cvmx_agl_gmx_tx_ifg {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_ifg_s {
+               u64 reserved_8_63 : 56;
+               u64 ifg2 : 4;
+               u64 ifg1 : 4;
+       } s;
+       struct cvmx_agl_gmx_tx_ifg_s cn52xx;
+       struct cvmx_agl_gmx_tx_ifg_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_ifg_s cn56xx;
+       struct cvmx_agl_gmx_tx_ifg_s cn56xxp1;
+       struct cvmx_agl_gmx_tx_ifg_s cn61xx;
+       struct cvmx_agl_gmx_tx_ifg_s cn63xx;
+       struct cvmx_agl_gmx_tx_ifg_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_ifg_s cn66xx;
+       struct cvmx_agl_gmx_tx_ifg_s cn68xx;
+       struct cvmx_agl_gmx_tx_ifg_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_ifg_s cn70xx;
+       struct cvmx_agl_gmx_tx_ifg_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_ifg cvmx_agl_gmx_tx_ifg_t;
+
+/**
+ * cvmx_agl_gmx_tx_int_en
+ *
+ * AGL_GMX_TX_INT_EN = Interrupt Enable
+ *
+ *
+ * Notes:
+ * UNDFLW[0], XSCOL[0], XSDEF[0], LATE_COL[0], PTP_LOST[0] will be reset when MIX0_CTL[RESET] is set to 1.
+ * UNDFLW[1], XSCOL[1], XSDEF[1], LATE_COL[1], PTP_LOST[1] will be reset when MIX1_CTL[RESET] is set to 1.
+ * PKO_NXA will bee reset when both MIX0/1_CTL[RESET] are set to 1.
+ */
+union cvmx_agl_gmx_tx_int_en {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_int_en_s {
+               u64 reserved_22_63 : 42;
+               u64 ptp_lost : 2;
+               u64 reserved_18_19 : 2;
+               u64 late_col : 2;
+               u64 reserved_14_15 : 2;
+               u64 xsdef : 2;
+               u64 reserved_10_11 : 2;
+               u64 xscol : 2;
+               u64 reserved_4_7 : 4;
+               u64 undflw : 2;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } s;
+       struct cvmx_agl_gmx_tx_int_en_cn52xx {
+               u64 reserved_18_63 : 46;
+               u64 late_col : 2;
+               u64 reserved_14_15 : 2;
+               u64 xsdef : 2;
+               u64 reserved_10_11 : 2;
+               u64 xscol : 2;
+               u64 reserved_4_7 : 4;
+               u64 undflw : 2;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn52xx;
+       struct cvmx_agl_gmx_tx_int_en_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_tx_int_en_cn56xx {
+               u64 reserved_17_63 : 47;
+               u64 late_col : 1;
+               u64 reserved_13_15 : 3;
+               u64 xsdef : 1;
+               u64 reserved_9_11 : 3;
+               u64 xscol : 1;
+               u64 reserved_3_7 : 5;
+               u64 undflw : 1;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn56xx;
+       struct cvmx_agl_gmx_tx_int_en_cn56xx cn56xxp1;
+       struct cvmx_agl_gmx_tx_int_en_s cn61xx;
+       struct cvmx_agl_gmx_tx_int_en_s cn63xx;
+       struct cvmx_agl_gmx_tx_int_en_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_int_en_s cn66xx;
+       struct cvmx_agl_gmx_tx_int_en_s cn68xx;
+       struct cvmx_agl_gmx_tx_int_en_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_int_en_cn70xx {
+               u64 reserved_21_63 : 43;
+               u64 ptp_lost : 1;
+               u64 reserved_17_19 : 3;
+               u64 late_col : 1;
+               u64 reserved_13_15 : 3;
+               u64 xsdef : 1;
+               u64 reserved_9_11 : 3;
+               u64 xscol : 1;
+               u64 reserved_3_7 : 5;
+               u64 undflw : 1;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn70xx;
+       struct cvmx_agl_gmx_tx_int_en_cn70xx cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_int_en cvmx_agl_gmx_tx_int_en_t;
+
+/**
+ * cvmx_agl_gmx_tx_int_reg
+ *
+ * AGL_GMX_TX_INT_REG = Interrupt Register
+ *
+ *
+ * Notes:
+ * UNDFLW[0], XSCOL[0], XSDEF[0], LATE_COL[0], PTP_LOST[0] will be reset when MIX0_CTL[RESET] is set to 1.
+ * UNDFLW[1], XSCOL[1], XSDEF[1], LATE_COL[1], PTP_LOST[1] will be reset when MIX1_CTL[RESET] is set to 1.
+ * PKO_NXA will bee reset when both MIX0/1_CTL[RESET] are set to 1.
+ */
+union cvmx_agl_gmx_tx_int_reg {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_int_reg_s {
+               u64 reserved_22_63 : 42;
+               u64 ptp_lost : 2;
+               u64 reserved_18_19 : 2;
+               u64 late_col : 2;
+               u64 reserved_14_15 : 2;
+               u64 xsdef : 2;
+               u64 reserved_10_11 : 2;
+               u64 xscol : 2;
+               u64 reserved_4_7 : 4;
+               u64 undflw : 2;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } s;
+       struct cvmx_agl_gmx_tx_int_reg_cn52xx {
+               u64 reserved_18_63 : 46;
+               u64 late_col : 2;
+               u64 reserved_14_15 : 2;
+               u64 xsdef : 2;
+               u64 reserved_10_11 : 2;
+               u64 xscol : 2;
+               u64 reserved_4_7 : 4;
+               u64 undflw : 2;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn52xx;
+       struct cvmx_agl_gmx_tx_int_reg_cn52xx cn52xxp1;
+       struct cvmx_agl_gmx_tx_int_reg_cn56xx {
+               u64 reserved_17_63 : 47;
+               u64 late_col : 1;
+               u64 reserved_13_15 : 3;
+               u64 xsdef : 1;
+               u64 reserved_9_11 : 3;
+               u64 xscol : 1;
+               u64 reserved_3_7 : 5;
+               u64 undflw : 1;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn56xx;
+       struct cvmx_agl_gmx_tx_int_reg_cn56xx cn56xxp1;
+       struct cvmx_agl_gmx_tx_int_reg_s cn61xx;
+       struct cvmx_agl_gmx_tx_int_reg_s cn63xx;
+       struct cvmx_agl_gmx_tx_int_reg_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_int_reg_s cn66xx;
+       struct cvmx_agl_gmx_tx_int_reg_s cn68xx;
+       struct cvmx_agl_gmx_tx_int_reg_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_int_reg_cn70xx {
+               u64 reserved_21_63 : 43;
+               u64 ptp_lost : 1;
+               u64 reserved_17_19 : 3;
+               u64 late_col : 1;
+               u64 reserved_13_15 : 3;
+               u64 xsdef : 1;
+               u64 reserved_9_11 : 3;
+               u64 xscol : 1;
+               u64 reserved_3_7 : 5;
+               u64 undflw : 1;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn70xx;
+       struct cvmx_agl_gmx_tx_int_reg_cn70xx cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_int_reg cvmx_agl_gmx_tx_int_reg_t;
+
+/**
+ * cvmx_agl_gmx_tx_jam
+ *
+ * AGL_GMX_TX_JAM = Packet TX Jam Pattern
+ *
+ *
+ * Notes:
+ * Additionally reset when both MIX0/1_CTL[RESET] are set to 1.
+ *
+ */
+union cvmx_agl_gmx_tx_jam {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_jam_s {
+               u64 reserved_8_63 : 56;
+               u64 jam : 8;
+       } s;
+       struct cvmx_agl_gmx_tx_jam_s cn52xx;
+       struct cvmx_agl_gmx_tx_jam_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_jam_s cn56xx;
+       struct cvmx_agl_gmx_tx_jam_s cn56xxp1;
+       struct cvmx_agl_gmx_tx_jam_s cn61xx;
+       struct cvmx_agl_gmx_tx_jam_s cn63xx;
+       struct cvmx_agl_gmx_tx_jam_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_jam_s cn66xx;
+       struct cvmx_agl_gmx_tx_jam_s cn68xx;
+       struct cvmx_agl_gmx_tx_jam_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_jam_s cn70xx;
+       struct cvmx_agl_gmx_tx_jam_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_jam cvmx_agl_gmx_tx_jam_t;
+
+/**
+ * cvmx_agl_gmx_tx_lfsr
+ *
+ * AGL_GMX_TX_LFSR = LFSR used to implement truncated binary exponential backoff
+ *
+ *
+ * Notes:
+ * Additionally reset when both MIX0/1_CTL[RESET] are set to 1.
+ *
+ */
+union cvmx_agl_gmx_tx_lfsr {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_lfsr_s {
+               u64 reserved_16_63 : 48;
+               u64 lfsr : 16;
+       } s;
+       struct cvmx_agl_gmx_tx_lfsr_s cn52xx;
+       struct cvmx_agl_gmx_tx_lfsr_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_lfsr_s cn56xx;
+       struct cvmx_agl_gmx_tx_lfsr_s cn56xxp1;
+       struct cvmx_agl_gmx_tx_lfsr_s cn61xx;
+       struct cvmx_agl_gmx_tx_lfsr_s cn63xx;
+       struct cvmx_agl_gmx_tx_lfsr_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_lfsr_s cn66xx;
+       struct cvmx_agl_gmx_tx_lfsr_s cn68xx;
+       struct cvmx_agl_gmx_tx_lfsr_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_lfsr_s cn70xx;
+       struct cvmx_agl_gmx_tx_lfsr_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_lfsr cvmx_agl_gmx_tx_lfsr_t;
+
+/**
+ * cvmx_agl_gmx_tx_ovr_bp
+ *
+ * AGL_GMX_TX_OVR_BP = Packet TX Override BackPressure
+ *
+ *
+ * Notes:
+ * IGN_FULL[0], BP[0], EN[0] will be reset when MIX0_CTL[RESET] is set to 1.
+ * IGN_FULL[1], BP[1], EN[1] will be reset when MIX1_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_gmx_tx_ovr_bp {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_ovr_bp_s {
+               u64 reserved_10_63 : 54;
+               u64 en : 2;
+               u64 reserved_6_7 : 2;
+               u64 bp : 2;
+               u64 reserved_2_3 : 2;
+               u64 ign_full : 2;
+       } s;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn52xx;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_ovr_bp_cn56xx {
+               u64 reserved_9_63 : 55;
+               u64 en : 1;
+               u64 reserved_5_7 : 3;
+               u64 bp : 1;
+               u64 reserved_1_3 : 3;
+               u64 ign_full : 1;
+       } cn56xx;
+       struct cvmx_agl_gmx_tx_ovr_bp_cn56xx cn56xxp1;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn61xx;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn63xx;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn66xx;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn68xx;
+       struct cvmx_agl_gmx_tx_ovr_bp_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_ovr_bp_cn56xx cn70xx;
+       struct cvmx_agl_gmx_tx_ovr_bp_cn56xx cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_ovr_bp cvmx_agl_gmx_tx_ovr_bp_t;
+
+/**
+ * cvmx_agl_gmx_tx_pause_pkt_dmac
+ *
+ * AGL_GMX_TX_PAUSE_PKT_DMAC = Packet TX Pause Packet DMAC field
+ *
+ *
+ * Notes:
+ * Additionally reset when both MIX0/1_CTL[RESET] are set to 1.
+ *
+ */
+union cvmx_agl_gmx_tx_pause_pkt_dmac {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s {
+               u64 reserved_48_63 : 16;
+               u64 dmac : 48;
+       } s;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn52xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn56xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn56xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn61xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn63xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn66xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn68xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn70xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_dmac_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_pause_pkt_dmac cvmx_agl_gmx_tx_pause_pkt_dmac_t;
+
+/**
+ * cvmx_agl_gmx_tx_pause_pkt_type
+ *
+ * AGL_GMX_TX_PAUSE_PKT_TYPE = Packet TX Pause Packet TYPE field
+ *
+ *
+ * Notes:
+ * Additionally reset when both MIX0/1_CTL[RESET] are set to 1.
+ *
+ */
+union cvmx_agl_gmx_tx_pause_pkt_type {
+       u64 u64;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s {
+               u64 reserved_16_63 : 48;
+               u64 type : 16;
+       } s;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn52xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn52xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn56xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn56xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn61xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn63xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn63xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn66xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn68xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn68xxp1;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn70xx;
+       struct cvmx_agl_gmx_tx_pause_pkt_type_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_tx_pause_pkt_type cvmx_agl_gmx_tx_pause_pkt_type_t;
+
+/**
+ * cvmx_agl_gmx_wol_ctl
+ */
+union cvmx_agl_gmx_wol_ctl {
+       u64 u64;
+       struct cvmx_agl_gmx_wol_ctl_s {
+               u64 reserved_33_63 : 31;
+               u64 magic_en : 1;
+               u64 reserved_17_31 : 15;
+               u64 direct_en : 1;
+               u64 reserved_1_15 : 15;
+               u64 en : 1;
+       } s;
+       struct cvmx_agl_gmx_wol_ctl_s cn70xx;
+       struct cvmx_agl_gmx_wol_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_agl_gmx_wol_ctl cvmx_agl_gmx_wol_ctl_t;
+
+/**
+ * cvmx_agl_prt#_ctl
+ *
+ * AGL_PRT_CTL = AGL Port Control
+ *
+ *
+ * Notes:
+ * The RGMII timing specification requires that devices transmit clock and
+ * data synchronously. The specification requires external sources (namely
+ * the PC board trace routes) to introduce the appropriate 1.5 to 2.0 ns of
+ * delay.
+ *
+ * To eliminate the need for the PC board delays, the MIX RGMII interface
+ * has optional onboard DLL's for both transmit and receive. For correct
+ * operation, at most one of the transmitter, board, or receiver involved
+ * in an RGMII link should introduce delay. By default/reset,
+ * the MIX RGMII receivers delay the received clock, and the MIX
+ * RGMII transmitters do not delay the transmitted clock. Whether this
+ * default works as-is with a given link partner depends on the behavior
+ * of the link partner and the PC board.
+ *
+ * These are the possible modes of MIX RGMII receive operation:
+ *  o AGL_PRTx_CTL[CLKRX_BYP] = 0 (reset value) - The OCTEON MIX RGMII
+ *    receive interface introduces clock delay using its internal DLL.
+ *    This mode is appropriate if neither the remote
+ *    transmitter nor the PC board delays the clock.
+ *  o AGL_PRTx_CTL[CLKRX_BYP] = 1, [CLKRX_SET] = 0x0 - The OCTEON MIX
+ *    RGMII receive interface introduces no clock delay. This mode
+ *    is appropriate if either the remote transmitter or the PC board
+ *    delays the clock.
+ *
+ * These are the possible modes of MIX RGMII transmit operation:
+ *  o AGL_PRTx_CTL[CLKTX_BYP] = 1, [CLKTX_SET] = 0x0 (reset value) -
+ *    The OCTEON MIX RGMII transmit interface introduces no clock
+ *    delay. This mode is appropriate is either the remote receiver
+ *    or the PC board delays the clock.
+ *  o AGL_PRTx_CTL[CLKTX_BYP] = 0 - The OCTEON MIX RGMII transmit
+ *    interface introduces clock delay using its internal DLL.
+ *    This mode is appropriate if neither the remote receiver
+ *    nor the PC board delays the clock.
+ *
+ * AGL_PRT0_CTL will be reset when MIX0_CTL[RESET] is set to 1.
+ * AGL_PRT1_CTL will be reset when MIX1_CTL[RESET] is set to 1.
+ */
+union cvmx_agl_prtx_ctl {
+       u64 u64;
+       struct cvmx_agl_prtx_ctl_s {
+               u64 drv_byp : 1;
+               u64 reserved_62_62 : 1;
+               u64 cmp_pctl : 6;
+               u64 reserved_54_55 : 2;
+               u64 cmp_nctl : 6;
+               u64 reserved_46_47 : 2;
+               u64 drv_pctl : 6;
+               u64 reserved_38_39 : 2;
+               u64 drv_nctl : 6;
+               u64 reserved_31_31 : 1;
+               u64 clk_set : 7;
+               u64 clkrx_byp : 1;
+               u64 clkrx_set : 7;
+               u64 clktx_byp : 1;
+               u64 clktx_set : 7;
+               u64 refclk_sel : 2;
+               u64 reserved_5_5 : 1;
+               u64 dllrst : 1;
+               u64 comp : 1;
+               u64 enable : 1;
+               u64 clkrst : 1;
+               u64 mode : 1;
+       } s;
+       struct cvmx_agl_prtx_ctl_cn61xx {
+               u64 drv_byp : 1;
+               u64 reserved_62_62 : 1;
+               u64 cmp_pctl : 6;
+               u64 reserved_54_55 : 2;
+               u64 cmp_nctl : 6;
+               u64 reserved_46_47 : 2;
+               u64 drv_pctl : 6;
+               u64 reserved_38_39 : 2;
+               u64 drv_nctl : 6;
+               u64 reserved_29_31 : 3;
+               u64 clk_set : 5;
+               u64 clkrx_byp : 1;
+               u64 reserved_21_22 : 2;
+               u64 clkrx_set : 5;
+               u64 clktx_byp : 1;
+               u64 reserved_13_14 : 2;
+               u64 clktx_set : 5;
+               u64 reserved_5_7 : 3;
+               u64 dllrst : 1;
+               u64 comp : 1;
+               u64 enable : 1;
+               u64 clkrst : 1;
+               u64 mode : 1;
+       } cn61xx;
+       struct cvmx_agl_prtx_ctl_cn61xx cn63xx;
+       struct cvmx_agl_prtx_ctl_cn61xx cn63xxp1;
+       struct cvmx_agl_prtx_ctl_cn61xx cn66xx;
+       struct cvmx_agl_prtx_ctl_cn61xx cn68xx;
+       struct cvmx_agl_prtx_ctl_cn61xx cn68xxp1;
+       struct cvmx_agl_prtx_ctl_cn70xx {
+               u64 drv_byp : 1;
+               u64 reserved_61_62 : 2;
+               u64 cmp_pctl : 5;
+               u64 reserved_53_55 : 3;
+               u64 cmp_nctl : 5;
+               u64 reserved_45_47 : 3;
+               u64 drv_pctl : 5;
+               u64 reserved_37_39 : 3;
+               u64 drv_nctl : 5;
+               u64 reserved_31_31 : 1;
+               u64 clk_set : 7;
+               u64 clkrx_byp : 1;
+               u64 clkrx_set : 7;
+               u64 clktx_byp : 1;
+               u64 clktx_set : 7;
+               u64 refclk_sel : 2;
+               u64 reserved_5_5 : 1;
+               u64 dllrst : 1;
+               u64 comp : 1;
+               u64 enable : 1;
+               u64 clkrst : 1;
+               u64 mode : 1;
+       } cn70xx;
+       struct cvmx_agl_prtx_ctl_cn70xx cn70xxp1;
+};
+
+typedef union cvmx_agl_prtx_ctl cvmx_agl_prtx_ctl_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-asxx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-asxx-defs.h
new file mode 100644 (file)
index 0000000..2af1a29
--- /dev/null
@@ -0,0 +1,709 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon asxx.
+ */
+
+#ifndef __CVMX_ASXX_DEFS_H__
+#define __CVMX_ASXX_DEFS_H__
+
+#define CVMX_ASXX_GMII_RX_CLK_SET(offset)    (0x00011800B0000180ull)
+#define CVMX_ASXX_GMII_RX_DAT_SET(offset)    (0x00011800B0000188ull)
+#define CVMX_ASXX_INT_EN(offset)            (0x00011800B0000018ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_INT_REG(offset)           (0x00011800B0000010ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_MII_RX_DAT_SET(offset)     (0x00011800B0000190ull)
+#define CVMX_ASXX_PRT_LOOP(offset)          (0x00011800B0000040ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_BYPASS(offset)        (0x00011800B0000248ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_BYPASS_SETTING(offset) (0x00011800B0000250ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_COMP(offset)          (0x00011800B0000220ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_DATA_DRV(offset)      (0x00011800B0000218ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_FCRAM_MODE(offset)     (0x00011800B0000210ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_NCTL_STRONG(offset)    (0x00011800B0000230ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_NCTL_WEAK(offset)             (0x00011800B0000240ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_PCTL_STRONG(offset)    (0x00011800B0000228ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_PCTL_WEAK(offset)             (0x00011800B0000238ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RLD_SETTING(offset)       (0x00011800B0000258ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RX_CLK_SETX(offset, block_id)                                                    \
+       (0x00011800B0000020ull + (((offset) & 3) + ((block_id) & 1) * 0x1000000ull) * 8)
+#define CVMX_ASXX_RX_PRT_EN(offset)    (0x00011800B0000000ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RX_WOL(offset)       (0x00011800B0000100ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RX_WOL_MSK(offset)   (0x00011800B0000108ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RX_WOL_POWOK(offset) (0x00011800B0000118ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_RX_WOL_SIG(offset)   (0x00011800B0000110ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_TX_CLK_SETX(offset, block_id)                                                    \
+       (0x00011800B0000048ull + (((offset) & 3) + ((block_id) & 1) * 0x1000000ull) * 8)
+#define CVMX_ASXX_TX_COMP_BYP(offset) (0x00011800B0000068ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_ASXX_TX_HI_WATERX(offset, block_id)                                                   \
+       (0x00011800B0000080ull + (((offset) & 3) + ((block_id) & 1) * 0x1000000ull) * 8)
+#define CVMX_ASXX_TX_PRT_EN(offset) (0x00011800B0000008ull + ((offset) & 1) * 0x8000000ull)
+
+/**
+ * cvmx_asx#_gmii_rx_clk_set
+ *
+ * ASX_GMII_RX_CLK_SET = GMII Clock delay setting
+ *
+ */
+union cvmx_asxx_gmii_rx_clk_set {
+       u64 u64;
+       struct cvmx_asxx_gmii_rx_clk_set_s {
+               u64 reserved_5_63 : 59;
+               u64 setting : 5;
+       } s;
+       struct cvmx_asxx_gmii_rx_clk_set_s cn30xx;
+       struct cvmx_asxx_gmii_rx_clk_set_s cn31xx;
+       struct cvmx_asxx_gmii_rx_clk_set_s cn50xx;
+};
+
+typedef union cvmx_asxx_gmii_rx_clk_set cvmx_asxx_gmii_rx_clk_set_t;
+
+/**
+ * cvmx_asx#_gmii_rx_dat_set
+ *
+ * ASX_GMII_RX_DAT_SET = GMII Clock delay setting
+ *
+ */
+union cvmx_asxx_gmii_rx_dat_set {
+       u64 u64;
+       struct cvmx_asxx_gmii_rx_dat_set_s {
+               u64 reserved_5_63 : 59;
+               u64 setting : 5;
+       } s;
+       struct cvmx_asxx_gmii_rx_dat_set_s cn30xx;
+       struct cvmx_asxx_gmii_rx_dat_set_s cn31xx;
+       struct cvmx_asxx_gmii_rx_dat_set_s cn50xx;
+};
+
+typedef union cvmx_asxx_gmii_rx_dat_set cvmx_asxx_gmii_rx_dat_set_t;
+
+/**
+ * cvmx_asx#_int_en
+ *
+ * ASX_INT_EN = Interrupt Enable
+ *
+ */
+union cvmx_asxx_int_en {
+       u64 u64;
+       struct cvmx_asxx_int_en_s {
+               u64 reserved_12_63 : 52;
+               u64 txpsh : 4;
+               u64 txpop : 4;
+               u64 ovrflw : 4;
+       } s;
+       struct cvmx_asxx_int_en_cn30xx {
+               u64 reserved_11_63 : 53;
+               u64 txpsh : 3;
+               u64 reserved_7_7 : 1;
+               u64 txpop : 3;
+               u64 reserved_3_3 : 1;
+               u64 ovrflw : 3;
+       } cn30xx;
+       struct cvmx_asxx_int_en_cn30xx cn31xx;
+       struct cvmx_asxx_int_en_s cn38xx;
+       struct cvmx_asxx_int_en_s cn38xxp2;
+       struct cvmx_asxx_int_en_cn30xx cn50xx;
+       struct cvmx_asxx_int_en_s cn58xx;
+       struct cvmx_asxx_int_en_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_int_en cvmx_asxx_int_en_t;
+
+/**
+ * cvmx_asx#_int_reg
+ *
+ * ASX_INT_REG = Interrupt Register
+ *
+ */
+union cvmx_asxx_int_reg {
+       u64 u64;
+       struct cvmx_asxx_int_reg_s {
+               u64 reserved_12_63 : 52;
+               u64 txpsh : 4;
+               u64 txpop : 4;
+               u64 ovrflw : 4;
+       } s;
+       struct cvmx_asxx_int_reg_cn30xx {
+               u64 reserved_11_63 : 53;
+               u64 txpsh : 3;
+               u64 reserved_7_7 : 1;
+               u64 txpop : 3;
+               u64 reserved_3_3 : 1;
+               u64 ovrflw : 3;
+       } cn30xx;
+       struct cvmx_asxx_int_reg_cn30xx cn31xx;
+       struct cvmx_asxx_int_reg_s cn38xx;
+       struct cvmx_asxx_int_reg_s cn38xxp2;
+       struct cvmx_asxx_int_reg_cn30xx cn50xx;
+       struct cvmx_asxx_int_reg_s cn58xx;
+       struct cvmx_asxx_int_reg_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_int_reg cvmx_asxx_int_reg_t;
+
+/**
+ * cvmx_asx#_mii_rx_dat_set
+ *
+ * ASX_MII_RX_DAT_SET = GMII Clock delay setting
+ *
+ */
+union cvmx_asxx_mii_rx_dat_set {
+       u64 u64;
+       struct cvmx_asxx_mii_rx_dat_set_s {
+               u64 reserved_5_63 : 59;
+               u64 setting : 5;
+       } s;
+       struct cvmx_asxx_mii_rx_dat_set_s cn30xx;
+       struct cvmx_asxx_mii_rx_dat_set_s cn50xx;
+};
+
+typedef union cvmx_asxx_mii_rx_dat_set cvmx_asxx_mii_rx_dat_set_t;
+
+/**
+ * cvmx_asx#_prt_loop
+ *
+ * ASX_PRT_LOOP = Internal Loopback mode - TX FIFO output goes into RX FIFO (and maybe pins)
+ *
+ */
+union cvmx_asxx_prt_loop {
+       u64 u64;
+       struct cvmx_asxx_prt_loop_s {
+               u64 reserved_8_63 : 56;
+               u64 ext_loop : 4;
+               u64 int_loop : 4;
+       } s;
+       struct cvmx_asxx_prt_loop_cn30xx {
+               u64 reserved_7_63 : 57;
+               u64 ext_loop : 3;
+               u64 reserved_3_3 : 1;
+               u64 int_loop : 3;
+       } cn30xx;
+       struct cvmx_asxx_prt_loop_cn30xx cn31xx;
+       struct cvmx_asxx_prt_loop_s cn38xx;
+       struct cvmx_asxx_prt_loop_s cn38xxp2;
+       struct cvmx_asxx_prt_loop_cn30xx cn50xx;
+       struct cvmx_asxx_prt_loop_s cn58xx;
+       struct cvmx_asxx_prt_loop_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_prt_loop cvmx_asxx_prt_loop_t;
+
+/**
+ * cvmx_asx#_rld_bypass
+ *
+ * ASX_RLD_BYPASS
+ *
+ */
+union cvmx_asxx_rld_bypass {
+       u64 u64;
+       struct cvmx_asxx_rld_bypass_s {
+               u64 reserved_1_63 : 63;
+               u64 bypass : 1;
+       } s;
+       struct cvmx_asxx_rld_bypass_s cn38xx;
+       struct cvmx_asxx_rld_bypass_s cn38xxp2;
+       struct cvmx_asxx_rld_bypass_s cn58xx;
+       struct cvmx_asxx_rld_bypass_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_bypass cvmx_asxx_rld_bypass_t;
+
+/**
+ * cvmx_asx#_rld_bypass_setting
+ *
+ * ASX_RLD_BYPASS_SETTING
+ *
+ */
+union cvmx_asxx_rld_bypass_setting {
+       u64 u64;
+       struct cvmx_asxx_rld_bypass_setting_s {
+               u64 reserved_5_63 : 59;
+               u64 setting : 5;
+       } s;
+       struct cvmx_asxx_rld_bypass_setting_s cn38xx;
+       struct cvmx_asxx_rld_bypass_setting_s cn38xxp2;
+       struct cvmx_asxx_rld_bypass_setting_s cn58xx;
+       struct cvmx_asxx_rld_bypass_setting_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_bypass_setting cvmx_asxx_rld_bypass_setting_t;
+
+/**
+ * cvmx_asx#_rld_comp
+ *
+ * ASX_RLD_COMP
+ *
+ */
+union cvmx_asxx_rld_comp {
+       u64 u64;
+       struct cvmx_asxx_rld_comp_s {
+               u64 reserved_9_63 : 55;
+               u64 pctl : 5;
+               u64 nctl : 4;
+       } s;
+       struct cvmx_asxx_rld_comp_cn38xx {
+               u64 reserved_8_63 : 56;
+               u64 pctl : 4;
+               u64 nctl : 4;
+       } cn38xx;
+       struct cvmx_asxx_rld_comp_cn38xx cn38xxp2;
+       struct cvmx_asxx_rld_comp_s cn58xx;
+       struct cvmx_asxx_rld_comp_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_comp cvmx_asxx_rld_comp_t;
+
+/**
+ * cvmx_asx#_rld_data_drv
+ *
+ * ASX_RLD_DATA_DRV
+ *
+ */
+union cvmx_asxx_rld_data_drv {
+       u64 u64;
+       struct cvmx_asxx_rld_data_drv_s {
+               u64 reserved_8_63 : 56;
+               u64 pctl : 4;
+               u64 nctl : 4;
+       } s;
+       struct cvmx_asxx_rld_data_drv_s cn38xx;
+       struct cvmx_asxx_rld_data_drv_s cn38xxp2;
+       struct cvmx_asxx_rld_data_drv_s cn58xx;
+       struct cvmx_asxx_rld_data_drv_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_data_drv cvmx_asxx_rld_data_drv_t;
+
+/**
+ * cvmx_asx#_rld_fcram_mode
+ *
+ * ASX_RLD_FCRAM_MODE
+ *
+ */
+union cvmx_asxx_rld_fcram_mode {
+       u64 u64;
+       struct cvmx_asxx_rld_fcram_mode_s {
+               u64 reserved_1_63 : 63;
+               u64 mode : 1;
+       } s;
+       struct cvmx_asxx_rld_fcram_mode_s cn38xx;
+       struct cvmx_asxx_rld_fcram_mode_s cn38xxp2;
+};
+
+typedef union cvmx_asxx_rld_fcram_mode cvmx_asxx_rld_fcram_mode_t;
+
+/**
+ * cvmx_asx#_rld_nctl_strong
+ *
+ * ASX_RLD_NCTL_STRONG
+ *
+ */
+union cvmx_asxx_rld_nctl_strong {
+       u64 u64;
+       struct cvmx_asxx_rld_nctl_strong_s {
+               u64 reserved_5_63 : 59;
+               u64 nctl : 5;
+       } s;
+       struct cvmx_asxx_rld_nctl_strong_s cn38xx;
+       struct cvmx_asxx_rld_nctl_strong_s cn38xxp2;
+       struct cvmx_asxx_rld_nctl_strong_s cn58xx;
+       struct cvmx_asxx_rld_nctl_strong_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_nctl_strong cvmx_asxx_rld_nctl_strong_t;
+
+/**
+ * cvmx_asx#_rld_nctl_weak
+ *
+ * ASX_RLD_NCTL_WEAK
+ *
+ */
+union cvmx_asxx_rld_nctl_weak {
+       u64 u64;
+       struct cvmx_asxx_rld_nctl_weak_s {
+               u64 reserved_5_63 : 59;
+               u64 nctl : 5;
+       } s;
+       struct cvmx_asxx_rld_nctl_weak_s cn38xx;
+       struct cvmx_asxx_rld_nctl_weak_s cn38xxp2;
+       struct cvmx_asxx_rld_nctl_weak_s cn58xx;
+       struct cvmx_asxx_rld_nctl_weak_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_nctl_weak cvmx_asxx_rld_nctl_weak_t;
+
+/**
+ * cvmx_asx#_rld_pctl_strong
+ *
+ * ASX_RLD_PCTL_STRONG
+ *
+ */
+union cvmx_asxx_rld_pctl_strong {
+       u64 u64;
+       struct cvmx_asxx_rld_pctl_strong_s {
+               u64 reserved_5_63 : 59;
+               u64 pctl : 5;
+       } s;
+       struct cvmx_asxx_rld_pctl_strong_s cn38xx;
+       struct cvmx_asxx_rld_pctl_strong_s cn38xxp2;
+       struct cvmx_asxx_rld_pctl_strong_s cn58xx;
+       struct cvmx_asxx_rld_pctl_strong_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_pctl_strong cvmx_asxx_rld_pctl_strong_t;
+
+/**
+ * cvmx_asx#_rld_pctl_weak
+ *
+ * ASX_RLD_PCTL_WEAK
+ *
+ */
+union cvmx_asxx_rld_pctl_weak {
+       u64 u64;
+       struct cvmx_asxx_rld_pctl_weak_s {
+               u64 reserved_5_63 : 59;
+               u64 pctl : 5;
+       } s;
+       struct cvmx_asxx_rld_pctl_weak_s cn38xx;
+       struct cvmx_asxx_rld_pctl_weak_s cn38xxp2;
+       struct cvmx_asxx_rld_pctl_weak_s cn58xx;
+       struct cvmx_asxx_rld_pctl_weak_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_pctl_weak cvmx_asxx_rld_pctl_weak_t;
+
+/**
+ * cvmx_asx#_rld_setting
+ *
+ * ASX_RLD_SETTING
+ *
+ */
+union cvmx_asxx_rld_setting {
+       u64 u64;
+       struct cvmx_asxx_rld_setting_s {
+               u64 reserved_13_63 : 51;
+               u64 dfaset : 5;
+               u64 dfalag : 1;
+               u64 dfalead : 1;
+               u64 dfalock : 1;
+               u64 setting : 5;
+       } s;
+       struct cvmx_asxx_rld_setting_cn38xx {
+               u64 reserved_5_63 : 59;
+               u64 setting : 5;
+       } cn38xx;
+       struct cvmx_asxx_rld_setting_cn38xx cn38xxp2;
+       struct cvmx_asxx_rld_setting_s cn58xx;
+       struct cvmx_asxx_rld_setting_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rld_setting cvmx_asxx_rld_setting_t;
+
+/**
+ * cvmx_asx#_rx_clk_set#
+ *
+ * ASX_RX_CLK_SET = RGMII Clock delay setting
+ *
+ *
+ * Notes:
+ * Setting to place on the open-loop RXC (RGMII receive clk)
+ * delay line, which can delay the received clock. This
+ * can be used if the board and/or transmitting device
+ * has not otherwise delayed the clock.
+ *
+ * A value of SETTING=0 disables the delay line. The delay
+ * line should be disabled unless the transmitter or board
+ * does not delay the clock.
+ *
+ * Note that this delay line provides only a coarse control
+ * over the delay. Generally, it can only reliably provide
+ * a delay in the range 1.25-2.5ns, which may not be adequate
+ * for some system applications.
+ *
+ * The open loop delay line selects
+ * from among a series of tap positions. Each incremental
+ * tap position adds a delay of 50ps to 135ps per tap, depending
+ * on the chip, its temperature, and the voltage.
+ * To achieve from 1.25-2.5ns of delay on the received
+ * clock, a fixed value of SETTING=24 may work.
+ * For more precision, we recommend the following settings
+ * based on the chip voltage:
+ *
+ *    VDD           SETTING
+ *  -----------------------------
+ *    1.0             18
+ *    1.05            19
+ *    1.1             21
+ *    1.15            22
+ *    1.2             23
+ *    1.25            24
+ *    1.3             25
+ */
+union cvmx_asxx_rx_clk_setx {
+       u64 u64;
+       struct cvmx_asxx_rx_clk_setx_s {
+               u64 reserved_5_63 : 59;
+               u64 setting : 5;
+       } s;
+       struct cvmx_asxx_rx_clk_setx_s cn30xx;
+       struct cvmx_asxx_rx_clk_setx_s cn31xx;
+       struct cvmx_asxx_rx_clk_setx_s cn38xx;
+       struct cvmx_asxx_rx_clk_setx_s cn38xxp2;
+       struct cvmx_asxx_rx_clk_setx_s cn50xx;
+       struct cvmx_asxx_rx_clk_setx_s cn58xx;
+       struct cvmx_asxx_rx_clk_setx_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rx_clk_setx cvmx_asxx_rx_clk_setx_t;
+
+/**
+ * cvmx_asx#_rx_prt_en
+ *
+ * ASX_RX_PRT_EN = RGMII Port Enable
+ *
+ */
+union cvmx_asxx_rx_prt_en {
+       u64 u64;
+       struct cvmx_asxx_rx_prt_en_s {
+               u64 reserved_4_63 : 60;
+               u64 prt_en : 4;
+       } s;
+       struct cvmx_asxx_rx_prt_en_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 prt_en : 3;
+       } cn30xx;
+       struct cvmx_asxx_rx_prt_en_cn30xx cn31xx;
+       struct cvmx_asxx_rx_prt_en_s cn38xx;
+       struct cvmx_asxx_rx_prt_en_s cn38xxp2;
+       struct cvmx_asxx_rx_prt_en_cn30xx cn50xx;
+       struct cvmx_asxx_rx_prt_en_s cn58xx;
+       struct cvmx_asxx_rx_prt_en_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_rx_prt_en cvmx_asxx_rx_prt_en_t;
+
+/**
+ * cvmx_asx#_rx_wol
+ *
+ * ASX_RX_WOL = RGMII RX Wake on LAN status register
+ *
+ */
+union cvmx_asxx_rx_wol {
+       u64 u64;
+       struct cvmx_asxx_rx_wol_s {
+               u64 reserved_2_63 : 62;
+               u64 status : 1;
+               u64 enable : 1;
+       } s;
+       struct cvmx_asxx_rx_wol_s cn38xx;
+       struct cvmx_asxx_rx_wol_s cn38xxp2;
+};
+
+typedef union cvmx_asxx_rx_wol cvmx_asxx_rx_wol_t;
+
+/**
+ * cvmx_asx#_rx_wol_msk
+ *
+ * ASX_RX_WOL_MSK = RGMII RX Wake on LAN byte mask
+ *
+ */
+union cvmx_asxx_rx_wol_msk {
+       u64 u64;
+       struct cvmx_asxx_rx_wol_msk_s {
+               u64 msk : 64;
+       } s;
+       struct cvmx_asxx_rx_wol_msk_s cn38xx;
+       struct cvmx_asxx_rx_wol_msk_s cn38xxp2;
+};
+
+typedef union cvmx_asxx_rx_wol_msk cvmx_asxx_rx_wol_msk_t;
+
+/**
+ * cvmx_asx#_rx_wol_powok
+ *
+ * ASX_RX_WOL_POWOK = RGMII RX Wake on LAN Power OK
+ *
+ */
+union cvmx_asxx_rx_wol_powok {
+       u64 u64;
+       struct cvmx_asxx_rx_wol_powok_s {
+               u64 reserved_1_63 : 63;
+               u64 powerok : 1;
+       } s;
+       struct cvmx_asxx_rx_wol_powok_s cn38xx;
+       struct cvmx_asxx_rx_wol_powok_s cn38xxp2;
+};
+
+typedef union cvmx_asxx_rx_wol_powok cvmx_asxx_rx_wol_powok_t;
+
+/**
+ * cvmx_asx#_rx_wol_sig
+ *
+ * ASX_RX_WOL_SIG = RGMII RX Wake on LAN CRC signature
+ *
+ */
+union cvmx_asxx_rx_wol_sig {
+       u64 u64;
+       struct cvmx_asxx_rx_wol_sig_s {
+               u64 reserved_32_63 : 32;
+               u64 sig : 32;
+       } s;
+       struct cvmx_asxx_rx_wol_sig_s cn38xx;
+       struct cvmx_asxx_rx_wol_sig_s cn38xxp2;
+};
+
+typedef union cvmx_asxx_rx_wol_sig cvmx_asxx_rx_wol_sig_t;
+
+/**
+ * cvmx_asx#_tx_clk_set#
+ *
+ * ASX_TX_CLK_SET = RGMII Clock delay setting
+ *
+ *
+ * Notes:
+ * Setting to place on the open-loop TXC (RGMII transmit clk)
+ * delay line, which can delay the transmited clock. This
+ * can be used if the board and/or transmitting device
+ * has not otherwise delayed the clock.
+ *
+ * A value of SETTING=0 disables the delay line. The delay
+ * line should be disabled unless the transmitter or board
+ * does not delay the clock.
+ *
+ * Note that this delay line provides only a coarse control
+ * over the delay. Generally, it can only reliably provide
+ * a delay in the range 1.25-2.5ns, which may not be adequate
+ * for some system applications.
+ *
+ * The open loop delay line selects
+ * from among a series of tap positions. Each incremental
+ * tap position adds a delay of 50ps to 135ps per tap, depending
+ * on the chip, its temperature, and the voltage.
+ * To achieve from 1.25-2.5ns of delay on the received
+ * clock, a fixed value of SETTING=24 may work.
+ * For more precision, we recommend the following settings
+ * based on the chip voltage:
+ *
+ *    VDD           SETTING
+ *  -----------------------------
+ *    1.0             18
+ *    1.05            19
+ *    1.1             21
+ *    1.15            22
+ *    1.2             23
+ *    1.25            24
+ *    1.3             25
+ */
+union cvmx_asxx_tx_clk_setx {
+       u64 u64;
+       struct cvmx_asxx_tx_clk_setx_s {
+               u64 reserved_5_63 : 59;
+               u64 setting : 5;
+       } s;
+       struct cvmx_asxx_tx_clk_setx_s cn30xx;
+       struct cvmx_asxx_tx_clk_setx_s cn31xx;
+       struct cvmx_asxx_tx_clk_setx_s cn38xx;
+       struct cvmx_asxx_tx_clk_setx_s cn38xxp2;
+       struct cvmx_asxx_tx_clk_setx_s cn50xx;
+       struct cvmx_asxx_tx_clk_setx_s cn58xx;
+       struct cvmx_asxx_tx_clk_setx_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_tx_clk_setx cvmx_asxx_tx_clk_setx_t;
+
+/**
+ * cvmx_asx#_tx_comp_byp
+ *
+ * ASX_TX_COMP_BYP = RGMII Clock delay setting
+ *
+ */
+union cvmx_asxx_tx_comp_byp {
+       u64 u64;
+       struct cvmx_asxx_tx_comp_byp_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_asxx_tx_comp_byp_cn30xx {
+               u64 reserved_9_63 : 55;
+               u64 bypass : 1;
+               u64 pctl : 4;
+               u64 nctl : 4;
+       } cn30xx;
+       struct cvmx_asxx_tx_comp_byp_cn30xx cn31xx;
+       struct cvmx_asxx_tx_comp_byp_cn38xx {
+               u64 reserved_8_63 : 56;
+               u64 pctl : 4;
+               u64 nctl : 4;
+       } cn38xx;
+       struct cvmx_asxx_tx_comp_byp_cn38xx cn38xxp2;
+       struct cvmx_asxx_tx_comp_byp_cn50xx {
+               u64 reserved_17_63 : 47;
+               u64 bypass : 1;
+               u64 reserved_13_15 : 3;
+               u64 pctl : 5;
+               u64 reserved_5_7 : 3;
+               u64 nctl : 5;
+       } cn50xx;
+       struct cvmx_asxx_tx_comp_byp_cn58xx {
+               u64 reserved_13_63 : 51;
+               u64 pctl : 5;
+               u64 reserved_5_7 : 3;
+               u64 nctl : 5;
+       } cn58xx;
+       struct cvmx_asxx_tx_comp_byp_cn58xx cn58xxp1;
+};
+
+typedef union cvmx_asxx_tx_comp_byp cvmx_asxx_tx_comp_byp_t;
+
+/**
+ * cvmx_asx#_tx_hi_water#
+ *
+ * ASX_TX_HI_WATER = RGMII TX FIFO Hi WaterMark
+ *
+ */
+union cvmx_asxx_tx_hi_waterx {
+       u64 u64;
+       struct cvmx_asxx_tx_hi_waterx_s {
+               u64 reserved_4_63 : 60;
+               u64 mark : 4;
+       } s;
+       struct cvmx_asxx_tx_hi_waterx_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 mark : 3;
+       } cn30xx;
+       struct cvmx_asxx_tx_hi_waterx_cn30xx cn31xx;
+       struct cvmx_asxx_tx_hi_waterx_s cn38xx;
+       struct cvmx_asxx_tx_hi_waterx_s cn38xxp2;
+       struct cvmx_asxx_tx_hi_waterx_cn30xx cn50xx;
+       struct cvmx_asxx_tx_hi_waterx_s cn58xx;
+       struct cvmx_asxx_tx_hi_waterx_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_tx_hi_waterx cvmx_asxx_tx_hi_waterx_t;
+
+/**
+ * cvmx_asx#_tx_prt_en
+ *
+ * ASX_TX_PRT_EN = RGMII Port Enable
+ *
+ */
+union cvmx_asxx_tx_prt_en {
+       u64 u64;
+       struct cvmx_asxx_tx_prt_en_s {
+               u64 reserved_4_63 : 60;
+               u64 prt_en : 4;
+       } s;
+       struct cvmx_asxx_tx_prt_en_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 prt_en : 3;
+       } cn30xx;
+       struct cvmx_asxx_tx_prt_en_cn30xx cn31xx;
+       struct cvmx_asxx_tx_prt_en_s cn38xx;
+       struct cvmx_asxx_tx_prt_en_s cn38xxp2;
+       struct cvmx_asxx_tx_prt_en_cn30xx cn50xx;
+       struct cvmx_asxx_tx_prt_en_s cn58xx;
+       struct cvmx_asxx_tx_prt_en_s cn58xxp1;
+};
+
+typedef union cvmx_asxx_tx_prt_en cvmx_asxx_tx_prt_en_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-bgxx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-bgxx-defs.h
new file mode 100644 (file)
index 0000000..7bcf805
--- /dev/null
@@ -0,0 +1,4106 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon bgxx.
+ */
+
+#ifndef __CVMX_BGXX_DEFS_H__
+#define __CVMX_BGXX_DEFS_H__
+
+#define CVMX_BGXX_CMRX_CONFIG(offset, block_id)                                                    \
+       (0x00011800E0000000ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_INT(offset, block_id)                                                       \
+       (0x00011800E0000020ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_PRT_CBFC_CTL(offset, block_id)                                              \
+       (0x00011800E0000408ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_ADR_CTL(offset, block_id)                                                \
+       (0x00011800E00000A0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_BP_DROP(offset, block_id)                                                \
+       (0x00011800E0000080ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_BP_OFF(offset, block_id)                                                 \
+       (0x00011800E0000090ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_BP_ON(offset, block_id)                                                  \
+       (0x00011800E0000088ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_BP_STATUS(offset, block_id)                                              \
+       (0x00011800E00000A8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_FIFO_LEN(offset, block_id)                                               \
+       (0x00011800E00000C0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_ID_MAP(offset, block_id)                                                 \
+       (0x00011800E0000028ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_LOGL_XOFF(offset, block_id)                                              \
+       (0x00011800E00000B0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_LOGL_XON(offset, block_id)                                               \
+       (0x00011800E00000B8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_PAUSE_DROP_TIME(offset, block_id)                                        \
+       (0x00011800E0000030ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT0(offset, block_id)                                                  \
+       (0x00011800E0000038ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT1(offset, block_id)                                                  \
+       (0x00011800E0000040ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT2(offset, block_id)                                                  \
+       (0x00011800E0000048ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT3(offset, block_id)                                                  \
+       (0x00011800E0000050ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT4(offset, block_id)                                                  \
+       (0x00011800E0000058ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT5(offset, block_id)                                                  \
+       (0x00011800E0000060ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT6(offset, block_id)                                                  \
+       (0x00011800E0000068ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT7(offset, block_id)                                                  \
+       (0x00011800E0000070ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_STAT8(offset, block_id)                                                  \
+       (0x00011800E0000078ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_RX_WEIGHT(offset, block_id)                                                 \
+       (0x00011800E0000098ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_CHANNEL(offset, block_id)                                                \
+       (0x00011800E0000400ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_FIFO_LEN(offset, block_id)                                               \
+       (0x00011800E0000418ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_HG2_STATUS(offset, block_id)                                             \
+       (0x00011800E0000410ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_OVR_BP(offset, block_id)                                                 \
+       (0x00011800E0000420ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT0(offset, block_id)                                                  \
+       (0x00011800E0000508ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT1(offset, block_id)                                                  \
+       (0x00011800E0000510ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT10(offset, block_id)                                                 \
+       (0x00011800E0000558ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT11(offset, block_id)                                                 \
+       (0x00011800E0000560ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT12(offset, block_id)                                                 \
+       (0x00011800E0000568ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT13(offset, block_id)                                                 \
+       (0x00011800E0000570ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT14(offset, block_id)                                                 \
+       (0x00011800E0000578ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT15(offset, block_id)                                                 \
+       (0x00011800E0000580ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT16(offset, block_id)                                                 \
+       (0x00011800E0000588ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT17(offset, block_id)                                                 \
+       (0x00011800E0000590ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT2(offset, block_id)                                                  \
+       (0x00011800E0000518ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT3(offset, block_id)                                                  \
+       (0x00011800E0000520ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT4(offset, block_id)                                                  \
+       (0x00011800E0000528ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT5(offset, block_id)                                                  \
+       (0x00011800E0000530ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT6(offset, block_id)                                                  \
+       (0x00011800E0000538ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT7(offset, block_id)                                                  \
+       (0x00011800E0000540ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT8(offset, block_id)                                                  \
+       (0x00011800E0000548ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMRX_TX_STAT9(offset, block_id)                                                  \
+       (0x00011800E0000550ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_CMR_BAD(offset)          (0x00011800E0001020ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_BIST_STATUS(offset)   (0x00011800E0000300ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_CHAN_MSK_AND(offset)  (0x00011800E0000200ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_CHAN_MSK_OR(offset)   (0x00011800E0000208ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_ECO(offset)          (0x00011800E0001028ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_GLOBAL_CONFIG(offset) (0x00011800E0000008ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_MEM_CTRL(offset)     (0x00011800E0000018ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_MEM_INT(offset)      (0x00011800E0000010ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_NXC_ADR(offset)      (0x00011800E0001018ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_RX_ADRX_CAM(offset, block_id)                                                \
+       (0x00011800E0000100ull + (((offset) & 31) + ((block_id) & 7) * 0x200000ull) * 8)
+#define CVMX_BGXX_CMR_RX_LMACS(offset) (0x00011800E0000308ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_RX_OVR_BP(offset) (0x00011800E0000318ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_CMR_TX_LMACS(offset) (0x00011800E0001000ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_GMP_GMI_PRTX_CFG(offset, block_id)                                               \
+       (0x00011800E0038010ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_RXX_DECISION(offset, block_id)                                           \
+       (0x00011800E0038040ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_RXX_FRM_CHK(offset, block_id)                                            \
+       (0x00011800E0038020ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_RXX_FRM_CTL(offset, block_id)                                            \
+       (0x00011800E0038018ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_RXX_IFG(offset, block_id)                                                \
+       (0x00011800E0038058ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_RXX_INT(offset, block_id)                                                \
+       (0x00011800E0038000ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_RXX_JABBER(offset, block_id)                                             \
+       (0x00011800E0038038ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_RXX_UDD_SKP(offset, block_id)                                            \
+       (0x00011800E0038048ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_SMACX(offset, block_id)                                                  \
+       (0x00011800E0038230ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_APPEND(offset, block_id)                                             \
+       (0x00011800E0038218ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_BURST(offset, block_id)                                              \
+       (0x00011800E0038228ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_CTL(offset, block_id)                                                \
+       (0x00011800E0038270ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_INT(offset, block_id)                                                \
+       (0x00011800E0038500ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_MIN_PKT(offset, block_id)                                            \
+       (0x00011800E0038240ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_PAUSE_PKT_INTERVAL(offset, block_id)                                 \
+       (0x00011800E0038248ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_PAUSE_PKT_TIME(offset, block_id)                                     \
+       (0x00011800E0038238ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_PAUSE_TOGO(offset, block_id)                                         \
+       (0x00011800E0038258ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_PAUSE_ZERO(offset, block_id)                                         \
+       (0x00011800E0038260ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_SGMII_CTL(offset, block_id)                                          \
+       (0x00011800E0038300ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_SLOT(offset, block_id)                                               \
+       (0x00011800E0038220ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_SOFT_PAUSE(offset, block_id)                                         \
+       (0x00011800E0038250ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TXX_THRESH(offset, block_id)                                             \
+       (0x00011800E0038210ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_GMI_TX_COL_ATTEMPT(offset)                                                   \
+       (0x00011800E0039010ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_GMP_GMI_TX_IFG(offset)  (0x00011800E0039000ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_GMP_GMI_TX_JAM(offset)  (0x00011800E0039008ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_GMP_GMI_TX_LFSR(offset) (0x00011800E0039028ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_GMP_GMI_TX_PAUSE_PKT_DMAC(offset)                                                \
+       (0x00011800E0039018ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_GMP_GMI_TX_PAUSE_PKT_TYPE(offset)                                                \
+       (0x00011800E0039020ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_GMP_PCS_ANX_ADV(offset, block_id)                                                \
+       (0x00011800E0030010ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_ANX_EXT_ST(offset, block_id)                                             \
+       (0x00011800E0030028ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_ANX_LP_ABIL(offset, block_id)                                            \
+       (0x00011800E0030018ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_ANX_RESULTS(offset, block_id)                                            \
+       (0x00011800E0030020ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_INTX(offset, block_id)                                                   \
+       (0x00011800E0030080ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_LINKX_TIMER(offset, block_id)                                            \
+       (0x00011800E0030040ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_MISCX_CTL(offset, block_id)                                              \
+       (0x00011800E0030078ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_MRX_CONTROL(offset, block_id)                                            \
+       (0x00011800E0030000ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_MRX_STATUS(offset, block_id)                                             \
+       (0x00011800E0030008ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_RXX_STATES(offset, block_id)                                             \
+       (0x00011800E0030058ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_RXX_SYNC(offset, block_id)                                               \
+       (0x00011800E0030050ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_SGMX_AN_ADV(offset, block_id)                                            \
+       (0x00011800E0030068ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_SGMX_LP_ADV(offset, block_id)                                            \
+       (0x00011800E0030070ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_TXX_STATES(offset, block_id)                                             \
+       (0x00011800E0030060ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_GMP_PCS_TX_RXX_POLARITY(offset, block_id)                                        \
+       (0x00011800E0030048ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_CBFC_CTL(offset, block_id)                                                  \
+       (0x00011800E0020218ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_CTRL(offset, block_id)                                                      \
+       (0x00011800E0020200ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_EXT_LOOPBACK(offset, block_id)                                              \
+       (0x00011800E0020208ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_HG2_CONTROL(offset, block_id)                                               \
+       (0x00011800E0020210ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_BAD_COL_HI(offset, block_id)                                             \
+       (0x00011800E0020040ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_BAD_COL_LO(offset, block_id)                                             \
+       (0x00011800E0020038ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_CTL(offset, block_id)                                                    \
+       (0x00011800E0020030ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_DECISION(offset, block_id)                                               \
+       (0x00011800E0020020ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_FRM_CHK(offset, block_id)                                                \
+       (0x00011800E0020010ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_FRM_CTL(offset, block_id)                                                \
+       (0x00011800E0020008ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_INT(offset, block_id)                                                    \
+       (0x00011800E0020000ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_JABBER(offset, block_id)                                                 \
+       (0x00011800E0020018ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_RX_UDD_SKP(offset, block_id)                                                \
+       (0x00011800E0020028ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_SMAC(offset, block_id)                                                      \
+       (0x00011800E0020108ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_APPEND(offset, block_id)                                                 \
+       (0x00011800E0020100ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_CTL(offset, block_id)                                                    \
+       (0x00011800E0020160ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_IFG(offset, block_id)                                                    \
+       (0x00011800E0020148ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_INT(offset, block_id)                                                    \
+       (0x00011800E0020140ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_MIN_PKT(offset, block_id)                                                \
+       (0x00011800E0020118ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_PAUSE_PKT_DMAC(offset, block_id)                                         \
+       (0x00011800E0020150ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_PAUSE_PKT_INTERVAL(offset, block_id)                                     \
+       (0x00011800E0020120ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_PAUSE_PKT_TIME(offset, block_id)                                         \
+       (0x00011800E0020110ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_PAUSE_PKT_TYPE(offset, block_id)                                         \
+       (0x00011800E0020158ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_PAUSE_TOGO(offset, block_id)                                             \
+       (0x00011800E0020130ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_PAUSE_ZERO(offset, block_id)                                             \
+       (0x00011800E0020138ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_SOFT_PAUSE(offset, block_id)                                             \
+       (0x00011800E0020128ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SMUX_TX_THRESH(offset, block_id)                                                 \
+       (0x00011800E0020168ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_AN_ADV(offset, block_id)                                                    \
+       (0x00011800E00100D8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_AN_BP_STATUS(offset, block_id)                                              \
+       (0x00011800E00100F8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_AN_CONTROL(offset, block_id)                                                \
+       (0x00011800E00100C8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_AN_LP_BASE(offset, block_id)                                                \
+       (0x00011800E00100E0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_AN_LP_XNP(offset, block_id)                                                 \
+       (0x00011800E00100F0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_AN_STATUS(offset, block_id)                                                 \
+       (0x00011800E00100D0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_AN_XNP_TX(offset, block_id)                                                 \
+       (0x00011800E00100E8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_ALGN_STATUS(offset, block_id)                                            \
+       (0x00011800E0010050ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_BIP_ERR_CNT(offset, block_id)                                            \
+       (0x00011800E0010058ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_LANE_MAP(offset, block_id)                                               \
+       (0x00011800E0010060ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_PMD_CONTROL(offset, block_id)                                            \
+       (0x00011800E0010068ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_PMD_LD_CUP(offset, block_id)                                             \
+       (0x00011800E0010088ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_PMD_LD_REP(offset, block_id)                                             \
+       (0x00011800E0010090ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_PMD_LP_CUP(offset, block_id)                                             \
+       (0x00011800E0010078ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_PMD_LP_REP(offset, block_id)                                             \
+       (0x00011800E0010080ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_PMD_STATUS(offset, block_id)                                             \
+       (0x00011800E0010070ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_STATUS1(offset, block_id)                                                \
+       (0x00011800E0010030ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_STATUS2(offset, block_id)                                                \
+       (0x00011800E0010038ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_TP_CONTROL(offset, block_id)                                             \
+       (0x00011800E0010040ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BR_TP_ERR_CNT(offset, block_id)                                             \
+       (0x00011800E0010048ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_BX_STATUS(offset, block_id)                                                 \
+       (0x00011800E0010028ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_CONTROL1(offset, block_id)                                                  \
+       (0x00011800E0010000ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_CONTROL2(offset, block_id)                                                  \
+       (0x00011800E0010018ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_FEC_ABIL(offset, block_id)                                                  \
+       (0x00011800E0010098ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_FEC_CONTROL(offset, block_id)                                               \
+       (0x00011800E00100A0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_FEC_CORR_BLKS01(offset, block_id)                                           \
+       (0x00011800E00100A8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_FEC_CORR_BLKS23(offset, block_id)                                           \
+       (0x00011800E00100B0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_FEC_UNCORR_BLKS01(offset, block_id)                                         \
+       (0x00011800E00100B8ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_FEC_UNCORR_BLKS23(offset, block_id)                                         \
+       (0x00011800E00100C0ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_INT(offset, block_id)                                                       \
+       (0x00011800E0010220ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_LPCS_STATES(offset, block_id)                                               \
+       (0x00011800E0010208ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_MISC_CONTROL(offset, block_id)                                              \
+       (0x00011800E0010218ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_SPD_ABIL(offset, block_id)                                                  \
+       (0x00011800E0010010ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_STATUS1(offset, block_id)                                                   \
+       (0x00011800E0010008ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPUX_STATUS2(offset, block_id)                                                   \
+       (0x00011800E0010020ull + (((offset) & 3) + ((block_id) & 7) * 0x10ull) * 1048576)
+#define CVMX_BGXX_SPU_BIST_STATUS(offset) (0x00011800E0010318ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_SPU_DBG_CONTROL(offset) (0x00011800E0010300ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_SPU_MEM_INT(offset)    (0x00011800E0010310ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_SPU_MEM_STATUS(offset)  (0x00011800E0010308ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_BGXX_SPU_SDSX_SKEW_STATUS(offset, block_id)                                           \
+       (0x00011800E0010320ull + (((offset) & 3) + ((block_id) & 7) * 0x200000ull) * 8)
+#define CVMX_BGXX_SPU_SDSX_STATES(offset, block_id)                                                \
+       (0x00011800E0010340ull + (((offset) & 3) + ((block_id) & 7) * 0x200000ull) * 8)
+
+/**
+ * cvmx_bgx#_cmr#_config
+ *
+ * Logical MAC/PCS configuration registers; one per LMAC. The maximum number of LMACs (and
+ * maximum LMAC ID) that can be enabled by these registers is limited by
+ * BGX()_CMR_RX_LMACS[LMACS] and BGX()_CMR_TX_LMACS[LMACS]. When multiple LMACs are
+ * enabled, they must be configured with the same [LMAC_TYPE] value.
+ */
+union cvmx_bgxx_cmrx_config {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_config_s {
+               u64 reserved_16_63 : 48;
+               u64 enable : 1;
+               u64 data_pkt_rx_en : 1;
+               u64 data_pkt_tx_en : 1;
+               u64 int_beat_gen : 1;
+               u64 mix_en : 1;
+               u64 lmac_type : 3;
+               u64 lane_to_sds : 8;
+       } s;
+       struct cvmx_bgxx_cmrx_config_s cn73xx;
+       struct cvmx_bgxx_cmrx_config_s cn78xx;
+       struct cvmx_bgxx_cmrx_config_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_config_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_config cvmx_bgxx_cmrx_config_t;
+
+/**
+ * cvmx_bgx#_cmr#_int
+ */
+union cvmx_bgxx_cmrx_int {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_int_s {
+               u64 reserved_3_63 : 61;
+               u64 pko_nxc : 1;
+               u64 overflw : 1;
+               u64 pause_drp : 1;
+       } s;
+       struct cvmx_bgxx_cmrx_int_s cn73xx;
+       struct cvmx_bgxx_cmrx_int_s cn78xx;
+       struct cvmx_bgxx_cmrx_int_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_int cvmx_bgxx_cmrx_int_t;
+
+/**
+ * cvmx_bgx#_cmr#_prt_cbfc_ctl
+ *
+ * See XOFF definition listed under BGX()_SMU()_CBFC_CTL.
+ *
+ */
+union cvmx_bgxx_cmrx_prt_cbfc_ctl {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_prt_cbfc_ctl_s {
+               u64 reserved_32_63 : 32;
+               u64 phys_bp : 16;
+               u64 reserved_0_15 : 16;
+       } s;
+       struct cvmx_bgxx_cmrx_prt_cbfc_ctl_s cn73xx;
+       struct cvmx_bgxx_cmrx_prt_cbfc_ctl_s cn78xx;
+       struct cvmx_bgxx_cmrx_prt_cbfc_ctl_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_prt_cbfc_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_prt_cbfc_ctl cvmx_bgxx_cmrx_prt_cbfc_ctl_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_adr_ctl
+ */
+union cvmx_bgxx_cmrx_rx_adr_ctl {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_adr_ctl_s {
+               u64 reserved_4_63 : 60;
+               u64 cam_accept : 1;
+               u64 mcst_mode : 2;
+               u64 bcst_accept : 1;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_adr_ctl_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_adr_ctl_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_adr_ctl_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_adr_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_adr_ctl cvmx_bgxx_cmrx_rx_adr_ctl_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_bp_drop
+ */
+union cvmx_bgxx_cmrx_rx_bp_drop {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_bp_drop_s {
+               u64 reserved_7_63 : 57;
+               u64 mark : 7;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_bp_drop_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_bp_drop_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_bp_drop_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_bp_drop_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_bp_drop cvmx_bgxx_cmrx_rx_bp_drop_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_bp_off
+ */
+union cvmx_bgxx_cmrx_rx_bp_off {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_bp_off_s {
+               u64 reserved_7_63 : 57;
+               u64 mark : 7;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_bp_off_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_bp_off_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_bp_off_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_bp_off_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_bp_off cvmx_bgxx_cmrx_rx_bp_off_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_bp_on
+ */
+union cvmx_bgxx_cmrx_rx_bp_on {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_bp_on_s {
+               u64 reserved_12_63 : 52;
+               u64 mark : 12;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_bp_on_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_bp_on_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_bp_on_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_bp_on_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_bp_on cvmx_bgxx_cmrx_rx_bp_on_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_bp_status
+ */
+union cvmx_bgxx_cmrx_rx_bp_status {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_bp_status_s {
+               u64 reserved_1_63 : 63;
+               u64 bp : 1;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_bp_status_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_bp_status_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_bp_status_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_bp_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_bp_status cvmx_bgxx_cmrx_rx_bp_status_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_fifo_len
+ */
+union cvmx_bgxx_cmrx_rx_fifo_len {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_fifo_len_s {
+               u64 reserved_13_63 : 51;
+               u64 fifo_len : 13;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_fifo_len_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_fifo_len_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_fifo_len_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_fifo_len_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_fifo_len cvmx_bgxx_cmrx_rx_fifo_len_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_id_map
+ *
+ * These registers set the RX LMAC ID mapping for X2P/PKI.
+ *
+ */
+union cvmx_bgxx_cmrx_rx_id_map {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_id_map_s {
+               u64 reserved_15_63 : 49;
+               u64 rid : 7;
+               u64 pknd : 8;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_id_map_cn73xx {
+               u64 reserved_15_63 : 49;
+               u64 rid : 7;
+               u64 reserved_6_7 : 2;
+               u64 pknd : 6;
+       } cn73xx;
+       struct cvmx_bgxx_cmrx_rx_id_map_cn73xx cn78xx;
+       struct cvmx_bgxx_cmrx_rx_id_map_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_id_map_cn73xx cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_id_map cvmx_bgxx_cmrx_rx_id_map_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_logl_xoff
+ */
+union cvmx_bgxx_cmrx_rx_logl_xoff {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_logl_xoff_s {
+               u64 reserved_16_63 : 48;
+               u64 xoff : 16;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_logl_xoff_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_logl_xoff_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_logl_xoff_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_logl_xoff_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_logl_xoff cvmx_bgxx_cmrx_rx_logl_xoff_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_logl_xon
+ */
+union cvmx_bgxx_cmrx_rx_logl_xon {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_logl_xon_s {
+               u64 reserved_16_63 : 48;
+               u64 xon : 16;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_logl_xon_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_logl_xon_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_logl_xon_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_logl_xon_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_logl_xon cvmx_bgxx_cmrx_rx_logl_xon_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_pause_drop_time
+ */
+union cvmx_bgxx_cmrx_rx_pause_drop_time {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_pause_drop_time_s {
+               u64 reserved_16_63 : 48;
+               u64 pause_time : 16;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_pause_drop_time_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_pause_drop_time_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_pause_drop_time_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_pause_drop_time_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_pause_drop_time cvmx_bgxx_cmrx_rx_pause_drop_time_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat0
+ *
+ * These registers provide a count of received packets that meet the following conditions:
+ * * are not recognized as PAUSE packets.
+ * * are not dropped due DMAC filtering.
+ * * are not dropped due FIFO full status.
+ * * do not have any other OPCODE (FCS, Length, etc).
+ */
+union cvmx_bgxx_cmrx_rx_stat0 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat0_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat0_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat0_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat0_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat0_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat0 cvmx_bgxx_cmrx_rx_stat0_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat1
+ *
+ * These registers provide a count of octets of received packets.
+ *
+ */
+union cvmx_bgxx_cmrx_rx_stat1 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat1_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat1_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat1_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat1_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat1_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat1 cvmx_bgxx_cmrx_rx_stat1_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat2
+ *
+ * These registers provide a count of all packets received that were recognized as flow-control
+ * or PAUSE packets. PAUSE packets with any kind of error are counted in
+ * BGX()_CMR()_RX_STAT8 (error stats register). Pause packets can be optionally dropped
+ * or forwarded based on BGX()_SMU()_RX_FRM_CTL[CTL_DRP]. This count increments
+ * regardless of whether the packet is dropped. PAUSE packets are never counted in
+ * BGX()_CMR()_RX_STAT0.
+ */
+union cvmx_bgxx_cmrx_rx_stat2 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat2_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat2_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat2_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat2_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat2_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat2 cvmx_bgxx_cmrx_rx_stat2_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat3
+ *
+ * These registers provide a count of octets of received PAUSE and control packets.
+ *
+ */
+union cvmx_bgxx_cmrx_rx_stat3 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat3_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat3_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat3_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat3_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat3_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat3 cvmx_bgxx_cmrx_rx_stat3_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat4
+ *
+ * These registers provide a count of all packets received that were dropped by the DMAC filter.
+ * Packets that match the DMAC are dropped and counted here regardless of whether they were ERR
+ * packets, but does not include those reported in BGX()_CMR()_RX_STAT6. These packets
+ * are never counted in BGX()_CMR()_RX_STAT0. Eight-byte packets as the result of
+ * truncation or other means are not dropped by CNXXXX and will never appear in this count.
+ */
+union cvmx_bgxx_cmrx_rx_stat4 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat4_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat4_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat4_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat4_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat4_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat4 cvmx_bgxx_cmrx_rx_stat4_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat5
+ *
+ * These registers provide a count of octets of filtered DMAC packets.
+ *
+ */
+union cvmx_bgxx_cmrx_rx_stat5 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat5_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat5_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat5_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat5_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat5_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat5 cvmx_bgxx_cmrx_rx_stat5_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat6
+ *
+ * These registers provide a count of all packets received that were dropped due to a full
+ * receive FIFO. They do not count any packet that is truncated at the point of overflow and sent
+ * on to the PKI. These registers count all entire packets dropped by the FIFO for a given LMAC
+ * regardless of DMAC or PAUSE type.
+ */
+union cvmx_bgxx_cmrx_rx_stat6 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat6_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat6_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat6_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat6_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat6_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat6 cvmx_bgxx_cmrx_rx_stat6_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat7
+ *
+ * These registers provide a count of octets of received packets that were dropped due to a full
+ * receive FIFO.
+ */
+union cvmx_bgxx_cmrx_rx_stat7 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat7_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat7_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat7_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat7_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat7_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat7 cvmx_bgxx_cmrx_rx_stat7_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_stat8
+ *
+ * These registers provide a count of all packets received with some error that were not dropped
+ * either due to the DMAC filter or lack of room in the receive FIFO.
+ * This does not include packets which were counted in
+ * BGX()_CMR()_RX_STAT2, BGX()_CMR()_RX_STAT4 nor
+ * BGX()_CMR()_RX_STAT6.
+ *
+ * Which statistics are updated on control packet errors and drops are shown below:
+ *
+ * <pre>
+ * if dropped [
+ *   if !errored STAT8
+ *   if overflow STAT6
+ *   else if dmac drop STAT4
+ *   else if filter drop STAT2
+ * ] else [
+ *   if errored STAT2
+ *   else STAT8
+ * ]
+ * </pre>
+ */
+union cvmx_bgxx_cmrx_rx_stat8 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_stat8_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_stat8_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_stat8_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_stat8_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_stat8_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_stat8 cvmx_bgxx_cmrx_rx_stat8_t;
+
+/**
+ * cvmx_bgx#_cmr#_rx_weight
+ */
+union cvmx_bgxx_cmrx_rx_weight {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_rx_weight_s {
+               u64 reserved_4_63 : 60;
+               u64 weight : 4;
+       } s;
+       struct cvmx_bgxx_cmrx_rx_weight_s cn73xx;
+       struct cvmx_bgxx_cmrx_rx_weight_s cn78xx;
+       struct cvmx_bgxx_cmrx_rx_weight_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_rx_weight_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_rx_weight cvmx_bgxx_cmrx_rx_weight_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_channel
+ */
+union cvmx_bgxx_cmrx_tx_channel {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_channel_s {
+               u64 reserved_32_63 : 32;
+               u64 msk : 16;
+               u64 dis : 16;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_channel_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_channel_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_channel_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_channel_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_channel cvmx_bgxx_cmrx_tx_channel_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_fifo_len
+ */
+union cvmx_bgxx_cmrx_tx_fifo_len {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_fifo_len_s {
+               u64 reserved_14_63 : 50;
+               u64 lmac_idle : 1;
+               u64 fifo_len : 13;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_fifo_len_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_fifo_len_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_fifo_len_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_fifo_len_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_fifo_len cvmx_bgxx_cmrx_tx_fifo_len_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_hg2_status
+ */
+union cvmx_bgxx_cmrx_tx_hg2_status {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_hg2_status_s {
+               u64 reserved_32_63 : 32;
+               u64 xof : 16;
+               u64 lgtim2go : 16;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_hg2_status_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_hg2_status_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_hg2_status_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_hg2_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_hg2_status cvmx_bgxx_cmrx_tx_hg2_status_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_ovr_bp
+ */
+union cvmx_bgxx_cmrx_tx_ovr_bp {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_ovr_bp_s {
+               u64 reserved_16_63 : 48;
+               u64 tx_chan_bp : 16;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_ovr_bp_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_ovr_bp_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_ovr_bp_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_ovr_bp_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_ovr_bp cvmx_bgxx_cmrx_tx_ovr_bp_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat0
+ */
+union cvmx_bgxx_cmrx_tx_stat0 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat0_s {
+               u64 reserved_48_63 : 16;
+               u64 xscol : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat0_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat0_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat0_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat0_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat0 cvmx_bgxx_cmrx_tx_stat0_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat1
+ */
+union cvmx_bgxx_cmrx_tx_stat1 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat1_s {
+               u64 reserved_48_63 : 16;
+               u64 xsdef : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat1_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat1_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat1_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat1_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat1 cvmx_bgxx_cmrx_tx_stat1_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat10
+ */
+union cvmx_bgxx_cmrx_tx_stat10 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat10_s {
+               u64 reserved_48_63 : 16;
+               u64 hist4 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat10_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat10_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat10_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat10_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat10 cvmx_bgxx_cmrx_tx_stat10_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat11
+ */
+union cvmx_bgxx_cmrx_tx_stat11 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat11_s {
+               u64 reserved_48_63 : 16;
+               u64 hist5 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat11_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat11_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat11_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat11_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat11 cvmx_bgxx_cmrx_tx_stat11_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat12
+ */
+union cvmx_bgxx_cmrx_tx_stat12 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat12_s {
+               u64 reserved_48_63 : 16;
+               u64 hist6 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat12_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat12_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat12_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat12_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat12 cvmx_bgxx_cmrx_tx_stat12_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat13
+ */
+union cvmx_bgxx_cmrx_tx_stat13 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat13_s {
+               u64 reserved_48_63 : 16;
+               u64 hist7 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat13_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat13_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat13_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat13_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat13 cvmx_bgxx_cmrx_tx_stat13_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat14
+ */
+union cvmx_bgxx_cmrx_tx_stat14 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat14_s {
+               u64 reserved_48_63 : 16;
+               u64 bcst : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat14_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat14_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat14_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat14_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat14 cvmx_bgxx_cmrx_tx_stat14_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat15
+ */
+union cvmx_bgxx_cmrx_tx_stat15 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat15_s {
+               u64 reserved_48_63 : 16;
+               u64 mcst : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat15_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat15_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat15_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat15_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat15 cvmx_bgxx_cmrx_tx_stat15_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat16
+ */
+union cvmx_bgxx_cmrx_tx_stat16 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat16_s {
+               u64 reserved_48_63 : 16;
+               u64 undflw : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat16_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat16_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat16_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat16_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat16 cvmx_bgxx_cmrx_tx_stat16_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat17
+ */
+union cvmx_bgxx_cmrx_tx_stat17 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat17_s {
+               u64 reserved_48_63 : 16;
+               u64 ctl : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat17_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat17_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat17_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat17_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat17 cvmx_bgxx_cmrx_tx_stat17_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat2
+ */
+union cvmx_bgxx_cmrx_tx_stat2 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat2_s {
+               u64 reserved_48_63 : 16;
+               u64 mcol : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat2_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat2_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat2_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat2_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat2 cvmx_bgxx_cmrx_tx_stat2_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat3
+ */
+union cvmx_bgxx_cmrx_tx_stat3 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat3_s {
+               u64 reserved_48_63 : 16;
+               u64 scol : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat3_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat3_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat3_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat3_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat3 cvmx_bgxx_cmrx_tx_stat3_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat4
+ */
+union cvmx_bgxx_cmrx_tx_stat4 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat4_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat4_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat4_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat4_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat4_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat4 cvmx_bgxx_cmrx_tx_stat4_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat5
+ */
+union cvmx_bgxx_cmrx_tx_stat5 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat5_s {
+               u64 reserved_48_63 : 16;
+               u64 pkts : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat5_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat5_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat5_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat5_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat5 cvmx_bgxx_cmrx_tx_stat5_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat6
+ */
+union cvmx_bgxx_cmrx_tx_stat6 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat6_s {
+               u64 reserved_48_63 : 16;
+               u64 hist0 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat6_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat6_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat6_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat6_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat6 cvmx_bgxx_cmrx_tx_stat6_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat7
+ */
+union cvmx_bgxx_cmrx_tx_stat7 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat7_s {
+               u64 reserved_48_63 : 16;
+               u64 hist1 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat7_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat7_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat7_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat7_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat7 cvmx_bgxx_cmrx_tx_stat7_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat8
+ */
+union cvmx_bgxx_cmrx_tx_stat8 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat8_s {
+               u64 reserved_48_63 : 16;
+               u64 hist2 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat8_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat8_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat8_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat8_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat8 cvmx_bgxx_cmrx_tx_stat8_t;
+
+/**
+ * cvmx_bgx#_cmr#_tx_stat9
+ */
+union cvmx_bgxx_cmrx_tx_stat9 {
+       u64 u64;
+       struct cvmx_bgxx_cmrx_tx_stat9_s {
+               u64 reserved_48_63 : 16;
+               u64 hist3 : 48;
+       } s;
+       struct cvmx_bgxx_cmrx_tx_stat9_s cn73xx;
+       struct cvmx_bgxx_cmrx_tx_stat9_s cn78xx;
+       struct cvmx_bgxx_cmrx_tx_stat9_s cn78xxp1;
+       struct cvmx_bgxx_cmrx_tx_stat9_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmrx_tx_stat9 cvmx_bgxx_cmrx_tx_stat9_t;
+
+/**
+ * cvmx_bgx#_cmr_bad
+ */
+union cvmx_bgxx_cmr_bad {
+       u64 u64;
+       struct cvmx_bgxx_cmr_bad_s {
+               u64 reserved_1_63 : 63;
+               u64 rxb_nxl : 1;
+       } s;
+       struct cvmx_bgxx_cmr_bad_s cn73xx;
+       struct cvmx_bgxx_cmr_bad_s cn78xx;
+       struct cvmx_bgxx_cmr_bad_s cn78xxp1;
+       struct cvmx_bgxx_cmr_bad_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_bad cvmx_bgxx_cmr_bad_t;
+
+/**
+ * cvmx_bgx#_cmr_bist_status
+ */
+union cvmx_bgxx_cmr_bist_status {
+       u64 u64;
+       struct cvmx_bgxx_cmr_bist_status_s {
+               u64 reserved_25_63 : 39;
+               u64 status : 25;
+       } s;
+       struct cvmx_bgxx_cmr_bist_status_s cn73xx;
+       struct cvmx_bgxx_cmr_bist_status_s cn78xx;
+       struct cvmx_bgxx_cmr_bist_status_s cn78xxp1;
+       struct cvmx_bgxx_cmr_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_bist_status cvmx_bgxx_cmr_bist_status_t;
+
+/**
+ * cvmx_bgx#_cmr_chan_msk_and
+ */
+union cvmx_bgxx_cmr_chan_msk_and {
+       u64 u64;
+       struct cvmx_bgxx_cmr_chan_msk_and_s {
+               u64 msk_and : 64;
+       } s;
+       struct cvmx_bgxx_cmr_chan_msk_and_s cn73xx;
+       struct cvmx_bgxx_cmr_chan_msk_and_s cn78xx;
+       struct cvmx_bgxx_cmr_chan_msk_and_s cn78xxp1;
+       struct cvmx_bgxx_cmr_chan_msk_and_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_chan_msk_and cvmx_bgxx_cmr_chan_msk_and_t;
+
+/**
+ * cvmx_bgx#_cmr_chan_msk_or
+ */
+union cvmx_bgxx_cmr_chan_msk_or {
+       u64 u64;
+       struct cvmx_bgxx_cmr_chan_msk_or_s {
+               u64 msk_or : 64;
+       } s;
+       struct cvmx_bgxx_cmr_chan_msk_or_s cn73xx;
+       struct cvmx_bgxx_cmr_chan_msk_or_s cn78xx;
+       struct cvmx_bgxx_cmr_chan_msk_or_s cn78xxp1;
+       struct cvmx_bgxx_cmr_chan_msk_or_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_chan_msk_or cvmx_bgxx_cmr_chan_msk_or_t;
+
+/**
+ * cvmx_bgx#_cmr_eco
+ */
+union cvmx_bgxx_cmr_eco {
+       u64 u64;
+       struct cvmx_bgxx_cmr_eco_s {
+               u64 eco_ro : 32;
+               u64 eco_rw : 32;
+       } s;
+       struct cvmx_bgxx_cmr_eco_s cn73xx;
+       struct cvmx_bgxx_cmr_eco_s cn78xx;
+       struct cvmx_bgxx_cmr_eco_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_eco cvmx_bgxx_cmr_eco_t;
+
+/**
+ * cvmx_bgx#_cmr_global_config
+ *
+ * These registers configure the global CMR, PCS, and MAC.
+ *
+ */
+union cvmx_bgxx_cmr_global_config {
+       u64 u64;
+       struct cvmx_bgxx_cmr_global_config_s {
+               u64 reserved_5_63 : 59;
+               u64 cmr_mix1_reset : 1;
+               u64 cmr_mix0_reset : 1;
+               u64 cmr_x2p_reset : 1;
+               u64 bgx_clk_enable : 1;
+               u64 pmux_sds_sel : 1;
+       } s;
+       struct cvmx_bgxx_cmr_global_config_s cn73xx;
+       struct cvmx_bgxx_cmr_global_config_s cn78xx;
+       struct cvmx_bgxx_cmr_global_config_s cn78xxp1;
+       struct cvmx_bgxx_cmr_global_config_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_global_config cvmx_bgxx_cmr_global_config_t;
+
+/**
+ * cvmx_bgx#_cmr_mem_ctrl
+ */
+union cvmx_bgxx_cmr_mem_ctrl {
+       u64 u64;
+       struct cvmx_bgxx_cmr_mem_ctrl_s {
+               u64 reserved_24_63 : 40;
+               u64 txb_skid_synd : 2;
+               u64 txb_skid_cor_dis : 1;
+               u64 txb_fif_bk1_syn : 2;
+               u64 txb_fif_bk1_cdis : 1;
+               u64 txb_fif_bk0_syn : 2;
+               u64 txb_fif_bk0_cdis : 1;
+               u64 rxb_skid_synd : 2;
+               u64 rxb_skid_cor_dis : 1;
+               u64 rxb_fif_bk1_syn1 : 2;
+               u64 rxb_fif_bk1_cdis1 : 1;
+               u64 rxb_fif_bk1_syn0 : 2;
+               u64 rxb_fif_bk1_cdis0 : 1;
+               u64 rxb_fif_bk0_syn1 : 2;
+               u64 rxb_fif_bk0_cdis1 : 1;
+               u64 rxb_fif_bk0_syn0 : 2;
+               u64 rxb_fif_bk0_cdis0 : 1;
+       } s;
+       struct cvmx_bgxx_cmr_mem_ctrl_s cn73xx;
+       struct cvmx_bgxx_cmr_mem_ctrl_s cn78xx;
+       struct cvmx_bgxx_cmr_mem_ctrl_s cn78xxp1;
+       struct cvmx_bgxx_cmr_mem_ctrl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_mem_ctrl cvmx_bgxx_cmr_mem_ctrl_t;
+
+/**
+ * cvmx_bgx#_cmr_mem_int
+ */
+union cvmx_bgxx_cmr_mem_int {
+       u64 u64;
+       struct cvmx_bgxx_cmr_mem_int_s {
+               u64 reserved_18_63 : 46;
+               u64 smu_in_overfl : 1;
+               u64 gmp_in_overfl : 1;
+               u64 txb_skid_sbe : 1;
+               u64 txb_skid_dbe : 1;
+               u64 txb_fif_bk1_sbe : 1;
+               u64 txb_fif_bk1_dbe : 1;
+               u64 txb_fif_bk0_sbe : 1;
+               u64 txb_fif_bk0_dbe : 1;
+               u64 rxb_skid_sbe : 1;
+               u64 rxb_skid_dbe : 1;
+               u64 rxb_fif_bk1_sbe1 : 1;
+               u64 rxb_fif_bk1_dbe1 : 1;
+               u64 rxb_fif_bk1_sbe0 : 1;
+               u64 rxb_fif_bk1_dbe0 : 1;
+               u64 rxb_fif_bk0_sbe1 : 1;
+               u64 rxb_fif_bk0_dbe1 : 1;
+               u64 rxb_fif_bk0_sbe0 : 1;
+               u64 rxb_fif_bk0_dbe0 : 1;
+       } s;
+       struct cvmx_bgxx_cmr_mem_int_s cn73xx;
+       struct cvmx_bgxx_cmr_mem_int_s cn78xx;
+       struct cvmx_bgxx_cmr_mem_int_s cn78xxp1;
+       struct cvmx_bgxx_cmr_mem_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_mem_int cvmx_bgxx_cmr_mem_int_t;
+
+/**
+ * cvmx_bgx#_cmr_nxc_adr
+ */
+union cvmx_bgxx_cmr_nxc_adr {
+       u64 u64;
+       struct cvmx_bgxx_cmr_nxc_adr_s {
+               u64 reserved_16_63 : 48;
+               u64 lmac_id : 4;
+               u64 channel : 12;
+       } s;
+       struct cvmx_bgxx_cmr_nxc_adr_s cn73xx;
+       struct cvmx_bgxx_cmr_nxc_adr_s cn78xx;
+       struct cvmx_bgxx_cmr_nxc_adr_s cn78xxp1;
+       struct cvmx_bgxx_cmr_nxc_adr_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_nxc_adr cvmx_bgxx_cmr_nxc_adr_t;
+
+/**
+ * cvmx_bgx#_cmr_rx_adr#_cam
+ *
+ * These registers provide access to the 32 DMAC CAM entries in BGX.
+ *
+ */
+union cvmx_bgxx_cmr_rx_adrx_cam {
+       u64 u64;
+       struct cvmx_bgxx_cmr_rx_adrx_cam_s {
+               u64 reserved_54_63 : 10;
+               u64 id : 2;
+               u64 reserved_49_51 : 3;
+               u64 en : 1;
+               u64 adr : 48;
+       } s;
+       struct cvmx_bgxx_cmr_rx_adrx_cam_s cn73xx;
+       struct cvmx_bgxx_cmr_rx_adrx_cam_s cn78xx;
+       struct cvmx_bgxx_cmr_rx_adrx_cam_s cn78xxp1;
+       struct cvmx_bgxx_cmr_rx_adrx_cam_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_rx_adrx_cam cvmx_bgxx_cmr_rx_adrx_cam_t;
+
+/**
+ * cvmx_bgx#_cmr_rx_lmacs
+ */
+union cvmx_bgxx_cmr_rx_lmacs {
+       u64 u64;
+       struct cvmx_bgxx_cmr_rx_lmacs_s {
+               u64 reserved_3_63 : 61;
+               u64 lmacs : 3;
+       } s;
+       struct cvmx_bgxx_cmr_rx_lmacs_s cn73xx;
+       struct cvmx_bgxx_cmr_rx_lmacs_s cn78xx;
+       struct cvmx_bgxx_cmr_rx_lmacs_s cn78xxp1;
+       struct cvmx_bgxx_cmr_rx_lmacs_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_rx_lmacs cvmx_bgxx_cmr_rx_lmacs_t;
+
+/**
+ * cvmx_bgx#_cmr_rx_ovr_bp
+ *
+ * BGX()_CMR_RX_OVR_BP[EN<0>] must be set to one and BGX()_CMR_RX_OVR_BP[BP<0>] must be
+ * cleared to zero (to forcibly disable hardware-automatic 802.3 PAUSE packet generation) with
+ * the HiGig2 Protocol when BGX()_SMU()_HG2_CONTROL[HG2TX_EN]=0. (The HiGig2 protocol is
+ * indicated by BGX()_SMU()_TX_CTL[HG_EN]=1 and BGX()_SMU()_RX_UDD_SKP[LEN]=16).
+ * Hardware can only auto-generate backpressure through HiGig2 messages (optionally, when
+ * BGX()_SMU()_HG2_CONTROL[HG2TX_EN]=1) with the HiGig2 protocol.
+ */
+union cvmx_bgxx_cmr_rx_ovr_bp {
+       u64 u64;
+       struct cvmx_bgxx_cmr_rx_ovr_bp_s {
+               u64 reserved_12_63 : 52;
+               u64 en : 4;
+               u64 bp : 4;
+               u64 ign_fifo_bp : 4;
+       } s;
+       struct cvmx_bgxx_cmr_rx_ovr_bp_s cn73xx;
+       struct cvmx_bgxx_cmr_rx_ovr_bp_s cn78xx;
+       struct cvmx_bgxx_cmr_rx_ovr_bp_s cn78xxp1;
+       struct cvmx_bgxx_cmr_rx_ovr_bp_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_rx_ovr_bp cvmx_bgxx_cmr_rx_ovr_bp_t;
+
+/**
+ * cvmx_bgx#_cmr_tx_lmacs
+ *
+ * This register sets the number of LMACs allowed on the TX interface. The value is important for
+ * defining the partitioning of the transmit FIFO.
+ */
+union cvmx_bgxx_cmr_tx_lmacs {
+       u64 u64;
+       struct cvmx_bgxx_cmr_tx_lmacs_s {
+               u64 reserved_3_63 : 61;
+               u64 lmacs : 3;
+       } s;
+       struct cvmx_bgxx_cmr_tx_lmacs_s cn73xx;
+       struct cvmx_bgxx_cmr_tx_lmacs_s cn78xx;
+       struct cvmx_bgxx_cmr_tx_lmacs_s cn78xxp1;
+       struct cvmx_bgxx_cmr_tx_lmacs_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_cmr_tx_lmacs cvmx_bgxx_cmr_tx_lmacs_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_prt#_cfg
+ *
+ * This register controls the configuration of the LMAC.
+ *
+ */
+union cvmx_bgxx_gmp_gmi_prtx_cfg {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_prtx_cfg_s {
+               u64 reserved_14_63 : 50;
+               u64 tx_idle : 1;
+               u64 rx_idle : 1;
+               u64 reserved_9_11 : 3;
+               u64 speed_msb : 1;
+               u64 reserved_4_7 : 4;
+               u64 slottime : 1;
+               u64 duplex : 1;
+               u64 speed : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_prtx_cfg_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_prtx_cfg_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_prtx_cfg_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_prtx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_prtx_cfg cvmx_bgxx_gmp_gmi_prtx_cfg_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_rx#_decision
+ *
+ * This register specifies the byte count used to determine when to accept or to filter a packet.
+ * As each byte in a packet is received by GMI, the L2 byte count is compared against
+ * [CNT]. In normal operation, the L2 header begins after the
+ * PREAMBLE + SFD (BGX()_GMP_GMI_RX()_FRM_CTL[PRE_CHK] = 1) and any optional UDD skip
+ * data (BGX()_GMP_GMI_RX()_UDD_SKP[LEN]).
+ */
+union cvmx_bgxx_gmp_gmi_rxx_decision {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_rxx_decision_s {
+               u64 reserved_5_63 : 59;
+               u64 cnt : 5;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_rxx_decision_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_decision_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_decision_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_rxx_decision_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_rxx_decision cvmx_bgxx_gmp_gmi_rxx_decision_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_rx#_frm_chk
+ */
+union cvmx_bgxx_gmp_gmi_rxx_frm_chk {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_chk_s {
+               u64 reserved_9_63 : 55;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_chk_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_chk_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_chk_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_chk_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_rxx_frm_chk cvmx_bgxx_gmp_gmi_rxx_frm_chk_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_rx#_frm_ctl
+ *
+ * This register controls the handling of the frames.
+ * The [CTL_BCK] and [CTL_DRP] bits control how the hardware handles incoming PAUSE packets. The
+ * most
+ * common modes of operation:
+ * _ [CTL_BCK] = 1, [CTL_DRP] = 1: hardware handles everything.
+ * _ [CTL_BCK] = 0, [CTL_DRP] = 0: software sees all PAUSE frames.
+ * _ [CTL_BCK] = 0, [CTL_DRP] = 1: all PAUSE frames are completely ignored.
+ *
+ * These control bits should be set to [CTL_BCK] = 0, [CTL_DRP] = 0 in half-duplex mode. Since
+ * PAUSE
+ * packets only apply to full duplex operation, any PAUSE packet would constitute an exception
+ * which should be handled by the processing cores. PAUSE packets should not be forwarded.
+ */
+union cvmx_bgxx_gmp_gmi_rxx_frm_ctl {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_ctl_s {
+               u64 reserved_13_63 : 51;
+               u64 ptp_mode : 1;
+               u64 reserved_11_11 : 1;
+               u64 null_dis : 1;
+               u64 pre_align : 1;
+               u64 reserved_7_8 : 2;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_ctl_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_ctl_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_ctl_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_rxx_frm_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_rxx_frm_ctl cvmx_bgxx_gmp_gmi_rxx_frm_ctl_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_rx#_ifg
+ *
+ * This register specifies the minimum number of interframe-gap (IFG) cycles between packets.
+ *
+ */
+union cvmx_bgxx_gmp_gmi_rxx_ifg {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_rxx_ifg_s {
+               u64 reserved_4_63 : 60;
+               u64 ifg : 4;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_rxx_ifg_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_ifg_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_ifg_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_rxx_ifg_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_rxx_ifg cvmx_bgxx_gmp_gmi_rxx_ifg_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_rx#_int
+ *
+ * '"These registers allow interrupts to be sent to the control processor.
+ * * Exception conditions <10:0> can also set the rcv/opcode in the received packet's work-queue
+ * entry. BGX()_GMP_GMI_RX()_FRM_CHK provides a bit mask for configuring which conditions
+ * set the error.
+ * In half duplex operation, the expectation is that collisions will appear as either MINERR or
+ * CAREXT errors.'
+ */
+union cvmx_bgxx_gmp_gmi_rxx_int {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_rxx_int_s {
+               u64 reserved_12_63 : 52;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_rxx_int_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_int_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_int_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_rxx_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_rxx_int cvmx_bgxx_gmp_gmi_rxx_int_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_rx#_jabber
+ *
+ * This register specifies the maximum size for packets, beyond which the GMI truncates.
+ *
+ */
+union cvmx_bgxx_gmp_gmi_rxx_jabber {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_rxx_jabber_s {
+               u64 reserved_16_63 : 48;
+               u64 cnt : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_rxx_jabber_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_jabber_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_jabber_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_rxx_jabber_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_rxx_jabber cvmx_bgxx_gmp_gmi_rxx_jabber_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_rx#_udd_skp
+ *
+ * This register specifies the amount of user-defined data (UDD) added before the start of the
+ * L2C data.
+ */
+union cvmx_bgxx_gmp_gmi_rxx_udd_skp {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_rxx_udd_skp_s {
+               u64 reserved_9_63 : 55;
+               u64 fcssel : 1;
+               u64 reserved_7_7 : 1;
+               u64 len : 7;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_rxx_udd_skp_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_udd_skp_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_rxx_udd_skp_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_rxx_udd_skp_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_rxx_udd_skp cvmx_bgxx_gmp_gmi_rxx_udd_skp_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_smac#
+ */
+union cvmx_bgxx_gmp_gmi_smacx {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_smacx_s {
+               u64 reserved_48_63 : 16;
+               u64 smac : 48;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_smacx_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_smacx_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_smacx_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_smacx_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_smacx cvmx_bgxx_gmp_gmi_smacx_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_append
+ */
+union cvmx_bgxx_gmp_gmi_txx_append {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_append_s {
+               u64 reserved_4_63 : 60;
+               u64 force_fcs : 1;
+               u64 fcs : 1;
+               u64 pad : 1;
+               u64 preamble : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_append_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_append_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_append_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_append_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_append cvmx_bgxx_gmp_gmi_txx_append_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_burst
+ */
+union cvmx_bgxx_gmp_gmi_txx_burst {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_burst_s {
+               u64 reserved_16_63 : 48;
+               u64 burst : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_burst_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_burst_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_burst_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_burst_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_burst cvmx_bgxx_gmp_gmi_txx_burst_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_ctl
+ */
+union cvmx_bgxx_gmp_gmi_txx_ctl {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 xsdef_en : 1;
+               u64 xscol_en : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_ctl_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_ctl_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_ctl_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_ctl cvmx_bgxx_gmp_gmi_txx_ctl_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_int
+ */
+union cvmx_bgxx_gmp_gmi_txx_int {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_int_s {
+               u64 reserved_5_63 : 59;
+               u64 ptp_lost : 1;
+               u64 late_col : 1;
+               u64 xsdef : 1;
+               u64 xscol : 1;
+               u64 undflw : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_int_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_int_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_int_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_int cvmx_bgxx_gmp_gmi_txx_int_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_min_pkt
+ */
+union cvmx_bgxx_gmp_gmi_txx_min_pkt {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_min_pkt_s {
+               u64 reserved_8_63 : 56;
+               u64 min_size : 8;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_min_pkt_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_min_pkt_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_min_pkt_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_min_pkt_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_min_pkt cvmx_bgxx_gmp_gmi_txx_min_pkt_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_pause_pkt_interval
+ *
+ * This register specifies how often PAUSE packets are sent.
+ *
+ */
+union cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval_s {
+               u64 reserved_16_63 : 48;
+               u64 interval : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval cvmx_bgxx_gmp_gmi_txx_pause_pkt_interval_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_pause_pkt_time
+ */
+union cvmx_bgxx_gmp_gmi_txx_pause_pkt_time {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_time_s {
+               u64 reserved_16_63 : 48;
+               u64 ptime : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_time_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_time_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_time_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_pkt_time_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_pause_pkt_time cvmx_bgxx_gmp_gmi_txx_pause_pkt_time_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_pause_togo
+ */
+union cvmx_bgxx_gmp_gmi_txx_pause_togo {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_togo_s {
+               u64 reserved_16_63 : 48;
+               u64 ptime : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_togo_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_togo_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_togo_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_togo_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_pause_togo cvmx_bgxx_gmp_gmi_txx_pause_togo_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_pause_zero
+ */
+union cvmx_bgxx_gmp_gmi_txx_pause_zero {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_zero_s {
+               u64 reserved_1_63 : 63;
+               u64 send : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_zero_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_zero_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_zero_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_pause_zero_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_pause_zero cvmx_bgxx_gmp_gmi_txx_pause_zero_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_sgmii_ctl
+ */
+union cvmx_bgxx_gmp_gmi_txx_sgmii_ctl {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_sgmii_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 align : 1;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_sgmii_ctl_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_sgmii_ctl_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_sgmii_ctl_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_sgmii_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_sgmii_ctl cvmx_bgxx_gmp_gmi_txx_sgmii_ctl_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_slot
+ */
+union cvmx_bgxx_gmp_gmi_txx_slot {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_slot_s {
+               u64 reserved_10_63 : 54;
+               u64 slot : 10;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_slot_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_slot_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_slot_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_slot_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_slot cvmx_bgxx_gmp_gmi_txx_slot_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_soft_pause
+ */
+union cvmx_bgxx_gmp_gmi_txx_soft_pause {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_soft_pause_s {
+               u64 reserved_16_63 : 48;
+               u64 ptime : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_soft_pause_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_soft_pause_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_soft_pause_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_soft_pause_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_soft_pause cvmx_bgxx_gmp_gmi_txx_soft_pause_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx#_thresh
+ */
+union cvmx_bgxx_gmp_gmi_txx_thresh {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_txx_thresh_s {
+               u64 reserved_11_63 : 53;
+               u64 cnt : 11;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_txx_thresh_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_txx_thresh_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_txx_thresh_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_txx_thresh_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_txx_thresh cvmx_bgxx_gmp_gmi_txx_thresh_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx_col_attempt
+ */
+union cvmx_bgxx_gmp_gmi_tx_col_attempt {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_tx_col_attempt_s {
+               u64 reserved_5_63 : 59;
+               u64 limit : 5;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_tx_col_attempt_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_tx_col_attempt_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_tx_col_attempt_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_tx_col_attempt_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_tx_col_attempt cvmx_bgxx_gmp_gmi_tx_col_attempt_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx_ifg
+ *
+ * Consider the following when programming IFG1 and IFG2:
+ * * For 10/100/1000 Mb/s half-duplex systems that require IEEE 802.3 compatibility, IFG1 must be
+ * in the range of 1-8, IFG2 must be in the range of 4-12, and the IFG1 + IFG2 sum must be 12.
+ * * For 10/100/1000 Mb/s full-duplex systems that require IEEE 802.3 compatibility, IFG1 must be
+ * in the range of 1-11, IFG2 must be in the range of 1-11, and the IFG1 + IFG2 sum must be 12.
+ * For all other systems, IFG1 and IFG2 can be any value in the range of 1-15, allowing for a
+ * total possible IFG sum of 2-30.
+ */
+union cvmx_bgxx_gmp_gmi_tx_ifg {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_tx_ifg_s {
+               u64 reserved_8_63 : 56;
+               u64 ifg2 : 4;
+               u64 ifg1 : 4;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_tx_ifg_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_tx_ifg_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_tx_ifg_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_tx_ifg_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_tx_ifg cvmx_bgxx_gmp_gmi_tx_ifg_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx_jam
+ *
+ * This register provides the pattern used in JAM bytes.
+ *
+ */
+union cvmx_bgxx_gmp_gmi_tx_jam {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_tx_jam_s {
+               u64 reserved_8_63 : 56;
+               u64 jam : 8;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_tx_jam_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_tx_jam_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_tx_jam_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_tx_jam_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_tx_jam cvmx_bgxx_gmp_gmi_tx_jam_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx_lfsr
+ *
+ * This register shows the contents of the linear feedback shift register (LFSR), which is used
+ * to implement truncated binary exponential backoff.
+ */
+union cvmx_bgxx_gmp_gmi_tx_lfsr {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_tx_lfsr_s {
+               u64 reserved_16_63 : 48;
+               u64 lfsr : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_tx_lfsr_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_tx_lfsr_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_tx_lfsr_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_tx_lfsr_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_tx_lfsr cvmx_bgxx_gmp_gmi_tx_lfsr_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx_pause_pkt_dmac
+ */
+union cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac_s {
+               u64 reserved_48_63 : 16;
+               u64 dmac : 48;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac cvmx_bgxx_gmp_gmi_tx_pause_pkt_dmac_t;
+
+/**
+ * cvmx_bgx#_gmp_gmi_tx_pause_pkt_type
+ *
+ * This register provides the PTYPE field that is placed in outbound PAUSE packets.
+ *
+ */
+union cvmx_bgxx_gmp_gmi_tx_pause_pkt_type {
+       u64 u64;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_type_s {
+               u64 reserved_16_63 : 48;
+               u64 ptype : 16;
+       } s;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_type_s cn73xx;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_type_s cn78xx;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_type_s cn78xxp1;
+       struct cvmx_bgxx_gmp_gmi_tx_pause_pkt_type_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_gmi_tx_pause_pkt_type cvmx_bgxx_gmp_gmi_tx_pause_pkt_type_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_an#_adv
+ */
+union cvmx_bgxx_gmp_pcs_anx_adv {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_anx_adv_s {
+               u64 reserved_16_63 : 48;
+               u64 np : 1;
+               u64 reserved_14_14 : 1;
+               u64 rem_flt : 2;
+               u64 reserved_9_11 : 3;
+               u64 pause : 2;
+               u64 hfd : 1;
+               u64 fd : 1;
+               u64 reserved_0_4 : 5;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_anx_adv_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_anx_adv_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_anx_adv_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_anx_adv_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_anx_adv cvmx_bgxx_gmp_pcs_anx_adv_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_an#_ext_st
+ */
+union cvmx_bgxx_gmp_pcs_anx_ext_st {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_anx_ext_st_s {
+               u64 reserved_16_63 : 48;
+               u64 thou_xfd : 1;
+               u64 thou_xhd : 1;
+               u64 thou_tfd : 1;
+               u64 thou_thd : 1;
+               u64 reserved_0_11 : 12;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_anx_ext_st_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_anx_ext_st_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_anx_ext_st_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_anx_ext_st_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_anx_ext_st cvmx_bgxx_gmp_pcs_anx_ext_st_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_an#_lp_abil
+ *
+ * This is the autonegotiation link partner ability register 5 as per IEEE 802.3, Clause 37.
+ *
+ */
+union cvmx_bgxx_gmp_pcs_anx_lp_abil {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_anx_lp_abil_s {
+               u64 reserved_16_63 : 48;
+               u64 np : 1;
+               u64 ack : 1;
+               u64 rem_flt : 2;
+               u64 reserved_9_11 : 3;
+               u64 pause : 2;
+               u64 hfd : 1;
+               u64 fd : 1;
+               u64 reserved_0_4 : 5;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_anx_lp_abil_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_anx_lp_abil_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_anx_lp_abil_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_anx_lp_abil_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_anx_lp_abil cvmx_bgxx_gmp_pcs_anx_lp_abil_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_an#_results
+ *
+ * This register is not valid when BGX()_GMP_PCS_MISC()_CTL[AN_OVRD] is set to 1. If
+ * BGX()_GMP_PCS_MISC()_CTL[AN_OVRD] is set to 0 and
+ * BGX()_GMP_PCS_AN()_RESULTS[AN_CPT] is set to 1, this register is valid.
+ */
+union cvmx_bgxx_gmp_pcs_anx_results {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_anx_results_s {
+               u64 reserved_7_63 : 57;
+               u64 pause : 2;
+               u64 spd : 2;
+               u64 an_cpt : 1;
+               u64 dup : 1;
+               u64 link_ok : 1;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_anx_results_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_anx_results_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_anx_results_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_anx_results_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_anx_results cvmx_bgxx_gmp_pcs_anx_results_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_int#
+ */
+union cvmx_bgxx_gmp_pcs_intx {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_intx_s {
+               u64 reserved_13_63 : 51;
+               u64 dbg_sync : 1;
+               u64 dup : 1;
+               u64 sync_bad : 1;
+               u64 an_bad : 1;
+               u64 rxlock : 1;
+               u64 rxbad : 1;
+               u64 rxerr : 1;
+               u64 txbad : 1;
+               u64 txfifo : 1;
+               u64 txfifu : 1;
+               u64 an_err : 1;
+               u64 xmit : 1;
+               u64 lnkspd : 1;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_intx_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_intx_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_intx_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_intx_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_intx cvmx_bgxx_gmp_pcs_intx_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_link#_timer
+ *
+ * This is the 1.6 ms nominal link timer register.
+ *
+ */
+union cvmx_bgxx_gmp_pcs_linkx_timer {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_linkx_timer_s {
+               u64 reserved_16_63 : 48;
+               u64 count : 16;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_linkx_timer_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_linkx_timer_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_linkx_timer_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_linkx_timer_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_linkx_timer cvmx_bgxx_gmp_pcs_linkx_timer_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_misc#_ctl
+ */
+union cvmx_bgxx_gmp_pcs_miscx_ctl {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_miscx_ctl_s {
+               u64 reserved_13_63 : 51;
+               u64 sgmii : 1;
+               u64 gmxeno : 1;
+               u64 loopbck2 : 1;
+               u64 mac_phy : 1;
+               u64 mode : 1;
+               u64 an_ovrd : 1;
+               u64 samp_pt : 7;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_miscx_ctl_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_miscx_ctl_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_miscx_ctl_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_miscx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_miscx_ctl cvmx_bgxx_gmp_pcs_miscx_ctl_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_mr#_control
+ */
+union cvmx_bgxx_gmp_pcs_mrx_control {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_mrx_control_s {
+               u64 reserved_16_63 : 48;
+               u64 reset : 1;
+               u64 loopbck1 : 1;
+               u64 spdlsb : 1;
+               u64 an_en : 1;
+               u64 pwr_dn : 1;
+               u64 reserved_10_10 : 1;
+               u64 rst_an : 1;
+               u64 dup : 1;
+               u64 coltst : 1;
+               u64 spdmsb : 1;
+               u64 uni : 1;
+               u64 reserved_0_4 : 5;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_mrx_control_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_mrx_control_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_mrx_control_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_mrx_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_mrx_control cvmx_bgxx_gmp_pcs_mrx_control_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_mr#_status
+ *
+ * Bits <15:9> in this register indicate the ability to operate when
+ * BGX()_GMP_PCS_MISC()_CTL[MAC_PHY] is set to MAC mode. Bits <15:9> are always read as
+ * 0, indicating that the chip cannot operate in the corresponding modes. The field [RM_FLT] is a
+ * 'don't care' when the selected mode is SGMII.
+ */
+union cvmx_bgxx_gmp_pcs_mrx_status {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_mrx_status_s {
+               u64 reserved_16_63 : 48;
+               u64 hun_t4 : 1;
+               u64 hun_xfd : 1;
+               u64 hun_xhd : 1;
+               u64 ten_fd : 1;
+               u64 ten_hd : 1;
+               u64 hun_t2fd : 1;
+               u64 hun_t2hd : 1;
+               u64 ext_st : 1;
+               u64 reserved_7_7 : 1;
+               u64 prb_sup : 1;
+               u64 an_cpt : 1;
+               u64 rm_flt : 1;
+               u64 an_abil : 1;
+               u64 lnk_st : 1;
+               u64 reserved_1_1 : 1;
+               u64 extnd : 1;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_mrx_status_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_mrx_status_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_mrx_status_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_mrx_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_mrx_status cvmx_bgxx_gmp_pcs_mrx_status_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_rx#_states
+ */
+union cvmx_bgxx_gmp_pcs_rxx_states {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_rxx_states_s {
+               u64 reserved_16_63 : 48;
+               u64 rx_bad : 1;
+               u64 rx_st : 5;
+               u64 sync_bad : 1;
+               u64 sync : 4;
+               u64 an_bad : 1;
+               u64 an_st : 4;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_rxx_states_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_rxx_states_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_rxx_states_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_rxx_states_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_rxx_states cvmx_bgxx_gmp_pcs_rxx_states_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_rx#_sync
+ */
+union cvmx_bgxx_gmp_pcs_rxx_sync {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_rxx_sync_s {
+               u64 reserved_2_63 : 62;
+               u64 sync : 1;
+               u64 bit_lock : 1;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_rxx_sync_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_rxx_sync_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_rxx_sync_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_rxx_sync_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_rxx_sync cvmx_bgxx_gmp_pcs_rxx_sync_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_sgm#_an_adv
+ *
+ * This is the SGMII autonegotiation advertisement register (sent out as tx_Config_Reg<15:0> as
+ * defined in IEEE 802.3 clause 37). This register is sent during autonegotiation if
+ * BGX()_GMP_PCS_MISC()_CTL[MAC_PHY] is set (1 = PHY mode). If the bit is not set (0 =
+ * MAC mode), then tx_Config_Reg<14> becomes ACK bit and tx_Config_Reg<0> is always 1. All other
+ * bits in tx_Config_Reg sent will be 0. The PHY dictates the autonegotiation results.
+ */
+union cvmx_bgxx_gmp_pcs_sgmx_an_adv {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_sgmx_an_adv_s {
+               u64 reserved_16_63 : 48;
+               u64 link : 1;
+               u64 ack : 1;
+               u64 reserved_13_13 : 1;
+               u64 dup : 1;
+               u64 speed : 2;
+               u64 reserved_1_9 : 9;
+               u64 one : 1;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_sgmx_an_adv_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_sgmx_an_adv_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_sgmx_an_adv_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_sgmx_an_adv_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_sgmx_an_adv cvmx_bgxx_gmp_pcs_sgmx_an_adv_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_sgm#_lp_adv
+ *
+ * This is the SGMII link partner advertisement register (received as rx_Config_Reg<15:0> as
+ * defined in IEEE 802.3 clause 37).
+ */
+union cvmx_bgxx_gmp_pcs_sgmx_lp_adv {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_sgmx_lp_adv_s {
+               u64 reserved_16_63 : 48;
+               u64 link : 1;
+               u64 reserved_13_14 : 2;
+               u64 dup : 1;
+               u64 speed : 2;
+               u64 reserved_1_9 : 9;
+               u64 one : 1;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_sgmx_lp_adv_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_sgmx_lp_adv_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_sgmx_lp_adv_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_sgmx_lp_adv_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_sgmx_lp_adv cvmx_bgxx_gmp_pcs_sgmx_lp_adv_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_tx#_states
+ */
+union cvmx_bgxx_gmp_pcs_txx_states {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_txx_states_s {
+               u64 reserved_7_63 : 57;
+               u64 xmit : 2;
+               u64 tx_bad : 1;
+               u64 ord_st : 4;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_txx_states_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_txx_states_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_txx_states_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_txx_states_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_txx_states cvmx_bgxx_gmp_pcs_txx_states_t;
+
+/**
+ * cvmx_bgx#_gmp_pcs_tx_rx#_polarity
+ *
+ * BGX()_GMP_PCS_TX_RX()_POLARITY[AUTORXPL] shows correct polarity needed on the link
+ * receive path after code group synchronization is achieved.
+ */
+union cvmx_bgxx_gmp_pcs_tx_rxx_polarity {
+       u64 u64;
+       struct cvmx_bgxx_gmp_pcs_tx_rxx_polarity_s {
+               u64 reserved_4_63 : 60;
+               u64 rxovrd : 1;
+               u64 autorxpl : 1;
+               u64 rxplrt : 1;
+               u64 txplrt : 1;
+       } s;
+       struct cvmx_bgxx_gmp_pcs_tx_rxx_polarity_s cn73xx;
+       struct cvmx_bgxx_gmp_pcs_tx_rxx_polarity_s cn78xx;
+       struct cvmx_bgxx_gmp_pcs_tx_rxx_polarity_s cn78xxp1;
+       struct cvmx_bgxx_gmp_pcs_tx_rxx_polarity_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_gmp_pcs_tx_rxx_polarity cvmx_bgxx_gmp_pcs_tx_rxx_polarity_t;
+
+/**
+ * cvmx_bgx#_smu#_cbfc_ctl
+ */
+union cvmx_bgxx_smux_cbfc_ctl {
+       u64 u64;
+       struct cvmx_bgxx_smux_cbfc_ctl_s {
+               u64 phys_en : 16;
+               u64 logl_en : 16;
+               u64 reserved_4_31 : 28;
+               u64 bck_en : 1;
+               u64 drp_en : 1;
+               u64 tx_en : 1;
+               u64 rx_en : 1;
+       } s;
+       struct cvmx_bgxx_smux_cbfc_ctl_s cn73xx;
+       struct cvmx_bgxx_smux_cbfc_ctl_s cn78xx;
+       struct cvmx_bgxx_smux_cbfc_ctl_s cn78xxp1;
+       struct cvmx_bgxx_smux_cbfc_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_cbfc_ctl cvmx_bgxx_smux_cbfc_ctl_t;
+
+/**
+ * cvmx_bgx#_smu#_ctrl
+ */
+union cvmx_bgxx_smux_ctrl {
+       u64 u64;
+       struct cvmx_bgxx_smux_ctrl_s {
+               u64 reserved_2_63 : 62;
+               u64 tx_idle : 1;
+               u64 rx_idle : 1;
+       } s;
+       struct cvmx_bgxx_smux_ctrl_s cn73xx;
+       struct cvmx_bgxx_smux_ctrl_s cn78xx;
+       struct cvmx_bgxx_smux_ctrl_s cn78xxp1;
+       struct cvmx_bgxx_smux_ctrl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_ctrl cvmx_bgxx_smux_ctrl_t;
+
+/**
+ * cvmx_bgx#_smu#_ext_loopback
+ *
+ * In loopback mode, the IFG1+IFG2 of local and remote parties must match exactly; otherwise one
+ * of the two sides' loopback FIFO will overrun: BGX()_SMU()_TX_INT[LB_OVRFLW].
+ */
+union cvmx_bgxx_smux_ext_loopback {
+       u64 u64;
+       struct cvmx_bgxx_smux_ext_loopback_s {
+               u64 reserved_5_63 : 59;
+               u64 en : 1;
+               u64 thresh : 4;
+       } s;
+       struct cvmx_bgxx_smux_ext_loopback_s cn73xx;
+       struct cvmx_bgxx_smux_ext_loopback_s cn78xx;
+       struct cvmx_bgxx_smux_ext_loopback_s cn78xxp1;
+       struct cvmx_bgxx_smux_ext_loopback_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_ext_loopback cvmx_bgxx_smux_ext_loopback_t;
+
+/**
+ * cvmx_bgx#_smu#_hg2_control
+ *
+ * HiGig2 TX- and RX-enable are normally set together for HiGig2 messaging. Setting just the TX
+ * or RX bit results in only the HG2 message transmit or receive capability.
+ *
+ * Setting [PHYS_EN] and [LOGL_EN] to 1 allows link PAUSE or backpressure to PKO as per the
+ * received HiGig2 message. Setting these fields to 0 disables link PAUSE and backpressure to PKO
+ * in response to received messages.
+ *
+ * BGX()_SMU()_TX_CTL[HG_EN] must be set (to enable HiGig) whenever either [HG2TX_EN] or
+ * [HG2RX_EN] are set. BGX()_SMU()_RX_UDD_SKP[LEN] must be set to 16 (to select HiGig2)
+ * whenever either [HG2TX_EN] or [HG2RX_EN] are set.
+ *
+ * BGX()_CMR_RX_OVR_BP[EN]<0> must be set and BGX()_CMR_RX_OVR_BP[BP]<0> must be cleared
+ * to 0 (to forcibly disable hardware-automatic 802.3 PAUSE packet generation) with the HiGig2
+ * Protocol when [HG2TX_EN] = 0. (The HiGig2 protocol is indicated
+ * by BGX()_SMU()_TX_CTL[HG_EN] = 1 and BGX()_SMU()_RX_UDD_SKP[LEN]=16.) Hardware
+ * can only autogenerate backpressure via HiGig2 messages (optionally, when [HG2TX_EN] = 1) with
+ * the HiGig2 protocol.
+ */
+union cvmx_bgxx_smux_hg2_control {
+       u64 u64;
+       struct cvmx_bgxx_smux_hg2_control_s {
+               u64 reserved_19_63 : 45;
+               u64 hg2tx_en : 1;
+               u64 hg2rx_en : 1;
+               u64 phys_en : 1;
+               u64 logl_en : 16;
+       } s;
+       struct cvmx_bgxx_smux_hg2_control_s cn73xx;
+       struct cvmx_bgxx_smux_hg2_control_s cn78xx;
+       struct cvmx_bgxx_smux_hg2_control_s cn78xxp1;
+       struct cvmx_bgxx_smux_hg2_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_hg2_control cvmx_bgxx_smux_hg2_control_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_bad_col_hi
+ */
+union cvmx_bgxx_smux_rx_bad_col_hi {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_bad_col_hi_s {
+               u64 reserved_17_63 : 47;
+               u64 val : 1;
+               u64 state : 8;
+               u64 lane_rxc : 8;
+       } s;
+       struct cvmx_bgxx_smux_rx_bad_col_hi_s cn73xx;
+       struct cvmx_bgxx_smux_rx_bad_col_hi_s cn78xx;
+       struct cvmx_bgxx_smux_rx_bad_col_hi_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_bad_col_hi_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_bad_col_hi cvmx_bgxx_smux_rx_bad_col_hi_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_bad_col_lo
+ */
+union cvmx_bgxx_smux_rx_bad_col_lo {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_bad_col_lo_s {
+               u64 lane_rxd : 64;
+       } s;
+       struct cvmx_bgxx_smux_rx_bad_col_lo_s cn73xx;
+       struct cvmx_bgxx_smux_rx_bad_col_lo_s cn78xx;
+       struct cvmx_bgxx_smux_rx_bad_col_lo_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_bad_col_lo_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_bad_col_lo cvmx_bgxx_smux_rx_bad_col_lo_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_ctl
+ */
+union cvmx_bgxx_smux_rx_ctl {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 status : 2;
+       } s;
+       struct cvmx_bgxx_smux_rx_ctl_s cn73xx;
+       struct cvmx_bgxx_smux_rx_ctl_s cn78xx;
+       struct cvmx_bgxx_smux_rx_ctl_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_ctl cvmx_bgxx_smux_rx_ctl_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_decision
+ *
+ * This register specifies the byte count used to determine when to accept or to filter a packet.
+ * As each byte in a packet is received by BGX, the L2 byte count (i.e. the number of bytes from
+ * the beginning of the L2 header (DMAC)) is compared against CNT. In normal operation, the L2
+ * header begins after the PREAMBLE + SFD (BGX()_SMU()_RX_FRM_CTL[PRE_CHK] = 1) and any
+ * optional UDD skip data (BGX()_SMU()_RX_UDD_SKP[LEN]).
+ */
+union cvmx_bgxx_smux_rx_decision {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_decision_s {
+               u64 reserved_5_63 : 59;
+               u64 cnt : 5;
+       } s;
+       struct cvmx_bgxx_smux_rx_decision_s cn73xx;
+       struct cvmx_bgxx_smux_rx_decision_s cn78xx;
+       struct cvmx_bgxx_smux_rx_decision_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_decision_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_decision cvmx_bgxx_smux_rx_decision_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_frm_chk
+ *
+ * The CSRs provide the enable bits for a subset of errors passed to CMR encoded.
+ *
+ */
+union cvmx_bgxx_smux_rx_frm_chk {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_frm_chk_s {
+               u64 reserved_9_63 : 55;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_6_6 : 1;
+               u64 fcserr_c : 1;
+               u64 fcserr_d : 1;
+               u64 jabber : 1;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_bgxx_smux_rx_frm_chk_s cn73xx;
+       struct cvmx_bgxx_smux_rx_frm_chk_s cn78xx;
+       struct cvmx_bgxx_smux_rx_frm_chk_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_frm_chk_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_frm_chk cvmx_bgxx_smux_rx_frm_chk_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_frm_ctl
+ *
+ * This register controls the handling of the frames.
+ * The [CTL_BCK] and [CTL_DRP] bits control how the hardware handles incoming PAUSE packets. The
+ * most
+ * common modes of operation:
+ * _ [CTL_BCK] = 1, [CTL_DRP] = 1: hardware handles everything
+ * _ [CTL_BCK] = 0, [CTL_DRP] = 0: software sees all PAUSE frames
+ * _ [CTL_BCK] = 0, [CTL_DRP] = 1: all PAUSE frames are completely ignored
+ *
+ * These control bits should be set to [CTL_BCK] = 0, [CTL_DRP] = 0 in half-duplex mode. Since
+ * PAUSE
+ * packets only apply to full duplex operation, any PAUSE packet would constitute an exception
+ * which should be handled by the processing cores. PAUSE packets should not be forwarded.
+ */
+union cvmx_bgxx_smux_rx_frm_ctl {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_frm_ctl_s {
+               u64 reserved_13_63 : 51;
+               u64 ptp_mode : 1;
+               u64 reserved_6_11 : 6;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } s;
+       struct cvmx_bgxx_smux_rx_frm_ctl_s cn73xx;
+       struct cvmx_bgxx_smux_rx_frm_ctl_s cn78xx;
+       struct cvmx_bgxx_smux_rx_frm_ctl_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_frm_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_frm_ctl cvmx_bgxx_smux_rx_frm_ctl_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_int
+ *
+ * SMU Interrupt Register.
+ *
+ */
+union cvmx_bgxx_smux_rx_int {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_int_s {
+               u64 reserved_12_63 : 52;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+       } s;
+       struct cvmx_bgxx_smux_rx_int_s cn73xx;
+       struct cvmx_bgxx_smux_rx_int_s cn78xx;
+       struct cvmx_bgxx_smux_rx_int_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_int cvmx_bgxx_smux_rx_int_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_jabber
+ *
+ * This register specifies the maximum size for packets, beyond which the SMU truncates. In
+ * XAUI/RXAUI mode, port 0 is used for checking.
+ */
+union cvmx_bgxx_smux_rx_jabber {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_jabber_s {
+               u64 reserved_16_63 : 48;
+               u64 cnt : 16;
+       } s;
+       struct cvmx_bgxx_smux_rx_jabber_s cn73xx;
+       struct cvmx_bgxx_smux_rx_jabber_s cn78xx;
+       struct cvmx_bgxx_smux_rx_jabber_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_jabber_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_jabber cvmx_bgxx_smux_rx_jabber_t;
+
+/**
+ * cvmx_bgx#_smu#_rx_udd_skp
+ *
+ * This register specifies the amount of user-defined data (UDD) added before the start of the
+ * L2C data.
+ */
+union cvmx_bgxx_smux_rx_udd_skp {
+       u64 u64;
+       struct cvmx_bgxx_smux_rx_udd_skp_s {
+               u64 reserved_9_63 : 55;
+               u64 fcssel : 1;
+               u64 reserved_7_7 : 1;
+               u64 len : 7;
+       } s;
+       struct cvmx_bgxx_smux_rx_udd_skp_s cn73xx;
+       struct cvmx_bgxx_smux_rx_udd_skp_s cn78xx;
+       struct cvmx_bgxx_smux_rx_udd_skp_s cn78xxp1;
+       struct cvmx_bgxx_smux_rx_udd_skp_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_rx_udd_skp cvmx_bgxx_smux_rx_udd_skp_t;
+
+/**
+ * cvmx_bgx#_smu#_smac
+ */
+union cvmx_bgxx_smux_smac {
+       u64 u64;
+       struct cvmx_bgxx_smux_smac_s {
+               u64 reserved_48_63 : 16;
+               u64 smac : 48;
+       } s;
+       struct cvmx_bgxx_smux_smac_s cn73xx;
+       struct cvmx_bgxx_smux_smac_s cn78xx;
+       struct cvmx_bgxx_smux_smac_s cn78xxp1;
+       struct cvmx_bgxx_smux_smac_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_smac cvmx_bgxx_smux_smac_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_append
+ *
+ * For more details on the interactions between FCS and PAD, see also the description of
+ * BGX()_SMU()_TX_MIN_PKT[MIN_SIZE].
+ */
+union cvmx_bgxx_smux_tx_append {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_append_s {
+               u64 reserved_4_63 : 60;
+               u64 fcs_c : 1;
+               u64 fcs_d : 1;
+               u64 pad : 1;
+               u64 preamble : 1;
+       } s;
+       struct cvmx_bgxx_smux_tx_append_s cn73xx;
+       struct cvmx_bgxx_smux_tx_append_s cn78xx;
+       struct cvmx_bgxx_smux_tx_append_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_append_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_append cvmx_bgxx_smux_tx_append_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_ctl
+ */
+union cvmx_bgxx_smux_tx_ctl {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_ctl_s {
+               u64 reserved_31_63 : 33;
+               u64 spu_mrk_cnt : 20;
+               u64 hg_pause_hgi : 2;
+               u64 hg_en : 1;
+               u64 l2p_bp_conv : 1;
+               u64 ls_byp : 1;
+               u64 ls : 2;
+               u64 reserved_3_3 : 1;
+               u64 x4a_dis : 1;
+               u64 uni_en : 1;
+               u64 dic_en : 1;
+       } s;
+       struct cvmx_bgxx_smux_tx_ctl_s cn73xx;
+       struct cvmx_bgxx_smux_tx_ctl_s cn78xx;
+       struct cvmx_bgxx_smux_tx_ctl_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_ctl cvmx_bgxx_smux_tx_ctl_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_ifg
+ *
+ * Programming IFG1 and IFG2:
+ * * For XAUI/RXAUI/10Gbs/40Gbs systems that require IEEE 802.3 compatibility, the IFG1+IFG2 sum
+ * must be 12.
+ * * In loopback mode, the IFG1+IFG2 of local and remote parties must match exactly; otherwise
+ * one of the two sides' loopback FIFO will overrun: BGX()_SMU()_TX_INT[LB_OVRFLW].
+ */
+union cvmx_bgxx_smux_tx_ifg {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_ifg_s {
+               u64 reserved_8_63 : 56;
+               u64 ifg2 : 4;
+               u64 ifg1 : 4;
+       } s;
+       struct cvmx_bgxx_smux_tx_ifg_s cn73xx;
+       struct cvmx_bgxx_smux_tx_ifg_s cn78xx;
+       struct cvmx_bgxx_smux_tx_ifg_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_ifg_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_ifg cvmx_bgxx_smux_tx_ifg_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_int
+ */
+union cvmx_bgxx_smux_tx_int {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_int_s {
+               u64 reserved_5_63 : 59;
+               u64 lb_ovrflw : 1;
+               u64 lb_undflw : 1;
+               u64 fake_commit : 1;
+               u64 xchange : 1;
+               u64 undflw : 1;
+       } s;
+       struct cvmx_bgxx_smux_tx_int_s cn73xx;
+       struct cvmx_bgxx_smux_tx_int_s cn78xx;
+       struct cvmx_bgxx_smux_tx_int_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_int cvmx_bgxx_smux_tx_int_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_min_pkt
+ */
+union cvmx_bgxx_smux_tx_min_pkt {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_min_pkt_s {
+               u64 reserved_8_63 : 56;
+               u64 min_size : 8;
+       } s;
+       struct cvmx_bgxx_smux_tx_min_pkt_s cn73xx;
+       struct cvmx_bgxx_smux_tx_min_pkt_s cn78xx;
+       struct cvmx_bgxx_smux_tx_min_pkt_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_min_pkt_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_min_pkt cvmx_bgxx_smux_tx_min_pkt_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_pause_pkt_dmac
+ *
+ * This register provides the DMAC value that is placed in outbound PAUSE packets.
+ *
+ */
+union cvmx_bgxx_smux_tx_pause_pkt_dmac {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_pause_pkt_dmac_s {
+               u64 reserved_48_63 : 16;
+               u64 dmac : 48;
+       } s;
+       struct cvmx_bgxx_smux_tx_pause_pkt_dmac_s cn73xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_dmac_s cn78xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_dmac_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_pause_pkt_dmac_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_pause_pkt_dmac cvmx_bgxx_smux_tx_pause_pkt_dmac_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_pause_pkt_interval
+ *
+ * This register specifies how often PAUSE packets are sent.
+ *
+ */
+union cvmx_bgxx_smux_tx_pause_pkt_interval {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_pause_pkt_interval_s {
+               u64 reserved_33_63 : 31;
+               u64 hg2_intra_en : 1;
+               u64 hg2_intra_interval : 16;
+               u64 interval : 16;
+       } s;
+       struct cvmx_bgxx_smux_tx_pause_pkt_interval_s cn73xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_interval_s cn78xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_interval_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_pause_pkt_interval_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_pause_pkt_interval cvmx_bgxx_smux_tx_pause_pkt_interval_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_pause_pkt_time
+ */
+union cvmx_bgxx_smux_tx_pause_pkt_time {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_pause_pkt_time_s {
+               u64 reserved_16_63 : 48;
+               u64 p_time : 16;
+       } s;
+       struct cvmx_bgxx_smux_tx_pause_pkt_time_s cn73xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_time_s cn78xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_time_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_pause_pkt_time_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_pause_pkt_time cvmx_bgxx_smux_tx_pause_pkt_time_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_pause_pkt_type
+ *
+ * This register provides the P_TYPE field that is placed in outbound PAUSE packets.
+ *
+ */
+union cvmx_bgxx_smux_tx_pause_pkt_type {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_pause_pkt_type_s {
+               u64 reserved_16_63 : 48;
+               u64 p_type : 16;
+       } s;
+       struct cvmx_bgxx_smux_tx_pause_pkt_type_s cn73xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_type_s cn78xx;
+       struct cvmx_bgxx_smux_tx_pause_pkt_type_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_pause_pkt_type_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_pause_pkt_type cvmx_bgxx_smux_tx_pause_pkt_type_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_pause_togo
+ */
+union cvmx_bgxx_smux_tx_pause_togo {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_pause_togo_s {
+               u64 reserved_32_63 : 32;
+               u64 msg_time : 16;
+               u64 p_time : 16;
+       } s;
+       struct cvmx_bgxx_smux_tx_pause_togo_s cn73xx;
+       struct cvmx_bgxx_smux_tx_pause_togo_s cn78xx;
+       struct cvmx_bgxx_smux_tx_pause_togo_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_pause_togo_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_pause_togo cvmx_bgxx_smux_tx_pause_togo_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_pause_zero
+ */
+union cvmx_bgxx_smux_tx_pause_zero {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_pause_zero_s {
+               u64 reserved_1_63 : 63;
+               u64 send : 1;
+       } s;
+       struct cvmx_bgxx_smux_tx_pause_zero_s cn73xx;
+       struct cvmx_bgxx_smux_tx_pause_zero_s cn78xx;
+       struct cvmx_bgxx_smux_tx_pause_zero_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_pause_zero_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_pause_zero cvmx_bgxx_smux_tx_pause_zero_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_soft_pause
+ */
+union cvmx_bgxx_smux_tx_soft_pause {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_soft_pause_s {
+               u64 reserved_16_63 : 48;
+               u64 p_time : 16;
+       } s;
+       struct cvmx_bgxx_smux_tx_soft_pause_s cn73xx;
+       struct cvmx_bgxx_smux_tx_soft_pause_s cn78xx;
+       struct cvmx_bgxx_smux_tx_soft_pause_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_soft_pause_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_soft_pause cvmx_bgxx_smux_tx_soft_pause_t;
+
+/**
+ * cvmx_bgx#_smu#_tx_thresh
+ */
+union cvmx_bgxx_smux_tx_thresh {
+       u64 u64;
+       struct cvmx_bgxx_smux_tx_thresh_s {
+               u64 reserved_11_63 : 53;
+               u64 cnt : 11;
+       } s;
+       struct cvmx_bgxx_smux_tx_thresh_s cn73xx;
+       struct cvmx_bgxx_smux_tx_thresh_s cn78xx;
+       struct cvmx_bgxx_smux_tx_thresh_s cn78xxp1;
+       struct cvmx_bgxx_smux_tx_thresh_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_smux_tx_thresh cvmx_bgxx_smux_tx_thresh_t;
+
+/**
+ * cvmx_bgx#_spu#_an_adv
+ *
+ * Software programs this register with the contents of the AN-link code word base page to be
+ * transmitted during autonegotiation. (See IEEE 802.3 section 73.6 for details.) Any write
+ * operations to this register prior to completion of autonegotiation, as indicated by
+ * BGX()_SPU()_AN_STATUS[AN_COMPLETE], should be followed by a renegotiation in order for
+ * the new values to take effect. Renegotiation is initiated by setting
+ * BGX()_SPU()_AN_CONTROL[AN_RESTART]. Once autonegotiation has completed, software can
+ * examine this register along with BGX()_SPU()_AN_LP_BASE to determine the highest
+ * common denominator technology.
+ */
+union cvmx_bgxx_spux_an_adv {
+       u64 u64;
+       struct cvmx_bgxx_spux_an_adv_s {
+               u64 reserved_48_63 : 16;
+               u64 fec_req : 1;
+               u64 fec_able : 1;
+               u64 arsv : 19;
+               u64 a100g_cr10 : 1;
+               u64 a40g_cr4 : 1;
+               u64 a40g_kr4 : 1;
+               u64 a10g_kr : 1;
+               u64 a10g_kx4 : 1;
+               u64 a1g_kx : 1;
+               u64 t : 5;
+               u64 np : 1;
+               u64 ack : 1;
+               u64 rf : 1;
+               u64 xnp_able : 1;
+               u64 asm_dir : 1;
+               u64 pause : 1;
+               u64 e : 5;
+               u64 s : 5;
+       } s;
+       struct cvmx_bgxx_spux_an_adv_s cn73xx;
+       struct cvmx_bgxx_spux_an_adv_s cn78xx;
+       struct cvmx_bgxx_spux_an_adv_s cn78xxp1;
+       struct cvmx_bgxx_spux_an_adv_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_an_adv cvmx_bgxx_spux_an_adv_t;
+
+/**
+ * cvmx_bgx#_spu#_an_bp_status
+ *
+ * The contents of this register are updated
+ * during autonegotiation and are valid when BGX()_SPU()_AN_STATUS[AN_COMPLETE] is set.
+ * At that time, one of the port type bits ([N100G_CR10], [N40G_CR4], [N40G_KR4], [N10G_KR],
+ * [N10G_KX4],
+ * [N1G_KX]) will be set depending on the AN priority resolution. If a BASE-R type is negotiated,
+ * then [FEC] will be set to indicate that FEC operation has been negotiated, and will be
+ * clear otherwise.
+ */
+union cvmx_bgxx_spux_an_bp_status {
+       u64 u64;
+       struct cvmx_bgxx_spux_an_bp_status_s {
+               u64 reserved_9_63 : 55;
+               u64 n100g_cr10 : 1;
+               u64 reserved_7_7 : 1;
+               u64 n40g_cr4 : 1;
+               u64 n40g_kr4 : 1;
+               u64 fec : 1;
+               u64 n10g_kr : 1;
+               u64 n10g_kx4 : 1;
+               u64 n1g_kx : 1;
+               u64 bp_an_able : 1;
+       } s;
+       struct cvmx_bgxx_spux_an_bp_status_s cn73xx;
+       struct cvmx_bgxx_spux_an_bp_status_s cn78xx;
+       struct cvmx_bgxx_spux_an_bp_status_s cn78xxp1;
+       struct cvmx_bgxx_spux_an_bp_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_an_bp_status cvmx_bgxx_spux_an_bp_status_t;
+
+/**
+ * cvmx_bgx#_spu#_an_control
+ */
+union cvmx_bgxx_spux_an_control {
+       u64 u64;
+       struct cvmx_bgxx_spux_an_control_s {
+               u64 reserved_16_63 : 48;
+               u64 an_reset : 1;
+               u64 reserved_14_14 : 1;
+               u64 xnp_en : 1;
+               u64 an_en : 1;
+               u64 reserved_10_11 : 2;
+               u64 an_restart : 1;
+               u64 reserved_0_8 : 9;
+       } s;
+       struct cvmx_bgxx_spux_an_control_s cn73xx;
+       struct cvmx_bgxx_spux_an_control_s cn78xx;
+       struct cvmx_bgxx_spux_an_control_s cn78xxp1;
+       struct cvmx_bgxx_spux_an_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_an_control cvmx_bgxx_spux_an_control_t;
+
+/**
+ * cvmx_bgx#_spu#_an_lp_base
+ *
+ * This register captures the contents of the latest AN link code word base page received from
+ * the link partner during autonegotiation. (See IEEE 802.3 section 73.6 for details.)
+ * BGX()_SPU()_AN_STATUS[PAGE_RX] is set when this register is updated by hardware.
+ */
+union cvmx_bgxx_spux_an_lp_base {
+       u64 u64;
+       struct cvmx_bgxx_spux_an_lp_base_s {
+               u64 reserved_48_63 : 16;
+               u64 fec_req : 1;
+               u64 fec_able : 1;
+               u64 arsv : 19;
+               u64 a100g_cr10 : 1;
+               u64 a40g_cr4 : 1;
+               u64 a40g_kr4 : 1;
+               u64 a10g_kr : 1;
+               u64 a10g_kx4 : 1;
+               u64 a1g_kx : 1;
+               u64 t : 5;
+               u64 np : 1;
+               u64 ack : 1;
+               u64 rf : 1;
+               u64 xnp_able : 1;
+               u64 asm_dir : 1;
+               u64 pause : 1;
+               u64 e : 5;
+               u64 s : 5;
+       } s;
+       struct cvmx_bgxx_spux_an_lp_base_s cn73xx;
+       struct cvmx_bgxx_spux_an_lp_base_s cn78xx;
+       struct cvmx_bgxx_spux_an_lp_base_s cn78xxp1;
+       struct cvmx_bgxx_spux_an_lp_base_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_an_lp_base cvmx_bgxx_spux_an_lp_base_t;
+
+/**
+ * cvmx_bgx#_spu#_an_lp_xnp
+ *
+ * This register captures the contents of the latest next page code word received from the link
+ * partner during autonegotiation, if any. See section 802.3 section 73.7.7 for details.
+ */
+union cvmx_bgxx_spux_an_lp_xnp {
+       u64 u64;
+       struct cvmx_bgxx_spux_an_lp_xnp_s {
+               u64 reserved_48_63 : 16;
+               u64 u : 32;
+               u64 np : 1;
+               u64 ack : 1;
+               u64 mp : 1;
+               u64 ack2 : 1;
+               u64 toggle : 1;
+               u64 m_u : 11;
+       } s;
+       struct cvmx_bgxx_spux_an_lp_xnp_s cn73xx;
+       struct cvmx_bgxx_spux_an_lp_xnp_s cn78xx;
+       struct cvmx_bgxx_spux_an_lp_xnp_s cn78xxp1;
+       struct cvmx_bgxx_spux_an_lp_xnp_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_an_lp_xnp cvmx_bgxx_spux_an_lp_xnp_t;
+
+/**
+ * cvmx_bgx#_spu#_an_status
+ */
+union cvmx_bgxx_spux_an_status {
+       u64 u64;
+       struct cvmx_bgxx_spux_an_status_s {
+               u64 reserved_10_63 : 54;
+               u64 prl_flt : 1;
+               u64 reserved_8_8 : 1;
+               u64 xnp_stat : 1;
+               u64 page_rx : 1;
+               u64 an_complete : 1;
+               u64 rmt_flt : 1;
+               u64 an_able : 1;
+               u64 link_status : 1;
+               u64 reserved_1_1 : 1;
+               u64 lp_an_able : 1;
+       } s;
+       struct cvmx_bgxx_spux_an_status_s cn73xx;
+       struct cvmx_bgxx_spux_an_status_s cn78xx;
+       struct cvmx_bgxx_spux_an_status_s cn78xxp1;
+       struct cvmx_bgxx_spux_an_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_an_status cvmx_bgxx_spux_an_status_t;
+
+/**
+ * cvmx_bgx#_spu#_an_xnp_tx
+ *
+ * Software programs this register with the contents of the AN message next page or unformatted
+ * next page link code word to be transmitted during autonegotiation. Next page exchange occurs
+ * after the base link code words have been exchanged if either end of the link segment sets the
+ * NP bit to 1, indicating that it has at least one next page to send. Once initiated, next page
+ * exchange continues until both ends of the link segment set their NP bits to 0. See section
+ * 802.3 section 73.7.7 for details.
+ */
+union cvmx_bgxx_spux_an_xnp_tx {
+       u64 u64;
+       struct cvmx_bgxx_spux_an_xnp_tx_s {
+               u64 reserved_48_63 : 16;
+               u64 u : 32;
+               u64 np : 1;
+               u64 ack : 1;
+               u64 mp : 1;
+               u64 ack2 : 1;
+               u64 toggle : 1;
+               u64 m_u : 11;
+       } s;
+       struct cvmx_bgxx_spux_an_xnp_tx_s cn73xx;
+       struct cvmx_bgxx_spux_an_xnp_tx_s cn78xx;
+       struct cvmx_bgxx_spux_an_xnp_tx_s cn78xxp1;
+       struct cvmx_bgxx_spux_an_xnp_tx_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_an_xnp_tx cvmx_bgxx_spux_an_xnp_tx_t;
+
+/**
+ * cvmx_bgx#_spu#_br_algn_status
+ *
+ * This register implements the IEEE 802.3 multilane BASE-R PCS alignment status 1-4 registers
+ * (3.50-3.53). It is valid only when the LPCS type is 40GBASE-R
+ * (BGX()_CMR()_CONFIG[LMAC_TYPE] = 0x4), and always returns 0x0 for all other LPCS
+ * types. IEEE 802.3 bits that are not applicable to 40GBASE-R (e.g. status bits for PCS lanes
+ * 19-4) are not implemented and marked as reserved. PCS lanes 3-0 are valid and are mapped to
+ * physical SerDes lanes based on the programming of BGX()_CMR()_CONFIG[LANE_TO_SDS].
+ */
+union cvmx_bgxx_spux_br_algn_status {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_algn_status_s {
+               u64 reserved_36_63 : 28;
+               u64 marker_lock : 4;
+               u64 reserved_13_31 : 19;
+               u64 alignd : 1;
+               u64 reserved_4_11 : 8;
+               u64 block_lock : 4;
+       } s;
+       struct cvmx_bgxx_spux_br_algn_status_s cn73xx;
+       struct cvmx_bgxx_spux_br_algn_status_s cn78xx;
+       struct cvmx_bgxx_spux_br_algn_status_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_algn_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_algn_status cvmx_bgxx_spux_br_algn_status_t;
+
+/**
+ * cvmx_bgx#_spu#_br_bip_err_cnt
+ *
+ * This register implements the IEEE 802.3 BIP error-counter registers for PCS lanes 0-3
+ * (3.200-3.203). It is valid only when the LPCS type is 40GBASE-R
+ * (BGX()_CMR()_CONFIG[LMAC_TYPE] = 0x4), and always returns 0x0 for all other LPCS
+ * types. The counters are indexed by the RX PCS lane number based on the Alignment Marker
+ * detected on each lane and captured in BGX()_SPU()_BR_LANE_MAP. Each counter counts the
+ * BIP errors for its PCS lane, and is held at all ones in case of overflow. The counters are
+ * reset to all 0s when this register is read by software.
+ *
+ * The reset operation takes precedence over the increment operation; if the register is read on
+ * the same clock cycle as an increment operation, the counter is reset to all 0s and the
+ * increment operation is lost. The counters are writable for test purposes, rather than read-
+ * only as specified in IEEE 802.3.
+ */
+union cvmx_bgxx_spux_br_bip_err_cnt {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_bip_err_cnt_s {
+               u64 bip_err_cnt_ln3 : 16;
+               u64 bip_err_cnt_ln2 : 16;
+               u64 bip_err_cnt_ln1 : 16;
+               u64 bip_err_cnt_ln0 : 16;
+       } s;
+       struct cvmx_bgxx_spux_br_bip_err_cnt_s cn73xx;
+       struct cvmx_bgxx_spux_br_bip_err_cnt_s cn78xx;
+       struct cvmx_bgxx_spux_br_bip_err_cnt_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_bip_err_cnt_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_bip_err_cnt cvmx_bgxx_spux_br_bip_err_cnt_t;
+
+/**
+ * cvmx_bgx#_spu#_br_lane_map
+ *
+ * This register implements the IEEE 802.3 lane 0-3 mapping registers (3.400-3.403). It is valid
+ * only when the LPCS type is 40GBASE-R (BGX()_CMR()_CONFIG[LMAC_TYPE] = 0x4), and always
+ * returns 0x0 for all other LPCS types. The LNx_MAPPING field for each programmed PCS lane
+ * (called service interface in 802.3ba-2010) is valid when that lane has achieved alignment
+ * marker lock on the receive side (i.e. the associated
+ * BGX()_SPU()_BR_ALGN_STATUS[MARKER_LOCK] = 1), and is invalid otherwise. When valid, it
+ * returns the actual detected receive PCS lane number based on the received alignment marker
+ * contents received on that service interface.
+ *
+ * The mapping is flexible because IEEE 802.3 allows multilane BASE-R receive lanes to be re-
+ * ordered. Note that for the transmit side, each PCS lane is mapped to a physical SerDes lane
+ * based on the programming of BGX()_CMR()_CONFIG[LANE_TO_SDS]. For the receive side,
+ * BGX()_CMR()_CONFIG[LANE_TO_SDS] specifies the service interface to physical SerDes
+ * lane mapping, and this register specifies the service interface to PCS lane mapping.
+ */
+union cvmx_bgxx_spux_br_lane_map {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_lane_map_s {
+               u64 reserved_54_63 : 10;
+               u64 ln3_mapping : 6;
+               u64 reserved_38_47 : 10;
+               u64 ln2_mapping : 6;
+               u64 reserved_22_31 : 10;
+               u64 ln1_mapping : 6;
+               u64 reserved_6_15 : 10;
+               u64 ln0_mapping : 6;
+       } s;
+       struct cvmx_bgxx_spux_br_lane_map_s cn73xx;
+       struct cvmx_bgxx_spux_br_lane_map_s cn78xx;
+       struct cvmx_bgxx_spux_br_lane_map_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_lane_map_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_lane_map cvmx_bgxx_spux_br_lane_map_t;
+
+/**
+ * cvmx_bgx#_spu#_br_pmd_control
+ */
+union cvmx_bgxx_spux_br_pmd_control {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_pmd_control_s {
+               u64 reserved_2_63 : 62;
+               u64 train_en : 1;
+               u64 train_restart : 1;
+       } s;
+       struct cvmx_bgxx_spux_br_pmd_control_s cn73xx;
+       struct cvmx_bgxx_spux_br_pmd_control_s cn78xx;
+       struct cvmx_bgxx_spux_br_pmd_control_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_pmd_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_pmd_control cvmx_bgxx_spux_br_pmd_control_t;
+
+/**
+ * cvmx_bgx#_spu#_br_pmd_ld_cup
+ *
+ * This register implements 802.3 MDIO register 1.153 for 10GBASE-R (when
+ * BGX()_CMR()_CONFIG[LMAC_TYPE] = 10G_R)
+ * and MDIO registers 1.1300-1.1303 for 40GBASE-R (when
+ * BGX()_CMR()_CONFIG[LMAC_TYPE] = 40G_R). It is automatically cleared at the start of training.
+ * When link training
+ * is in progress, each field reflects the contents of the coefficient update field in the
+ * associated lane's outgoing training frame. The fields in this register are read/write even
+ * though they are specified as read-only in 802.3.
+ *
+ * If BGX()_SPU_DBG_CONTROL[BR_PMD_TRAIN_SOFT_EN] is set, then this register must be updated
+ * by software during link training and hardware updates are disabled. If
+ * BGX()_SPU_DBG_CONTROL[BR_PMD_TRAIN_SOFT_EN] is clear, this register is automatically
+ * updated by hardware, and it should not be written by software. The lane fields in this
+ * register are indexed by logical PCS lane ID.
+ *
+ * The lane 0 field (LN0_*) is valid for both
+ * 10GBASE-R and 40GBASE-R. The remaining fields (LN1_*, LN2_*, LN3_*) are only valid for
+ * 40GBASE-R.
+ */
+union cvmx_bgxx_spux_br_pmd_ld_cup {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_pmd_ld_cup_s {
+               u64 ln3_cup : 16;
+               u64 ln2_cup : 16;
+               u64 ln1_cup : 16;
+               u64 ln0_cup : 16;
+       } s;
+       struct cvmx_bgxx_spux_br_pmd_ld_cup_s cn73xx;
+       struct cvmx_bgxx_spux_br_pmd_ld_cup_s cn78xx;
+       struct cvmx_bgxx_spux_br_pmd_ld_cup_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_pmd_ld_cup_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_pmd_ld_cup cvmx_bgxx_spux_br_pmd_ld_cup_t;
+
+/**
+ * cvmx_bgx#_spu#_br_pmd_ld_rep
+ *
+ * This register implements 802.3 MDIO register 1.154 for 10GBASE-R (when
+ * BGX()_CMR()_CONFIG[LMAC_TYPE] = 10G_R) and MDIO registers 1.1400-1.1403 for 40GBASE-R
+ * (when BGX()_CMR()_CONFIG[LMAC_TYPE] = 40G_R). It is automatically cleared at the start of
+ * training. Each field
+ * reflects the contents of the status report field in the associated lane's outgoing training
+ * frame. The fields in this register are read/write even though they are specified as read-only
+ * in 802.3. If BGX()_SPU_DBG_CONTROL[BR_PMD_TRAIN_SOFT_EN] is set, then this register must
+ * be updated by software during link training and hardware updates are disabled. If
+ * BGX()_SPU_DBG_CONTROL[BR_PMD_TRAIN_SOFT_EN] is clear, this register is automatically
+ * updated by hardware, and it should not be written by software. The lane fields in this
+ * register are indexed by logical PCS lane ID.
+ *
+ * The lane 0 field (LN0_*) is valid for both
+ * 10GBASE-R and 40GBASE-R. The remaining fields (LN1_*, LN2_*, LN3_*) are only valid for
+ * 40GBASE-R.
+ */
+union cvmx_bgxx_spux_br_pmd_ld_rep {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_pmd_ld_rep_s {
+               u64 ln3_rep : 16;
+               u64 ln2_rep : 16;
+               u64 ln1_rep : 16;
+               u64 ln0_rep : 16;
+       } s;
+       struct cvmx_bgxx_spux_br_pmd_ld_rep_s cn73xx;
+       struct cvmx_bgxx_spux_br_pmd_ld_rep_s cn78xx;
+       struct cvmx_bgxx_spux_br_pmd_ld_rep_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_pmd_ld_rep_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_pmd_ld_rep cvmx_bgxx_spux_br_pmd_ld_rep_t;
+
+/**
+ * cvmx_bgx#_spu#_br_pmd_lp_cup
+ *
+ * This register implements 802.3 MDIO register 1.152 for 10GBASE-R (when
+ * BGX()_CMR()_CONFIG[LMAC_TYPE] = 10G_R)
+ * and MDIO registers 1.1100-1.1103 for 40GBASE-R (when
+ * BGX()_CMR()_CONFIG[LMAC_TYPE] = 40G_R). It is automatically cleared at the start of training.
+ * Each field reflects
+ * the contents of the coefficient update field in the lane's most recently received training
+ * frame. This register should not be written when link training is enabled, i.e. when
+ * BGX()_SPU()_BR_PMD_CONTROL[TRAIN_EN] is set. The lane fields in this register are indexed by
+ * logical PCS lane ID.
+ *
+ * The lane 0 field (LN0_*) is valid for both 10GBASE-R and 40GBASE-R. The remaining fields
+ * (LN1_*, LN2_*, LN3_*) are only valid for 40GBASE-R.
+ */
+union cvmx_bgxx_spux_br_pmd_lp_cup {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_pmd_lp_cup_s {
+               u64 ln3_cup : 16;
+               u64 ln2_cup : 16;
+               u64 ln1_cup : 16;
+               u64 ln0_cup : 16;
+       } s;
+       struct cvmx_bgxx_spux_br_pmd_lp_cup_s cn73xx;
+       struct cvmx_bgxx_spux_br_pmd_lp_cup_s cn78xx;
+       struct cvmx_bgxx_spux_br_pmd_lp_cup_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_pmd_lp_cup_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_pmd_lp_cup cvmx_bgxx_spux_br_pmd_lp_cup_t;
+
+/**
+ * cvmx_bgx#_spu#_br_pmd_lp_rep
+ *
+ * This register implements 802.3 MDIO register 1.153 for 10GBASE-R (when
+ * BGX()_CMR()_CONFIG[LMAC_TYPE] = 10G_R)
+ * and MDIO registers 1.1200-1.1203 for 40GBASE-R (when
+ * BGX()_CMR()_CONFIG[LMAC_TYPE] = 40G_R). It is automatically cleared at the start of training.
+ * Each field reflects
+ * the contents of the status report field in the associated lane's most recently received
+ * training frame. The lane fields in this register are indexed by logical PCS lane ID.
+ *
+ * The lane
+ * 0 field (LN0_*) is valid for both 10GBASE-R and 40GBASE-R. The remaining fields (LN1_*, LN2_*,
+ * LN3_*) are only valid for 40GBASE-R.
+ */
+union cvmx_bgxx_spux_br_pmd_lp_rep {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_pmd_lp_rep_s {
+               u64 ln3_rep : 16;
+               u64 ln2_rep : 16;
+               u64 ln1_rep : 16;
+               u64 ln0_rep : 16;
+       } s;
+       struct cvmx_bgxx_spux_br_pmd_lp_rep_s cn73xx;
+       struct cvmx_bgxx_spux_br_pmd_lp_rep_s cn78xx;
+       struct cvmx_bgxx_spux_br_pmd_lp_rep_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_pmd_lp_rep_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_pmd_lp_rep cvmx_bgxx_spux_br_pmd_lp_rep_t;
+
+/**
+ * cvmx_bgx#_spu#_br_pmd_status
+ *
+ * The lane fields in this register are indexed by logical PCS lane ID. The lane 0 field (LN0_*)
+ * is valid for both 10GBASE-R and 40GBASE-R. The remaining fields (LN1_*, LN2_*, LN3_*) are only
+ * valid for 40GBASE-R.
+ */
+union cvmx_bgxx_spux_br_pmd_status {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_pmd_status_s {
+               u64 reserved_16_63 : 48;
+               u64 ln3_train_status : 4;
+               u64 ln2_train_status : 4;
+               u64 ln1_train_status : 4;
+               u64 ln0_train_status : 4;
+       } s;
+       struct cvmx_bgxx_spux_br_pmd_status_s cn73xx;
+       struct cvmx_bgxx_spux_br_pmd_status_s cn78xx;
+       struct cvmx_bgxx_spux_br_pmd_status_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_pmd_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_pmd_status cvmx_bgxx_spux_br_pmd_status_t;
+
+/**
+ * cvmx_bgx#_spu#_br_status1
+ */
+union cvmx_bgxx_spux_br_status1 {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_status1_s {
+               u64 reserved_13_63 : 51;
+               u64 rcv_lnk : 1;
+               u64 reserved_4_11 : 8;
+               u64 prbs9 : 1;
+               u64 prbs31 : 1;
+               u64 hi_ber : 1;
+               u64 blk_lock : 1;
+       } s;
+       struct cvmx_bgxx_spux_br_status1_s cn73xx;
+       struct cvmx_bgxx_spux_br_status1_s cn78xx;
+       struct cvmx_bgxx_spux_br_status1_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_status1_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_status1 cvmx_bgxx_spux_br_status1_t;
+
+/**
+ * cvmx_bgx#_spu#_br_status2
+ *
+ * This register implements a combination of the following IEEE 802.3 registers:
+ * * BASE-R PCS status 2 (MDIO address 3.33).
+ * * BASE-R BER high-order counter (MDIO address 3.44).
+ * * Errored-blocks high-order counter (MDIO address 3.45).
+ *
+ * Note that the relative locations of some fields have been moved from IEEE 802.3 in order to
+ * make the register layout more software friendly: the BER counter high-order and low-order bits
+ * from sections 3.44 and 3.33 have been combined into the contiguous, 22-bit [BER_CNT] field;
+ * likewise, the errored-blocks counter high-order and low-order bits from section 3.45 have been
+ * combined into the contiguous, 22-bit [ERR_BLKS] field.
+ */
+union cvmx_bgxx_spux_br_status2 {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_status2_s {
+               u64 reserved_62_63 : 2;
+               u64 err_blks : 22;
+               u64 reserved_38_39 : 2;
+               u64 ber_cnt : 22;
+               u64 latched_lock : 1;
+               u64 latched_ber : 1;
+               u64 reserved_0_13 : 14;
+       } s;
+       struct cvmx_bgxx_spux_br_status2_s cn73xx;
+       struct cvmx_bgxx_spux_br_status2_s cn78xx;
+       struct cvmx_bgxx_spux_br_status2_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_status2_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_status2 cvmx_bgxx_spux_br_status2_t;
+
+/**
+ * cvmx_bgx#_spu#_br_tp_control
+ *
+ * Refer to the test pattern methodology described in 802.3 sections 49.2.8 and 82.2.10.
+ *
+ */
+union cvmx_bgxx_spux_br_tp_control {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_tp_control_s {
+               u64 reserved_8_63 : 56;
+               u64 scramble_tp : 1;
+               u64 prbs9_tx : 1;
+               u64 prbs31_rx : 1;
+               u64 prbs31_tx : 1;
+               u64 tx_tp_en : 1;
+               u64 rx_tp_en : 1;
+               u64 tp_sel : 1;
+               u64 dp_sel : 1;
+       } s;
+       struct cvmx_bgxx_spux_br_tp_control_s cn73xx;
+       struct cvmx_bgxx_spux_br_tp_control_s cn78xx;
+       struct cvmx_bgxx_spux_br_tp_control_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_tp_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_tp_control cvmx_bgxx_spux_br_tp_control_t;
+
+/**
+ * cvmx_bgx#_spu#_br_tp_err_cnt
+ *
+ * This register provides the BASE-R PCS test-pattern error counter.
+ *
+ */
+union cvmx_bgxx_spux_br_tp_err_cnt {
+       u64 u64;
+       struct cvmx_bgxx_spux_br_tp_err_cnt_s {
+               u64 reserved_16_63 : 48;
+               u64 err_cnt : 16;
+       } s;
+       struct cvmx_bgxx_spux_br_tp_err_cnt_s cn73xx;
+       struct cvmx_bgxx_spux_br_tp_err_cnt_s cn78xx;
+       struct cvmx_bgxx_spux_br_tp_err_cnt_s cn78xxp1;
+       struct cvmx_bgxx_spux_br_tp_err_cnt_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_br_tp_err_cnt cvmx_bgxx_spux_br_tp_err_cnt_t;
+
+/**
+ * cvmx_bgx#_spu#_bx_status
+ */
+union cvmx_bgxx_spux_bx_status {
+       u64 u64;
+       struct cvmx_bgxx_spux_bx_status_s {
+               u64 reserved_13_63 : 51;
+               u64 alignd : 1;
+               u64 pattst : 1;
+               u64 reserved_4_10 : 7;
+               u64 lsync : 4;
+       } s;
+       struct cvmx_bgxx_spux_bx_status_s cn73xx;
+       struct cvmx_bgxx_spux_bx_status_s cn78xx;
+       struct cvmx_bgxx_spux_bx_status_s cn78xxp1;
+       struct cvmx_bgxx_spux_bx_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_bx_status cvmx_bgxx_spux_bx_status_t;
+
+/**
+ * cvmx_bgx#_spu#_control1
+ */
+union cvmx_bgxx_spux_control1 {
+       u64 u64;
+       struct cvmx_bgxx_spux_control1_s {
+               u64 reserved_16_63 : 48;
+               u64 reset : 1;
+               u64 loopbck : 1;
+               u64 spdsel1 : 1;
+               u64 reserved_12_12 : 1;
+               u64 lo_pwr : 1;
+               u64 reserved_7_10 : 4;
+               u64 spdsel0 : 1;
+               u64 spd : 4;
+               u64 reserved_0_1 : 2;
+       } s;
+       struct cvmx_bgxx_spux_control1_s cn73xx;
+       struct cvmx_bgxx_spux_control1_s cn78xx;
+       struct cvmx_bgxx_spux_control1_s cn78xxp1;
+       struct cvmx_bgxx_spux_control1_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_control1 cvmx_bgxx_spux_control1_t;
+
+/**
+ * cvmx_bgx#_spu#_control2
+ */
+union cvmx_bgxx_spux_control2 {
+       u64 u64;
+       struct cvmx_bgxx_spux_control2_s {
+               u64 reserved_3_63 : 61;
+               u64 pcs_type : 3;
+       } s;
+       struct cvmx_bgxx_spux_control2_s cn73xx;
+       struct cvmx_bgxx_spux_control2_s cn78xx;
+       struct cvmx_bgxx_spux_control2_s cn78xxp1;
+       struct cvmx_bgxx_spux_control2_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_control2 cvmx_bgxx_spux_control2_t;
+
+/**
+ * cvmx_bgx#_spu#_fec_abil
+ */
+union cvmx_bgxx_spux_fec_abil {
+       u64 u64;
+       struct cvmx_bgxx_spux_fec_abil_s {
+               u64 reserved_2_63 : 62;
+               u64 err_abil : 1;
+               u64 fec_abil : 1;
+       } s;
+       struct cvmx_bgxx_spux_fec_abil_s cn73xx;
+       struct cvmx_bgxx_spux_fec_abil_s cn78xx;
+       struct cvmx_bgxx_spux_fec_abil_s cn78xxp1;
+       struct cvmx_bgxx_spux_fec_abil_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_fec_abil cvmx_bgxx_spux_fec_abil_t;
+
+/**
+ * cvmx_bgx#_spu#_fec_control
+ */
+union cvmx_bgxx_spux_fec_control {
+       u64 u64;
+       struct cvmx_bgxx_spux_fec_control_s {
+               u64 reserved_2_63 : 62;
+               u64 err_en : 1;
+               u64 fec_en : 1;
+       } s;
+       struct cvmx_bgxx_spux_fec_control_s cn73xx;
+       struct cvmx_bgxx_spux_fec_control_s cn78xx;
+       struct cvmx_bgxx_spux_fec_control_s cn78xxp1;
+       struct cvmx_bgxx_spux_fec_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_fec_control cvmx_bgxx_spux_fec_control_t;
+
+/**
+ * cvmx_bgx#_spu#_fec_corr_blks01
+ *
+ * This register is valid only when the LPCS type is BASE-R
+ * (BGX()_CMR()_CONFIG[LMAC_TYPE] = 0x3 or 0x4). The FEC corrected-block counters are
+ * defined in IEEE 802.3 section 74.8.4.1. Each corrected-blocks counter increments by 1 for a
+ * corrected FEC block, i.e. an FEC block that has been received with invalid parity on the
+ * associated PCS lane and has been corrected by the FEC decoder. The counter is reset to all 0s
+ * when the register is read, and held at all 1s in case of overflow.
+ *
+ * The reset operation takes precedence over the increment operation; if the register is read on
+ * the same clock cycle as an increment operation, the counter is reset to all 0s and the
+ * increment operation is lost. The counters are writable for test purposes, rather than read-
+ * only as specified in IEEE 802.3.
+ */
+union cvmx_bgxx_spux_fec_corr_blks01 {
+       u64 u64;
+       struct cvmx_bgxx_spux_fec_corr_blks01_s {
+               u64 ln1_corr_blks : 32;
+               u64 ln0_corr_blks : 32;
+       } s;
+       struct cvmx_bgxx_spux_fec_corr_blks01_s cn73xx;
+       struct cvmx_bgxx_spux_fec_corr_blks01_s cn78xx;
+       struct cvmx_bgxx_spux_fec_corr_blks01_s cn78xxp1;
+       struct cvmx_bgxx_spux_fec_corr_blks01_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_fec_corr_blks01 cvmx_bgxx_spux_fec_corr_blks01_t;
+
+/**
+ * cvmx_bgx#_spu#_fec_corr_blks23
+ *
+ * This register is valid only when the LPCS type is 40GBASE-R
+ * (BGX()_CMR()_CONFIG[LMAC_TYPE] = 0x4). The FEC corrected-block counters are defined in
+ * IEEE 802.3 section 74.8.4.1. Each corrected-blocks counter increments by 1 for a corrected FEC
+ * block, i.e. an FEC block that has been received with invalid parity on the associated PCS lane
+ * and has been corrected by the FEC decoder. The counter is reset to all 0s when the register is
+ * read, and held at all 1s in case of overflow.
+ *
+ * The reset operation takes precedence over the increment operation; if the register is read on
+ * the same clock cycle as an increment operation, the counter is reset to all 0s and the
+ * increment operation is lost. The counters are writable for test purposes, rather than read-
+ * only as specified in IEEE 802.3.
+ */
+union cvmx_bgxx_spux_fec_corr_blks23 {
+       u64 u64;
+       struct cvmx_bgxx_spux_fec_corr_blks23_s {
+               u64 ln3_corr_blks : 32;
+               u64 ln2_corr_blks : 32;
+       } s;
+       struct cvmx_bgxx_spux_fec_corr_blks23_s cn73xx;
+       struct cvmx_bgxx_spux_fec_corr_blks23_s cn78xx;
+       struct cvmx_bgxx_spux_fec_corr_blks23_s cn78xxp1;
+       struct cvmx_bgxx_spux_fec_corr_blks23_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_fec_corr_blks23 cvmx_bgxx_spux_fec_corr_blks23_t;
+
+/**
+ * cvmx_bgx#_spu#_fec_uncorr_blks01
+ *
+ * This register is valid only when the LPCS type is BASE-R
+ * (BGX()_CMR()_CONFIG[LMAC_TYPE] = 0x3 or 0x4). The FEC corrected-block counters are
+ * defined in IEEE 802.3 section 74.8.4.2. Each uncorrected-blocks counter increments by 1 for an
+ * uncorrected FEC block, i.e. an FEC block that has been received with invalid parity on the
+ * associated PCS lane and has not been corrected by the FEC decoder. The counter is reset to all
+ * 0s when the register is read, and held at all 1s in case of overflow.
+ *
+ * The reset operation takes precedence over the increment operation; if the register is read on
+ * the same clock cycle as an increment operation, the counter is reset to all 0s and the
+ * increment operation is lost. The counters are writable for test purposes, rather than read-
+ * only as specified in IEEE 802.3.
+ */
+union cvmx_bgxx_spux_fec_uncorr_blks01 {
+       u64 u64;
+       struct cvmx_bgxx_spux_fec_uncorr_blks01_s {
+               u64 ln1_uncorr_blks : 32;
+               u64 ln0_uncorr_blks : 32;
+       } s;
+       struct cvmx_bgxx_spux_fec_uncorr_blks01_s cn73xx;
+       struct cvmx_bgxx_spux_fec_uncorr_blks01_s cn78xx;
+       struct cvmx_bgxx_spux_fec_uncorr_blks01_s cn78xxp1;
+       struct cvmx_bgxx_spux_fec_uncorr_blks01_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_fec_uncorr_blks01 cvmx_bgxx_spux_fec_uncorr_blks01_t;
+
+/**
+ * cvmx_bgx#_spu#_fec_uncorr_blks23
+ *
+ * This register is valid only when the LPCS type is 40GBASE-R
+ * (BGX()_CMR()_CONFIG[LMAC_TYPE] = 0x4). The FEC uncorrected-block counters are defined
+ * in IEEE 802.3 section 74.8.4.2. Each corrected-blocks counter increments by 1 for an
+ * uncorrected FEC block, i.e. an FEC block that has been received with invalid parity on the
+ * associated PCS lane and has not been corrected by the FEC decoder. The counter is reset to all
+ * 0s when the register is read, and held at all 1s in case of overflow.
+ *
+ * The reset operation takes precedence over the increment operation; if the register is read on
+ * the same clock cycle as an increment operation, the counter is reset to all 0s and the
+ * increment operation is lost. The counters are writable for test purposes, rather than read-
+ * only as specified in IEEE 802.3.
+ */
+union cvmx_bgxx_spux_fec_uncorr_blks23 {
+       u64 u64;
+       struct cvmx_bgxx_spux_fec_uncorr_blks23_s {
+               u64 ln3_uncorr_blks : 32;
+               u64 ln2_uncorr_blks : 32;
+       } s;
+       struct cvmx_bgxx_spux_fec_uncorr_blks23_s cn73xx;
+       struct cvmx_bgxx_spux_fec_uncorr_blks23_s cn78xx;
+       struct cvmx_bgxx_spux_fec_uncorr_blks23_s cn78xxp1;
+       struct cvmx_bgxx_spux_fec_uncorr_blks23_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_fec_uncorr_blks23 cvmx_bgxx_spux_fec_uncorr_blks23_t;
+
+/**
+ * cvmx_bgx#_spu#_int
+ */
+union cvmx_bgxx_spux_int {
+       u64 u64;
+       struct cvmx_bgxx_spux_int_s {
+               u64 reserved_15_63 : 49;
+               u64 training_failure : 1;
+               u64 training_done : 1;
+               u64 an_complete : 1;
+               u64 an_link_good : 1;
+               u64 an_page_rx : 1;
+               u64 fec_uncorr : 1;
+               u64 fec_corr : 1;
+               u64 bip_err : 1;
+               u64 dbg_sync : 1;
+               u64 algnlos : 1;
+               u64 synlos : 1;
+               u64 bitlckls : 1;
+               u64 err_blk : 1;
+               u64 rx_link_down : 1;
+               u64 rx_link_up : 1;
+       } s;
+       struct cvmx_bgxx_spux_int_s cn73xx;
+       struct cvmx_bgxx_spux_int_s cn78xx;
+       struct cvmx_bgxx_spux_int_s cn78xxp1;
+       struct cvmx_bgxx_spux_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_int cvmx_bgxx_spux_int_t;
+
+/**
+ * cvmx_bgx#_spu#_lpcs_states
+ */
+union cvmx_bgxx_spux_lpcs_states {
+       u64 u64;
+       struct cvmx_bgxx_spux_lpcs_states_s {
+               u64 reserved_15_63 : 49;
+               u64 br_rx_sm : 3;
+               u64 reserved_10_11 : 2;
+               u64 bx_rx_sm : 2;
+               u64 deskew_am_found : 4;
+               u64 reserved_3_3 : 1;
+               u64 deskew_sm : 3;
+       } s;
+       struct cvmx_bgxx_spux_lpcs_states_s cn73xx;
+       struct cvmx_bgxx_spux_lpcs_states_s cn78xx;
+       struct cvmx_bgxx_spux_lpcs_states_s cn78xxp1;
+       struct cvmx_bgxx_spux_lpcs_states_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_lpcs_states cvmx_bgxx_spux_lpcs_states_t;
+
+/**
+ * cvmx_bgx#_spu#_misc_control
+ *
+ * "* RX logical PCS lane polarity vector <3:0> = [XOR_RXPLRT]<3:0> ^ [4[[RXPLRT]]].
+ *  * TX logical PCS lane polarity vector <3:0> = [XOR_TXPLRT]<3:0> ^ [4[[TXPLRT]]].
+ *
+ *  In short, keep [RXPLRT] and [TXPLRT] cleared, and use [XOR_RXPLRT] and [XOR_TXPLRT] fields to
+ *  define
+ *  the polarity per logical PCS lane. Only bit 0 of vector is used for 10GBASE-R, and only bits
+ * - 1:0 of vector are used for RXAUI."
+ */
+union cvmx_bgxx_spux_misc_control {
+       u64 u64;
+       struct cvmx_bgxx_spux_misc_control_s {
+               u64 reserved_13_63 : 51;
+               u64 rx_packet_dis : 1;
+               u64 skip_after_term : 1;
+               u64 intlv_rdisp : 1;
+               u64 xor_rxplrt : 4;
+               u64 xor_txplrt : 4;
+               u64 rxplrt : 1;
+               u64 txplrt : 1;
+       } s;
+       struct cvmx_bgxx_spux_misc_control_s cn73xx;
+       struct cvmx_bgxx_spux_misc_control_s cn78xx;
+       struct cvmx_bgxx_spux_misc_control_s cn78xxp1;
+       struct cvmx_bgxx_spux_misc_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_misc_control cvmx_bgxx_spux_misc_control_t;
+
+/**
+ * cvmx_bgx#_spu#_spd_abil
+ */
+union cvmx_bgxx_spux_spd_abil {
+       u64 u64;
+       struct cvmx_bgxx_spux_spd_abil_s {
+               u64 reserved_4_63 : 60;
+               u64 hundredgb : 1;
+               u64 fortygb : 1;
+               u64 tenpasst : 1;
+               u64 tengb : 1;
+       } s;
+       struct cvmx_bgxx_spux_spd_abil_s cn73xx;
+       struct cvmx_bgxx_spux_spd_abil_s cn78xx;
+       struct cvmx_bgxx_spux_spd_abil_s cn78xxp1;
+       struct cvmx_bgxx_spux_spd_abil_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_spd_abil cvmx_bgxx_spux_spd_abil_t;
+
+/**
+ * cvmx_bgx#_spu#_status1
+ */
+union cvmx_bgxx_spux_status1 {
+       u64 u64;
+       struct cvmx_bgxx_spux_status1_s {
+               u64 reserved_8_63 : 56;
+               u64 flt : 1;
+               u64 reserved_3_6 : 4;
+               u64 rcv_lnk : 1;
+               u64 lpable : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_bgxx_spux_status1_s cn73xx;
+       struct cvmx_bgxx_spux_status1_s cn78xx;
+       struct cvmx_bgxx_spux_status1_s cn78xxp1;
+       struct cvmx_bgxx_spux_status1_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_status1 cvmx_bgxx_spux_status1_t;
+
+/**
+ * cvmx_bgx#_spu#_status2
+ */
+union cvmx_bgxx_spux_status2 {
+       u64 u64;
+       struct cvmx_bgxx_spux_status2_s {
+               u64 reserved_16_63 : 48;
+               u64 dev : 2;
+               u64 reserved_12_13 : 2;
+               u64 xmtflt : 1;
+               u64 rcvflt : 1;
+               u64 reserved_6_9 : 4;
+               u64 hundredgb_r : 1;
+               u64 fortygb_r : 1;
+               u64 tengb_t : 1;
+               u64 tengb_w : 1;
+               u64 tengb_x : 1;
+               u64 tengb_r : 1;
+       } s;
+       struct cvmx_bgxx_spux_status2_s cn73xx;
+       struct cvmx_bgxx_spux_status2_s cn78xx;
+       struct cvmx_bgxx_spux_status2_s cn78xxp1;
+       struct cvmx_bgxx_spux_status2_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spux_status2 cvmx_bgxx_spux_status2_t;
+
+/**
+ * cvmx_bgx#_spu_bist_status
+ *
+ * This register provides memory BIST status from the SPU receive buffer lane FIFOs.
+ *
+ */
+union cvmx_bgxx_spu_bist_status {
+       u64 u64;
+       struct cvmx_bgxx_spu_bist_status_s {
+               u64 reserved_4_63 : 60;
+               u64 rx_buf_bist_status : 4;
+       } s;
+       struct cvmx_bgxx_spu_bist_status_s cn73xx;
+       struct cvmx_bgxx_spu_bist_status_s cn78xx;
+       struct cvmx_bgxx_spu_bist_status_s cn78xxp1;
+       struct cvmx_bgxx_spu_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spu_bist_status cvmx_bgxx_spu_bist_status_t;
+
+/**
+ * cvmx_bgx#_spu_dbg_control
+ */
+union cvmx_bgxx_spu_dbg_control {
+       u64 u64;
+       struct cvmx_bgxx_spu_dbg_control_s {
+               u64 reserved_56_63 : 8;
+               u64 ms_clk_period : 12;
+               u64 us_clk_period : 12;
+               u64 reserved_31_31 : 1;
+               u64 br_ber_mon_dis : 1;
+               u64 an_nonce_match_dis : 1;
+               u64 timestamp_norm_dis : 1;
+               u64 rx_buf_flip_synd : 8;
+               u64 br_pmd_train_soft_en : 1;
+               u64 an_arb_link_chk_en : 1;
+               u64 rx_buf_cor_dis : 1;
+               u64 scramble_dis : 1;
+               u64 reserved_15_15 : 1;
+               u64 marker_rxp : 15;
+       } s;
+       struct cvmx_bgxx_spu_dbg_control_s cn73xx;
+       struct cvmx_bgxx_spu_dbg_control_s cn78xx;
+       struct cvmx_bgxx_spu_dbg_control_s cn78xxp1;
+       struct cvmx_bgxx_spu_dbg_control_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spu_dbg_control cvmx_bgxx_spu_dbg_control_t;
+
+/**
+ * cvmx_bgx#_spu_mem_int
+ */
+union cvmx_bgxx_spu_mem_int {
+       u64 u64;
+       struct cvmx_bgxx_spu_mem_int_s {
+               u64 reserved_8_63 : 56;
+               u64 rx_buf_sbe : 4;
+               u64 rx_buf_dbe : 4;
+       } s;
+       struct cvmx_bgxx_spu_mem_int_s cn73xx;
+       struct cvmx_bgxx_spu_mem_int_s cn78xx;
+       struct cvmx_bgxx_spu_mem_int_s cn78xxp1;
+       struct cvmx_bgxx_spu_mem_int_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spu_mem_int cvmx_bgxx_spu_mem_int_t;
+
+/**
+ * cvmx_bgx#_spu_mem_status
+ *
+ * This register provides memory ECC status from the SPU receive buffer lane FIFOs.
+ *
+ */
+union cvmx_bgxx_spu_mem_status {
+       u64 u64;
+       struct cvmx_bgxx_spu_mem_status_s {
+               u64 reserved_32_63 : 32;
+               u64 rx_buf_ecc_synd : 32;
+       } s;
+       struct cvmx_bgxx_spu_mem_status_s cn73xx;
+       struct cvmx_bgxx_spu_mem_status_s cn78xx;
+       struct cvmx_bgxx_spu_mem_status_s cn78xxp1;
+       struct cvmx_bgxx_spu_mem_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spu_mem_status cvmx_bgxx_spu_mem_status_t;
+
+/**
+ * cvmx_bgx#_spu_sds#_skew_status
+ *
+ * This register provides SerDes lane skew status. One register per physical SerDes lane.
+ *
+ */
+union cvmx_bgxx_spu_sdsx_skew_status {
+       u64 u64;
+       struct cvmx_bgxx_spu_sdsx_skew_status_s {
+               u64 reserved_32_63 : 32;
+               u64 skew_status : 32;
+       } s;
+       struct cvmx_bgxx_spu_sdsx_skew_status_s cn73xx;
+       struct cvmx_bgxx_spu_sdsx_skew_status_s cn78xx;
+       struct cvmx_bgxx_spu_sdsx_skew_status_s cn78xxp1;
+       struct cvmx_bgxx_spu_sdsx_skew_status_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spu_sdsx_skew_status cvmx_bgxx_spu_sdsx_skew_status_t;
+
+/**
+ * cvmx_bgx#_spu_sds#_states
+ *
+ * This register provides SerDes lane states. One register per physical SerDes lane.
+ *
+ */
+union cvmx_bgxx_spu_sdsx_states {
+       u64 u64;
+       struct cvmx_bgxx_spu_sdsx_states_s {
+               u64 reserved_52_63 : 12;
+               u64 am_lock_invld_cnt : 2;
+               u64 am_lock_sm : 2;
+               u64 reserved_45_47 : 3;
+               u64 train_sm : 3;
+               u64 train_code_viol : 1;
+               u64 train_frame_lock : 1;
+               u64 train_lock_found_1st_marker : 1;
+               u64 train_lock_bad_markers : 3;
+               u64 reserved_35_35 : 1;
+               u64 an_arb_sm : 3;
+               u64 an_rx_sm : 2;
+               u64 reserved_29_29 : 1;
+               u64 fec_block_sync : 1;
+               u64 fec_sync_cnt : 4;
+               u64 reserved_23_23 : 1;
+               u64 br_sh_invld_cnt : 7;
+               u64 br_block_lock : 1;
+               u64 br_sh_cnt : 11;
+               u64 bx_sync_sm : 4;
+       } s;
+       struct cvmx_bgxx_spu_sdsx_states_s cn73xx;
+       struct cvmx_bgxx_spu_sdsx_states_s cn78xx;
+       struct cvmx_bgxx_spu_sdsx_states_s cn78xxp1;
+       struct cvmx_bgxx_spu_sdsx_states_s cnf75xx;
+};
+
+typedef union cvmx_bgxx_spu_sdsx_states cvmx_bgxx_spu_sdsx_states_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-ciu-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-ciu-defs.h
new file mode 100644 (file)
index 0000000..e67d916
--- /dev/null
@@ -0,0 +1,7351 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon ciu.
+ */
+
+#ifndef __CVMX_CIU_DEFS_H__
+#define __CVMX_CIU_DEFS_H__
+
+#define CVMX_CIU_BIST                            (0x0001070000000730ull)
+#define CVMX_CIU_BLOCK_INT                       (0x00010700000007C0ull)
+#define CVMX_CIU_CIB_L2C_ENX(offset)             (0x000107000000E100ull)
+#define CVMX_CIU_CIB_L2C_RAWX(offset)            (0x000107000000E000ull)
+#define CVMX_CIU_CIB_LMCX_ENX(offset, block_id)          (0x000107000000E300ull)
+#define CVMX_CIU_CIB_LMCX_RAWX(offset, block_id)  (0x000107000000E200ull)
+#define CVMX_CIU_CIB_OCLAX_ENX(offset, block_id)  (0x000107000000EE00ull)
+#define CVMX_CIU_CIB_OCLAX_RAWX(offset, block_id) (0x000107000000EC00ull)
+#define CVMX_CIU_CIB_RST_ENX(offset)             (0x000107000000E500ull)
+#define CVMX_CIU_CIB_RST_RAWX(offset)            (0x000107000000E400ull)
+#define CVMX_CIU_CIB_SATA_ENX(offset)            (0x000107000000E700ull)
+#define CVMX_CIU_CIB_SATA_RAWX(offset)           (0x000107000000E600ull)
+#define CVMX_CIU_CIB_USBDRDX_ENX(offset, block_id)                                                 \
+       (0x000107000000EA00ull + ((block_id) & 1) * 0x100ull)
+#define CVMX_CIU_CIB_USBDRDX_RAWX(offset, block_id)                                                \
+       (0x000107000000E800ull + ((block_id) & 1) * 0x100ull)
+#define CVMX_CIU_DINT CVMX_CIU_DINT_FUNC()
+static inline u64 CVMX_CIU_DINT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000720ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001010000000180ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001010000000180ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001010000000180ull;
+       }
+       return 0x0001010000000180ull;
+}
+
+#define CVMX_CIU_EN2_IOX_INT(offset)    (0x000107000000A600ull + ((offset) & 1) * 8)
+#define CVMX_CIU_EN2_IOX_INT_W1C(offset) (0x000107000000CE00ull + ((offset) & 1) * 8)
+#define CVMX_CIU_EN2_IOX_INT_W1S(offset) (0x000107000000AE00ull + ((offset) & 1) * 8)
+#define CVMX_CIU_EN2_PPX_IP2(offset)    (0x000107000000A000ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP2_W1C(offset) (0x000107000000C800ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP2_W1S(offset) (0x000107000000A800ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP3(offset)    (0x000107000000A200ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP3_W1C(offset) (0x000107000000CA00ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP3_W1S(offset) (0x000107000000AA00ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP4(offset)    (0x000107000000A400ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP4_W1C(offset) (0x000107000000CC00ull + ((offset) & 15) * 8)
+#define CVMX_CIU_EN2_PPX_IP4_W1S(offset) (0x000107000000AC00ull + ((offset) & 15) * 8)
+#define CVMX_CIU_FUSE                   CVMX_CIU_FUSE_FUNC()
+static inline u64 CVMX_CIU_FUSE_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000728ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00010100000001A0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00010100000001A0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00010100000001A0ull;
+       }
+       return 0x00010100000001A0ull;
+}
+
+#define CVMX_CIU_GSTOP                 (0x0001070000000710ull)
+#define CVMX_CIU_INT33_SUM0            (0x0001070000000110ull)
+#define CVMX_CIU_INTR_SLOWDOWN         (0x00010700000007D0ull)
+#define CVMX_CIU_INTX_EN0(offset)      (0x0001070000000200ull + ((offset) & 63) * 16)
+#define CVMX_CIU_INTX_EN0_W1C(offset)  (0x0001070000002200ull + ((offset) & 63) * 16)
+#define CVMX_CIU_INTX_EN0_W1S(offset)  (0x0001070000006200ull + ((offset) & 63) * 16)
+#define CVMX_CIU_INTX_EN1(offset)      (0x0001070000000208ull + ((offset) & 63) * 16)
+#define CVMX_CIU_INTX_EN1_W1C(offset)  (0x0001070000002208ull + ((offset) & 63) * 16)
+#define CVMX_CIU_INTX_EN1_W1S(offset)  (0x0001070000006208ull + ((offset) & 63) * 16)
+#define CVMX_CIU_INTX_EN4_0(offset)    (0x0001070000000C80ull + ((offset) & 15) * 16)
+#define CVMX_CIU_INTX_EN4_0_W1C(offset) (0x0001070000002C80ull + ((offset) & 15) * 16)
+#define CVMX_CIU_INTX_EN4_0_W1S(offset) (0x0001070000006C80ull + ((offset) & 15) * 16)
+#define CVMX_CIU_INTX_EN4_1(offset)    (0x0001070000000C88ull + ((offset) & 15) * 16)
+#define CVMX_CIU_INTX_EN4_1_W1C(offset) (0x0001070000002C88ull + ((offset) & 15) * 16)
+#define CVMX_CIU_INTX_EN4_1_W1S(offset) (0x0001070000006C88ull + ((offset) & 15) * 16)
+#define CVMX_CIU_INTX_SUM0(offset)     (0x0001070000000000ull + ((offset) & 63) * 8)
+#define CVMX_CIU_INTX_SUM4(offset)     (0x0001070000000C00ull + ((offset) & 15) * 8)
+#define CVMX_CIU_INT_DBG_SEL           (0x00010700000007D0ull)
+#define CVMX_CIU_INT_SUM1              (0x0001070000000108ull)
+static inline u64 CVMX_CIU_MBOX_CLRX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000680ull + (offset) * 8;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000680ull + (offset) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000680ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070100100600ull + (offset) * 8;
+       }
+       return 0x0001070000000680ull + (offset) * 8;
+}
+
+static inline u64 CVMX_CIU_MBOX_SETX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000600ull + (offset) * 8;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000600ull + (offset) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000600ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070100100400ull + (offset) * 8;
+       }
+       return 0x0001070000000600ull + (offset) * 8;
+}
+
+#define CVMX_CIU_NMI         (0x0001070000000718ull)
+#define CVMX_CIU_PCI_INTA     (0x0001070000000750ull)
+#define CVMX_CIU_PP_BIST_STAT (0x00010700000007E0ull)
+#define CVMX_CIU_PP_DBG              CVMX_CIU_PP_DBG_FUNC()
+static inline u64 CVMX_CIU_PP_DBG_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000708ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001010000000120ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001010000000120ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001010000000120ull;
+       }
+       return 0x0001010000000120ull;
+}
+
+static inline u64 CVMX_CIU_PP_POKEX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000580ull + (offset) * 8;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000580ull + (offset) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000580ull + (offset) * 8;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001010000030000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001010000030000ull + (offset) * 8;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001010000030000ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070100100200ull + (offset) * 8;
+       }
+       return 0x0001010000030000ull + (offset) * 8;
+}
+
+#define CVMX_CIU_PP_RST CVMX_CIU_PP_RST_FUNC()
+static inline u64 CVMX_CIU_PP_RST_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000700ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001010000000100ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001010000000100ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001010000000100ull;
+       }
+       return 0x0001010000000100ull;
+}
+
+#define CVMX_CIU_PP_RST_PENDING CVMX_CIU_PP_RST_PENDING_FUNC()
+static inline u64 CVMX_CIU_PP_RST_PENDING_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001010000000110ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001010000000110ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001010000000110ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000740ull;
+       }
+       return 0x0001010000000110ull;
+}
+
+#define CVMX_CIU_QLM0                (0x0001070000000780ull)
+#define CVMX_CIU_QLM1                (0x0001070000000788ull)
+#define CVMX_CIU_QLM2                (0x0001070000000790ull)
+#define CVMX_CIU_QLM3                (0x0001070000000798ull)
+#define CVMX_CIU_QLM4                (0x00010700000007A0ull)
+#define CVMX_CIU_QLM_DCOK            (0x0001070000000760ull)
+#define CVMX_CIU_QLM_JTGC            (0x0001070000000768ull)
+#define CVMX_CIU_QLM_JTGD            (0x0001070000000770ull)
+#define CVMX_CIU_SOFT_BIST           (0x0001070000000738ull)
+#define CVMX_CIU_SOFT_PRST           (0x0001070000000748ull)
+#define CVMX_CIU_SOFT_PRST1          (0x0001070000000758ull)
+#define CVMX_CIU_SOFT_PRST2          (0x00010700000007D8ull)
+#define CVMX_CIU_SOFT_PRST3          (0x00010700000007E0ull)
+#define CVMX_CIU_SOFT_RST            (0x0001070000000740ull)
+#define CVMX_CIU_SUM1_IOX_INT(offset) (0x0001070000008600ull + ((offset) & 1) * 8)
+#define CVMX_CIU_SUM1_PPX_IP2(offset) (0x0001070000008000ull + ((offset) & 15) * 8)
+#define CVMX_CIU_SUM1_PPX_IP3(offset) (0x0001070000008200ull + ((offset) & 15) * 8)
+#define CVMX_CIU_SUM1_PPX_IP4(offset) (0x0001070000008400ull + ((offset) & 15) * 8)
+#define CVMX_CIU_SUM2_IOX_INT(offset) (0x0001070000008E00ull + ((offset) & 1) * 8)
+#define CVMX_CIU_SUM2_PPX_IP2(offset) (0x0001070000008800ull + ((offset) & 15) * 8)
+#define CVMX_CIU_SUM2_PPX_IP3(offset) (0x0001070000008A00ull + ((offset) & 15) * 8)
+#define CVMX_CIU_SUM2_PPX_IP4(offset) (0x0001070000008C00ull + ((offset) & 15) * 8)
+#define CVMX_CIU_TIMX(offset)        (0x0001070000000480ull + ((offset) & 15) * 8)
+#define CVMX_CIU_TIM_MULTI_CAST              CVMX_CIU_TIM_MULTI_CAST_FUNC()
+static inline u64 CVMX_CIU_TIM_MULTI_CAST_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00010700000004F0ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x000107000000C200ull;
+       }
+       return 0x000107000000C200ull;
+}
+
+static inline u64 CVMX_CIU_WDOGX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000500ull + (offset) * 8;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000500ull + (offset) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001070000000500ull + (offset) * 8;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001010000020000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001010000020000ull + (offset) * 8;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001010000020000ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001070100100000ull + (offset) * 8;
+       }
+       return 0x0001010000020000ull + (offset) * 8;
+}
+
+/**
+ * cvmx_ciu_bist
+ */
+union cvmx_ciu_bist {
+       u64 u64;
+       struct cvmx_ciu_bist_s {
+               u64 reserved_7_63 : 57;
+               u64 bist : 7;
+       } s;
+       struct cvmx_ciu_bist_cn30xx {
+               u64 reserved_4_63 : 60;
+               u64 bist : 4;
+       } cn30xx;
+       struct cvmx_ciu_bist_cn30xx cn31xx;
+       struct cvmx_ciu_bist_cn30xx cn38xx;
+       struct cvmx_ciu_bist_cn30xx cn38xxp2;
+       struct cvmx_ciu_bist_cn50xx {
+               u64 reserved_2_63 : 62;
+               u64 bist : 2;
+       } cn50xx;
+       struct cvmx_ciu_bist_cn52xx {
+               u64 reserved_3_63 : 61;
+               u64 bist : 3;
+       } cn52xx;
+       struct cvmx_ciu_bist_cn52xx cn52xxp1;
+       struct cvmx_ciu_bist_cn30xx cn56xx;
+       struct cvmx_ciu_bist_cn30xx cn56xxp1;
+       struct cvmx_ciu_bist_cn30xx cn58xx;
+       struct cvmx_ciu_bist_cn30xx cn58xxp1;
+       struct cvmx_ciu_bist_cn61xx {
+               u64 reserved_6_63 : 58;
+               u64 bist : 6;
+       } cn61xx;
+       struct cvmx_ciu_bist_cn63xx {
+               u64 reserved_5_63 : 59;
+               u64 bist : 5;
+       } cn63xx;
+       struct cvmx_ciu_bist_cn63xx cn63xxp1;
+       struct cvmx_ciu_bist_cn61xx cn66xx;
+       struct cvmx_ciu_bist_s cn68xx;
+       struct cvmx_ciu_bist_s cn68xxp1;
+       struct cvmx_ciu_bist_cn52xx cn70xx;
+       struct cvmx_ciu_bist_cn52xx cn70xxp1;
+       struct cvmx_ciu_bist_cn61xx cnf71xx;
+};
+
+typedef union cvmx_ciu_bist cvmx_ciu_bist_t;
+
+/**
+ * cvmx_ciu_block_int
+ *
+ * CIU_BLOCK_INT = CIU Blocks Interrupt
+ *
+ * The interrupt lines from the various chip blocks.
+ */
+union cvmx_ciu_block_int {
+       u64 u64;
+       struct cvmx_ciu_block_int_s {
+               u64 reserved_62_63 : 2;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_43_59 : 17;
+               u64 ptp : 1;
+               u64 dpi : 1;
+               u64 dfm : 1;
+               u64 reserved_34_39 : 6;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 reserved_31_31 : 1;
+               u64 iob : 1;
+               u64 reserved_29_29 : 1;
+               u64 agl : 1;
+               u64 reserved_27_27 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 reserved_24_24 : 1;
+               u64 asxpcs1 : 1;
+               u64 asxpcs0 : 1;
+               u64 reserved_21_21 : 1;
+               u64 pip : 1;
+               u64 reserved_18_19 : 2;
+               u64 lmc0 : 1;
+               u64 l2c : 1;
+               u64 reserved_15_15 : 1;
+               u64 rad : 1;
+               u64 usb : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 reserved_8_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 sli : 1;
+               u64 gmx1 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } s;
+       struct cvmx_ciu_block_int_cn61xx {
+               u64 reserved_43_63 : 21;
+               u64 ptp : 1;
+               u64 dpi : 1;
+               u64 reserved_31_40 : 10;
+               u64 iob : 1;
+               u64 reserved_29_29 : 1;
+               u64 agl : 1;
+               u64 reserved_27_27 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 reserved_24_24 : 1;
+               u64 asxpcs1 : 1;
+               u64 asxpcs0 : 1;
+               u64 reserved_21_21 : 1;
+               u64 pip : 1;
+               u64 reserved_18_19 : 2;
+               u64 lmc0 : 1;
+               u64 l2c : 1;
+               u64 reserved_15_15 : 1;
+               u64 rad : 1;
+               u64 usb : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 reserved_8_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 sli : 1;
+               u64 gmx1 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } cn61xx;
+       struct cvmx_ciu_block_int_cn63xx {
+               u64 reserved_43_63 : 21;
+               u64 ptp : 1;
+               u64 dpi : 1;
+               u64 dfm : 1;
+               u64 reserved_34_39 : 6;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 reserved_31_31 : 1;
+               u64 iob : 1;
+               u64 reserved_29_29 : 1;
+               u64 agl : 1;
+               u64 reserved_27_27 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 reserved_23_24 : 2;
+               u64 asxpcs0 : 1;
+               u64 reserved_21_21 : 1;
+               u64 pip : 1;
+               u64 reserved_18_19 : 2;
+               u64 lmc0 : 1;
+               u64 l2c : 1;
+               u64 reserved_15_15 : 1;
+               u64 rad : 1;
+               u64 usb : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 reserved_8_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 sli : 1;
+               u64 reserved_2_2 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } cn63xx;
+       struct cvmx_ciu_block_int_cn63xx cn63xxp1;
+       struct cvmx_ciu_block_int_cn66xx {
+               u64 reserved_62_63 : 2;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_43_59 : 17;
+               u64 ptp : 1;
+               u64 dpi : 1;
+               u64 dfm : 1;
+               u64 reserved_33_39 : 7;
+               u64 srio0 : 1;
+               u64 reserved_31_31 : 1;
+               u64 iob : 1;
+               u64 reserved_29_29 : 1;
+               u64 agl : 1;
+               u64 reserved_27_27 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 reserved_24_24 : 1;
+               u64 asxpcs1 : 1;
+               u64 asxpcs0 : 1;
+               u64 reserved_21_21 : 1;
+               u64 pip : 1;
+               u64 reserved_18_19 : 2;
+               u64 lmc0 : 1;
+               u64 l2c : 1;
+               u64 reserved_15_15 : 1;
+               u64 rad : 1;
+               u64 usb : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 reserved_8_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 sli : 1;
+               u64 gmx1 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } cn66xx;
+       struct cvmx_ciu_block_int_cnf71xx {
+               u64 reserved_43_63 : 21;
+               u64 ptp : 1;
+               u64 dpi : 1;
+               u64 reserved_31_40 : 10;
+               u64 iob : 1;
+               u64 reserved_27_29 : 3;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 reserved_23_24 : 2;
+               u64 asxpcs0 : 1;
+               u64 reserved_21_21 : 1;
+               u64 pip : 1;
+               u64 reserved_18_19 : 2;
+               u64 lmc0 : 1;
+               u64 l2c : 1;
+               u64 reserved_15_15 : 1;
+               u64 rad : 1;
+               u64 usb : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 reserved_6_8 : 3;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 sli : 1;
+               u64 reserved_2_2 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_block_int cvmx_ciu_block_int_t;
+
+/**
+ * cvmx_ciu_cib_l2c_en#
+ */
+union cvmx_ciu_cib_l2c_enx {
+       u64 u64;
+       struct cvmx_ciu_cib_l2c_enx_s {
+               u64 reserved_23_63 : 41;
+               u64 cbcx_int_ioccmddbe : 1;
+               u64 cbcx_int_ioccmdsbe : 1;
+               u64 cbcx_int_rsddbe : 1;
+               u64 cbcx_int_rsdsbe : 1;
+               u64 mcix_int_vbfdbe : 1;
+               u64 mcix_int_vbfsbe : 1;
+               u64 tadx_int_rtgdbe : 1;
+               u64 tadx_int_rtgsbe : 1;
+               u64 tadx_int_rddislmc : 1;
+               u64 tadx_int_wrdislmc : 1;
+               u64 tadx_int_bigrd : 1;
+               u64 tadx_int_bigwr : 1;
+               u64 tadx_int_holerd : 1;
+               u64 tadx_int_holewr : 1;
+               u64 tadx_int_noway : 1;
+               u64 tadx_int_tagdbe : 1;
+               u64 tadx_int_tagsbe : 1;
+               u64 tadx_int_fbfdbe : 1;
+               u64 tadx_int_fbfsbe : 1;
+               u64 tadx_int_sbfdbe : 1;
+               u64 tadx_int_sbfsbe : 1;
+               u64 tadx_int_l2ddbe : 1;
+               u64 tadx_int_l2dsbe : 1;
+       } s;
+       struct cvmx_ciu_cib_l2c_enx_s cn70xx;
+       struct cvmx_ciu_cib_l2c_enx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_l2c_enx cvmx_ciu_cib_l2c_enx_t;
+
+/**
+ * cvmx_ciu_cib_l2c_raw#
+ */
+union cvmx_ciu_cib_l2c_rawx {
+       u64 u64;
+       struct cvmx_ciu_cib_l2c_rawx_s {
+               u64 reserved_23_63 : 41;
+               u64 cbcx_int_ioccmddbe : 1;
+               u64 cbcx_int_ioccmdsbe : 1;
+               u64 cbcx_int_rsddbe : 1;
+               u64 cbcx_int_rsdsbe : 1;
+               u64 mcix_int_vbfdbe : 1;
+               u64 mcix_int_vbfsbe : 1;
+               u64 tadx_int_rtgdbe : 1;
+               u64 tadx_int_rtgsbe : 1;
+               u64 tadx_int_rddislmc : 1;
+               u64 tadx_int_wrdislmc : 1;
+               u64 tadx_int_bigrd : 1;
+               u64 tadx_int_bigwr : 1;
+               u64 tadx_int_holerd : 1;
+               u64 tadx_int_holewr : 1;
+               u64 tadx_int_noway : 1;
+               u64 tadx_int_tagdbe : 1;
+               u64 tadx_int_tagsbe : 1;
+               u64 tadx_int_fbfdbe : 1;
+               u64 tadx_int_fbfsbe : 1;
+               u64 tadx_int_sbfdbe : 1;
+               u64 tadx_int_sbfsbe : 1;
+               u64 tadx_int_l2ddbe : 1;
+               u64 tadx_int_l2dsbe : 1;
+       } s;
+       struct cvmx_ciu_cib_l2c_rawx_s cn70xx;
+       struct cvmx_ciu_cib_l2c_rawx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_l2c_rawx cvmx_ciu_cib_l2c_rawx_t;
+
+/**
+ * cvmx_ciu_cib_lmc#_en#
+ */
+union cvmx_ciu_cib_lmcx_enx {
+       u64 u64;
+       struct cvmx_ciu_cib_lmcx_enx_s {
+               u64 reserved_12_63 : 52;
+               u64 int_ddr_err : 1;
+               u64 int_dlc_ded : 1;
+               u64 int_dlc_sec : 1;
+               u64 int_ded_errx : 4;
+               u64 int_sec_errx : 4;
+               u64 int_nxm_wr_err : 1;
+       } s;
+       struct cvmx_ciu_cib_lmcx_enx_s cn70xx;
+       struct cvmx_ciu_cib_lmcx_enx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_lmcx_enx cvmx_ciu_cib_lmcx_enx_t;
+
+/**
+ * cvmx_ciu_cib_lmc#_raw#
+ */
+union cvmx_ciu_cib_lmcx_rawx {
+       u64 u64;
+       struct cvmx_ciu_cib_lmcx_rawx_s {
+               u64 reserved_12_63 : 52;
+               u64 int_ddr_err : 1;
+               u64 int_dlc_ded : 1;
+               u64 int_dlc_sec : 1;
+               u64 int_ded_errx : 4;
+               u64 int_sec_errx : 4;
+               u64 int_nxm_wr_err : 1;
+       } s;
+       struct cvmx_ciu_cib_lmcx_rawx_s cn70xx;
+       struct cvmx_ciu_cib_lmcx_rawx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_lmcx_rawx cvmx_ciu_cib_lmcx_rawx_t;
+
+/**
+ * cvmx_ciu_cib_ocla#_en#
+ */
+union cvmx_ciu_cib_oclax_enx {
+       u64 u64;
+       struct cvmx_ciu_cib_oclax_enx_s {
+               u64 reserved_15_63 : 49;
+               u64 state_ddrfull : 1;
+               u64 state_wmark : 1;
+               u64 state_overfull : 1;
+               u64 state_trigfull : 1;
+               u64 state_captured : 1;
+               u64 state_fsm1_int : 1;
+               u64 state_fsm0_int : 1;
+               u64 state_mcdx : 3;
+               u64 state_trig : 1;
+               u64 state_ovflx : 4;
+       } s;
+       struct cvmx_ciu_cib_oclax_enx_s cn70xx;
+       struct cvmx_ciu_cib_oclax_enx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_oclax_enx cvmx_ciu_cib_oclax_enx_t;
+
+/**
+ * cvmx_ciu_cib_ocla#_raw#
+ */
+union cvmx_ciu_cib_oclax_rawx {
+       u64 u64;
+       struct cvmx_ciu_cib_oclax_rawx_s {
+               u64 reserved_15_63 : 49;
+               u64 state_ddrfull : 1;
+               u64 state_wmark : 1;
+               u64 state_overfull : 1;
+               u64 state_trigfull : 1;
+               u64 state_captured : 1;
+               u64 state_fsm1_int : 1;
+               u64 state_fsm0_int : 1;
+               u64 state_mcdx : 3;
+               u64 state_trig : 1;
+               u64 state_ovflx : 4;
+       } s;
+       struct cvmx_ciu_cib_oclax_rawx_s cn70xx;
+       struct cvmx_ciu_cib_oclax_rawx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_oclax_rawx cvmx_ciu_cib_oclax_rawx_t;
+
+/**
+ * cvmx_ciu_cib_rst_en#
+ */
+union cvmx_ciu_cib_rst_enx {
+       u64 u64;
+       struct cvmx_ciu_cib_rst_enx_s {
+               u64 reserved_6_63 : 58;
+               u64 int_perstx : 3;
+               u64 int_linkx : 3;
+       } s;
+       struct cvmx_ciu_cib_rst_enx_s cn70xx;
+       struct cvmx_ciu_cib_rst_enx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_rst_enx cvmx_ciu_cib_rst_enx_t;
+
+/**
+ * cvmx_ciu_cib_rst_raw#
+ */
+union cvmx_ciu_cib_rst_rawx {
+       u64 u64;
+       struct cvmx_ciu_cib_rst_rawx_s {
+               u64 reserved_6_63 : 58;
+               u64 int_perstx : 3;
+               u64 int_linkx : 3;
+       } s;
+       struct cvmx_ciu_cib_rst_rawx_s cn70xx;
+       struct cvmx_ciu_cib_rst_rawx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_rst_rawx cvmx_ciu_cib_rst_rawx_t;
+
+/**
+ * cvmx_ciu_cib_sata_en#
+ */
+union cvmx_ciu_cib_sata_enx {
+       u64 u64;
+       struct cvmx_ciu_cib_sata_enx_s {
+               u64 reserved_4_63 : 60;
+               u64 uahc_pme_req_ip : 1;
+               u64 uahc_intrq_ip : 1;
+               u64 intstat_xm_bad_dma : 1;
+               u64 intstat_xs_ncb_oob : 1;
+       } s;
+       struct cvmx_ciu_cib_sata_enx_s cn70xx;
+       struct cvmx_ciu_cib_sata_enx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_sata_enx cvmx_ciu_cib_sata_enx_t;
+
+/**
+ * cvmx_ciu_cib_sata_raw#
+ */
+union cvmx_ciu_cib_sata_rawx {
+       u64 u64;
+       struct cvmx_ciu_cib_sata_rawx_s {
+               u64 reserved_4_63 : 60;
+               u64 uahc_pme_req_ip : 1;
+               u64 uahc_intrq_ip : 1;
+               u64 intstat_xm_bad_dma : 1;
+               u64 intstat_xs_ncb_oob : 1;
+       } s;
+       struct cvmx_ciu_cib_sata_rawx_s cn70xx;
+       struct cvmx_ciu_cib_sata_rawx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_sata_rawx cvmx_ciu_cib_sata_rawx_t;
+
+/**
+ * cvmx_ciu_cib_usbdrd#_en#
+ */
+union cvmx_ciu_cib_usbdrdx_enx {
+       u64 u64;
+       struct cvmx_ciu_cib_usbdrdx_enx_s {
+               u64 reserved_11_63 : 53;
+               u64 uahc_dev_int : 1;
+               u64 uahc_imanx_ip : 1;
+               u64 uahc_usbsts_hse : 1;
+               u64 intstat_ram2_dbe : 1;
+               u64 intstat_ram2_sbe : 1;
+               u64 intstat_ram1_dbe : 1;
+               u64 intstat_ram1_sbe : 1;
+               u64 intstat_ram0_dbe : 1;
+               u64 intstat_ram0_sbe : 1;
+               u64 intstat_xm_bad_dma : 1;
+               u64 intstat_xs_ncb_oob : 1;
+       } s;
+       struct cvmx_ciu_cib_usbdrdx_enx_s cn70xx;
+       struct cvmx_ciu_cib_usbdrdx_enx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_usbdrdx_enx cvmx_ciu_cib_usbdrdx_enx_t;
+
+/**
+ * cvmx_ciu_cib_usbdrd#_raw#
+ */
+union cvmx_ciu_cib_usbdrdx_rawx {
+       u64 u64;
+       struct cvmx_ciu_cib_usbdrdx_rawx_s {
+               u64 reserved_11_63 : 53;
+               u64 uahc_dev_int : 1;
+               u64 uahc_imanx_ip : 1;
+               u64 uahc_usbsts_hse : 1;
+               u64 intstat_ram2_dbe : 1;
+               u64 intstat_ram2_sbe : 1;
+               u64 intstat_ram1_dbe : 1;
+               u64 intstat_ram1_sbe : 1;
+               u64 intstat_ram0_dbe : 1;
+               u64 intstat_ram0_sbe : 1;
+               u64 intstat_xm_bad_dma : 1;
+               u64 intstat_xs_ncb_oob : 1;
+       } s;
+       struct cvmx_ciu_cib_usbdrdx_rawx_s cn70xx;
+       struct cvmx_ciu_cib_usbdrdx_rawx_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_cib_usbdrdx_rawx cvmx_ciu_cib_usbdrdx_rawx_t;
+
+/**
+ * cvmx_ciu_dint
+ */
+union cvmx_ciu_dint {
+       u64 u64;
+       struct cvmx_ciu_dint_s {
+               u64 reserved_48_63 : 16;
+               u64 dint : 48;
+       } s;
+       struct cvmx_ciu_dint_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 dint : 1;
+       } cn30xx;
+       struct cvmx_ciu_dint_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 dint : 2;
+       } cn31xx;
+       struct cvmx_ciu_dint_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 dint : 16;
+       } cn38xx;
+       struct cvmx_ciu_dint_cn38xx cn38xxp2;
+       struct cvmx_ciu_dint_cn31xx cn50xx;
+       struct cvmx_ciu_dint_cn52xx {
+               u64 reserved_4_63 : 60;
+               u64 dint : 4;
+       } cn52xx;
+       struct cvmx_ciu_dint_cn52xx cn52xxp1;
+       struct cvmx_ciu_dint_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 dint : 12;
+       } cn56xx;
+       struct cvmx_ciu_dint_cn56xx cn56xxp1;
+       struct cvmx_ciu_dint_cn38xx cn58xx;
+       struct cvmx_ciu_dint_cn38xx cn58xxp1;
+       struct cvmx_ciu_dint_cn52xx cn61xx;
+       struct cvmx_ciu_dint_cn63xx {
+               u64 reserved_6_63 : 58;
+               u64 dint : 6;
+       } cn63xx;
+       struct cvmx_ciu_dint_cn63xx cn63xxp1;
+       struct cvmx_ciu_dint_cn66xx {
+               u64 reserved_10_63 : 54;
+               u64 dint : 10;
+       } cn66xx;
+       struct cvmx_ciu_dint_cn68xx {
+               u64 reserved_32_63 : 32;
+               u64 dint : 32;
+       } cn68xx;
+       struct cvmx_ciu_dint_cn68xx cn68xxp1;
+       struct cvmx_ciu_dint_cn52xx cn70xx;
+       struct cvmx_ciu_dint_cn52xx cn70xxp1;
+       struct cvmx_ciu_dint_cn38xx cn73xx;
+       struct cvmx_ciu_dint_s cn78xx;
+       struct cvmx_ciu_dint_s cn78xxp1;
+       struct cvmx_ciu_dint_cn52xx cnf71xx;
+       struct cvmx_ciu_dint_cn38xx cnf75xx;
+};
+
+typedef union cvmx_ciu_dint cvmx_ciu_dint_t;
+
+/**
+ * cvmx_ciu_en2_io#_int
+ *
+ * CIU_EN2_IO0_INT is for PEM0, CIU_EN2_IO1_INT is reserved.
+ *
+ */
+union cvmx_ciu_en2_iox_int {
+       u64 u64;
+       struct cvmx_ciu_en2_iox_int_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_iox_int_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_iox_int_cn61xx cn66xx;
+       struct cvmx_ciu_en2_iox_int_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_iox_int_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_iox_int_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_iox_int cvmx_ciu_en2_iox_int_t;
+
+/**
+ * cvmx_ciu_en2_io#_int_w1c
+ *
+ * CIU_EN2_IO0_INT_W1C is for PEM0, CIU_EN2_IO1_INT_W1C is reserved.
+ *
+ */
+union cvmx_ciu_en2_iox_int_w1c {
+       u64 u64;
+       struct cvmx_ciu_en2_iox_int_w1c_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_iox_int_w1c_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_iox_int_w1c_cn61xx cn66xx;
+       struct cvmx_ciu_en2_iox_int_w1c_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_iox_int_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_iox_int_w1c_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_iox_int_w1c cvmx_ciu_en2_iox_int_w1c_t;
+
+/**
+ * cvmx_ciu_en2_io#_int_w1s
+ *
+ * CIU_EN2_IO0_INT_W1S is for PEM0, CIU_EN2_IO1_INT_W1S is reserved.
+ *
+ */
+union cvmx_ciu_en2_iox_int_w1s {
+       u64 u64;
+       struct cvmx_ciu_en2_iox_int_w1s_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_iox_int_w1s_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_iox_int_w1s_cn61xx cn66xx;
+       struct cvmx_ciu_en2_iox_int_w1s_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_iox_int_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_iox_int_w1s_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_iox_int_w1s cvmx_ciu_en2_iox_int_w1s_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip2
+ *
+ * Notes:
+ * These SUM2 CSR's did not exist prior to pass 1.2. CIU_TIM4-9 did not exist prior to pass 1.2.
+ *
+ */
+union cvmx_ciu_en2_ppx_ip2 {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip2_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip2_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip2_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip2_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip2_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip2_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip2 cvmx_ciu_en2_ppx_ip2_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip2_w1c
+ *
+ * Write-1-to-clear version of the CIU_EN2_PP(IO)X_IPx(INT) register, read back corresponding
+ * CIU_EN2_PP(IO)X_IPx(INT) value.
+ */
+union cvmx_ciu_en2_ppx_ip2_w1c {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip2_w1c_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip2_w1c_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip2_w1c_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip2_w1c_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip2_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip2_w1c_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip2_w1c cvmx_ciu_en2_ppx_ip2_w1c_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip2_w1s
+ *
+ * Write-1-to-set version of the CIU_EN2_PP(IO)X_IPx(INT) register, read back corresponding
+ * CIU_EN2_PP(IO)X_IPx(INT) value.
+ */
+union cvmx_ciu_en2_ppx_ip2_w1s {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip2_w1s_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip2_w1s_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip2_w1s_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip2_w1s_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip2_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip2_w1s_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip2_w1s cvmx_ciu_en2_ppx_ip2_w1s_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip3
+ *
+ * Notes:
+ * These SUM2 CSR's did not exist prior to pass 1.2. CIU_TIM4-9 did not exist prior to pass 1.2.
+ *
+ */
+union cvmx_ciu_en2_ppx_ip3 {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip3_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip3_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip3_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip3_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip3_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip3_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip3 cvmx_ciu_en2_ppx_ip3_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip3_w1c
+ *
+ * Notes:
+ * Write-1-to-clear version of the CIU_EN2_PP(IO)X_IPx(INT) register, read back corresponding
+ * CIU_EN2_PP(IO)X_IPx(INT) value.
+ */
+union cvmx_ciu_en2_ppx_ip3_w1c {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip3_w1c_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip3_w1c_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip3_w1c_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip3_w1c_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip3_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip3_w1c_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip3_w1c cvmx_ciu_en2_ppx_ip3_w1c_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip3_w1s
+ *
+ * Notes:
+ * Write-1-to-set version of the CIU_EN2_PP(IO)X_IPx(INT) register, read back corresponding
+ * CIU_EN2_PP(IO)X_IPx(INT) value.
+ */
+union cvmx_ciu_en2_ppx_ip3_w1s {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip3_w1s_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip3_w1s_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip3_w1s_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip3_w1s_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip3_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip3_w1s_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip3_w1s cvmx_ciu_en2_ppx_ip3_w1s_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip4
+ *
+ * Notes:
+ * These SUM2 CSR's did not exist prior to pass 1.2. CIU_TIM4-9 did not exist prior to pass 1.2.
+ *
+ */
+union cvmx_ciu_en2_ppx_ip4 {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip4_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip4_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip4_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip4_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip4_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip4_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip4 cvmx_ciu_en2_ppx_ip4_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip4_w1c
+ *
+ * Notes:
+ * Write-1-to-clear version of the CIU_EN2_PP(IO)X_IPx(INT) register, read back corresponding
+ * CIU_EN2_PP(IO)X_IPx(INT) value.
+ */
+union cvmx_ciu_en2_ppx_ip4_w1c {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip4_w1c_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip4_w1c_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip4_w1c_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip4_w1c_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip4_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip4_w1c_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip4_w1c cvmx_ciu_en2_ppx_ip4_w1c_t;
+
+/**
+ * cvmx_ciu_en2_pp#_ip4_w1s
+ *
+ * Notes:
+ * Write-1-to-set version of the CIU_EN2_PP(IO)X_IPx(INT) register, read back corresponding
+ * CIU_EN2_PP(IO)X_IPx(INT) value.
+ */
+union cvmx_ciu_en2_ppx_ip4_w1s {
+       u64 u64;
+       struct cvmx_ciu_en2_ppx_ip4_w1s_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_en2_ppx_ip4_w1s_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_en2_ppx_ip4_w1s_cn61xx cn66xx;
+       struct cvmx_ciu_en2_ppx_ip4_w1s_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_en2_ppx_ip4_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_en2_ppx_ip4_w1s_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_en2_ppx_ip4_w1s cvmx_ciu_en2_ppx_ip4_w1s_t;
+
+/**
+ * cvmx_ciu_fuse
+ */
+union cvmx_ciu_fuse {
+       u64 u64;
+       struct cvmx_ciu_fuse_s {
+               u64 reserved_48_63 : 16;
+               u64 fuse : 48;
+       } s;
+       struct cvmx_ciu_fuse_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 fuse : 1;
+       } cn30xx;
+       struct cvmx_ciu_fuse_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 fuse : 2;
+       } cn31xx;
+       struct cvmx_ciu_fuse_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 fuse : 16;
+       } cn38xx;
+       struct cvmx_ciu_fuse_cn38xx cn38xxp2;
+       struct cvmx_ciu_fuse_cn31xx cn50xx;
+       struct cvmx_ciu_fuse_cn52xx {
+               u64 reserved_4_63 : 60;
+               u64 fuse : 4;
+       } cn52xx;
+       struct cvmx_ciu_fuse_cn52xx cn52xxp1;
+       struct cvmx_ciu_fuse_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 fuse : 12;
+       } cn56xx;
+       struct cvmx_ciu_fuse_cn56xx cn56xxp1;
+       struct cvmx_ciu_fuse_cn38xx cn58xx;
+       struct cvmx_ciu_fuse_cn38xx cn58xxp1;
+       struct cvmx_ciu_fuse_cn52xx cn61xx;
+       struct cvmx_ciu_fuse_cn63xx {
+               u64 reserved_6_63 : 58;
+               u64 fuse : 6;
+       } cn63xx;
+       struct cvmx_ciu_fuse_cn63xx cn63xxp1;
+       struct cvmx_ciu_fuse_cn66xx {
+               u64 reserved_10_63 : 54;
+               u64 fuse : 10;
+       } cn66xx;
+       struct cvmx_ciu_fuse_cn68xx {
+               u64 reserved_32_63 : 32;
+               u64 fuse : 32;
+       } cn68xx;
+       struct cvmx_ciu_fuse_cn68xx cn68xxp1;
+       struct cvmx_ciu_fuse_cn52xx cn70xx;
+       struct cvmx_ciu_fuse_cn52xx cn70xxp1;
+       struct cvmx_ciu_fuse_cn38xx cn73xx;
+       struct cvmx_ciu_fuse_s cn78xx;
+       struct cvmx_ciu_fuse_s cn78xxp1;
+       struct cvmx_ciu_fuse_cn52xx cnf71xx;
+       struct cvmx_ciu_fuse_cn38xx cnf75xx;
+};
+
+typedef union cvmx_ciu_fuse cvmx_ciu_fuse_t;
+
+/**
+ * cvmx_ciu_gstop
+ */
+union cvmx_ciu_gstop {
+       u64 u64;
+       struct cvmx_ciu_gstop_s {
+               u64 reserved_1_63 : 63;
+               u64 gstop : 1;
+       } s;
+       struct cvmx_ciu_gstop_s cn30xx;
+       struct cvmx_ciu_gstop_s cn31xx;
+       struct cvmx_ciu_gstop_s cn38xx;
+       struct cvmx_ciu_gstop_s cn38xxp2;
+       struct cvmx_ciu_gstop_s cn50xx;
+       struct cvmx_ciu_gstop_s cn52xx;
+       struct cvmx_ciu_gstop_s cn52xxp1;
+       struct cvmx_ciu_gstop_s cn56xx;
+       struct cvmx_ciu_gstop_s cn56xxp1;
+       struct cvmx_ciu_gstop_s cn58xx;
+       struct cvmx_ciu_gstop_s cn58xxp1;
+       struct cvmx_ciu_gstop_s cn61xx;
+       struct cvmx_ciu_gstop_s cn63xx;
+       struct cvmx_ciu_gstop_s cn63xxp1;
+       struct cvmx_ciu_gstop_s cn66xx;
+       struct cvmx_ciu_gstop_s cn68xx;
+       struct cvmx_ciu_gstop_s cn68xxp1;
+       struct cvmx_ciu_gstop_s cn70xx;
+       struct cvmx_ciu_gstop_s cn70xxp1;
+       struct cvmx_ciu_gstop_s cnf71xx;
+};
+
+typedef union cvmx_ciu_gstop cvmx_ciu_gstop_t;
+
+/**
+ * cvmx_ciu_int#_en0
+ *
+ * CIU_INT0_EN0:  PP0/IP2
+ * CIU_INT1_EN0:  PP0/IP3
+ * CIU_INT2_EN0:  PP1/IP2
+ * CIU_INT3_EN0:  PP1/IP3
+ * CIU_INT4_EN0:  PP2/IP2
+ * CIU_INT5_EN0:  PP2/IP3
+ * CIU_INT6_EN0:  PP3/IP2
+ * CIU_INT7_EN0:  PP3/IP3
+ * - .....
+ * (hole)
+ * CIU_INT32_EN0: IO 0 (PEM0)
+ * CIU_INT33_EN0: IO 1 (reserved in o70).
+ */
+union cvmx_ciu_intx_en0 {
+       u64 u64;
+       struct cvmx_ciu_intx_en0_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_en0_cn30xx {
+               u64 reserved_59_63 : 5;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 reserved_47_47 : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn30xx;
+       struct cvmx_ciu_intx_en0_cn31xx {
+               u64 reserved_59_63 : 5;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn31xx;
+       struct cvmx_ciu_intx_en0_cn38xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn38xx;
+       struct cvmx_ciu_intx_en0_cn38xx cn38xxp2;
+       struct cvmx_ciu_intx_en0_cn30xx cn50xx;
+       struct cvmx_ciu_intx_en0_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_en0_cn52xx cn52xxp1;
+       struct cvmx_ciu_intx_en0_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_en0_cn56xx cn56xxp1;
+       struct cvmx_ciu_intx_en0_cn38xx cn58xx;
+       struct cvmx_ciu_intx_en0_cn38xx cn58xxp1;
+       struct cvmx_ciu_intx_en0_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_en0_cn52xx cn63xx;
+       struct cvmx_ciu_intx_en0_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_en0_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_en0_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_en0_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en0_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en0 cvmx_ciu_intx_en0_t;
+
+/**
+ * cvmx_ciu_int#_en0_w1c
+ *
+ * Write-1-to-clear version of the CIU_INTx_EN0 register, read back corresponding CIU_INTx_EN0
+ * value.
+ * CIU_INT33_EN0_W1C is reserved.
+ */
+union cvmx_ciu_intx_en0_w1c {
+       u64 u64;
+       struct cvmx_ciu_intx_en0_w1c_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_en0_w1c_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_en0_w1c_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_en0_w1c_cn58xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en0_w1c_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_en0_w1c_cn52xx cn63xx;
+       struct cvmx_ciu_intx_en0_w1c_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_en0_w1c_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_en0_w1c_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_en0_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en0_w1c_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en0_w1c cvmx_ciu_intx_en0_w1c_t;
+
+/**
+ * cvmx_ciu_int#_en0_w1s
+ *
+ * Write-1-to-set version of the CIU_INTx_EN0 register, read back corresponding CIU_INTx_EN0
+ * value.
+ * CIU_INT33_EN0_W1S is reserved.
+ */
+union cvmx_ciu_intx_en0_w1s {
+       u64 u64;
+       struct cvmx_ciu_intx_en0_w1s_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_en0_w1s_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_en0_w1s_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_en0_w1s_cn58xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en0_w1s_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_en0_w1s_cn52xx cn63xx;
+       struct cvmx_ciu_intx_en0_w1s_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_en0_w1s_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_en0_w1s_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_en0_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en0_w1s_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en0_w1s cvmx_ciu_intx_en0_w1s_t;
+
+/**
+ * cvmx_ciu_int#_en1
+ *
+ * Enables for CIU_SUM1_PPX_IPx  or CIU_SUM1_IOX_INT
+ * CIU_INT0_EN1:  PP0/IP2
+ * CIU_INT1_EN1:  PP0/IP3
+ * CIU_INT2_EN1:  PP1/IP2
+ * CIU_INT3_EN1:  PP1/IP3
+ * CIU_INT4_EN1:  PP2/IP2
+ * CIU_INT5_EN1:  PP2/IP3
+ * CIU_INT6_EN1:  PP3/IP2
+ * CIU_INT7_EN1:  PP3/IP3
+ * - .....
+ * (hole)
+ * CIU_INT32_EN1: IO0 (PEM0)
+ * CIU_INT33_EN1: IO1 (Reserved for o70)
+ *
+ * PPx/IP2 will be raised when...
+ *
+ * n = x*2
+ * PPx/IP2 = |([CIU_SUM2_PPx_IP2,CIU_SUM1_PPx_IP2, CIU_INTn_SUM0] &
+ * [CIU_EN2_PPx_IP2,CIU_INTn_EN1, CIU_INTn_EN0])
+ *
+ * PPx/IP3 will be raised when...
+ *
+ * n = x*2 + 1
+ * PPx/IP3 =  |([CIU_SUM2_PPx_IP3,CIU_SUM1_PPx_IP3, CIU_INTn_SUM0] &
+ * [CIU_EN2_PPx_IP3,CIU_INTn_EN1, CIU_INTn_EN0])
+ *
+ * PPx/IP4 will be raised when...
+ * PPx/IP4 = |([CIU_SUM1_PPx_IP4, CIU_INTx_SUM4] & [CIU_INTx_EN4_1, CIU_INTx_EN4_0])
+ *
+ * PCI/INT will be raised when...
+ *
+ * PCI/INT0 (PEM0)
+ * PCI/INT0 = |([CIU_SUM2_IO0_INT,CIU_SUM1_IO0_INT, CIU_INT32_SUM0] &
+ * [CIU_EN2_IO0_INT,CIU_INT32_EN1, CIU_INT32_EN0])
+ *
+ * PCI/INT1 is reserved for o70.
+ * PCI/INT1 = |([CIU_SUM2_IO1_INT,CIU_SUM1_IO1_INT, CIU_INT33_SUM0] &
+ * [CIU_EN2_IO1_INT,CIU_INT33_EN1, CIU_INT33_EN0])
+ */
+union cvmx_ciu_intx_en1 {
+       u64 u64;
+       struct cvmx_ciu_intx_en1_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 reserved_50_50 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 wdog : 16;
+       } s;
+       struct cvmx_ciu_intx_en1_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 wdog : 1;
+       } cn30xx;
+       struct cvmx_ciu_intx_en1_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 wdog : 2;
+       } cn31xx;
+       struct cvmx_ciu_intx_en1_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 wdog : 16;
+       } cn38xx;
+       struct cvmx_ciu_intx_en1_cn38xx cn38xxp2;
+       struct cvmx_ciu_intx_en1_cn31xx cn50xx;
+       struct cvmx_ciu_intx_en1_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xx;
+       struct cvmx_ciu_intx_en1_cn52xxp1 {
+               u64 reserved_19_63 : 45;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xxp1;
+       struct cvmx_ciu_intx_en1_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 wdog : 12;
+       } cn56xx;
+       struct cvmx_ciu_intx_en1_cn56xx cn56xxp1;
+       struct cvmx_ciu_intx_en1_cn38xx cn58xx;
+       struct cvmx_ciu_intx_en1_cn38xx cn58xxp1;
+       struct cvmx_ciu_intx_en1_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_intx_en1_cn63xx {
+               u64 rst : 1;
+               u64 reserved_57_62 : 6;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_37_45 : 9;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_6_17 : 12;
+               u64 wdog : 6;
+       } cn63xx;
+       struct cvmx_ciu_intx_en1_cn63xx cn63xxp1;
+       struct cvmx_ciu_intx_en1_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_intx_en1_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_39_38 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_intx_en1_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en1_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en1 cvmx_ciu_intx_en1_t;
+
+/**
+ * cvmx_ciu_int#_en1_w1c
+ *
+ * Write-1-to-clear version of the CIU_INTX_EN1 register, read back corresponding CIU_INTX_EN1
+ * value.
+ * CIU_INT33_EN1_W1C is reserved.
+ */
+union cvmx_ciu_intx_en1_w1c {
+       u64 u64;
+       struct cvmx_ciu_intx_en1_w1c_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 reserved_50_50 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 wdog : 16;
+       } s;
+       struct cvmx_ciu_intx_en1_w1c_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xx;
+       struct cvmx_ciu_intx_en1_w1c_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 wdog : 12;
+       } cn56xx;
+       struct cvmx_ciu_intx_en1_w1c_cn58xx {
+               u64 reserved_16_63 : 48;
+               u64 wdog : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en1_w1c_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_intx_en1_w1c_cn63xx {
+               u64 rst : 1;
+               u64 reserved_57_62 : 6;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_37_45 : 9;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_6_17 : 12;
+               u64 wdog : 6;
+       } cn63xx;
+       struct cvmx_ciu_intx_en1_w1c_cn63xx cn63xxp1;
+       struct cvmx_ciu_intx_en1_w1c_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_intx_en1_w1c_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_intx_en1_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en1_w1c_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en1_w1c cvmx_ciu_intx_en1_w1c_t;
+
+/**
+ * cvmx_ciu_int#_en1_w1s
+ *
+ * Write-1-to-set version of the CIU_INTX_EN1 register, read back corresponding CIU_INTX_EN1
+ * value.
+ * CIU_INT33_EN1_W1S is reserved.
+ */
+union cvmx_ciu_intx_en1_w1s {
+       u64 u64;
+       struct cvmx_ciu_intx_en1_w1s_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 reserved_50_50 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 wdog : 16;
+       } s;
+       struct cvmx_ciu_intx_en1_w1s_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xx;
+       struct cvmx_ciu_intx_en1_w1s_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 wdog : 12;
+       } cn56xx;
+       struct cvmx_ciu_intx_en1_w1s_cn58xx {
+               u64 reserved_16_63 : 48;
+               u64 wdog : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en1_w1s_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_intx_en1_w1s_cn63xx {
+               u64 rst : 1;
+               u64 reserved_57_62 : 6;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_37_45 : 9;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_6_17 : 12;
+               u64 wdog : 6;
+       } cn63xx;
+       struct cvmx_ciu_intx_en1_w1s_cn63xx cn63xxp1;
+       struct cvmx_ciu_intx_en1_w1s_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_intx_en1_w1s_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_intx_en1_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en1_w1s_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en1_w1s cvmx_ciu_intx_en1_w1s_t;
+
+/**
+ * cvmx_ciu_int#_en4_0
+ *
+ * CIU_INT0_EN4_0:   PP0  /IP4
+ * CIU_INT1_EN4_0:   PP1  /IP4
+ * - ...
+ * CIU_INT3_EN4_0:   PP3  /IP4
+ */
+union cvmx_ciu_intx_en4_0 {
+       u64 u64;
+       struct cvmx_ciu_intx_en4_0_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_en4_0_cn50xx {
+               u64 reserved_59_63 : 5;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 reserved_47_47 : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn50xx;
+       struct cvmx_ciu_intx_en4_0_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_en4_0_cn52xx cn52xxp1;
+       struct cvmx_ciu_intx_en4_0_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_en4_0_cn56xx cn56xxp1;
+       struct cvmx_ciu_intx_en4_0_cn58xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en4_0_cn58xx cn58xxp1;
+       struct cvmx_ciu_intx_en4_0_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_en4_0_cn52xx cn63xx;
+       struct cvmx_ciu_intx_en4_0_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_en4_0_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_en4_0_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_en4_0_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en4_0_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en4_0 cvmx_ciu_intx_en4_0_t;
+
+/**
+ * cvmx_ciu_int#_en4_0_w1c
+ *
+ * Write-1-to-clear version of the CIU_INTx_EN4_0 register, read back corresponding
+ * CIU_INTx_EN4_0 value.
+ */
+union cvmx_ciu_intx_en4_0_w1c {
+       u64 u64;
+       struct cvmx_ciu_intx_en4_0_w1c_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_en4_0_w1c_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_en4_0_w1c_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_en4_0_w1c_cn58xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en4_0_w1c_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_en4_0_w1c_cn52xx cn63xx;
+       struct cvmx_ciu_intx_en4_0_w1c_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_en4_0_w1c_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_en4_0_w1c_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_en4_0_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en4_0_w1c_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en4_0_w1c cvmx_ciu_intx_en4_0_w1c_t;
+
+/**
+ * cvmx_ciu_int#_en4_0_w1s
+ *
+ * Write-1-to-set version of the CIU_INTX_EN4_0 register, read back corresponding CIU_INTX_EN4_0
+ * value.
+ */
+union cvmx_ciu_intx_en4_0_w1s {
+       u64 u64;
+       struct cvmx_ciu_intx_en4_0_w1s_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_en4_0_w1s_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_en4_0_w1s_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_en4_0_w1s_cn58xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en4_0_w1s_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_en4_0_w1s_cn52xx cn63xx;
+       struct cvmx_ciu_intx_en4_0_w1s_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_en4_0_w1s_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_en4_0_w1s_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_en4_0_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en4_0_w1s_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 reserved_44_44 : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en4_0_w1s cvmx_ciu_intx_en4_0_w1s_t;
+
+/**
+ * cvmx_ciu_int#_en4_1
+ *
+ * PPx/IP4 will be raised when...
+ * PPx/IP4 = |([CIU_SUM1_PPx_IP4, CIU_INTx_SUM4] & [CIU_INTx_EN4_1, CIU_INTx_EN4_0])
+ */
+union cvmx_ciu_intx_en4_1 {
+       u64 u64;
+       struct cvmx_ciu_intx_en4_1_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 reserved_50_50 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 wdog : 16;
+       } s;
+       struct cvmx_ciu_intx_en4_1_cn50xx {
+               u64 reserved_2_63 : 62;
+               u64 wdog : 2;
+       } cn50xx;
+       struct cvmx_ciu_intx_en4_1_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xx;
+       struct cvmx_ciu_intx_en4_1_cn52xxp1 {
+               u64 reserved_19_63 : 45;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xxp1;
+       struct cvmx_ciu_intx_en4_1_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 wdog : 12;
+       } cn56xx;
+       struct cvmx_ciu_intx_en4_1_cn56xx cn56xxp1;
+       struct cvmx_ciu_intx_en4_1_cn58xx {
+               u64 reserved_16_63 : 48;
+               u64 wdog : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en4_1_cn58xx cn58xxp1;
+       struct cvmx_ciu_intx_en4_1_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_intx_en4_1_cn63xx {
+               u64 rst : 1;
+               u64 reserved_57_62 : 6;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_37_45 : 9;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_6_17 : 12;
+               u64 wdog : 6;
+       } cn63xx;
+       struct cvmx_ciu_intx_en4_1_cn63xx cn63xxp1;
+       struct cvmx_ciu_intx_en4_1_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_intx_en4_1_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_39_38 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_intx_en4_1_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en4_1_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en4_1 cvmx_ciu_intx_en4_1_t;
+
+/**
+ * cvmx_ciu_int#_en4_1_w1c
+ *
+ * Write-1-to-clear version of the CIU_INTX_EN4_1 register, read back corresponding
+ * CIU_INTX_EN4_1 value.
+ */
+union cvmx_ciu_intx_en4_1_w1c {
+       u64 u64;
+       struct cvmx_ciu_intx_en4_1_w1c_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 reserved_50_50 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 wdog : 16;
+       } s;
+       struct cvmx_ciu_intx_en4_1_w1c_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xx;
+       struct cvmx_ciu_intx_en4_1_w1c_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 wdog : 12;
+       } cn56xx;
+       struct cvmx_ciu_intx_en4_1_w1c_cn58xx {
+               u64 reserved_16_63 : 48;
+               u64 wdog : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en4_1_w1c_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_intx_en4_1_w1c_cn63xx {
+               u64 rst : 1;
+               u64 reserved_57_62 : 6;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_37_45 : 9;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_6_17 : 12;
+               u64 wdog : 6;
+       } cn63xx;
+       struct cvmx_ciu_intx_en4_1_w1c_cn63xx cn63xxp1;
+       struct cvmx_ciu_intx_en4_1_w1c_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_intx_en4_1_w1c_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_intx_en4_1_w1c_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en4_1_w1c_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en4_1_w1c cvmx_ciu_intx_en4_1_w1c_t;
+
+/**
+ * cvmx_ciu_int#_en4_1_w1s
+ *
+ * Write-1-to-set version of the CIU_INTX_EN4_1 register, read back corresponding CIU_INTX_EN4_1
+ * value.
+ */
+union cvmx_ciu_intx_en4_1_w1s {
+       u64 u64;
+       struct cvmx_ciu_intx_en4_1_w1s_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 reserved_50_50 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 wdog : 16;
+       } s;
+       struct cvmx_ciu_intx_en4_1_w1s_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xx;
+       struct cvmx_ciu_intx_en4_1_w1s_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 wdog : 12;
+       } cn56xx;
+       struct cvmx_ciu_intx_en4_1_w1s_cn58xx {
+               u64 reserved_16_63 : 48;
+               u64 wdog : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_en4_1_w1s_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_intx_en4_1_w1s_cn63xx {
+               u64 rst : 1;
+               u64 reserved_57_62 : 6;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_37_45 : 9;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_6_17 : 12;
+               u64 wdog : 6;
+       } cn63xx;
+       struct cvmx_ciu_intx_en4_1_w1s_cn63xx cn63xxp1;
+       struct cvmx_ciu_intx_en4_1_w1s_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_intx_en4_1_w1s_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_intx_en4_1_w1s_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_en4_1_w1s_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_en4_1_w1s cvmx_ciu_intx_en4_1_w1s_t;
+
+/**
+ * cvmx_ciu_int#_sum0
+ *
+ * The remaining IP4 summary bits will be CIU_INTX_SUM4.
+ * CIU_INT0_SUM0:  PP0/IP2
+ * CIU_INT1_SUM0:  PP0/IP3
+ * CIU_INT2_SUM0:  PP1/IP2
+ * CIU_INT3_SUM0:  PP1/IP3
+ * CIU_INT4_SUM0:  PP2/IP2
+ * CIU_INT5_SUM0:  PP2/IP3
+ * CIU_INT6_SUM0:  PP3/IP2
+ * CIU_INT7_SUM0:  PP3/IP3
+ *  - .....
+ * (hole)
+ * CIU_INT32_SUM0: IO 0 (PEM0).
+ * CIU_INT33_SUM0: IO 1 (Reserved in o70, in separate address group)
+ */
+union cvmx_ciu_intx_sum0 {
+       u64 u64;
+       struct cvmx_ciu_intx_sum0_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_sum0_cn30xx {
+               u64 reserved_59_63 : 5;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 reserved_47_47 : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn30xx;
+       struct cvmx_ciu_intx_sum0_cn31xx {
+               u64 reserved_59_63 : 5;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn31xx;
+       struct cvmx_ciu_intx_sum0_cn38xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn38xx;
+       struct cvmx_ciu_intx_sum0_cn38xx cn38xxp2;
+       struct cvmx_ciu_intx_sum0_cn30xx cn50xx;
+       struct cvmx_ciu_intx_sum0_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_sum0_cn52xx cn52xxp1;
+       struct cvmx_ciu_intx_sum0_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_sum0_cn56xx cn56xxp1;
+       struct cvmx_ciu_intx_sum0_cn38xx cn58xx;
+       struct cvmx_ciu_intx_sum0_cn38xx cn58xxp1;
+       struct cvmx_ciu_intx_sum0_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_sum0_cn52xx cn63xx;
+       struct cvmx_ciu_intx_sum0_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_sum0_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_sum0_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_sum0_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_sum0_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_sum0 cvmx_ciu_intx_sum0_t;
+
+/**
+ * cvmx_ciu_int#_sum4
+ *
+ * CIU_INT0_SUM4:   PP0  /IP4
+ * CIU_INT1_SUM4:   PP1  /IP4
+ * - ...
+ * CIU_INT3_SUM4:   PP3  /IP4
+ */
+union cvmx_ciu_intx_sum4 {
+       u64 u64;
+       struct cvmx_ciu_intx_sum4_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_intx_sum4_cn50xx {
+               u64 reserved_59_63 : 5;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 reserved_47_47 : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn50xx;
+       struct cvmx_ciu_intx_sum4_cn52xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn52xx;
+       struct cvmx_ciu_intx_sum4_cn52xx cn52xxp1;
+       struct cvmx_ciu_intx_sum4_cn56xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn56xx;
+       struct cvmx_ciu_intx_sum4_cn56xx cn56xxp1;
+       struct cvmx_ciu_intx_sum4_cn58xx {
+               u64 reserved_56_63 : 8;
+               u64 timer : 4;
+               u64 key_zero : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn58xx;
+       struct cvmx_ciu_intx_sum4_cn58xx cn58xxp1;
+       struct cvmx_ciu_intx_sum4_cn61xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn61xx;
+       struct cvmx_ciu_intx_sum4_cn52xx cn63xx;
+       struct cvmx_ciu_intx_sum4_cn52xx cn63xxp1;
+       struct cvmx_ciu_intx_sum4_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_intx_sum4_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_46_47 : 2;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_intx_sum4_cn70xx cn70xxp1;
+       struct cvmx_ciu_intx_sum4_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_intx_sum4 cvmx_ciu_intx_sum4_t;
+
+/**
+ * cvmx_ciu_int33_sum0
+ *
+ * This bit is associated with CIU_INTX_SUM0. Reserved for o70 for future expansion.
+ *
+ */
+union cvmx_ciu_int33_sum0 {
+       u64 u64;
+       struct cvmx_ciu_int33_sum0_s {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } s;
+       struct cvmx_ciu_int33_sum0_s cn61xx;
+       struct cvmx_ciu_int33_sum0_cn63xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 reserved_57_58 : 2;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 reserved_51_51 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn63xx;
+       struct cvmx_ciu_int33_sum0_cn63xx cn63xxp1;
+       struct cvmx_ciu_int33_sum0_cn66xx {
+               u64 bootdma : 1;
+               u64 mii : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 reserved_57_57 : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn66xx;
+       struct cvmx_ciu_int33_sum0_cn70xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 reserved_56_56 : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 gmx_drp : 2;
+               u64 reserved_47_46 : 2;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cn70xx;
+       struct cvmx_ciu_int33_sum0_cn70xx cn70xxp1;
+       struct cvmx_ciu_int33_sum0_cnf71xx {
+               u64 bootdma : 1;
+               u64 reserved_62_62 : 1;
+               u64 ipdppthr : 1;
+               u64 powiq : 1;
+               u64 twsi2 : 1;
+               u64 mpi : 1;
+               u64 pcm : 1;
+               u64 usb : 1;
+               u64 timer : 4;
+               u64 sum2 : 1;
+               u64 ipd_drp : 1;
+               u64 reserved_49_49 : 1;
+               u64 gmx_drp : 1;
+               u64 trace : 1;
+               u64 rml : 1;
+               u64 twsi : 1;
+               u64 wdog_sum : 1;
+               u64 pci_msi : 4;
+               u64 pci_int : 4;
+               u64 uart : 2;
+               u64 mbox : 2;
+               u64 gpio : 16;
+               u64 workq : 16;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_int33_sum0 cvmx_ciu_int33_sum0_t;
+
+/**
+ * cvmx_ciu_int_dbg_sel
+ */
+union cvmx_ciu_int_dbg_sel {
+       u64 u64;
+       struct cvmx_ciu_int_dbg_sel_s {
+               u64 reserved_19_63 : 45;
+               u64 sel : 3;
+               u64 reserved_10_15 : 6;
+               u64 irq : 2;
+               u64 reserved_5_7 : 3;
+               u64 pp : 5;
+       } s;
+       struct cvmx_ciu_int_dbg_sel_cn61xx {
+               u64 reserved_19_63 : 45;
+               u64 sel : 3;
+               u64 reserved_10_15 : 6;
+               u64 irq : 2;
+               u64 reserved_4_7 : 4;
+               u64 pp : 4;
+       } cn61xx;
+       struct cvmx_ciu_int_dbg_sel_cn63xx {
+               u64 reserved_19_63 : 45;
+               u64 sel : 3;
+               u64 reserved_10_15 : 6;
+               u64 irq : 2;
+               u64 reserved_3_7 : 5;
+               u64 pp : 3;
+       } cn63xx;
+       struct cvmx_ciu_int_dbg_sel_cn61xx cn66xx;
+       struct cvmx_ciu_int_dbg_sel_s cn68xx;
+       struct cvmx_ciu_int_dbg_sel_s cn68xxp1;
+       struct cvmx_ciu_int_dbg_sel_cn61xx cnf71xx;
+};
+
+typedef union cvmx_ciu_int_dbg_sel cvmx_ciu_int_dbg_sel_t;
+
+/**
+ * cvmx_ciu_int_sum1
+ *
+ * CIU_INT_SUM1 is kept to keep backward compatible.
+ * Refer to CIU_SUM1_PPX_IPx which is the one should use.
+ */
+union cvmx_ciu_int_sum1 {
+       u64 u64;
+       struct cvmx_ciu_int_sum1_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 reserved_50_50 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 wdog : 16;
+       } s;
+       struct cvmx_ciu_int_sum1_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 wdog : 1;
+       } cn30xx;
+       struct cvmx_ciu_int_sum1_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 wdog : 2;
+       } cn31xx;
+       struct cvmx_ciu_int_sum1_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 wdog : 16;
+       } cn38xx;
+       struct cvmx_ciu_int_sum1_cn38xx cn38xxp2;
+       struct cvmx_ciu_int_sum1_cn31xx cn50xx;
+       struct cvmx_ciu_int_sum1_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xx;
+       struct cvmx_ciu_int_sum1_cn52xxp1 {
+               u64 reserved_19_63 : 45;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 uart2 : 1;
+               u64 reserved_4_15 : 12;
+               u64 wdog : 4;
+       } cn52xxp1;
+       struct cvmx_ciu_int_sum1_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 wdog : 12;
+       } cn56xx;
+       struct cvmx_ciu_int_sum1_cn56xx cn56xxp1;
+       struct cvmx_ciu_int_sum1_cn38xx cn58xx;
+       struct cvmx_ciu_int_sum1_cn38xx cn58xxp1;
+       struct cvmx_ciu_int_sum1_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_int_sum1_cn63xx {
+               u64 rst : 1;
+               u64 reserved_57_62 : 6;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 srio1 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_37_45 : 9;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_6_17 : 12;
+               u64 wdog : 6;
+       } cn63xx;
+       struct cvmx_ciu_int_sum1_cn63xx cn63xxp1;
+       struct cvmx_ciu_int_sum1_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_int_sum1_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_int_sum1_cn70xx cn70xxp1;
+       struct cvmx_ciu_int_sum1_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_37_46 : 10;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_int_sum1 cvmx_ciu_int_sum1_t;
+
+/**
+ * cvmx_ciu_intr_slowdown
+ */
+union cvmx_ciu_intr_slowdown {
+       u64 u64;
+       struct cvmx_ciu_intr_slowdown_s {
+               u64 reserved_3_63 : 61;
+               u64 ctl : 3;
+       } s;
+       struct cvmx_ciu_intr_slowdown_s cn70xx;
+       struct cvmx_ciu_intr_slowdown_s cn70xxp1;
+};
+
+typedef union cvmx_ciu_intr_slowdown cvmx_ciu_intr_slowdown_t;
+
+/**
+ * cvmx_ciu_mbox_clr#
+ */
+union cvmx_ciu_mbox_clrx {
+       u64 u64;
+       struct cvmx_ciu_mbox_clrx_s {
+               u64 reserved_32_63 : 32;
+               u64 bits : 32;
+       } s;
+       struct cvmx_ciu_mbox_clrx_s cn30xx;
+       struct cvmx_ciu_mbox_clrx_s cn31xx;
+       struct cvmx_ciu_mbox_clrx_s cn38xx;
+       struct cvmx_ciu_mbox_clrx_s cn38xxp2;
+       struct cvmx_ciu_mbox_clrx_s cn50xx;
+       struct cvmx_ciu_mbox_clrx_s cn52xx;
+       struct cvmx_ciu_mbox_clrx_s cn52xxp1;
+       struct cvmx_ciu_mbox_clrx_s cn56xx;
+       struct cvmx_ciu_mbox_clrx_s cn56xxp1;
+       struct cvmx_ciu_mbox_clrx_s cn58xx;
+       struct cvmx_ciu_mbox_clrx_s cn58xxp1;
+       struct cvmx_ciu_mbox_clrx_s cn61xx;
+       struct cvmx_ciu_mbox_clrx_s cn63xx;
+       struct cvmx_ciu_mbox_clrx_s cn63xxp1;
+       struct cvmx_ciu_mbox_clrx_s cn66xx;
+       struct cvmx_ciu_mbox_clrx_s cn68xx;
+       struct cvmx_ciu_mbox_clrx_s cn68xxp1;
+       struct cvmx_ciu_mbox_clrx_s cn70xx;
+       struct cvmx_ciu_mbox_clrx_s cn70xxp1;
+       struct cvmx_ciu_mbox_clrx_s cnf71xx;
+};
+
+typedef union cvmx_ciu_mbox_clrx cvmx_ciu_mbox_clrx_t;
+
+/**
+ * cvmx_ciu_mbox_set#
+ */
+union cvmx_ciu_mbox_setx {
+       u64 u64;
+       struct cvmx_ciu_mbox_setx_s {
+               u64 reserved_32_63 : 32;
+               u64 bits : 32;
+       } s;
+       struct cvmx_ciu_mbox_setx_s cn30xx;
+       struct cvmx_ciu_mbox_setx_s cn31xx;
+       struct cvmx_ciu_mbox_setx_s cn38xx;
+       struct cvmx_ciu_mbox_setx_s cn38xxp2;
+       struct cvmx_ciu_mbox_setx_s cn50xx;
+       struct cvmx_ciu_mbox_setx_s cn52xx;
+       struct cvmx_ciu_mbox_setx_s cn52xxp1;
+       struct cvmx_ciu_mbox_setx_s cn56xx;
+       struct cvmx_ciu_mbox_setx_s cn56xxp1;
+       struct cvmx_ciu_mbox_setx_s cn58xx;
+       struct cvmx_ciu_mbox_setx_s cn58xxp1;
+       struct cvmx_ciu_mbox_setx_s cn61xx;
+       struct cvmx_ciu_mbox_setx_s cn63xx;
+       struct cvmx_ciu_mbox_setx_s cn63xxp1;
+       struct cvmx_ciu_mbox_setx_s cn66xx;
+       struct cvmx_ciu_mbox_setx_s cn68xx;
+       struct cvmx_ciu_mbox_setx_s cn68xxp1;
+       struct cvmx_ciu_mbox_setx_s cn70xx;
+       struct cvmx_ciu_mbox_setx_s cn70xxp1;
+       struct cvmx_ciu_mbox_setx_s cnf71xx;
+};
+
+typedef union cvmx_ciu_mbox_setx cvmx_ciu_mbox_setx_t;
+
+/**
+ * cvmx_ciu_nmi
+ */
+union cvmx_ciu_nmi {
+       u64 u64;
+       struct cvmx_ciu_nmi_s {
+               u64 reserved_32_63 : 32;
+               u64 nmi : 32;
+       } s;
+       struct cvmx_ciu_nmi_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 nmi : 1;
+       } cn30xx;
+       struct cvmx_ciu_nmi_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 nmi : 2;
+       } cn31xx;
+       struct cvmx_ciu_nmi_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 nmi : 16;
+       } cn38xx;
+       struct cvmx_ciu_nmi_cn38xx cn38xxp2;
+       struct cvmx_ciu_nmi_cn31xx cn50xx;
+       struct cvmx_ciu_nmi_cn52xx {
+               u64 reserved_4_63 : 60;
+               u64 nmi : 4;
+       } cn52xx;
+       struct cvmx_ciu_nmi_cn52xx cn52xxp1;
+       struct cvmx_ciu_nmi_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 nmi : 12;
+       } cn56xx;
+       struct cvmx_ciu_nmi_cn56xx cn56xxp1;
+       struct cvmx_ciu_nmi_cn38xx cn58xx;
+       struct cvmx_ciu_nmi_cn38xx cn58xxp1;
+       struct cvmx_ciu_nmi_cn52xx cn61xx;
+       struct cvmx_ciu_nmi_cn63xx {
+               u64 reserved_6_63 : 58;
+               u64 nmi : 6;
+       } cn63xx;
+       struct cvmx_ciu_nmi_cn63xx cn63xxp1;
+       struct cvmx_ciu_nmi_cn66xx {
+               u64 reserved_10_63 : 54;
+               u64 nmi : 10;
+       } cn66xx;
+       struct cvmx_ciu_nmi_s cn68xx;
+       struct cvmx_ciu_nmi_s cn68xxp1;
+       struct cvmx_ciu_nmi_cn52xx cn70xx;
+       struct cvmx_ciu_nmi_cn52xx cn70xxp1;
+       struct cvmx_ciu_nmi_cn52xx cnf71xx;
+};
+
+typedef union cvmx_ciu_nmi cvmx_ciu_nmi_t;
+
+/**
+ * cvmx_ciu_pci_inta
+ */
+union cvmx_ciu_pci_inta {
+       u64 u64;
+       struct cvmx_ciu_pci_inta_s {
+               u64 reserved_2_63 : 62;
+               u64 intr : 2;
+       } s;
+       struct cvmx_ciu_pci_inta_s cn30xx;
+       struct cvmx_ciu_pci_inta_s cn31xx;
+       struct cvmx_ciu_pci_inta_s cn38xx;
+       struct cvmx_ciu_pci_inta_s cn38xxp2;
+       struct cvmx_ciu_pci_inta_s cn50xx;
+       struct cvmx_ciu_pci_inta_s cn52xx;
+       struct cvmx_ciu_pci_inta_s cn52xxp1;
+       struct cvmx_ciu_pci_inta_s cn56xx;
+       struct cvmx_ciu_pci_inta_s cn56xxp1;
+       struct cvmx_ciu_pci_inta_s cn58xx;
+       struct cvmx_ciu_pci_inta_s cn58xxp1;
+       struct cvmx_ciu_pci_inta_s cn61xx;
+       struct cvmx_ciu_pci_inta_s cn63xx;
+       struct cvmx_ciu_pci_inta_s cn63xxp1;
+       struct cvmx_ciu_pci_inta_s cn66xx;
+       struct cvmx_ciu_pci_inta_s cn68xx;
+       struct cvmx_ciu_pci_inta_s cn68xxp1;
+       struct cvmx_ciu_pci_inta_s cn70xx;
+       struct cvmx_ciu_pci_inta_s cn70xxp1;
+       struct cvmx_ciu_pci_inta_s cnf71xx;
+};
+
+typedef union cvmx_ciu_pci_inta cvmx_ciu_pci_inta_t;
+
+/**
+ * cvmx_ciu_pp_bist_stat
+ */
+union cvmx_ciu_pp_bist_stat {
+       u64 u64;
+       struct cvmx_ciu_pp_bist_stat_s {
+               u64 reserved_32_63 : 32;
+               u64 pp_bist : 32;
+       } s;
+       struct cvmx_ciu_pp_bist_stat_s cn68xx;
+       struct cvmx_ciu_pp_bist_stat_s cn68xxp1;
+};
+
+typedef union cvmx_ciu_pp_bist_stat cvmx_ciu_pp_bist_stat_t;
+
+/**
+ * cvmx_ciu_pp_dbg
+ */
+union cvmx_ciu_pp_dbg {
+       u64 u64;
+       struct cvmx_ciu_pp_dbg_s {
+               u64 reserved_48_63 : 16;
+               u64 ppdbg : 48;
+       } s;
+       struct cvmx_ciu_pp_dbg_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 ppdbg : 1;
+       } cn30xx;
+       struct cvmx_ciu_pp_dbg_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 ppdbg : 2;
+       } cn31xx;
+       struct cvmx_ciu_pp_dbg_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 ppdbg : 16;
+       } cn38xx;
+       struct cvmx_ciu_pp_dbg_cn38xx cn38xxp2;
+       struct cvmx_ciu_pp_dbg_cn31xx cn50xx;
+       struct cvmx_ciu_pp_dbg_cn52xx {
+               u64 reserved_4_63 : 60;
+               u64 ppdbg : 4;
+       } cn52xx;
+       struct cvmx_ciu_pp_dbg_cn52xx cn52xxp1;
+       struct cvmx_ciu_pp_dbg_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 ppdbg : 12;
+       } cn56xx;
+       struct cvmx_ciu_pp_dbg_cn56xx cn56xxp1;
+       struct cvmx_ciu_pp_dbg_cn38xx cn58xx;
+       struct cvmx_ciu_pp_dbg_cn38xx cn58xxp1;
+       struct cvmx_ciu_pp_dbg_cn52xx cn61xx;
+       struct cvmx_ciu_pp_dbg_cn63xx {
+               u64 reserved_6_63 : 58;
+               u64 ppdbg : 6;
+       } cn63xx;
+       struct cvmx_ciu_pp_dbg_cn63xx cn63xxp1;
+       struct cvmx_ciu_pp_dbg_cn66xx {
+               u64 reserved_10_63 : 54;
+               u64 ppdbg : 10;
+       } cn66xx;
+       struct cvmx_ciu_pp_dbg_cn68xx {
+               u64 reserved_32_63 : 32;
+               u64 ppdbg : 32;
+       } cn68xx;
+       struct cvmx_ciu_pp_dbg_cn68xx cn68xxp1;
+       struct cvmx_ciu_pp_dbg_cn52xx cn70xx;
+       struct cvmx_ciu_pp_dbg_cn52xx cn70xxp1;
+       struct cvmx_ciu_pp_dbg_cn38xx cn73xx;
+       struct cvmx_ciu_pp_dbg_s cn78xx;
+       struct cvmx_ciu_pp_dbg_s cn78xxp1;
+       struct cvmx_ciu_pp_dbg_cn52xx cnf71xx;
+       struct cvmx_ciu_pp_dbg_cn38xx cnf75xx;
+};
+
+typedef union cvmx_ciu_pp_dbg cvmx_ciu_pp_dbg_t;
+
+/**
+ * cvmx_ciu_pp_poke#
+ *
+ * CIU_PP_POKE for CIU_WDOG
+ *
+ */
+union cvmx_ciu_pp_pokex {
+       u64 u64;
+       struct cvmx_ciu_pp_pokex_s {
+               u64 poke : 64;
+       } s;
+       struct cvmx_ciu_pp_pokex_s cn30xx;
+       struct cvmx_ciu_pp_pokex_s cn31xx;
+       struct cvmx_ciu_pp_pokex_s cn38xx;
+       struct cvmx_ciu_pp_pokex_s cn38xxp2;
+       struct cvmx_ciu_pp_pokex_s cn50xx;
+       struct cvmx_ciu_pp_pokex_s cn52xx;
+       struct cvmx_ciu_pp_pokex_s cn52xxp1;
+       struct cvmx_ciu_pp_pokex_s cn56xx;
+       struct cvmx_ciu_pp_pokex_s cn56xxp1;
+       struct cvmx_ciu_pp_pokex_s cn58xx;
+       struct cvmx_ciu_pp_pokex_s cn58xxp1;
+       struct cvmx_ciu_pp_pokex_s cn61xx;
+       struct cvmx_ciu_pp_pokex_s cn63xx;
+       struct cvmx_ciu_pp_pokex_s cn63xxp1;
+       struct cvmx_ciu_pp_pokex_s cn66xx;
+       struct cvmx_ciu_pp_pokex_s cn68xx;
+       struct cvmx_ciu_pp_pokex_s cn68xxp1;
+       struct cvmx_ciu_pp_pokex_s cn70xx;
+       struct cvmx_ciu_pp_pokex_s cn70xxp1;
+       struct cvmx_ciu_pp_pokex_cn73xx {
+               u64 reserved_1_63 : 63;
+               u64 poke : 1;
+       } cn73xx;
+       struct cvmx_ciu_pp_pokex_cn73xx cn78xx;
+       struct cvmx_ciu_pp_pokex_cn73xx cn78xxp1;
+       struct cvmx_ciu_pp_pokex_s cnf71xx;
+       struct cvmx_ciu_pp_pokex_cn73xx cnf75xx;
+};
+
+typedef union cvmx_ciu_pp_pokex cvmx_ciu_pp_pokex_t;
+
+/**
+ * cvmx_ciu_pp_rst
+ *
+ * This register contains the reset control for each core. A 1 holds a core in reset, 0 release
+ * from reset. It resets to all ones when REMOTE_BOOT is enabled or all ones excluding bit 0 when
+ * REMOTE_BOOT is disabled. Writes to this register should occur only if the CIU_PP_RST_PENDING
+ * register is cleared.
+ */
+union cvmx_ciu_pp_rst {
+       u64 u64;
+       struct cvmx_ciu_pp_rst_s {
+               u64 reserved_48_63 : 16;
+               u64 rst : 47;
+               u64 rst0 : 1;
+       } s;
+       struct cvmx_ciu_pp_rst_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 rst0 : 1;
+       } cn30xx;
+       struct cvmx_ciu_pp_rst_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 rst : 1;
+               u64 rst0 : 1;
+       } cn31xx;
+       struct cvmx_ciu_pp_rst_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 rst : 15;
+               u64 rst0 : 1;
+       } cn38xx;
+       struct cvmx_ciu_pp_rst_cn38xx cn38xxp2;
+       struct cvmx_ciu_pp_rst_cn31xx cn50xx;
+       struct cvmx_ciu_pp_rst_cn52xx {
+               u64 reserved_4_63 : 60;
+               u64 rst : 3;
+               u64 rst0 : 1;
+       } cn52xx;
+       struct cvmx_ciu_pp_rst_cn52xx cn52xxp1;
+       struct cvmx_ciu_pp_rst_cn56xx {
+               u64 reserved_12_63 : 52;
+               u64 rst : 11;
+               u64 rst0 : 1;
+       } cn56xx;
+       struct cvmx_ciu_pp_rst_cn56xx cn56xxp1;
+       struct cvmx_ciu_pp_rst_cn38xx cn58xx;
+       struct cvmx_ciu_pp_rst_cn38xx cn58xxp1;
+       struct cvmx_ciu_pp_rst_cn52xx cn61xx;
+       struct cvmx_ciu_pp_rst_cn63xx {
+               u64 reserved_6_63 : 58;
+               u64 rst : 5;
+               u64 rst0 : 1;
+       } cn63xx;
+       struct cvmx_ciu_pp_rst_cn63xx cn63xxp1;
+       struct cvmx_ciu_pp_rst_cn66xx {
+               u64 reserved_10_63 : 54;
+               u64 rst : 9;
+               u64 rst0 : 1;
+       } cn66xx;
+       struct cvmx_ciu_pp_rst_cn68xx {
+               u64 reserved_32_63 : 32;
+               u64 rst : 31;
+               u64 rst0 : 1;
+       } cn68xx;
+       struct cvmx_ciu_pp_rst_cn68xx cn68xxp1;
+       struct cvmx_ciu_pp_rst_cn52xx cn70xx;
+       struct cvmx_ciu_pp_rst_cn52xx cn70xxp1;
+       struct cvmx_ciu_pp_rst_cn38xx cn73xx;
+       struct cvmx_ciu_pp_rst_s cn78xx;
+       struct cvmx_ciu_pp_rst_s cn78xxp1;
+       struct cvmx_ciu_pp_rst_cn52xx cnf71xx;
+       struct cvmx_ciu_pp_rst_cn38xx cnf75xx;
+};
+
+typedef union cvmx_ciu_pp_rst cvmx_ciu_pp_rst_t;
+
+/**
+ * cvmx_ciu_pp_rst_pending
+ *
+ * This register contains the reset status for each core.
+ *
+ */
+union cvmx_ciu_pp_rst_pending {
+       u64 u64;
+       struct cvmx_ciu_pp_rst_pending_s {
+               u64 reserved_48_63 : 16;
+               u64 pend : 48;
+       } s;
+       struct cvmx_ciu_pp_rst_pending_s cn70xx;
+       struct cvmx_ciu_pp_rst_pending_s cn70xxp1;
+       struct cvmx_ciu_pp_rst_pending_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 pend : 16;
+       } cn73xx;
+       struct cvmx_ciu_pp_rst_pending_s cn78xx;
+       struct cvmx_ciu_pp_rst_pending_s cn78xxp1;
+       struct cvmx_ciu_pp_rst_pending_cn73xx cnf75xx;
+};
+
+typedef union cvmx_ciu_pp_rst_pending cvmx_ciu_pp_rst_pending_t;
+
+/**
+ * cvmx_ciu_qlm0
+ *
+ * Notes:
+ * This register is only reset by cold reset.
+ *
+ */
+union cvmx_ciu_qlm0 {
+       u64 u64;
+       struct cvmx_ciu_qlm0_s {
+               u64 g2bypass : 1;
+               u64 reserved_53_62 : 10;
+               u64 g2deemph : 5;
+               u64 reserved_45_47 : 3;
+               u64 g2margin : 5;
+               u64 reserved_32_39 : 8;
+               u64 txbypass : 1;
+               u64 reserved_21_30 : 10;
+               u64 txdeemph : 5;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } s;
+       struct cvmx_ciu_qlm0_s cn61xx;
+       struct cvmx_ciu_qlm0_s cn63xx;
+       struct cvmx_ciu_qlm0_cn63xxp1 {
+               u64 reserved_32_63 : 32;
+               u64 txbypass : 1;
+               u64 reserved_20_30 : 11;
+               u64 txdeemph : 4;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } cn63xxp1;
+       struct cvmx_ciu_qlm0_s cn66xx;
+       struct cvmx_ciu_qlm0_cn68xx {
+               u64 reserved_32_63 : 32;
+               u64 txbypass : 1;
+               u64 reserved_21_30 : 10;
+               u64 txdeemph : 5;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } cn68xx;
+       struct cvmx_ciu_qlm0_cn68xx cn68xxp1;
+       struct cvmx_ciu_qlm0_s cnf71xx;
+};
+
+typedef union cvmx_ciu_qlm0 cvmx_ciu_qlm0_t;
+
+/**
+ * cvmx_ciu_qlm1
+ *
+ * Notes:
+ * This register is only reset by cold reset.
+ *
+ */
+union cvmx_ciu_qlm1 {
+       u64 u64;
+       struct cvmx_ciu_qlm1_s {
+               u64 g2bypass : 1;
+               u64 reserved_53_62 : 10;
+               u64 g2deemph : 5;
+               u64 reserved_45_47 : 3;
+               u64 g2margin : 5;
+               u64 reserved_32_39 : 8;
+               u64 txbypass : 1;
+               u64 reserved_21_30 : 10;
+               u64 txdeemph : 5;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } s;
+       struct cvmx_ciu_qlm1_s cn61xx;
+       struct cvmx_ciu_qlm1_s cn63xx;
+       struct cvmx_ciu_qlm1_cn63xxp1 {
+               u64 reserved_32_63 : 32;
+               u64 txbypass : 1;
+               u64 reserved_20_30 : 11;
+               u64 txdeemph : 4;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } cn63xxp1;
+       struct cvmx_ciu_qlm1_s cn66xx;
+       struct cvmx_ciu_qlm1_s cn68xx;
+       struct cvmx_ciu_qlm1_s cn68xxp1;
+       struct cvmx_ciu_qlm1_s cnf71xx;
+};
+
+typedef union cvmx_ciu_qlm1 cvmx_ciu_qlm1_t;
+
+/**
+ * cvmx_ciu_qlm2
+ *
+ * Notes:
+ * This register is only reset by cold reset.
+ *
+ */
+union cvmx_ciu_qlm2 {
+       u64 u64;
+       struct cvmx_ciu_qlm2_s {
+               u64 g2bypass : 1;
+               u64 reserved_53_62 : 10;
+               u64 g2deemph : 5;
+               u64 reserved_45_47 : 3;
+               u64 g2margin : 5;
+               u64 reserved_32_39 : 8;
+               u64 txbypass : 1;
+               u64 reserved_21_30 : 10;
+               u64 txdeemph : 5;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } s;
+       struct cvmx_ciu_qlm2_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 txbypass : 1;
+               u64 reserved_21_30 : 10;
+               u64 txdeemph : 5;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } cn61xx;
+       struct cvmx_ciu_qlm2_cn61xx cn63xx;
+       struct cvmx_ciu_qlm2_cn63xxp1 {
+               u64 reserved_32_63 : 32;
+               u64 txbypass : 1;
+               u64 reserved_20_30 : 11;
+               u64 txdeemph : 4;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } cn63xxp1;
+       struct cvmx_ciu_qlm2_cn61xx cn66xx;
+       struct cvmx_ciu_qlm2_s cn68xx;
+       struct cvmx_ciu_qlm2_s cn68xxp1;
+       struct cvmx_ciu_qlm2_cn61xx cnf71xx;
+};
+
+typedef union cvmx_ciu_qlm2 cvmx_ciu_qlm2_t;
+
+/**
+ * cvmx_ciu_qlm3
+ *
+ * Notes:
+ * This register is only reset by cold reset.
+ *
+ */
+union cvmx_ciu_qlm3 {
+       u64 u64;
+       struct cvmx_ciu_qlm3_s {
+               u64 g2bypass : 1;
+               u64 reserved_53_62 : 10;
+               u64 g2deemph : 5;
+               u64 reserved_45_47 : 3;
+               u64 g2margin : 5;
+               u64 reserved_32_39 : 8;
+               u64 txbypass : 1;
+               u64 reserved_21_30 : 10;
+               u64 txdeemph : 5;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } s;
+       struct cvmx_ciu_qlm3_s cn68xx;
+       struct cvmx_ciu_qlm3_s cn68xxp1;
+};
+
+typedef union cvmx_ciu_qlm3 cvmx_ciu_qlm3_t;
+
+/**
+ * cvmx_ciu_qlm4
+ *
+ * Notes:
+ * This register is only reset by cold reset.
+ *
+ */
+union cvmx_ciu_qlm4 {
+       u64 u64;
+       struct cvmx_ciu_qlm4_s {
+               u64 g2bypass : 1;
+               u64 reserved_53_62 : 10;
+               u64 g2deemph : 5;
+               u64 reserved_45_47 : 3;
+               u64 g2margin : 5;
+               u64 reserved_32_39 : 8;
+               u64 txbypass : 1;
+               u64 reserved_21_30 : 10;
+               u64 txdeemph : 5;
+               u64 reserved_13_15 : 3;
+               u64 txmargin : 5;
+               u64 reserved_4_7 : 4;
+               u64 lane_en : 4;
+       } s;
+       struct cvmx_ciu_qlm4_s cn68xx;
+       struct cvmx_ciu_qlm4_s cn68xxp1;
+};
+
+typedef union cvmx_ciu_qlm4 cvmx_ciu_qlm4_t;
+
+/**
+ * cvmx_ciu_qlm_dcok
+ */
+union cvmx_ciu_qlm_dcok {
+       u64 u64;
+       struct cvmx_ciu_qlm_dcok_s {
+               u64 reserved_4_63 : 60;
+               u64 qlm_dcok : 4;
+       } s;
+       struct cvmx_ciu_qlm_dcok_cn52xx {
+               u64 reserved_2_63 : 62;
+               u64 qlm_dcok : 2;
+       } cn52xx;
+       struct cvmx_ciu_qlm_dcok_cn52xx cn52xxp1;
+       struct cvmx_ciu_qlm_dcok_s cn56xx;
+       struct cvmx_ciu_qlm_dcok_s cn56xxp1;
+};
+
+typedef union cvmx_ciu_qlm_dcok cvmx_ciu_qlm_dcok_t;
+
+/**
+ * cvmx_ciu_qlm_jtgc
+ */
+union cvmx_ciu_qlm_jtgc {
+       u64 u64;
+       struct cvmx_ciu_qlm_jtgc_s {
+               u64 reserved_17_63 : 47;
+               u64 bypass_ext : 1;
+               u64 reserved_11_15 : 5;
+               u64 clk_div : 3;
+               u64 reserved_7_7 : 1;
+               u64 mux_sel : 3;
+               u64 bypass : 4;
+       } s;
+       struct cvmx_ciu_qlm_jtgc_cn52xx {
+               u64 reserved_11_63 : 53;
+               u64 clk_div : 3;
+               u64 reserved_5_7 : 3;
+               u64 mux_sel : 1;
+               u64 reserved_2_3 : 2;
+               u64 bypass : 2;
+       } cn52xx;
+       struct cvmx_ciu_qlm_jtgc_cn52xx cn52xxp1;
+       struct cvmx_ciu_qlm_jtgc_cn56xx {
+               u64 reserved_11_63 : 53;
+               u64 clk_div : 3;
+               u64 reserved_6_7 : 2;
+               u64 mux_sel : 2;
+               u64 bypass : 4;
+       } cn56xx;
+       struct cvmx_ciu_qlm_jtgc_cn56xx cn56xxp1;
+       struct cvmx_ciu_qlm_jtgc_cn61xx {
+               u64 reserved_11_63 : 53;
+               u64 clk_div : 3;
+               u64 reserved_6_7 : 2;
+               u64 mux_sel : 2;
+               u64 reserved_3_3 : 1;
+               u64 bypass : 3;
+       } cn61xx;
+       struct cvmx_ciu_qlm_jtgc_cn61xx cn63xx;
+       struct cvmx_ciu_qlm_jtgc_cn61xx cn63xxp1;
+       struct cvmx_ciu_qlm_jtgc_cn61xx cn66xx;
+       struct cvmx_ciu_qlm_jtgc_s cn68xx;
+       struct cvmx_ciu_qlm_jtgc_s cn68xxp1;
+       struct cvmx_ciu_qlm_jtgc_cn61xx cnf71xx;
+};
+
+typedef union cvmx_ciu_qlm_jtgc cvmx_ciu_qlm_jtgc_t;
+
+/**
+ * cvmx_ciu_qlm_jtgd
+ */
+union cvmx_ciu_qlm_jtgd {
+       u64 u64;
+       struct cvmx_ciu_qlm_jtgd_s {
+               u64 capture : 1;
+               u64 shift : 1;
+               u64 update : 1;
+               u64 reserved_45_60 : 16;
+               u64 select : 5;
+               u64 reserved_37_39 : 3;
+               u64 shft_cnt : 5;
+               u64 shft_reg : 32;
+       } s;
+       struct cvmx_ciu_qlm_jtgd_cn52xx {
+               u64 capture : 1;
+               u64 shift : 1;
+               u64 update : 1;
+               u64 reserved_42_60 : 19;
+               u64 select : 2;
+               u64 reserved_37_39 : 3;
+               u64 shft_cnt : 5;
+               u64 shft_reg : 32;
+       } cn52xx;
+       struct cvmx_ciu_qlm_jtgd_cn52xx cn52xxp1;
+       struct cvmx_ciu_qlm_jtgd_cn56xx {
+               u64 capture : 1;
+               u64 shift : 1;
+               u64 update : 1;
+               u64 reserved_44_60 : 17;
+               u64 select : 4;
+               u64 reserved_37_39 : 3;
+               u64 shft_cnt : 5;
+               u64 shft_reg : 32;
+       } cn56xx;
+       struct cvmx_ciu_qlm_jtgd_cn56xxp1 {
+               u64 capture : 1;
+               u64 shift : 1;
+               u64 update : 1;
+               u64 reserved_37_60 : 24;
+               u64 shft_cnt : 5;
+               u64 shft_reg : 32;
+       } cn56xxp1;
+       struct cvmx_ciu_qlm_jtgd_cn61xx {
+               u64 capture : 1;
+               u64 shift : 1;
+               u64 update : 1;
+               u64 reserved_43_60 : 18;
+               u64 select : 3;
+               u64 reserved_37_39 : 3;
+               u64 shft_cnt : 5;
+               u64 shft_reg : 32;
+       } cn61xx;
+       struct cvmx_ciu_qlm_jtgd_cn61xx cn63xx;
+       struct cvmx_ciu_qlm_jtgd_cn61xx cn63xxp1;
+       struct cvmx_ciu_qlm_jtgd_cn61xx cn66xx;
+       struct cvmx_ciu_qlm_jtgd_s cn68xx;
+       struct cvmx_ciu_qlm_jtgd_s cn68xxp1;
+       struct cvmx_ciu_qlm_jtgd_cn61xx cnf71xx;
+};
+
+typedef union cvmx_ciu_qlm_jtgd cvmx_ciu_qlm_jtgd_t;
+
+/**
+ * cvmx_ciu_soft_bist
+ */
+union cvmx_ciu_soft_bist {
+       u64 u64;
+       struct cvmx_ciu_soft_bist_s {
+               u64 reserved_1_63 : 63;
+               u64 soft_bist : 1;
+       } s;
+       struct cvmx_ciu_soft_bist_s cn30xx;
+       struct cvmx_ciu_soft_bist_s cn31xx;
+       struct cvmx_ciu_soft_bist_s cn38xx;
+       struct cvmx_ciu_soft_bist_s cn38xxp2;
+       struct cvmx_ciu_soft_bist_s cn50xx;
+       struct cvmx_ciu_soft_bist_s cn52xx;
+       struct cvmx_ciu_soft_bist_s cn52xxp1;
+       struct cvmx_ciu_soft_bist_s cn56xx;
+       struct cvmx_ciu_soft_bist_s cn56xxp1;
+       struct cvmx_ciu_soft_bist_s cn58xx;
+       struct cvmx_ciu_soft_bist_s cn58xxp1;
+       struct cvmx_ciu_soft_bist_s cn61xx;
+       struct cvmx_ciu_soft_bist_s cn63xx;
+       struct cvmx_ciu_soft_bist_s cn63xxp1;
+       struct cvmx_ciu_soft_bist_s cn66xx;
+       struct cvmx_ciu_soft_bist_s cn68xx;
+       struct cvmx_ciu_soft_bist_s cn68xxp1;
+       struct cvmx_ciu_soft_bist_s cn70xx;
+       struct cvmx_ciu_soft_bist_s cn70xxp1;
+       struct cvmx_ciu_soft_bist_s cnf71xx;
+};
+
+typedef union cvmx_ciu_soft_bist cvmx_ciu_soft_bist_t;
+
+/**
+ * cvmx_ciu_soft_prst
+ */
+union cvmx_ciu_soft_prst {
+       u64 u64;
+       struct cvmx_ciu_soft_prst_s {
+               u64 reserved_3_63 : 61;
+               u64 host64 : 1;
+               u64 npi : 1;
+               u64 soft_prst : 1;
+       } s;
+       struct cvmx_ciu_soft_prst_s cn30xx;
+       struct cvmx_ciu_soft_prst_s cn31xx;
+       struct cvmx_ciu_soft_prst_s cn38xx;
+       struct cvmx_ciu_soft_prst_s cn38xxp2;
+       struct cvmx_ciu_soft_prst_s cn50xx;
+       struct cvmx_ciu_soft_prst_cn52xx {
+               u64 reserved_1_63 : 63;
+               u64 soft_prst : 1;
+       } cn52xx;
+       struct cvmx_ciu_soft_prst_cn52xx cn52xxp1;
+       struct cvmx_ciu_soft_prst_cn52xx cn56xx;
+       struct cvmx_ciu_soft_prst_cn52xx cn56xxp1;
+       struct cvmx_ciu_soft_prst_s cn58xx;
+       struct cvmx_ciu_soft_prst_s cn58xxp1;
+       struct cvmx_ciu_soft_prst_cn52xx cn61xx;
+       struct cvmx_ciu_soft_prst_cn52xx cn63xx;
+       struct cvmx_ciu_soft_prst_cn52xx cn63xxp1;
+       struct cvmx_ciu_soft_prst_cn52xx cn66xx;
+       struct cvmx_ciu_soft_prst_cn52xx cn68xx;
+       struct cvmx_ciu_soft_prst_cn52xx cn68xxp1;
+       struct cvmx_ciu_soft_prst_cn52xx cnf71xx;
+};
+
+typedef union cvmx_ciu_soft_prst cvmx_ciu_soft_prst_t;
+
+/**
+ * cvmx_ciu_soft_prst1
+ */
+union cvmx_ciu_soft_prst1 {
+       u64 u64;
+       struct cvmx_ciu_soft_prst1_s {
+               u64 reserved_1_63 : 63;
+               u64 soft_prst : 1;
+       } s;
+       struct cvmx_ciu_soft_prst1_s cn52xx;
+       struct cvmx_ciu_soft_prst1_s cn52xxp1;
+       struct cvmx_ciu_soft_prst1_s cn56xx;
+       struct cvmx_ciu_soft_prst1_s cn56xxp1;
+       struct cvmx_ciu_soft_prst1_s cn61xx;
+       struct cvmx_ciu_soft_prst1_s cn63xx;
+       struct cvmx_ciu_soft_prst1_s cn63xxp1;
+       struct cvmx_ciu_soft_prst1_s cn66xx;
+       struct cvmx_ciu_soft_prst1_s cn68xx;
+       struct cvmx_ciu_soft_prst1_s cn68xxp1;
+       struct cvmx_ciu_soft_prst1_s cnf71xx;
+};
+
+typedef union cvmx_ciu_soft_prst1 cvmx_ciu_soft_prst1_t;
+
+/**
+ * cvmx_ciu_soft_prst2
+ */
+union cvmx_ciu_soft_prst2 {
+       u64 u64;
+       struct cvmx_ciu_soft_prst2_s {
+               u64 reserved_1_63 : 63;
+               u64 soft_prst : 1;
+       } s;
+       struct cvmx_ciu_soft_prst2_s cn66xx;
+};
+
+typedef union cvmx_ciu_soft_prst2 cvmx_ciu_soft_prst2_t;
+
+/**
+ * cvmx_ciu_soft_prst3
+ */
+union cvmx_ciu_soft_prst3 {
+       u64 u64;
+       struct cvmx_ciu_soft_prst3_s {
+               u64 reserved_1_63 : 63;
+               u64 soft_prst : 1;
+       } s;
+       struct cvmx_ciu_soft_prst3_s cn66xx;
+};
+
+typedef union cvmx_ciu_soft_prst3 cvmx_ciu_soft_prst3_t;
+
+/**
+ * cvmx_ciu_soft_rst
+ */
+union cvmx_ciu_soft_rst {
+       u64 u64;
+       struct cvmx_ciu_soft_rst_s {
+               u64 reserved_1_63 : 63;
+               u64 soft_rst : 1;
+       } s;
+       struct cvmx_ciu_soft_rst_s cn30xx;
+       struct cvmx_ciu_soft_rst_s cn31xx;
+       struct cvmx_ciu_soft_rst_s cn38xx;
+       struct cvmx_ciu_soft_rst_s cn38xxp2;
+       struct cvmx_ciu_soft_rst_s cn50xx;
+       struct cvmx_ciu_soft_rst_s cn52xx;
+       struct cvmx_ciu_soft_rst_s cn52xxp1;
+       struct cvmx_ciu_soft_rst_s cn56xx;
+       struct cvmx_ciu_soft_rst_s cn56xxp1;
+       struct cvmx_ciu_soft_rst_s cn58xx;
+       struct cvmx_ciu_soft_rst_s cn58xxp1;
+       struct cvmx_ciu_soft_rst_s cn61xx;
+       struct cvmx_ciu_soft_rst_s cn63xx;
+       struct cvmx_ciu_soft_rst_s cn63xxp1;
+       struct cvmx_ciu_soft_rst_s cn66xx;
+       struct cvmx_ciu_soft_rst_s cn68xx;
+       struct cvmx_ciu_soft_rst_s cn68xxp1;
+       struct cvmx_ciu_soft_rst_s cnf71xx;
+};
+
+typedef union cvmx_ciu_soft_rst cvmx_ciu_soft_rst_t;
+
+/**
+ * cvmx_ciu_sum1_io#_int
+ *
+ * CIU_SUM1_IO0_INT is for PEM0, CIU_SUM1_IO1_INT is reserved.
+ *
+ */
+union cvmx_ciu_sum1_iox_int {
+       u64 u64;
+       struct cvmx_ciu_sum1_iox_int_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 reserved_10_16 : 7;
+               u64 wdog : 10;
+       } s;
+       struct cvmx_ciu_sum1_iox_int_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum1_iox_int_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_sum1_iox_int_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum1_iox_int_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum1_iox_int_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum1_iox_int cvmx_ciu_sum1_iox_int_t;
+
+/**
+ * cvmx_ciu_sum1_pp#_ip2
+ *
+ * SUM1 becomes per IPx in o65/6 and afterwards. Only Field <40> DPI_DMA will have
+ * different value per PP(IP) for  $CIU_SUM1_PPx_IPy, and <40> DPI_DMA will always
+ * be zero for  $CIU_SUM1_IOX_INT. All other fields ([63:41] and [39:0]) values  are idential for
+ * different PPs, same value as $CIU_INT_SUM1.
+ * Write to any IRQ's PTP fields will clear PTP for all IRQ's PTP field.
+ */
+union cvmx_ciu_sum1_ppx_ip2 {
+       u64 u64;
+       struct cvmx_ciu_sum1_ppx_ip2_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 reserved_10_16 : 7;
+               u64 wdog : 10;
+       } s;
+       struct cvmx_ciu_sum1_ppx_ip2_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum1_ppx_ip2_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_sum1_ppx_ip2_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum1_ppx_ip2_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum1_ppx_ip2_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum1_ppx_ip2 cvmx_ciu_sum1_ppx_ip2_t;
+
+/**
+ * cvmx_ciu_sum1_pp#_ip3
+ *
+ * Notes:
+ * SUM1 becomes per IPx in o65/6 and afterwards. Only Field <40> DPI_DMA will have
+ * different value per PP(IP) for  $CIU_SUM1_PPx_IPy, and <40> DPI_DMA will always
+ * be zero for  $CIU_SUM1_IOX_INT. All other fields ([63:41] and [39:0]) values  are idential for
+ * different PPs, same value as $CIU_INT_SUM1.
+ * Write to any IRQ's PTP fields will clear PTP for all IRQ's PTP field.
+ */
+union cvmx_ciu_sum1_ppx_ip3 {
+       u64 u64;
+       struct cvmx_ciu_sum1_ppx_ip3_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 reserved_10_16 : 7;
+               u64 wdog : 10;
+       } s;
+       struct cvmx_ciu_sum1_ppx_ip3_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum1_ppx_ip3_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_sum1_ppx_ip3_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum1_ppx_ip3_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum1_ppx_ip3_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum1_ppx_ip3 cvmx_ciu_sum1_ppx_ip3_t;
+
+/**
+ * cvmx_ciu_sum1_pp#_ip4
+ *
+ * Notes:
+ * SUM1 becomes per IPx in o65/6 and afterwards. Only Field <40> DPI_DMA will have
+ * different value per PP(IP) for  $CIU_SUM1_PPx_IPy, and <40> DPI_DMA will always
+ * be zero for  $CIU_SUM1_IOX_INT. All other fields ([63:41] and [39:0]) values  are idential for
+ * different PPs, same value as $CIU_INT_SUM1.
+ * Write to any IRQ's PTP fields will clear PTP for all IRQ's PTP field.
+ */
+union cvmx_ciu_sum1_ppx_ip4 {
+       u64 u64;
+       struct cvmx_ciu_sum1_ppx_ip4_s {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 usb1 : 1;
+               u64 reserved_10_16 : 7;
+               u64 wdog : 10;
+       } s;
+       struct cvmx_ciu_sum1_ppx_ip4_cn61xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_4_17 : 14;
+               u64 wdog : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum1_ppx_ip4_cn66xx {
+               u64 rst : 1;
+               u64 reserved_62_62 : 1;
+               u64 srio3 : 1;
+               u64 srio2 : 1;
+               u64 reserved_57_59 : 3;
+               u64 dfm : 1;
+               u64 reserved_53_55 : 3;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 srio0 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_38_45 : 8;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 zip : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 mii1 : 1;
+               u64 reserved_10_17 : 8;
+               u64 wdog : 10;
+       } cn66xx;
+       struct cvmx_ciu_sum1_ppx_ip4_cn70xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_51_51 : 1;
+               u64 pem2 : 1;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 agl : 1;
+               u64 reserved_41_45 : 5;
+               u64 dpi_dma : 1;
+               u64 reserved_38_39 : 2;
+               u64 agx1 : 1;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 dfa : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_18_18 : 1;
+               u64 usb1 : 1;
+               u64 reserved_4_16 : 13;
+               u64 wdog : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum1_ppx_ip4_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum1_ppx_ip4_cnf71xx {
+               u64 rst : 1;
+               u64 reserved_53_62 : 10;
+               u64 lmc0 : 1;
+               u64 reserved_50_51 : 2;
+               u64 pem1 : 1;
+               u64 pem0 : 1;
+               u64 ptp : 1;
+               u64 reserved_41_46 : 6;
+               u64 dpi_dma : 1;
+               u64 reserved_37_39 : 3;
+               u64 agx0 : 1;
+               u64 dpi : 1;
+               u64 sli : 1;
+               u64 usb : 1;
+               u64 reserved_32_32 : 1;
+               u64 key : 1;
+               u64 rad : 1;
+               u64 tim : 1;
+               u64 reserved_28_28 : 1;
+               u64 pko : 1;
+               u64 pip : 1;
+               u64 ipd : 1;
+               u64 l2c : 1;
+               u64 pow : 1;
+               u64 fpa : 1;
+               u64 iob : 1;
+               u64 mio : 1;
+               u64 nand : 1;
+               u64 reserved_4_18 : 15;
+               u64 wdog : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum1_ppx_ip4 cvmx_ciu_sum1_ppx_ip4_t;
+
+/**
+ * cvmx_ciu_sum2_io#_int
+ *
+ * CIU_SUM2_IO0_INT is for PEM0, CIU_SUM2_IO1_INT is reserved.
+ *
+ */
+union cvmx_ciu_sum2_iox_int {
+       u64 u64;
+       struct cvmx_ciu_sum2_iox_int_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_sum2_iox_int_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum2_iox_int_cn61xx cn66xx;
+       struct cvmx_ciu_sum2_iox_int_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum2_iox_int_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum2_iox_int_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum2_iox_int cvmx_ciu_sum2_iox_int_t;
+
+/**
+ * cvmx_ciu_sum2_pp#_ip2
+ *
+ * Only TIMER field may have different value per PP(IP).
+ * All other fields  values  are idential for different PPs.
+ */
+union cvmx_ciu_sum2_ppx_ip2 {
+       u64 u64;
+       struct cvmx_ciu_sum2_ppx_ip2_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_sum2_ppx_ip2_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum2_ppx_ip2_cn61xx cn66xx;
+       struct cvmx_ciu_sum2_ppx_ip2_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum2_ppx_ip2_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum2_ppx_ip2_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum2_ppx_ip2 cvmx_ciu_sum2_ppx_ip2_t;
+
+/**
+ * cvmx_ciu_sum2_pp#_ip3
+ *
+ * Notes:
+ * These SUM2 CSR's did not exist prior to pass 1.2. CIU_TIM4-9 did not exist prior to pass 1.2.
+ *
+ */
+union cvmx_ciu_sum2_ppx_ip3 {
+       u64 u64;
+       struct cvmx_ciu_sum2_ppx_ip3_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_sum2_ppx_ip3_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum2_ppx_ip3_cn61xx cn66xx;
+       struct cvmx_ciu_sum2_ppx_ip3_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum2_ppx_ip3_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum2_ppx_ip3_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum2_ppx_ip3 cvmx_ciu_sum2_ppx_ip3_t;
+
+/**
+ * cvmx_ciu_sum2_pp#_ip4
+ *
+ * Notes:
+ * These SUM2 CSR's did not exist prior to pass 1.2. CIU_TIM4-9 did not exist prior to pass 1.2.
+ *
+ */
+union cvmx_ciu_sum2_ppx_ip4 {
+       u64 u64;
+       struct cvmx_ciu_sum2_ppx_ip4_s {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_15_15 : 1;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_ciu_sum2_ppx_ip4_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_ciu_sum2_ppx_ip4_cn61xx cn66xx;
+       struct cvmx_ciu_sum2_ppx_ip4_cn70xx {
+               u64 reserved_20_63 : 44;
+               u64 bch : 1;
+               u64 agl_drp : 1;
+               u64 ocla : 1;
+               u64 sata : 1;
+               u64 reserved_10_15 : 6;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_ciu_sum2_ppx_ip4_cn70xx cn70xxp1;
+       struct cvmx_ciu_sum2_ppx_ip4_cnf71xx {
+               u64 reserved_15_63 : 49;
+               u64 endor : 2;
+               u64 eoi : 1;
+               u64 reserved_10_11 : 2;
+               u64 timer : 6;
+               u64 reserved_0_3 : 4;
+       } cnf71xx;
+};
+
+typedef union cvmx_ciu_sum2_ppx_ip4 cvmx_ciu_sum2_ppx_ip4_t;
+
+/**
+ * cvmx_ciu_tim#
+ *
+ * Notes:
+ * CIU_TIM4-9 did not exist prior to pass 1.2
+ *
+ */
+union cvmx_ciu_timx {
+       u64 u64;
+       struct cvmx_ciu_timx_s {
+               u64 reserved_37_63 : 27;
+               u64 one_shot : 1;
+               u64 len : 36;
+       } s;
+       struct cvmx_ciu_timx_s cn30xx;
+       struct cvmx_ciu_timx_s cn31xx;
+       struct cvmx_ciu_timx_s cn38xx;
+       struct cvmx_ciu_timx_s cn38xxp2;
+       struct cvmx_ciu_timx_s cn50xx;
+       struct cvmx_ciu_timx_s cn52xx;
+       struct cvmx_ciu_timx_s cn52xxp1;
+       struct cvmx_ciu_timx_s cn56xx;
+       struct cvmx_ciu_timx_s cn56xxp1;
+       struct cvmx_ciu_timx_s cn58xx;
+       struct cvmx_ciu_timx_s cn58xxp1;
+       struct cvmx_ciu_timx_s cn61xx;
+       struct cvmx_ciu_timx_s cn63xx;
+       struct cvmx_ciu_timx_s cn63xxp1;
+       struct cvmx_ciu_timx_s cn66xx;
+       struct cvmx_ciu_timx_s cn68xx;
+       struct cvmx_ciu_timx_s cn68xxp1;
+       struct cvmx_ciu_timx_s cn70xx;
+       struct cvmx_ciu_timx_s cn70xxp1;
+       struct cvmx_ciu_timx_s cnf71xx;
+};
+
+typedef union cvmx_ciu_timx cvmx_ciu_timx_t;
+
+/**
+ * cvmx_ciu_tim_multi_cast
+ *
+ * Notes:
+ * This register does not exist prior to pass 1.2 silicon. Those earlier chip passes operate as if
+ * EN==0.
+ */
+union cvmx_ciu_tim_multi_cast {
+       u64 u64;
+       struct cvmx_ciu_tim_multi_cast_s {
+               u64 reserved_1_63 : 63;
+               u64 en : 1;
+       } s;
+       struct cvmx_ciu_tim_multi_cast_s cn61xx;
+       struct cvmx_ciu_tim_multi_cast_s cn66xx;
+       struct cvmx_ciu_tim_multi_cast_s cn70xx;
+       struct cvmx_ciu_tim_multi_cast_s cn70xxp1;
+       struct cvmx_ciu_tim_multi_cast_s cnf71xx;
+};
+
+typedef union cvmx_ciu_tim_multi_cast cvmx_ciu_tim_multi_cast_t;
+
+/**
+ * cvmx_ciu_wdog#
+ */
+union cvmx_ciu_wdogx {
+       u64 u64;
+       struct cvmx_ciu_wdogx_s {
+               u64 reserved_46_63 : 18;
+               u64 gstopen : 1;
+               u64 dstop : 1;
+               u64 cnt : 24;
+               u64 len : 16;
+               u64 state : 2;
+               u64 mode : 2;
+       } s;
+       struct cvmx_ciu_wdogx_s cn30xx;
+       struct cvmx_ciu_wdogx_s cn31xx;
+       struct cvmx_ciu_wdogx_s cn38xx;
+       struct cvmx_ciu_wdogx_s cn38xxp2;
+       struct cvmx_ciu_wdogx_s cn50xx;
+       struct cvmx_ciu_wdogx_s cn52xx;
+       struct cvmx_ciu_wdogx_s cn52xxp1;
+       struct cvmx_ciu_wdogx_s cn56xx;
+       struct cvmx_ciu_wdogx_s cn56xxp1;
+       struct cvmx_ciu_wdogx_s cn58xx;
+       struct cvmx_ciu_wdogx_s cn58xxp1;
+       struct cvmx_ciu_wdogx_s cn61xx;
+       struct cvmx_ciu_wdogx_s cn63xx;
+       struct cvmx_ciu_wdogx_s cn63xxp1;
+       struct cvmx_ciu_wdogx_s cn66xx;
+       struct cvmx_ciu_wdogx_s cn68xx;
+       struct cvmx_ciu_wdogx_s cn68xxp1;
+       struct cvmx_ciu_wdogx_s cn70xx;
+       struct cvmx_ciu_wdogx_s cn70xxp1;
+       struct cvmx_ciu_wdogx_s cn73xx;
+       struct cvmx_ciu_wdogx_s cn78xx;
+       struct cvmx_ciu_wdogx_s cn78xxp1;
+       struct cvmx_ciu_wdogx_s cnf71xx;
+       struct cvmx_ciu_wdogx_s cnf75xx;
+};
+
+typedef union cvmx_ciu_wdogx cvmx_ciu_wdogx_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-cmd-queue.h b/arch/mips/mach-octeon/include/mach/cvmx-cmd-queue.h
new file mode 100644 (file)
index 0000000..ddc2943
--- /dev/null
@@ -0,0 +1,441 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Support functions for managing command queues used for
+ * various hardware blocks.
+ *
+ * The common command queue infrastructure abstracts out the
+ * software necessary for adding to Octeon's chained queue
+ * structures. These structures are used for commands to the
+ * PKO, ZIP, DFA, RAID, HNA, and DMA engine blocks. Although each
+ * hardware unit takes commands and CSRs of different types,
+ * they all use basic linked command buffers to store the
+ * pending request. In general, users of the CVMX API don't
+ * call cvmx-cmd-queue functions directly. Instead the hardware
+ * unit specific wrapper should be used. The wrappers perform
+ * unit specific validation and CSR writes to submit the
+ * commands.
+ *
+ * Even though most software will never directly interact with
+ * cvmx-cmd-queue, knowledge of its internal workings can help
+ * in diagnosing performance problems and help with debugging.
+ *
+ * Command queue pointers are stored in a global named block
+ * called "cvmx_cmd_queues". Except for the PKO queues, each
+ * hardware queue is stored in its own cache line to reduce SMP
+ * contention on spin locks. The PKO queues are stored such that
+ * every 16th queue is next to each other in memory. This scheme
+ * allows for queues being in separate cache lines when there
+ * are low number of queues per port. With 16 queues per port,
+ * the first queue for each port is in the same cache area. The
+ * second queues for each port are in another area, etc. This
+ * allows software to implement very efficient lockless PKO with
+ * 16 queues per port using a minimum of cache lines per core.
+ * All queues for a given core will be isolated in the same
+ * cache area.
+ *
+ * In addition to the memory pointer layout, cvmx-cmd-queue
+ * provides an optimized fair ll/sc locking mechanism for the
+ * queues. The lock uses a "ticket / now serving" model to
+ * maintain fair order on contended locks. In addition, it uses
+ * predicted locking time to limit cache contention. When a core
+ * know it must wait in line for a lock, it spins on the
+ * internal cycle counter to completely eliminate any causes of
+ * bus traffic.
+ */
+
+#ifndef __CVMX_CMD_QUEUE_H__
+#define __CVMX_CMD_QUEUE_H__
+
+/**
+ * By default we disable the max depth support. Most programs
+ * don't use it and it slows down the command queue processing
+ * significantly.
+ */
+#ifndef CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH
+#define CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH 0
+#endif
+
+/**
+ * Enumeration representing all hardware blocks that use command
+ * queues. Each hardware block has up to 65536 sub identifiers for
+ * multiple command queues. Not all chips support all hardware
+ * units.
+ */
+typedef enum {
+       CVMX_CMD_QUEUE_PKO_BASE = 0x00000,
+#define CVMX_CMD_QUEUE_PKO(queue)                                                                  \
+       ((cvmx_cmd_queue_id_t)(CVMX_CMD_QUEUE_PKO_BASE + (0xffff & (queue))))
+       CVMX_CMD_QUEUE_ZIP = 0x10000,
+#define CVMX_CMD_QUEUE_ZIP_QUE(queue)                                                              \
+       ((cvmx_cmd_queue_id_t)(CVMX_CMD_QUEUE_ZIP + (0xffff & (queue))))
+       CVMX_CMD_QUEUE_DFA = 0x20000,
+       CVMX_CMD_QUEUE_RAID = 0x30000,
+       CVMX_CMD_QUEUE_DMA_BASE = 0x40000,
+#define CVMX_CMD_QUEUE_DMA(queue)                                                                  \
+       ((cvmx_cmd_queue_id_t)(CVMX_CMD_QUEUE_DMA_BASE + (0xffff & (queue))))
+       CVMX_CMD_QUEUE_BCH = 0x50000,
+#define CVMX_CMD_QUEUE_BCH(queue) ((cvmx_cmd_queue_id_t)(CVMX_CMD_QUEUE_BCH + (0xffff & (queue))))
+       CVMX_CMD_QUEUE_HNA = 0x60000,
+       CVMX_CMD_QUEUE_END = 0x70000,
+} cvmx_cmd_queue_id_t;
+
+#define CVMX_CMD_QUEUE_ZIP3_QUE(node, queue)                                                       \
+       ((cvmx_cmd_queue_id_t)((node) << 24 | CVMX_CMD_QUEUE_ZIP | (0xffff & (queue))))
+
+/**
+ * Command write operations can fail if the command queue needs
+ * a new buffer and the associated FPA pool is empty. It can also
+ * fail if the number of queued command words reaches the maximum
+ * set at initialization.
+ */
+typedef enum {
+       CVMX_CMD_QUEUE_SUCCESS = 0,
+       CVMX_CMD_QUEUE_NO_MEMORY = -1,
+       CVMX_CMD_QUEUE_FULL = -2,
+       CVMX_CMD_QUEUE_INVALID_PARAM = -3,
+       CVMX_CMD_QUEUE_ALREADY_SETUP = -4,
+} cvmx_cmd_queue_result_t;
+
+typedef struct {
+       /* First 64-bit word: */
+       u64 fpa_pool : 16;
+       u64 base_paddr : 48;
+       s32 index;
+       u16 max_depth;
+       u16 pool_size_m1;
+} __cvmx_cmd_queue_state_t;
+
+/**
+ * command-queue locking uses a fair ticket spinlock algo,
+ * with 64-bit tickets for endianness-neutrality and
+ * counter overflow protection.
+ * Lock is free when both counters are of equal value.
+ */
+typedef struct {
+       u64 ticket;
+       u64 now_serving;
+} __cvmx_cmd_queue_lock_t;
+
+/**
+ * @INTERNAL
+ * This structure contains the global state of all command queues.
+ * It is stored in a bootmem named block and shared by all
+ * applications running on Octeon. Tickets are stored in a different
+ * cache line that queue information to reduce the contention on the
+ * ll/sc used to get a ticket. If this is not the case, the update
+ * of queue state causes the ll/sc to fail quite often.
+ */
+typedef struct {
+       __cvmx_cmd_queue_lock_t lock[(CVMX_CMD_QUEUE_END >> 16) * 256];
+       __cvmx_cmd_queue_state_t state[(CVMX_CMD_QUEUE_END >> 16) * 256];
+} __cvmx_cmd_queue_all_state_t;
+
+extern __cvmx_cmd_queue_all_state_t *__cvmx_cmd_queue_state_ptrs[CVMX_MAX_NODES];
+
+/**
+ * @INTERNAL
+ * Internal function to handle the corner cases
+ * of adding command words to a queue when the current
+ * block is getting full.
+ */
+cvmx_cmd_queue_result_t __cvmx_cmd_queue_write_raw(cvmx_cmd_queue_id_t queue_id,
+                                                  __cvmx_cmd_queue_state_t *qptr, int cmd_count,
+                                                  const u64 *cmds);
+
+/**
+ * Initialize a command queue for use. The initial FPA buffer is
+ * allocated and the hardware unit is configured to point to the
+ * new command queue.
+ *
+ * @param queue_id  Hardware command queue to initialize.
+ * @param max_depth Maximum outstanding commands that can be queued.
+ * @param fpa_pool  FPA pool the command queues should come from.
+ * @param pool_size Size of each buffer in the FPA pool (bytes)
+ *
+ * @return CVMX_CMD_QUEUE_SUCCESS or a failure code
+ */
+cvmx_cmd_queue_result_t cvmx_cmd_queue_initialize(cvmx_cmd_queue_id_t queue_id, int max_depth,
+                                                 int fpa_pool, int pool_size);
+
+/**
+ * Shutdown a queue a free it's command buffers to the FPA. The
+ * hardware connected to the queue must be stopped before this
+ * function is called.
+ *
+ * @param queue_id Queue to shutdown
+ *
+ * @return CVMX_CMD_QUEUE_SUCCESS or a failure code
+ */
+cvmx_cmd_queue_result_t cvmx_cmd_queue_shutdown(cvmx_cmd_queue_id_t queue_id);
+
+/**
+ * Return the number of command words pending in the queue. This
+ * function may be relatively slow for some hardware units.
+ *
+ * @param queue_id Hardware command queue to query
+ *
+ * @return Number of outstanding commands
+ */
+int cvmx_cmd_queue_length(cvmx_cmd_queue_id_t queue_id);
+
+/**
+ * Return the command buffer to be written to. The purpose of this
+ * function is to allow CVMX routine access to the low level buffer
+ * for initial hardware setup. User applications should not call this
+ * function directly.
+ *
+ * @param queue_id Command queue to query
+ *
+ * @return Command buffer or NULL on failure
+ */
+void *cvmx_cmd_queue_buffer(cvmx_cmd_queue_id_t queue_id);
+
+/**
+ * @INTERNAL
+ * Retrieve or allocate command queue state named block
+ */
+cvmx_cmd_queue_result_t __cvmx_cmd_queue_init_state_ptr(unsigned int node);
+
+/**
+ * @INTERNAL
+ * Get the index into the state arrays for the supplied queue id.
+ *
+ * @param queue_id Queue ID to get an index for
+ *
+ * @return Index into the state arrays
+ */
+static inline unsigned int __cvmx_cmd_queue_get_index(cvmx_cmd_queue_id_t queue_id)
+{
+       /* Warning: This code currently only works with devices that have 256
+        * queues or less.  Devices with more than 16 queues are laid out in
+        * memory to allow cores quick access to every 16th queue. This reduces
+        * cache thrashing when you are running 16 queues per port to support
+        * lockless operation
+        */
+       unsigned int unit = (queue_id >> 16) & 0xff;
+       unsigned int q = (queue_id >> 4) & 0xf;
+       unsigned int core = queue_id & 0xf;
+
+       return (unit << 8) | (core << 4) | q;
+}
+
+static inline int __cvmx_cmd_queue_get_node(cvmx_cmd_queue_id_t queue_id)
+{
+       unsigned int node = queue_id >> 24;
+       return node;
+}
+
+/**
+ * @INTERNAL
+ * Lock the supplied queue so nobody else is updating it at the same
+ * time as us.
+ *
+ * @param queue_id Queue ID to lock
+ *
+ */
+static inline void __cvmx_cmd_queue_lock(cvmx_cmd_queue_id_t queue_id)
+{
+}
+
+/**
+ * @INTERNAL
+ * Unlock the queue, flushing all writes.
+ *
+ * @param queue_id Queue ID to lock
+ *
+ */
+static inline void __cvmx_cmd_queue_unlock(cvmx_cmd_queue_id_t queue_id)
+{
+       CVMX_SYNCWS; /* nudge out the unlock. */
+}
+
+/**
+ * @INTERNAL
+ * Initialize a command-queue lock to "unlocked" state.
+ */
+static inline void __cvmx_cmd_queue_lock_init(cvmx_cmd_queue_id_t queue_id)
+{
+       unsigned int index = __cvmx_cmd_queue_get_index(queue_id);
+       unsigned int node = __cvmx_cmd_queue_get_node(queue_id);
+
+       __cvmx_cmd_queue_state_ptrs[node]->lock[index] = (__cvmx_cmd_queue_lock_t){ 0, 0 };
+       CVMX_SYNCWS;
+}
+
+/**
+ * @INTERNAL
+ * Get the queue state structure for the given queue id
+ *
+ * @param queue_id Queue id to get
+ *
+ * @return Queue structure or NULL on failure
+ */
+static inline __cvmx_cmd_queue_state_t *__cvmx_cmd_queue_get_state(cvmx_cmd_queue_id_t queue_id)
+{
+       unsigned int index;
+       unsigned int node;
+       __cvmx_cmd_queue_state_t *qptr;
+
+       node = __cvmx_cmd_queue_get_node(queue_id);
+       index = __cvmx_cmd_queue_get_index(queue_id);
+
+       if (cvmx_unlikely(!__cvmx_cmd_queue_state_ptrs[node]))
+               __cvmx_cmd_queue_init_state_ptr(node);
+
+       qptr = &__cvmx_cmd_queue_state_ptrs[node]->state[index];
+       return qptr;
+}
+
+/**
+ * Write an arbitrary number of command words to a command queue.
+ * This is a generic function; the fixed number of command word
+ * functions yield higher performance.
+ *
+ * @param queue_id  Hardware command queue to write to
+ * @param use_locking
+ *                  Use internal locking to ensure exclusive access for queue
+ *                  updates. If you don't use this locking you must ensure
+ *                  exclusivity some other way. Locking is strongly recommended.
+ * @param cmd_count Number of command words to write
+ * @param cmds      Array of commands to write
+ *
+ * @return CVMX_CMD_QUEUE_SUCCESS or a failure code
+ */
+static inline cvmx_cmd_queue_result_t
+cvmx_cmd_queue_write(cvmx_cmd_queue_id_t queue_id, bool use_locking, int cmd_count, const u64 *cmds)
+{
+       cvmx_cmd_queue_result_t ret = CVMX_CMD_QUEUE_SUCCESS;
+       u64 *cmd_ptr;
+
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+
+       /* Make sure nobody else is updating the same queue */
+       if (cvmx_likely(use_locking))
+               __cvmx_cmd_queue_lock(queue_id);
+
+       /* Most of the time there is lots of free words in current block */
+       if (cvmx_unlikely((qptr->index + cmd_count) >= qptr->pool_size_m1)) {
+               /* The rare case when nearing end of block */
+               ret = __cvmx_cmd_queue_write_raw(queue_id, qptr, cmd_count, cmds);
+       } else {
+               cmd_ptr = (u64 *)cvmx_phys_to_ptr((u64)qptr->base_paddr);
+               /* Loop easy for compiler to unroll for the likely case */
+               while (cmd_count > 0) {
+                       cmd_ptr[qptr->index++] = *cmds++;
+                       cmd_count--;
+               }
+       }
+
+       /* All updates are complete. Release the lock and return */
+       if (cvmx_likely(use_locking))
+               __cvmx_cmd_queue_unlock(queue_id);
+       else
+               CVMX_SYNCWS;
+
+       return ret;
+}
+
+/**
+ * Simple function to write two command words to a command queue.
+ *
+ * @param queue_id Hardware command queue to write to
+ * @param use_locking
+ *                 Use internal locking to ensure exclusive access for queue
+ *                 updates. If you don't use this locking you must ensure
+ *                 exclusivity some other way. Locking is strongly recommended.
+ * @param cmd1     Command
+ * @param cmd2     Command
+ *
+ * @return CVMX_CMD_QUEUE_SUCCESS or a failure code
+ */
+static inline cvmx_cmd_queue_result_t cvmx_cmd_queue_write2(cvmx_cmd_queue_id_t queue_id,
+                                                           bool use_locking, u64 cmd1, u64 cmd2)
+{
+       cvmx_cmd_queue_result_t ret = CVMX_CMD_QUEUE_SUCCESS;
+       u64 *cmd_ptr;
+
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+
+       /* Make sure nobody else is updating the same queue */
+       if (cvmx_likely(use_locking))
+               __cvmx_cmd_queue_lock(queue_id);
+
+       if (cvmx_unlikely((qptr->index + 2) >= qptr->pool_size_m1)) {
+               /* The rare case when nearing end of block */
+               u64 cmds[2];
+
+               cmds[0] = cmd1;
+               cmds[1] = cmd2;
+               ret = __cvmx_cmd_queue_write_raw(queue_id, qptr, 2, cmds);
+       } else {
+               /* Likely case to work fast */
+               cmd_ptr = (u64 *)cvmx_phys_to_ptr((u64)qptr->base_paddr);
+               cmd_ptr += qptr->index;
+               qptr->index += 2;
+               cmd_ptr[0] = cmd1;
+               cmd_ptr[1] = cmd2;
+       }
+
+       /* All updates are complete. Release the lock and return */
+       if (cvmx_likely(use_locking))
+               __cvmx_cmd_queue_unlock(queue_id);
+       else
+               CVMX_SYNCWS;
+
+       return ret;
+}
+
+/**
+ * Simple function to write three command words to a command queue.
+ *
+ * @param queue_id Hardware command queue to write to
+ * @param use_locking
+ *                 Use internal locking to ensure exclusive access for queue
+ *                 updates. If you don't use this locking you must ensure
+ *                 exclusivity some other way. Locking is strongly recommended.
+ * @param cmd1     Command
+ * @param cmd2     Command
+ * @param cmd3     Command
+ *
+ * @return CVMX_CMD_QUEUE_SUCCESS or a failure code
+ */
+static inline cvmx_cmd_queue_result_t
+cvmx_cmd_queue_write3(cvmx_cmd_queue_id_t queue_id, bool use_locking, u64 cmd1, u64 cmd2, u64 cmd3)
+{
+       cvmx_cmd_queue_result_t ret = CVMX_CMD_QUEUE_SUCCESS;
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+       u64 *cmd_ptr;
+
+       /* Make sure nobody else is updating the same queue */
+       if (cvmx_likely(use_locking))
+               __cvmx_cmd_queue_lock(queue_id);
+
+       if (cvmx_unlikely((qptr->index + 3) >= qptr->pool_size_m1)) {
+               /* Most of the time there is lots of free words in current block */
+               u64 cmds[3];
+
+               cmds[0] = cmd1;
+               cmds[1] = cmd2;
+               cmds[2] = cmd3;
+               ret = __cvmx_cmd_queue_write_raw(queue_id, qptr, 3, cmds);
+       } else {
+               cmd_ptr = (u64 *)cvmx_phys_to_ptr((u64)qptr->base_paddr);
+               cmd_ptr += qptr->index;
+               qptr->index += 3;
+               cmd_ptr[0] = cmd1;
+               cmd_ptr[1] = cmd2;
+               cmd_ptr[2] = cmd3;
+       }
+
+       /* All updates are complete. Release the lock and return */
+       if (cvmx_likely(use_locking))
+               __cvmx_cmd_queue_unlock(queue_id);
+       else
+               CVMX_SYNCWS;
+
+       return ret;
+}
+
+#endif /* __CVMX_CMD_QUEUE_H__ */
index c34ff46..314b6d9 100644 (file)
@@ -741,8 +741,9 @@ void cvmx_coremask_print(const struct cvmx_coremask *pcm);
 
 static inline void cvmx_coremask_dprint(const struct cvmx_coremask *pcm)
 {
-       if (IS_ENABLED(DEBUG))
-               cvmx_coremask_print(pcm);
+#if defined(DEBUG)
+       cvmx_coremask_print(pcm);
+#endif
 }
 
 struct cvmx_coremask *octeon_get_available_coremask(struct cvmx_coremask *pcm);
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-csr-enums.h b/arch/mips/mach-octeon/include/mach/cvmx-csr-enums.h
new file mode 100644 (file)
index 0000000..a8625b4
--- /dev/null
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Definitions for enumerations used with Octeon CSRs.
+ */
+
+#ifndef __CVMX_CSR_ENUMS_H__
+#define __CVMX_CSR_ENUMS_H__
+
+typedef enum {
+       CVMX_IPD_OPC_MODE_STT = 0LL,
+       CVMX_IPD_OPC_MODE_STF = 1LL,
+       CVMX_IPD_OPC_MODE_STF1_STT = 2LL,
+       CVMX_IPD_OPC_MODE_STF2_STT = 3LL
+} cvmx_ipd_mode_t;
+
+/**
+ * Enumeration representing the amount of packet processing
+ * and validation performed by the input hardware.
+ */
+typedef enum {
+       CVMX_PIP_PORT_CFG_MODE_NONE = 0ull,
+       CVMX_PIP_PORT_CFG_MODE_SKIPL2 = 1ull,
+       CVMX_PIP_PORT_CFG_MODE_SKIPIP = 2ull
+} cvmx_pip_port_parse_mode_t;
+
+/**
+ * This enumeration controls how a QoS watcher matches a packet.
+ *
+ * @deprecated  This enumeration was used with cvmx_pip_config_watcher which has
+ *              been deprecated.
+ */
+typedef enum {
+       CVMX_PIP_QOS_WATCH_DISABLE = 0ull,
+       CVMX_PIP_QOS_WATCH_PROTNH = 1ull,
+       CVMX_PIP_QOS_WATCH_TCP = 2ull,
+       CVMX_PIP_QOS_WATCH_UDP = 3ull
+} cvmx_pip_qos_watch_types;
+
+/**
+ * This enumeration is used in PIP tag config to control how
+ * POW tags are generated by the hardware.
+ */
+typedef enum {
+       CVMX_PIP_TAG_MODE_TUPLE = 0ull,
+       CVMX_PIP_TAG_MODE_MASK = 1ull,
+       CVMX_PIP_TAG_MODE_IP_OR_MASK = 2ull,
+       CVMX_PIP_TAG_MODE_TUPLE_XOR_MASK = 3ull
+} cvmx_pip_tag_mode_t;
+
+/**
+ * Tag type definitions
+ */
+typedef enum {
+       CVMX_POW_TAG_TYPE_ORDERED = 0L,
+       CVMX_POW_TAG_TYPE_ATOMIC = 1L,
+       CVMX_POW_TAG_TYPE_NULL = 2L,
+       CVMX_POW_TAG_TYPE_NULL_NULL = 3L
+} cvmx_pow_tag_type_t;
+
+/**
+ * LCR bits 0 and 1 control the number of bits per character. See the following table for encodings:
+ *
+ * - 00 = 5 bits (bits 0-4 sent)
+ * - 01 = 6 bits (bits 0-5 sent)
+ * - 10 = 7 bits (bits 0-6 sent)
+ * - 11 = 8 bits (all bits sent)
+ */
+typedef enum {
+       CVMX_UART_BITS5 = 0,
+       CVMX_UART_BITS6 = 1,
+       CVMX_UART_BITS7 = 2,
+       CVMX_UART_BITS8 = 3
+} cvmx_uart_bits_t;
+
+typedef enum {
+       CVMX_UART_IID_NONE = 1,
+       CVMX_UART_IID_RX_ERROR = 6,
+       CVMX_UART_IID_RX_DATA = 4,
+       CVMX_UART_IID_RX_TIMEOUT = 12,
+       CVMX_UART_IID_TX_EMPTY = 2,
+       CVMX_UART_IID_MODEM = 0,
+       CVMX_UART_IID_BUSY = 7
+} cvmx_uart_iid_t;
+
+#endif /* __CVMX_CSR_ENUMS_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-csr.h b/arch/mips/mach-octeon/include/mach/cvmx-csr.h
new file mode 100644 (file)
index 0000000..730d54b
--- /dev/null
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) address and type definitions for
+ * Octoen.
+ */
+
+#ifndef __CVMX_CSR_H__
+#define __CVMX_CSR_H__
+
+#include "cvmx-csr-enums.h"
+#include "cvmx-pip-defs.h"
+
+typedef cvmx_pip_prt_cfgx_t cvmx_pip_port_cfg_t;
+
+/* The CSRs for bootbus region zero used to be independent of the
+    other 1-7. As of SDK 1.7.0 these were combined. These macros
+    are for backwards compactability */
+#define CVMX_MIO_BOOT_REG_CFG0 CVMX_MIO_BOOT_REG_CFGX(0)
+#define CVMX_MIO_BOOT_REG_TIM0 CVMX_MIO_BOOT_REG_TIMX(0)
+
+/* The CN3XXX and CN58XX chips used to not have a LMC number
+    passed to the address macros. These are here to supply backwards
+    compatibility with old code. Code should really use the new addresses
+    with bus arguments for support on other chips */
+#define CVMX_LMC_BIST_CTL        CVMX_LMCX_BIST_CTL(0)
+#define CVMX_LMC_BIST_RESULT     CVMX_LMCX_BIST_RESULT(0)
+#define CVMX_LMC_COMP_CTL        CVMX_LMCX_COMP_CTL(0)
+#define CVMX_LMC_CTL             CVMX_LMCX_CTL(0)
+#define CVMX_LMC_CTL1            CVMX_LMCX_CTL1(0)
+#define CVMX_LMC_DCLK_CNT_HI     CVMX_LMCX_DCLK_CNT_HI(0)
+#define CVMX_LMC_DCLK_CNT_LO     CVMX_LMCX_DCLK_CNT_LO(0)
+#define CVMX_LMC_DCLK_CTL        CVMX_LMCX_DCLK_CTL(0)
+#define CVMX_LMC_DDR2_CTL        CVMX_LMCX_DDR2_CTL(0)
+#define CVMX_LMC_DELAY_CFG       CVMX_LMCX_DELAY_CFG(0)
+#define CVMX_LMC_DLL_CTL         CVMX_LMCX_DLL_CTL(0)
+#define CVMX_LMC_DUAL_MEMCFG     CVMX_LMCX_DUAL_MEMCFG(0)
+#define CVMX_LMC_ECC_SYND        CVMX_LMCX_ECC_SYND(0)
+#define CVMX_LMC_FADR            CVMX_LMCX_FADR(0)
+#define CVMX_LMC_IFB_CNT_HI      CVMX_LMCX_IFB_CNT_HI(0)
+#define CVMX_LMC_IFB_CNT_LO      CVMX_LMCX_IFB_CNT_LO(0)
+#define CVMX_LMC_MEM_CFG0        CVMX_LMCX_MEM_CFG0(0)
+#define CVMX_LMC_MEM_CFG1        CVMX_LMCX_MEM_CFG1(0)
+#define CVMX_LMC_OPS_CNT_HI      CVMX_LMCX_OPS_CNT_HI(0)
+#define CVMX_LMC_OPS_CNT_LO      CVMX_LMCX_OPS_CNT_LO(0)
+#define CVMX_LMC_PLL_BWCTL       CVMX_LMCX_PLL_BWCTL(0)
+#define CVMX_LMC_PLL_CTL         CVMX_LMCX_PLL_CTL(0)
+#define CVMX_LMC_PLL_STATUS      CVMX_LMCX_PLL_STATUS(0)
+#define CVMX_LMC_READ_LEVEL_CTL          CVMX_LMCX_READ_LEVEL_CTL(0)
+#define CVMX_LMC_READ_LEVEL_DBG          CVMX_LMCX_READ_LEVEL_DBG(0)
+#define CVMX_LMC_READ_LEVEL_RANKX CVMX_LMCX_READ_LEVEL_RANKX(0)
+#define CVMX_LMC_RODT_COMP_CTL   CVMX_LMCX_RODT_COMP_CTL(0)
+#define CVMX_LMC_RODT_CTL        CVMX_LMCX_RODT_CTL(0)
+#define CVMX_LMC_WODT_CTL        CVMX_LMCX_WODT_CTL0(0)
+#define CVMX_LMC_WODT_CTL0       CVMX_LMCX_WODT_CTL0(0)
+#define CVMX_LMC_WODT_CTL1       CVMX_LMCX_WODT_CTL1(0)
+
+/* The CN3XXX and CN58XX chips used to not have a TWSI bus number
+    passed to the address macros. These are here to supply backwards
+    compatibility with old code. Code should really use the new addresses
+    with bus arguments for support on other chips */
+#define CVMX_MIO_TWS_INT        CVMX_MIO_TWSX_INT(0)
+#define CVMX_MIO_TWS_SW_TWSI    CVMX_MIO_TWSX_SW_TWSI(0)
+#define CVMX_MIO_TWS_SW_TWSI_EXT CVMX_MIO_TWSX_SW_TWSI_EXT(0)
+#define CVMX_MIO_TWS_TWSI_SW    CVMX_MIO_TWSX_TWSI_SW(0)
+
+/* The CN3XXX and CN58XX chips used to not have a SMI/MDIO bus number
+    passed to the address macros. These are here to supply backwards
+    compatibility with old code. Code should really use the new addresses
+    with bus arguments for support on other chips */
+#define CVMX_SMI_CLK   CVMX_SMIX_CLK(0)
+#define CVMX_SMI_CMD   CVMX_SMIX_CMD(0)
+#define CVMX_SMI_EN    CVMX_SMIX_EN(0)
+#define CVMX_SMI_RD_DAT CVMX_SMIX_RD_DAT(0)
+#define CVMX_SMI_WR_DAT CVMX_SMIX_WR_DAT(0)
+
+#endif /* __CVMX_CSR_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-dbg-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-dbg-defs.h
new file mode 100644 (file)
index 0000000..9f91fee
--- /dev/null
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon dbg.
+ */
+
+#ifndef __CVMX_DBG_DEFS_H__
+#define __CVMX_DBG_DEFS_H__
+
+#define CVMX_DBG_DATA (0x00011F00000001E8ull)
+
+/**
+ * cvmx_dbg_data
+ *
+ * DBG_DATA = Debug Data Register
+ *
+ * Value returned on the debug-data lines from the RSLs
+ */
+union cvmx_dbg_data {
+       u64 u64;
+       struct cvmx_dbg_data_s {
+               u64 reserved_23_63 : 41;
+               u64 c_mul : 5;
+               u64 dsel_ext : 1;
+               u64 data : 17;
+       } s;
+};
+
+typedef union cvmx_dbg_data cvmx_dbg_data_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-dpi-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-dpi-defs.h
new file mode 100644 (file)
index 0000000..6809894
--- /dev/null
@@ -0,0 +1,1460 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon dpi.
+ */
+
+#ifndef __CVMX_DPI_DEFS_H__
+#define __CVMX_DPI_DEFS_H__
+
+#define CVMX_DPI_BIST_STATUS                (0x0001DF0000000000ull)
+#define CVMX_DPI_CTL                        (0x0001DF0000000040ull)
+#define CVMX_DPI_DMAX_COUNTS(offset)        (0x0001DF0000000300ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_DBELL(offset)         (0x0001DF0000000200ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_ERR_RSP_STATUS(offset) (0x0001DF0000000A80ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_IBUFF_SADDR(offset)    (0x0001DF0000000280ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_IFLIGHT(offset)       (0x0001DF0000000A00ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_NADDR(offset)         (0x0001DF0000000380ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_REQBNK0(offset)       (0x0001DF0000000400ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_REQBNK1(offset)       (0x0001DF0000000480ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_REQQ_CTL(offset)      (0x0001DF0000000180ull + ((offset) & 7) * 8)
+#define CVMX_DPI_DMA_CONTROL                (0x0001DF0000000048ull)
+#define CVMX_DPI_DMA_ENGX_EN(offset)        (0x0001DF0000000080ull + ((offset) & 7) * 8)
+static inline u64 CVMX_DPI_DMA_PPX_CNT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001DF0000000B00ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001DF0000000B00ull + (offset) * 8;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001DF0000000C00ull + (offset) * 8;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001DF0000000C00ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001DF0000000C00ull + (offset) * 8;
+       }
+       return 0x0001DF0000000C00ull + (offset) * 8;
+}
+
+#define CVMX_DPI_DMA_PP_INT          (0x0001DF0000000038ull)
+#define CVMX_DPI_ECC_CTL             (0x0001DF0000000018ull)
+#define CVMX_DPI_ECC_INT             (0x0001DF0000000020ull)
+#define CVMX_DPI_ENGX_BUF(offset)     (0x0001DF0000000880ull + ((offset) & 7) * 8)
+#define CVMX_DPI_INFO_REG            (0x0001DF0000000980ull)
+#define CVMX_DPI_INT_EN                      (0x0001DF0000000010ull)
+#define CVMX_DPI_INT_REG             (0x0001DF0000000008ull)
+#define CVMX_DPI_NCBX_CFG(offset)     (0x0001DF0000000800ull)
+#define CVMX_DPI_NCB_CTL             (0x0001DF0000000028ull)
+#define CVMX_DPI_PINT_INFO           (0x0001DF0000000830ull)
+#define CVMX_DPI_PKT_ERR_RSP         (0x0001DF0000000078ull)
+#define CVMX_DPI_REQ_ERR_RSP         (0x0001DF0000000058ull)
+#define CVMX_DPI_REQ_ERR_RSP_EN              (0x0001DF0000000068ull)
+#define CVMX_DPI_REQ_ERR_RST         (0x0001DF0000000060ull)
+#define CVMX_DPI_REQ_ERR_RST_EN              (0x0001DF0000000070ull)
+#define CVMX_DPI_REQ_ERR_SKIP_COMP    (0x0001DF0000000838ull)
+#define CVMX_DPI_REQ_GBL_EN          (0x0001DF0000000050ull)
+#define CVMX_DPI_SLI_PRTX_CFG(offset) (0x0001DF0000000900ull + ((offset) & 3) * 8)
+static inline u64 CVMX_DPI_SLI_PRTX_ERR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001DF0000000920ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001DF0000000920ull + (offset) * 8;
+               return 0x0001DF0000000920ull + (offset) * 8;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+
+               if (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS1))
+                       return 0x0001DF0000000928ull + (offset) * 8;
+
+               if (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS2))
+                       return 0x0001DF0000000920ull + (offset) * 8;
+               return 0x0001DF0000000920ull + (offset) * 8;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0001DF0000000920ull + (offset) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001DF0000000928ull + (offset) * 8;
+       }
+       return 0x0001DF0000000920ull + (offset) * 8;
+}
+
+#define CVMX_DPI_SLI_PRTX_ERR_INFO(offset) (0x0001DF0000000940ull + ((offset) & 3) * 8)
+#define CVMX_DPI_SRIO_RX_BELLX(offset)    (0x0001DF0000080200ull + ((offset) & 31) * 8)
+#define CVMX_DPI_SRIO_RX_BELL_SEQX(offset) (0x0001DF0000080400ull + ((offset) & 31) * 8)
+#define CVMX_DPI_SWA_Q_VMID               (0x0001DF0000000030ull)
+
+/**
+ * cvmx_dpi_bist_status
+ *
+ * This is the built-in self-test (BIST) status register. Each bit is the BIST result of an
+ * individual memory (per bit, 0 = pass and 1 = fail).
+ */
+union cvmx_dpi_bist_status {
+       u64 u64;
+       struct cvmx_dpi_bist_status_s {
+               u64 reserved_57_63 : 7;
+               u64 bist : 57;
+       } s;
+       struct cvmx_dpi_bist_status_cn61xx {
+               u64 reserved_47_63 : 17;
+               u64 bist : 47;
+       } cn61xx;
+       struct cvmx_dpi_bist_status_cn63xx {
+               u64 reserved_45_63 : 19;
+               u64 bist : 45;
+       } cn63xx;
+       struct cvmx_dpi_bist_status_cn63xxp1 {
+               u64 reserved_37_63 : 27;
+               u64 bist : 37;
+       } cn63xxp1;
+       struct cvmx_dpi_bist_status_cn61xx cn66xx;
+       struct cvmx_dpi_bist_status_cn63xx cn68xx;
+       struct cvmx_dpi_bist_status_cn63xx cn68xxp1;
+       struct cvmx_dpi_bist_status_cn61xx cn70xx;
+       struct cvmx_dpi_bist_status_cn61xx cn70xxp1;
+       struct cvmx_dpi_bist_status_s cn73xx;
+       struct cvmx_dpi_bist_status_s cn78xx;
+       struct cvmx_dpi_bist_status_cn78xxp1 {
+               u64 reserved_51_63 : 13;
+               u64 bist : 51;
+       } cn78xxp1;
+       struct cvmx_dpi_bist_status_cn61xx cnf71xx;
+       struct cvmx_dpi_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_dpi_bist_status cvmx_dpi_bist_status_t;
+
+/**
+ * cvmx_dpi_ctl
+ *
+ * This register provides the enable bit for the DMA and packet state machines.
+ *
+ */
+union cvmx_dpi_ctl {
+       u64 u64;
+       struct cvmx_dpi_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 clk : 1;
+               u64 en : 1;
+       } s;
+       struct cvmx_dpi_ctl_cn61xx {
+               u64 reserved_1_63 : 63;
+               u64 en : 1;
+       } cn61xx;
+       struct cvmx_dpi_ctl_s cn63xx;
+       struct cvmx_dpi_ctl_s cn63xxp1;
+       struct cvmx_dpi_ctl_s cn66xx;
+       struct cvmx_dpi_ctl_s cn68xx;
+       struct cvmx_dpi_ctl_s cn68xxp1;
+       struct cvmx_dpi_ctl_cn61xx cn70xx;
+       struct cvmx_dpi_ctl_cn61xx cn70xxp1;
+       struct cvmx_dpi_ctl_cn61xx cn73xx;
+       struct cvmx_dpi_ctl_cn61xx cn78xx;
+       struct cvmx_dpi_ctl_cn61xx cn78xxp1;
+       struct cvmx_dpi_ctl_cn61xx cnf71xx;
+       struct cvmx_dpi_ctl_cn61xx cnf75xx;
+};
+
+typedef union cvmx_dpi_ctl cvmx_dpi_ctl_t;
+
+/**
+ * cvmx_dpi_dma#_counts
+ *
+ * These registers provide values for determining the number of instructions in the local
+ * instruction FIFO.
+ */
+union cvmx_dpi_dmax_counts {
+       u64 u64;
+       struct cvmx_dpi_dmax_counts_s {
+               u64 reserved_39_63 : 25;
+               u64 fcnt : 7;
+               u64 dbell : 32;
+       } s;
+       struct cvmx_dpi_dmax_counts_s cn61xx;
+       struct cvmx_dpi_dmax_counts_s cn63xx;
+       struct cvmx_dpi_dmax_counts_s cn63xxp1;
+       struct cvmx_dpi_dmax_counts_s cn66xx;
+       struct cvmx_dpi_dmax_counts_s cn68xx;
+       struct cvmx_dpi_dmax_counts_s cn68xxp1;
+       struct cvmx_dpi_dmax_counts_s cn70xx;
+       struct cvmx_dpi_dmax_counts_s cn70xxp1;
+       struct cvmx_dpi_dmax_counts_s cn73xx;
+       struct cvmx_dpi_dmax_counts_s cn78xx;
+       struct cvmx_dpi_dmax_counts_s cn78xxp1;
+       struct cvmx_dpi_dmax_counts_s cnf71xx;
+       struct cvmx_dpi_dmax_counts_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_counts cvmx_dpi_dmax_counts_t;
+
+/**
+ * cvmx_dpi_dma#_dbell
+ *
+ * This is the door bell register for the eight DMA instruction queues.
+ *
+ */
+union cvmx_dpi_dmax_dbell {
+       u64 u64;
+       struct cvmx_dpi_dmax_dbell_s {
+               u64 reserved_16_63 : 48;
+               u64 dbell : 16;
+       } s;
+       struct cvmx_dpi_dmax_dbell_s cn61xx;
+       struct cvmx_dpi_dmax_dbell_s cn63xx;
+       struct cvmx_dpi_dmax_dbell_s cn63xxp1;
+       struct cvmx_dpi_dmax_dbell_s cn66xx;
+       struct cvmx_dpi_dmax_dbell_s cn68xx;
+       struct cvmx_dpi_dmax_dbell_s cn68xxp1;
+       struct cvmx_dpi_dmax_dbell_s cn70xx;
+       struct cvmx_dpi_dmax_dbell_s cn70xxp1;
+       struct cvmx_dpi_dmax_dbell_s cn73xx;
+       struct cvmx_dpi_dmax_dbell_s cn78xx;
+       struct cvmx_dpi_dmax_dbell_s cn78xxp1;
+       struct cvmx_dpi_dmax_dbell_s cnf71xx;
+       struct cvmx_dpi_dmax_dbell_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_dbell cvmx_dpi_dmax_dbell_t;
+
+/**
+ * cvmx_dpi_dma#_err_rsp_status
+ */
+union cvmx_dpi_dmax_err_rsp_status {
+       u64 u64;
+       struct cvmx_dpi_dmax_err_rsp_status_s {
+               u64 reserved_6_63 : 58;
+               u64 status : 6;
+       } s;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn61xx;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn66xx;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn68xx;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn68xxp1;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn70xx;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn70xxp1;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn73xx;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn78xx;
+       struct cvmx_dpi_dmax_err_rsp_status_s cn78xxp1;
+       struct cvmx_dpi_dmax_err_rsp_status_s cnf71xx;
+       struct cvmx_dpi_dmax_err_rsp_status_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_err_rsp_status cvmx_dpi_dmax_err_rsp_status_t;
+
+/**
+ * cvmx_dpi_dma#_ibuff_saddr
+ *
+ * These registers provide the address to start reading instructions for the eight DMA
+ * instruction queues.
+ */
+union cvmx_dpi_dmax_ibuff_saddr {
+       u64 u64;
+       struct cvmx_dpi_dmax_ibuff_saddr_s {
+               u64 reserved_62_63 : 2;
+               u64 csize : 14;
+               u64 reserved_0_47 : 48;
+       } s;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx {
+               u64 reserved_62_63 : 2;
+               u64 csize : 14;
+               u64 reserved_41_47 : 7;
+               u64 idle : 1;
+               u64 reserved_36_39 : 4;
+               u64 saddr : 29;
+               u64 reserved_0_6 : 7;
+       } cn61xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx cn63xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx cn63xxp1;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx cn66xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn68xx {
+               u64 reserved_62_63 : 2;
+               u64 csize : 14;
+               u64 reserved_41_47 : 7;
+               u64 idle : 1;
+               u64 saddr : 33;
+               u64 reserved_0_6 : 7;
+       } cn68xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn68xx cn68xxp1;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx cn70xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx cn70xxp1;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn73xx {
+               u64 idle : 1;
+               u64 reserved_62_62 : 1;
+               u64 csize : 14;
+               u64 reserved_42_47 : 6;
+               u64 saddr : 35;
+               u64 reserved_0_6 : 7;
+       } cn73xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn73xx cn78xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn73xx cn78xxp1;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx cnf71xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn73xx cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_ibuff_saddr cvmx_dpi_dmax_ibuff_saddr_t;
+
+/**
+ * cvmx_dpi_dma#_iflight
+ */
+union cvmx_dpi_dmax_iflight {
+       u64 u64;
+       struct cvmx_dpi_dmax_iflight_s {
+               u64 reserved_3_63 : 61;
+               u64 cnt : 3;
+       } s;
+       struct cvmx_dpi_dmax_iflight_s cn61xx;
+       struct cvmx_dpi_dmax_iflight_s cn66xx;
+       struct cvmx_dpi_dmax_iflight_s cn68xx;
+       struct cvmx_dpi_dmax_iflight_s cn68xxp1;
+       struct cvmx_dpi_dmax_iflight_s cn70xx;
+       struct cvmx_dpi_dmax_iflight_s cn70xxp1;
+       struct cvmx_dpi_dmax_iflight_s cn73xx;
+       struct cvmx_dpi_dmax_iflight_s cn78xx;
+       struct cvmx_dpi_dmax_iflight_s cn78xxp1;
+       struct cvmx_dpi_dmax_iflight_s cnf71xx;
+       struct cvmx_dpi_dmax_iflight_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_iflight cvmx_dpi_dmax_iflight_t;
+
+/**
+ * cvmx_dpi_dma#_naddr
+ *
+ * These registers provide the L2C addresses to read the next Ichunk data.
+ *
+ */
+union cvmx_dpi_dmax_naddr {
+       u64 u64;
+       struct cvmx_dpi_dmax_naddr_s {
+               u64 reserved_42_63 : 22;
+               u64 addr : 42;
+       } s;
+       struct cvmx_dpi_dmax_naddr_cn61xx {
+               u64 reserved_36_63 : 28;
+               u64 addr : 36;
+       } cn61xx;
+       struct cvmx_dpi_dmax_naddr_cn61xx cn63xx;
+       struct cvmx_dpi_dmax_naddr_cn61xx cn63xxp1;
+       struct cvmx_dpi_dmax_naddr_cn61xx cn66xx;
+       struct cvmx_dpi_dmax_naddr_cn68xx {
+               u64 reserved_40_63 : 24;
+               u64 addr : 40;
+       } cn68xx;
+       struct cvmx_dpi_dmax_naddr_cn68xx cn68xxp1;
+       struct cvmx_dpi_dmax_naddr_cn61xx cn70xx;
+       struct cvmx_dpi_dmax_naddr_cn61xx cn70xxp1;
+       struct cvmx_dpi_dmax_naddr_s cn73xx;
+       struct cvmx_dpi_dmax_naddr_s cn78xx;
+       struct cvmx_dpi_dmax_naddr_s cn78xxp1;
+       struct cvmx_dpi_dmax_naddr_cn61xx cnf71xx;
+       struct cvmx_dpi_dmax_naddr_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_naddr cvmx_dpi_dmax_naddr_t;
+
+/**
+ * cvmx_dpi_dma#_reqbnk0
+ *
+ * These registers provide the current contents of the request state machine, bank 0.
+ *
+ */
+union cvmx_dpi_dmax_reqbnk0 {
+       u64 u64;
+       struct cvmx_dpi_dmax_reqbnk0_s {
+               u64 state : 64;
+       } s;
+       struct cvmx_dpi_dmax_reqbnk0_s cn61xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cn63xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cn63xxp1;
+       struct cvmx_dpi_dmax_reqbnk0_s cn66xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cn68xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cn68xxp1;
+       struct cvmx_dpi_dmax_reqbnk0_s cn70xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cn70xxp1;
+       struct cvmx_dpi_dmax_reqbnk0_s cn73xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cn78xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cn78xxp1;
+       struct cvmx_dpi_dmax_reqbnk0_s cnf71xx;
+       struct cvmx_dpi_dmax_reqbnk0_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_reqbnk0 cvmx_dpi_dmax_reqbnk0_t;
+
+/**
+ * cvmx_dpi_dma#_reqbnk1
+ *
+ * These registers provide the current contents of the request state machine, bank 1.
+ *
+ */
+union cvmx_dpi_dmax_reqbnk1 {
+       u64 u64;
+       struct cvmx_dpi_dmax_reqbnk1_s {
+               u64 state : 64;
+       } s;
+       struct cvmx_dpi_dmax_reqbnk1_s cn61xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cn63xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cn63xxp1;
+       struct cvmx_dpi_dmax_reqbnk1_s cn66xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cn68xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cn68xxp1;
+       struct cvmx_dpi_dmax_reqbnk1_s cn70xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cn70xxp1;
+       struct cvmx_dpi_dmax_reqbnk1_s cn73xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cn78xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cn78xxp1;
+       struct cvmx_dpi_dmax_reqbnk1_s cnf71xx;
+       struct cvmx_dpi_dmax_reqbnk1_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_reqbnk1 cvmx_dpi_dmax_reqbnk1_t;
+
+/**
+ * cvmx_dpi_dma#_reqq_ctl
+ *
+ * This register contains the control bits for transactions on the eight request queues.
+ *
+ */
+union cvmx_dpi_dmax_reqq_ctl {
+       u64 u64;
+       struct cvmx_dpi_dmax_reqq_ctl_s {
+               u64 reserved_9_63 : 55;
+               u64 st_cmd : 1;
+               u64 reserved_2_7 : 6;
+               u64 ld_cmd : 2;
+       } s;
+       struct cvmx_dpi_dmax_reqq_ctl_s cn73xx;
+       struct cvmx_dpi_dmax_reqq_ctl_s cn78xx;
+       struct cvmx_dpi_dmax_reqq_ctl_s cn78xxp1;
+       struct cvmx_dpi_dmax_reqq_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dmax_reqq_ctl cvmx_dpi_dmax_reqq_ctl_t;
+
+/**
+ * cvmx_dpi_dma_control
+ *
+ * This register controls the operation of DMA input and output.
+ *
+ */
+union cvmx_dpi_dma_control {
+       u64 u64;
+       struct cvmx_dpi_dma_control_s {
+               u64 reserved_62_63 : 2;
+               u64 dici_mode : 1;
+               u64 pkt_en1 : 1;
+               u64 ffp_dis : 1;
+               u64 commit_mode : 1;
+               u64 pkt_hp : 1;
+               u64 pkt_en : 1;
+               u64 reserved_54_55 : 2;
+               u64 dma_enb : 6;
+               u64 wqecsdis : 1;
+               u64 wqecsoff : 7;
+               u64 zbwcsen : 1;
+               u64 wqecsmode : 2;
+               u64 reserved_35_36 : 2;
+               u64 ncb_tag : 1;
+               u64 b0_lend : 1;
+               u64 reserved_20_32 : 13;
+               u64 o_add1 : 1;
+               u64 o_ro : 1;
+               u64 o_ns : 1;
+               u64 o_es : 2;
+               u64 o_mode : 1;
+               u64 reserved_0_13 : 14;
+       } s;
+       struct cvmx_dpi_dma_control_cn61xx {
+               u64 reserved_62_63 : 2;
+               u64 dici_mode : 1;
+               u64 pkt_en1 : 1;
+               u64 ffp_dis : 1;
+               u64 commit_mode : 1;
+               u64 pkt_hp : 1;
+               u64 pkt_en : 1;
+               u64 reserved_54_55 : 2;
+               u64 dma_enb : 6;
+               u64 reserved_34_47 : 14;
+               u64 b0_lend : 1;
+               u64 dwb_denb : 1;
+               u64 dwb_ichk : 9;
+               u64 fpa_que : 3;
+               u64 o_add1 : 1;
+               u64 o_ro : 1;
+               u64 o_ns : 1;
+               u64 o_es : 2;
+               u64 o_mode : 1;
+               u64 reserved_0_13 : 14;
+       } cn61xx;
+       struct cvmx_dpi_dma_control_cn63xx {
+               u64 reserved_61_63 : 3;
+               u64 pkt_en1 : 1;
+               u64 ffp_dis : 1;
+               u64 commit_mode : 1;
+               u64 pkt_hp : 1;
+               u64 pkt_en : 1;
+               u64 reserved_54_55 : 2;
+               u64 dma_enb : 6;
+               u64 reserved_34_47 : 14;
+               u64 b0_lend : 1;
+               u64 dwb_denb : 1;
+               u64 dwb_ichk : 9;
+               u64 fpa_que : 3;
+               u64 o_add1 : 1;
+               u64 o_ro : 1;
+               u64 o_ns : 1;
+               u64 o_es : 2;
+               u64 o_mode : 1;
+               u64 reserved_0_13 : 14;
+       } cn63xx;
+       struct cvmx_dpi_dma_control_cn63xxp1 {
+               u64 reserved_59_63 : 5;
+               u64 commit_mode : 1;
+               u64 pkt_hp : 1;
+               u64 pkt_en : 1;
+               u64 reserved_54_55 : 2;
+               u64 dma_enb : 6;
+               u64 reserved_34_47 : 14;
+               u64 b0_lend : 1;
+               u64 dwb_denb : 1;
+               u64 dwb_ichk : 9;
+               u64 fpa_que : 3;
+               u64 o_add1 : 1;
+               u64 o_ro : 1;
+               u64 o_ns : 1;
+               u64 o_es : 2;
+               u64 o_mode : 1;
+               u64 reserved_0_13 : 14;
+       } cn63xxp1;
+       struct cvmx_dpi_dma_control_cn63xx cn66xx;
+       struct cvmx_dpi_dma_control_cn61xx cn68xx;
+       struct cvmx_dpi_dma_control_cn63xx cn68xxp1;
+       struct cvmx_dpi_dma_control_cn61xx cn70xx;
+       struct cvmx_dpi_dma_control_cn61xx cn70xxp1;
+       struct cvmx_dpi_dma_control_cn73xx {
+               u64 reserved_60_63 : 4;
+               u64 ffp_dis : 1;
+               u64 commit_mode : 1;
+               u64 reserved_57_57 : 1;
+               u64 pkt_en : 1;
+               u64 reserved_54_55 : 2;
+               u64 dma_enb : 6;
+               u64 wqecsdis : 1;
+               u64 wqecsoff : 7;
+               u64 zbwcsen : 1;
+               u64 wqecsmode : 2;
+               u64 reserved_35_36 : 2;
+               u64 ncb_tag : 1;
+               u64 b0_lend : 1;
+               u64 ldwb : 1;
+               u64 aura_ichk : 12;
+               u64 o_add1 : 1;
+               u64 o_ro : 1;
+               u64 o_ns : 1;
+               u64 o_es : 2;
+               u64 o_mode : 1;
+               u64 reserved_0_13 : 14;
+       } cn73xx;
+       struct cvmx_dpi_dma_control_cn73xx cn78xx;
+       struct cvmx_dpi_dma_control_cn73xx cn78xxp1;
+       struct cvmx_dpi_dma_control_cn61xx cnf71xx;
+       struct cvmx_dpi_dma_control_cn73xx cnf75xx;
+};
+
+typedef union cvmx_dpi_dma_control cvmx_dpi_dma_control_t;
+
+/**
+ * cvmx_dpi_dma_eng#_en
+ *
+ * These registers provide control for the DMA engines.
+ *
+ */
+union cvmx_dpi_dma_engx_en {
+       u64 u64;
+       struct cvmx_dpi_dma_engx_en_s {
+               u64 reserved_39_63 : 25;
+               u64 eng_molr : 7;
+               u64 reserved_8_31 : 24;
+               u64 qen : 8;
+       } s;
+       struct cvmx_dpi_dma_engx_en_cn61xx {
+               u64 reserved_8_63 : 56;
+               u64 qen : 8;
+       } cn61xx;
+       struct cvmx_dpi_dma_engx_en_cn61xx cn63xx;
+       struct cvmx_dpi_dma_engx_en_cn61xx cn63xxp1;
+       struct cvmx_dpi_dma_engx_en_cn61xx cn66xx;
+       struct cvmx_dpi_dma_engx_en_cn61xx cn68xx;
+       struct cvmx_dpi_dma_engx_en_cn61xx cn68xxp1;
+       struct cvmx_dpi_dma_engx_en_cn61xx cn70xx;
+       struct cvmx_dpi_dma_engx_en_cn61xx cn70xxp1;
+       struct cvmx_dpi_dma_engx_en_s cn73xx;
+       struct cvmx_dpi_dma_engx_en_s cn78xx;
+       struct cvmx_dpi_dma_engx_en_s cn78xxp1;
+       struct cvmx_dpi_dma_engx_en_cn61xx cnf71xx;
+       struct cvmx_dpi_dma_engx_en_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dma_engx_en cvmx_dpi_dma_engx_en_t;
+
+/**
+ * cvmx_dpi_dma_pp#_cnt
+ *
+ * DPI_DMA_PP[0..3]_CNT  = DMA per PP Instr Done Counter
+ * When DMA Instruction Completion Interrupt Mode DPI_DMA_CONTROL.DICI_MODE is enabled, every dma
+ * instruction
+ * that has the WQP=0 and a PTR value of 1..4 will incremrement DPI_DMA_PPx_CNT value-1 counter.
+ * Instructions with WQP=0 and PTR values higher then 0x3F will still send a zero byte write.
+ * Hardware reserves that values 5..63 for future use and will treat them as a PTR of 0 and do
+ * nothing.
+ */
+union cvmx_dpi_dma_ppx_cnt {
+       u64 u64;
+       struct cvmx_dpi_dma_ppx_cnt_s {
+               u64 reserved_16_63 : 48;
+               u64 cnt : 16;
+       } s;
+       struct cvmx_dpi_dma_ppx_cnt_s cn61xx;
+       struct cvmx_dpi_dma_ppx_cnt_s cn68xx;
+       struct cvmx_dpi_dma_ppx_cnt_s cn70xx;
+       struct cvmx_dpi_dma_ppx_cnt_s cn70xxp1;
+       struct cvmx_dpi_dma_ppx_cnt_s cn73xx;
+       struct cvmx_dpi_dma_ppx_cnt_s cn78xx;
+       struct cvmx_dpi_dma_ppx_cnt_s cn78xxp1;
+       struct cvmx_dpi_dma_ppx_cnt_s cnf71xx;
+       struct cvmx_dpi_dma_ppx_cnt_s cnf75xx;
+};
+
+typedef union cvmx_dpi_dma_ppx_cnt cvmx_dpi_dma_ppx_cnt_t;
+
+/**
+ * cvmx_dpi_dma_pp_int
+ */
+union cvmx_dpi_dma_pp_int {
+       u64 u64;
+       struct cvmx_dpi_dma_pp_int_s {
+               u64 reserved_48_63 : 16;
+               u64 complete : 48;
+       } s;
+       struct cvmx_dpi_dma_pp_int_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 complete : 16;
+       } cn73xx;
+       struct cvmx_dpi_dma_pp_int_s cn78xx;
+       struct cvmx_dpi_dma_pp_int_s cn78xxp1;
+       struct cvmx_dpi_dma_pp_int_cn73xx cnf75xx;
+};
+
+typedef union cvmx_dpi_dma_pp_int cvmx_dpi_dma_pp_int_t;
+
+/**
+ * cvmx_dpi_ecc_ctl
+ *
+ * This register allows inserting ECC errors for testing.
+ *
+ */
+union cvmx_dpi_ecc_ctl {
+       u64 u64;
+       struct cvmx_dpi_ecc_ctl_s {
+               u64 reserved_33_63 : 31;
+               u64 ram_cdis : 1;
+               u64 reserved_17_31 : 15;
+               u64 ram_flip1 : 1;
+               u64 reserved_1_15 : 15;
+               u64 ram_flip0 : 1;
+       } s;
+       struct cvmx_dpi_ecc_ctl_s cn73xx;
+       struct cvmx_dpi_ecc_ctl_s cn78xx;
+       struct cvmx_dpi_ecc_ctl_s cn78xxp1;
+       struct cvmx_dpi_ecc_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dpi_ecc_ctl cvmx_dpi_ecc_ctl_t;
+
+/**
+ * cvmx_dpi_ecc_int
+ *
+ * This register contains ECC error interrupt summary bits.
+ *
+ */
+union cvmx_dpi_ecc_int {
+       u64 u64;
+       struct cvmx_dpi_ecc_int_s {
+               u64 reserved_47_63 : 17;
+               u64 ram_sbe : 15;
+               u64 reserved_15_31 : 17;
+               u64 ram_dbe : 15;
+       } s;
+       struct cvmx_dpi_ecc_int_s cn73xx;
+       struct cvmx_dpi_ecc_int_s cn78xx;
+       struct cvmx_dpi_ecc_int_s cn78xxp1;
+       struct cvmx_dpi_ecc_int_s cnf75xx;
+};
+
+typedef union cvmx_dpi_ecc_int cvmx_dpi_ecc_int_t;
+
+/**
+ * cvmx_dpi_eng#_buf
+ *
+ * Notes:
+ * The total amount of storage allocated to the 6 DPI DMA engines (via DPI_ENG*_BUF[BLKS]) must not exceed 8KB.
+ *
+ */
+union cvmx_dpi_engx_buf {
+       u64 u64;
+       struct cvmx_dpi_engx_buf_s {
+               u64 reserved_38_63 : 26;
+               u64 compblks : 6;
+               u64 reserved_10_31 : 22;
+               u64 base : 6;
+               u64 blks : 4;
+       } s;
+       struct cvmx_dpi_engx_buf_cn61xx {
+               u64 reserved_37_63 : 27;
+               u64 compblks : 5;
+               u64 reserved_9_31 : 23;
+               u64 base : 5;
+               u64 blks : 4;
+       } cn61xx;
+       struct cvmx_dpi_engx_buf_cn63xx {
+               u64 reserved_8_63 : 56;
+               u64 base : 4;
+               u64 blks : 4;
+       } cn63xx;
+       struct cvmx_dpi_engx_buf_cn63xx cn63xxp1;
+       struct cvmx_dpi_engx_buf_cn61xx cn66xx;
+       struct cvmx_dpi_engx_buf_cn61xx cn68xx;
+       struct cvmx_dpi_engx_buf_cn61xx cn68xxp1;
+       struct cvmx_dpi_engx_buf_cn61xx cn70xx;
+       struct cvmx_dpi_engx_buf_cn61xx cn70xxp1;
+       struct cvmx_dpi_engx_buf_s cn73xx;
+       struct cvmx_dpi_engx_buf_s cn78xx;
+       struct cvmx_dpi_engx_buf_s cn78xxp1;
+       struct cvmx_dpi_engx_buf_cn61xx cnf71xx;
+       struct cvmx_dpi_engx_buf_s cnf75xx;
+};
+
+typedef union cvmx_dpi_engx_buf cvmx_dpi_engx_buf_t;
+
+/**
+ * cvmx_dpi_info_reg
+ */
+union cvmx_dpi_info_reg {
+       u64 u64;
+       struct cvmx_dpi_info_reg_s {
+               u64 reserved_8_63 : 56;
+               u64 ffp : 4;
+               u64 reserved_2_3 : 2;
+               u64 ncb : 1;
+               u64 rsl : 1;
+       } s;
+       struct cvmx_dpi_info_reg_s cn61xx;
+       struct cvmx_dpi_info_reg_s cn63xx;
+       struct cvmx_dpi_info_reg_cn63xxp1 {
+               u64 reserved_2_63 : 62;
+               u64 ncb : 1;
+               u64 rsl : 1;
+       } cn63xxp1;
+       struct cvmx_dpi_info_reg_s cn66xx;
+       struct cvmx_dpi_info_reg_s cn68xx;
+       struct cvmx_dpi_info_reg_s cn68xxp1;
+       struct cvmx_dpi_info_reg_s cn70xx;
+       struct cvmx_dpi_info_reg_s cn70xxp1;
+       struct cvmx_dpi_info_reg_s cn73xx;
+       struct cvmx_dpi_info_reg_s cn78xx;
+       struct cvmx_dpi_info_reg_s cn78xxp1;
+       struct cvmx_dpi_info_reg_s cnf71xx;
+       struct cvmx_dpi_info_reg_s cnf75xx;
+};
+
+typedef union cvmx_dpi_info_reg cvmx_dpi_info_reg_t;
+
+/**
+ * cvmx_dpi_int_en
+ */
+union cvmx_dpi_int_en {
+       u64 u64;
+       struct cvmx_dpi_int_en_s {
+               u64 reserved_28_63 : 36;
+               u64 sprt3_rst : 1;
+               u64 sprt2_rst : 1;
+               u64 sprt1_rst : 1;
+               u64 sprt0_rst : 1;
+               u64 reserved_23_23 : 1;
+               u64 req_badfil : 1;
+               u64 req_inull : 1;
+               u64 req_anull : 1;
+               u64 req_undflw : 1;
+               u64 req_ovrflw : 1;
+               u64 req_badlen : 1;
+               u64 req_badadr : 1;
+               u64 dmadbo : 8;
+               u64 reserved_2_7 : 6;
+               u64 nfovr : 1;
+               u64 nderr : 1;
+       } s;
+       struct cvmx_dpi_int_en_s cn61xx;
+       struct cvmx_dpi_int_en_cn63xx {
+               u64 reserved_26_63 : 38;
+               u64 sprt1_rst : 1;
+               u64 sprt0_rst : 1;
+               u64 reserved_23_23 : 1;
+               u64 req_badfil : 1;
+               u64 req_inull : 1;
+               u64 req_anull : 1;
+               u64 req_undflw : 1;
+               u64 req_ovrflw : 1;
+               u64 req_badlen : 1;
+               u64 req_badadr : 1;
+               u64 dmadbo : 8;
+               u64 reserved_2_7 : 6;
+               u64 nfovr : 1;
+               u64 nderr : 1;
+       } cn63xx;
+       struct cvmx_dpi_int_en_cn63xx cn63xxp1;
+       struct cvmx_dpi_int_en_s cn66xx;
+       struct cvmx_dpi_int_en_cn63xx cn68xx;
+       struct cvmx_dpi_int_en_cn63xx cn68xxp1;
+       struct cvmx_dpi_int_en_cn70xx {
+               u64 reserved_28_63 : 36;
+               u64 sprt3_rst : 1;
+               u64 sprt2_rst : 1;
+               u64 sprt1_rst : 1;
+               u64 sprt0_rst : 1;
+               u64 reserved_23_23 : 1;
+               u64 req_badfil : 1;
+               u64 req_inull : 1;
+               u64 req_anull : 1;
+               u64 req_undflw : 1;
+               u64 req_ovrflw : 1;
+               u64 req_badlen : 1;
+               u64 req_badadr : 1;
+               u64 dmadbo : 8;
+               u64 reserved_7_2 : 6;
+               u64 nfovr : 1;
+               u64 nderr : 1;
+       } cn70xx;
+       struct cvmx_dpi_int_en_cn70xx cn70xxp1;
+       struct cvmx_dpi_int_en_s cnf71xx;
+};
+
+typedef union cvmx_dpi_int_en cvmx_dpi_int_en_t;
+
+/**
+ * cvmx_dpi_int_reg
+ *
+ * This register contains error flags for DPI.
+ *
+ */
+union cvmx_dpi_int_reg {
+       u64 u64;
+       struct cvmx_dpi_int_reg_s {
+               u64 reserved_28_63 : 36;
+               u64 sprt3_rst : 1;
+               u64 sprt2_rst : 1;
+               u64 sprt1_rst : 1;
+               u64 sprt0_rst : 1;
+               u64 reserved_23_23 : 1;
+               u64 req_badfil : 1;
+               u64 req_inull : 1;
+               u64 req_anull : 1;
+               u64 req_undflw : 1;
+               u64 req_ovrflw : 1;
+               u64 req_badlen : 1;
+               u64 req_badadr : 1;
+               u64 dmadbo : 8;
+               u64 reserved_2_7 : 6;
+               u64 nfovr : 1;
+               u64 nderr : 1;
+       } s;
+       struct cvmx_dpi_int_reg_s cn61xx;
+       struct cvmx_dpi_int_reg_cn63xx {
+               u64 reserved_26_63 : 38;
+               u64 sprt1_rst : 1;
+               u64 sprt0_rst : 1;
+               u64 reserved_23_23 : 1;
+               u64 req_badfil : 1;
+               u64 req_inull : 1;
+               u64 req_anull : 1;
+               u64 req_undflw : 1;
+               u64 req_ovrflw : 1;
+               u64 req_badlen : 1;
+               u64 req_badadr : 1;
+               u64 dmadbo : 8;
+               u64 reserved_2_7 : 6;
+               u64 nfovr : 1;
+               u64 nderr : 1;
+       } cn63xx;
+       struct cvmx_dpi_int_reg_cn63xx cn63xxp1;
+       struct cvmx_dpi_int_reg_s cn66xx;
+       struct cvmx_dpi_int_reg_cn63xx cn68xx;
+       struct cvmx_dpi_int_reg_cn63xx cn68xxp1;
+       struct cvmx_dpi_int_reg_s cn70xx;
+       struct cvmx_dpi_int_reg_s cn70xxp1;
+       struct cvmx_dpi_int_reg_cn73xx {
+               u64 reserved_23_63 : 41;
+               u64 req_badfil : 1;
+               u64 req_inull : 1;
+               u64 req_anull : 1;
+               u64 req_undflw : 1;
+               u64 req_ovrflw : 1;
+               u64 req_badlen : 1;
+               u64 req_badadr : 1;
+               u64 dmadbo : 8;
+               u64 reserved_2_7 : 6;
+               u64 nfovr : 1;
+               u64 nderr : 1;
+       } cn73xx;
+       struct cvmx_dpi_int_reg_cn73xx cn78xx;
+       struct cvmx_dpi_int_reg_s cn78xxp1;
+       struct cvmx_dpi_int_reg_s cnf71xx;
+       struct cvmx_dpi_int_reg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_dpi_int_reg cvmx_dpi_int_reg_t;
+
+/**
+ * cvmx_dpi_ncb#_cfg
+ */
+union cvmx_dpi_ncbx_cfg {
+       u64 u64;
+       struct cvmx_dpi_ncbx_cfg_s {
+               u64 reserved_6_63 : 58;
+               u64 molr : 6;
+       } s;
+       struct cvmx_dpi_ncbx_cfg_s cn61xx;
+       struct cvmx_dpi_ncbx_cfg_s cn66xx;
+       struct cvmx_dpi_ncbx_cfg_s cn68xx;
+       struct cvmx_dpi_ncbx_cfg_s cn70xx;
+       struct cvmx_dpi_ncbx_cfg_s cn70xxp1;
+       struct cvmx_dpi_ncbx_cfg_s cn73xx;
+       struct cvmx_dpi_ncbx_cfg_s cn78xx;
+       struct cvmx_dpi_ncbx_cfg_s cn78xxp1;
+       struct cvmx_dpi_ncbx_cfg_s cnf71xx;
+       struct cvmx_dpi_ncbx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_dpi_ncbx_cfg cvmx_dpi_ncbx_cfg_t;
+
+/**
+ * cvmx_dpi_ncb_ctl
+ *
+ * This register chooses which NCB interface DPI uses for L2/DRAM reads/writes.
+ *
+ */
+union cvmx_dpi_ncb_ctl {
+       u64 u64;
+       struct cvmx_dpi_ncb_ctl_s {
+               u64 reserved_25_63 : 39;
+               u64 ncbsel_prt_xor_dis : 1;
+               u64 reserved_21_23 : 3;
+               u64 ncbsel_zbw : 1;
+               u64 reserved_17_19 : 3;
+               u64 ncbsel_req : 1;
+               u64 reserved_13_15 : 3;
+               u64 ncbsel_dst : 1;
+               u64 reserved_9_11 : 3;
+               u64 ncbsel_src : 1;
+               u64 reserved_1_7 : 7;
+               u64 prt : 1;
+       } s;
+       struct cvmx_dpi_ncb_ctl_cn73xx {
+               u64 reserved_25_63 : 39;
+               u64 ncbsel_prt_xor_dis : 1;
+               u64 reserved_21_23 : 3;
+               u64 ncbsel_zbw : 1;
+               u64 reserved_17_19 : 3;
+               u64 ncbsel_req : 1;
+               u64 reserved_13_15 : 3;
+               u64 ncbsel_dst : 1;
+               u64 reserved_9_11 : 3;
+               u64 ncbsel_src : 1;
+               u64 reserved_0_7 : 8;
+       } cn73xx;
+       struct cvmx_dpi_ncb_ctl_s cn78xx;
+       struct cvmx_dpi_ncb_ctl_s cn78xxp1;
+       struct cvmx_dpi_ncb_ctl_cn73xx cnf75xx;
+};
+
+typedef union cvmx_dpi_ncb_ctl cvmx_dpi_ncb_ctl_t;
+
+/**
+ * cvmx_dpi_pint_info
+ *
+ * This register provides DPI packet interrupt information.
+ *
+ */
+union cvmx_dpi_pint_info {
+       u64 u64;
+       struct cvmx_dpi_pint_info_s {
+               u64 reserved_14_63 : 50;
+               u64 iinfo : 6;
+               u64 reserved_6_7 : 2;
+               u64 sinfo : 6;
+       } s;
+       struct cvmx_dpi_pint_info_s cn61xx;
+       struct cvmx_dpi_pint_info_s cn63xx;
+       struct cvmx_dpi_pint_info_s cn63xxp1;
+       struct cvmx_dpi_pint_info_s cn66xx;
+       struct cvmx_dpi_pint_info_s cn68xx;
+       struct cvmx_dpi_pint_info_s cn68xxp1;
+       struct cvmx_dpi_pint_info_s cn70xx;
+       struct cvmx_dpi_pint_info_s cn70xxp1;
+       struct cvmx_dpi_pint_info_s cn73xx;
+       struct cvmx_dpi_pint_info_s cn78xx;
+       struct cvmx_dpi_pint_info_s cn78xxp1;
+       struct cvmx_dpi_pint_info_s cnf71xx;
+       struct cvmx_dpi_pint_info_s cnf75xx;
+};
+
+typedef union cvmx_dpi_pint_info cvmx_dpi_pint_info_t;
+
+/**
+ * cvmx_dpi_pkt_err_rsp
+ */
+union cvmx_dpi_pkt_err_rsp {
+       u64 u64;
+       struct cvmx_dpi_pkt_err_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 pkterr : 1;
+       } s;
+       struct cvmx_dpi_pkt_err_rsp_s cn61xx;
+       struct cvmx_dpi_pkt_err_rsp_s cn63xx;
+       struct cvmx_dpi_pkt_err_rsp_s cn63xxp1;
+       struct cvmx_dpi_pkt_err_rsp_s cn66xx;
+       struct cvmx_dpi_pkt_err_rsp_s cn68xx;
+       struct cvmx_dpi_pkt_err_rsp_s cn68xxp1;
+       struct cvmx_dpi_pkt_err_rsp_s cn70xx;
+       struct cvmx_dpi_pkt_err_rsp_s cn70xxp1;
+       struct cvmx_dpi_pkt_err_rsp_s cn73xx;
+       struct cvmx_dpi_pkt_err_rsp_s cn78xx;
+       struct cvmx_dpi_pkt_err_rsp_s cn78xxp1;
+       struct cvmx_dpi_pkt_err_rsp_s cnf71xx;
+       struct cvmx_dpi_pkt_err_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dpi_pkt_err_rsp cvmx_dpi_pkt_err_rsp_t;
+
+/**
+ * cvmx_dpi_req_err_rsp
+ */
+union cvmx_dpi_req_err_rsp {
+       u64 u64;
+       struct cvmx_dpi_req_err_rsp_s {
+               u64 reserved_8_63 : 56;
+               u64 qerr : 8;
+       } s;
+       struct cvmx_dpi_req_err_rsp_s cn61xx;
+       struct cvmx_dpi_req_err_rsp_s cn63xx;
+       struct cvmx_dpi_req_err_rsp_s cn63xxp1;
+       struct cvmx_dpi_req_err_rsp_s cn66xx;
+       struct cvmx_dpi_req_err_rsp_s cn68xx;
+       struct cvmx_dpi_req_err_rsp_s cn68xxp1;
+       struct cvmx_dpi_req_err_rsp_s cn70xx;
+       struct cvmx_dpi_req_err_rsp_s cn70xxp1;
+       struct cvmx_dpi_req_err_rsp_s cn73xx;
+       struct cvmx_dpi_req_err_rsp_s cn78xx;
+       struct cvmx_dpi_req_err_rsp_s cn78xxp1;
+       struct cvmx_dpi_req_err_rsp_s cnf71xx;
+       struct cvmx_dpi_req_err_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dpi_req_err_rsp cvmx_dpi_req_err_rsp_t;
+
+/**
+ * cvmx_dpi_req_err_rsp_en
+ */
+union cvmx_dpi_req_err_rsp_en {
+       u64 u64;
+       struct cvmx_dpi_req_err_rsp_en_s {
+               u64 reserved_8_63 : 56;
+               u64 en : 8;
+       } s;
+       struct cvmx_dpi_req_err_rsp_en_s cn61xx;
+       struct cvmx_dpi_req_err_rsp_en_s cn63xx;
+       struct cvmx_dpi_req_err_rsp_en_s cn63xxp1;
+       struct cvmx_dpi_req_err_rsp_en_s cn66xx;
+       struct cvmx_dpi_req_err_rsp_en_s cn68xx;
+       struct cvmx_dpi_req_err_rsp_en_s cn68xxp1;
+       struct cvmx_dpi_req_err_rsp_en_s cn70xx;
+       struct cvmx_dpi_req_err_rsp_en_s cn70xxp1;
+       struct cvmx_dpi_req_err_rsp_en_s cn73xx;
+       struct cvmx_dpi_req_err_rsp_en_s cn78xx;
+       struct cvmx_dpi_req_err_rsp_en_s cn78xxp1;
+       struct cvmx_dpi_req_err_rsp_en_s cnf71xx;
+       struct cvmx_dpi_req_err_rsp_en_s cnf75xx;
+};
+
+typedef union cvmx_dpi_req_err_rsp_en cvmx_dpi_req_err_rsp_en_t;
+
+/**
+ * cvmx_dpi_req_err_rst
+ */
+union cvmx_dpi_req_err_rst {
+       u64 u64;
+       struct cvmx_dpi_req_err_rst_s {
+               u64 reserved_8_63 : 56;
+               u64 qerr : 8;
+       } s;
+       struct cvmx_dpi_req_err_rst_s cn61xx;
+       struct cvmx_dpi_req_err_rst_s cn63xx;
+       struct cvmx_dpi_req_err_rst_s cn63xxp1;
+       struct cvmx_dpi_req_err_rst_s cn66xx;
+       struct cvmx_dpi_req_err_rst_s cn68xx;
+       struct cvmx_dpi_req_err_rst_s cn68xxp1;
+       struct cvmx_dpi_req_err_rst_s cn70xx;
+       struct cvmx_dpi_req_err_rst_s cn70xxp1;
+       struct cvmx_dpi_req_err_rst_s cn73xx;
+       struct cvmx_dpi_req_err_rst_s cn78xx;
+       struct cvmx_dpi_req_err_rst_s cn78xxp1;
+       struct cvmx_dpi_req_err_rst_s cnf71xx;
+       struct cvmx_dpi_req_err_rst_s cnf75xx;
+};
+
+typedef union cvmx_dpi_req_err_rst cvmx_dpi_req_err_rst_t;
+
+/**
+ * cvmx_dpi_req_err_rst_en
+ */
+union cvmx_dpi_req_err_rst_en {
+       u64 u64;
+       struct cvmx_dpi_req_err_rst_en_s {
+               u64 reserved_8_63 : 56;
+               u64 en : 8;
+       } s;
+       struct cvmx_dpi_req_err_rst_en_s cn61xx;
+       struct cvmx_dpi_req_err_rst_en_s cn63xx;
+       struct cvmx_dpi_req_err_rst_en_s cn63xxp1;
+       struct cvmx_dpi_req_err_rst_en_s cn66xx;
+       struct cvmx_dpi_req_err_rst_en_s cn68xx;
+       struct cvmx_dpi_req_err_rst_en_s cn68xxp1;
+       struct cvmx_dpi_req_err_rst_en_s cn70xx;
+       struct cvmx_dpi_req_err_rst_en_s cn70xxp1;
+       struct cvmx_dpi_req_err_rst_en_s cn73xx;
+       struct cvmx_dpi_req_err_rst_en_s cn78xx;
+       struct cvmx_dpi_req_err_rst_en_s cn78xxp1;
+       struct cvmx_dpi_req_err_rst_en_s cnf71xx;
+       struct cvmx_dpi_req_err_rst_en_s cnf75xx;
+};
+
+typedef union cvmx_dpi_req_err_rst_en cvmx_dpi_req_err_rst_en_t;
+
+/**
+ * cvmx_dpi_req_err_skip_comp
+ */
+union cvmx_dpi_req_err_skip_comp {
+       u64 u64;
+       struct cvmx_dpi_req_err_skip_comp_s {
+               u64 reserved_24_63 : 40;
+               u64 en_rst : 8;
+               u64 reserved_8_15 : 8;
+               u64 en_rsp : 8;
+       } s;
+       struct cvmx_dpi_req_err_skip_comp_s cn61xx;
+       struct cvmx_dpi_req_err_skip_comp_s cn66xx;
+       struct cvmx_dpi_req_err_skip_comp_s cn68xx;
+       struct cvmx_dpi_req_err_skip_comp_s cn68xxp1;
+       struct cvmx_dpi_req_err_skip_comp_s cn70xx;
+       struct cvmx_dpi_req_err_skip_comp_s cn70xxp1;
+       struct cvmx_dpi_req_err_skip_comp_s cn73xx;
+       struct cvmx_dpi_req_err_skip_comp_s cn78xx;
+       struct cvmx_dpi_req_err_skip_comp_s cn78xxp1;
+       struct cvmx_dpi_req_err_skip_comp_s cnf71xx;
+       struct cvmx_dpi_req_err_skip_comp_s cnf75xx;
+};
+
+typedef union cvmx_dpi_req_err_skip_comp cvmx_dpi_req_err_skip_comp_t;
+
+/**
+ * cvmx_dpi_req_gbl_en
+ */
+union cvmx_dpi_req_gbl_en {
+       u64 u64;
+       struct cvmx_dpi_req_gbl_en_s {
+               u64 reserved_8_63 : 56;
+               u64 qen : 8;
+       } s;
+       struct cvmx_dpi_req_gbl_en_s cn61xx;
+       struct cvmx_dpi_req_gbl_en_s cn63xx;
+       struct cvmx_dpi_req_gbl_en_s cn63xxp1;
+       struct cvmx_dpi_req_gbl_en_s cn66xx;
+       struct cvmx_dpi_req_gbl_en_s cn68xx;
+       struct cvmx_dpi_req_gbl_en_s cn68xxp1;
+       struct cvmx_dpi_req_gbl_en_s cn70xx;
+       struct cvmx_dpi_req_gbl_en_s cn70xxp1;
+       struct cvmx_dpi_req_gbl_en_s cn73xx;
+       struct cvmx_dpi_req_gbl_en_s cn78xx;
+       struct cvmx_dpi_req_gbl_en_s cn78xxp1;
+       struct cvmx_dpi_req_gbl_en_s cnf71xx;
+       struct cvmx_dpi_req_gbl_en_s cnf75xx;
+};
+
+typedef union cvmx_dpi_req_gbl_en cvmx_dpi_req_gbl_en_t;
+
+/**
+ * cvmx_dpi_sli_prt#_cfg
+ *
+ * This register configures the max read request size, max payload size, and max number of SLI
+ * tags in use. Indexed by SLI_PORT_E.
+ */
+union cvmx_dpi_sli_prtx_cfg {
+       u64 u64;
+       struct cvmx_dpi_sli_prtx_cfg_s {
+               u64 reserved_29_63 : 35;
+               u64 ncbsel : 1;
+               u64 reserved_25_27 : 3;
+               u64 halt : 1;
+               u64 qlm_cfg : 4;
+               u64 reserved_17_19 : 3;
+               u64 rd_mode : 1;
+               u64 reserved_15_15 : 1;
+               u64 molr : 7;
+               u64 mps_lim : 1;
+               u64 reserved_5_6 : 2;
+               u64 mps : 1;
+               u64 mrrs_lim : 1;
+               u64 reserved_2_2 : 1;
+               u64 mrrs : 2;
+       } s;
+       struct cvmx_dpi_sli_prtx_cfg_cn61xx {
+               u64 reserved_25_63 : 39;
+               u64 halt : 1;
+               u64 qlm_cfg : 4;
+               u64 reserved_17_19 : 3;
+               u64 rd_mode : 1;
+               u64 reserved_14_15 : 2;
+               u64 molr : 6;
+               u64 mps_lim : 1;
+               u64 reserved_5_6 : 2;
+               u64 mps : 1;
+               u64 mrrs_lim : 1;
+               u64 reserved_2_2 : 1;
+               u64 mrrs : 2;
+       } cn61xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx {
+               u64 reserved_25_63 : 39;
+               u64 halt : 1;
+               u64 reserved_21_23 : 3;
+               u64 qlm_cfg : 1;
+               u64 reserved_17_19 : 3;
+               u64 rd_mode : 1;
+               u64 reserved_14_15 : 2;
+               u64 molr : 6;
+               u64 mps_lim : 1;
+               u64 reserved_5_6 : 2;
+               u64 mps : 1;
+               u64 mrrs_lim : 1;
+               u64 reserved_2_2 : 1;
+               u64 mrrs : 2;
+       } cn63xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx cn63xxp1;
+       struct cvmx_dpi_sli_prtx_cfg_cn61xx cn66xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx cn68xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx cn68xxp1;
+       struct cvmx_dpi_sli_prtx_cfg_cn70xx {
+               u64 reserved_25_63 : 39;
+               u64 halt : 1;
+               u64 reserved_17_23 : 7;
+               u64 rd_mode : 1;
+               u64 reserved_14_15 : 2;
+               u64 molr : 6;
+               u64 mps_lim : 1;
+               u64 reserved_5_6 : 2;
+               u64 mps : 1;
+               u64 mrrs_lim : 1;
+               u64 reserved_2_2 : 1;
+               u64 mrrs : 2;
+       } cn70xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn70xx cn70xxp1;
+       struct cvmx_dpi_sli_prtx_cfg_cn73xx {
+               u64 reserved_29_63 : 35;
+               u64 ncbsel : 1;
+               u64 reserved_25_27 : 3;
+               u64 halt : 1;
+               u64 reserved_21_23 : 3;
+               u64 qlm_cfg : 1;
+               u64 reserved_17_19 : 3;
+               u64 rd_mode : 1;
+               u64 reserved_15_15 : 1;
+               u64 molr : 7;
+               u64 mps_lim : 1;
+               u64 reserved_5_6 : 2;
+               u64 mps : 1;
+               u64 mrrs_lim : 1;
+               u64 reserved_2_2 : 1;
+               u64 mrrs : 2;
+       } cn73xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn73xx cn78xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn73xx cn78xxp1;
+       struct cvmx_dpi_sli_prtx_cfg_cn61xx cnf71xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_dpi_sli_prtx_cfg cvmx_dpi_sli_prtx_cfg_t;
+
+/**
+ * cvmx_dpi_sli_prt#_err
+ *
+ * This register logs the address associated with the reported SLI error response.
+ * Indexed by SLI_PORT_E.
+ */
+union cvmx_dpi_sli_prtx_err {
+       u64 u64;
+       struct cvmx_dpi_sli_prtx_err_s {
+               u64 addr : 61;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_dpi_sli_prtx_err_s cn61xx;
+       struct cvmx_dpi_sli_prtx_err_s cn63xx;
+       struct cvmx_dpi_sli_prtx_err_s cn63xxp1;
+       struct cvmx_dpi_sli_prtx_err_s cn66xx;
+       struct cvmx_dpi_sli_prtx_err_s cn68xx;
+       struct cvmx_dpi_sli_prtx_err_s cn68xxp1;
+       struct cvmx_dpi_sli_prtx_err_s cn70xx;
+       struct cvmx_dpi_sli_prtx_err_s cn70xxp1;
+       struct cvmx_dpi_sli_prtx_err_s cn73xx;
+       struct cvmx_dpi_sli_prtx_err_s cn78xx;
+       struct cvmx_dpi_sli_prtx_err_s cn78xxp1;
+       struct cvmx_dpi_sli_prtx_err_s cnf71xx;
+       struct cvmx_dpi_sli_prtx_err_s cnf75xx;
+};
+
+typedef union cvmx_dpi_sli_prtx_err cvmx_dpi_sli_prtx_err_t;
+
+/**
+ * cvmx_dpi_sli_prt#_err_info
+ *
+ * This register logs information associated with the reported SLI error response.
+ * Indexed by SLI_PORT_E.
+ */
+union cvmx_dpi_sli_prtx_err_info {
+       u64 u64;
+       struct cvmx_dpi_sli_prtx_err_info_s {
+               u64 reserved_9_63 : 55;
+               u64 lock : 1;
+               u64 reserved_5_7 : 3;
+               u64 type : 1;
+               u64 reserved_3_3 : 1;
+               u64 reqq : 3;
+       } s;
+       struct cvmx_dpi_sli_prtx_err_info_s cn61xx;
+       struct cvmx_dpi_sli_prtx_err_info_s cn63xx;
+       struct cvmx_dpi_sli_prtx_err_info_s cn63xxp1;
+       struct cvmx_dpi_sli_prtx_err_info_s cn66xx;
+       struct cvmx_dpi_sli_prtx_err_info_s cn68xx;
+       struct cvmx_dpi_sli_prtx_err_info_s cn68xxp1;
+       struct cvmx_dpi_sli_prtx_err_info_s cn70xx;
+       struct cvmx_dpi_sli_prtx_err_info_s cn70xxp1;
+       struct cvmx_dpi_sli_prtx_err_info_cn73xx {
+               u64 reserved_32_63 : 32;
+               u64 pvf : 16;
+               u64 reserved_9_15 : 7;
+               u64 lock : 1;
+               u64 reserved_5_7 : 3;
+               u64 type : 1;
+               u64 reserved_3_3 : 1;
+               u64 reqq : 3;
+       } cn73xx;
+       struct cvmx_dpi_sli_prtx_err_info_cn73xx cn78xx;
+       struct cvmx_dpi_sli_prtx_err_info_cn78xxp1 {
+               u64 reserved_23_63 : 41;
+               u64 vf : 7;
+               u64 reserved_9_15 : 7;
+               u64 lock : 1;
+               u64 reserved_5_7 : 3;
+               u64 type : 1;
+               u64 reserved_3_3 : 1;
+               u64 reqq : 3;
+       } cn78xxp1;
+       struct cvmx_dpi_sli_prtx_err_info_s cnf71xx;
+       struct cvmx_dpi_sli_prtx_err_info_cn73xx cnf75xx;
+};
+
+typedef union cvmx_dpi_sli_prtx_err_info cvmx_dpi_sli_prtx_err_info_t;
+
+/**
+ * cvmx_dpi_srio_rx_bell#
+ *
+ * Reading this register pops an entry off the corresponding SRIO RX doorbell FIFO.
+ * The chip supports 16 FIFOs per SRIO interface for a total of 32 FIFOs/Registers.
+ * The MSB of the registers indicates the MAC while the 4 LSBs indicate the FIFO.
+ * Information on the doorbell allocation can be found in SRIO()_RX_BELL_CTRL.
+ */
+union cvmx_dpi_srio_rx_bellx {
+       u64 u64;
+       struct cvmx_dpi_srio_rx_bellx_s {
+               u64 reserved_48_63 : 16;
+               u64 data : 16;
+               u64 sid : 16;
+               u64 count : 8;
+               u64 reserved_5_7 : 3;
+               u64 dest_id : 1;
+               u64 id16 : 1;
+               u64 reserved_2_2 : 1;
+               u64 dpriority : 2;
+       } s;
+       struct cvmx_dpi_srio_rx_bellx_s cnf75xx;
+};
+
+typedef union cvmx_dpi_srio_rx_bellx cvmx_dpi_srio_rx_bellx_t;
+
+/**
+ * cvmx_dpi_srio_rx_bell_seq#
+ *
+ * This register contains the value of the sequence counter when the doorbell
+ * was received and a shadow copy of the Bell FIFO Count that can be read without
+ * emptying the FIFO.  This register must be read prior to corresponding
+ * DPI_SRIO_RX_BELL register to link the doorbell and sequence number.
+ *
+ * Information on the Doorbell Allocation can be found in SRIO()_RX_BELL_CTRL.
+ */
+union cvmx_dpi_srio_rx_bell_seqx {
+       u64 u64;
+       struct cvmx_dpi_srio_rx_bell_seqx_s {
+               u64 reserved_40_63 : 24;
+               u64 count : 8;
+               u64 sid : 32;
+       } s;
+       struct cvmx_dpi_srio_rx_bell_seqx_s cnf75xx;
+};
+
+typedef union cvmx_dpi_srio_rx_bell_seqx cvmx_dpi_srio_rx_bell_seqx_t;
+
+/**
+ * cvmx_dpi_swa_q_vmid
+ *
+ * Not used.
+ *
+ */
+union cvmx_dpi_swa_q_vmid {
+       u64 u64;
+       struct cvmx_dpi_swa_q_vmid_s {
+               u64 vmid7 : 8;
+               u64 vmid6 : 8;
+               u64 vmid5 : 8;
+               u64 vmid4 : 8;
+               u64 vmid3 : 8;
+               u64 vmid2 : 8;
+               u64 vmid1 : 8;
+               u64 vmid0 : 8;
+       } s;
+       struct cvmx_dpi_swa_q_vmid_s cn73xx;
+       struct cvmx_dpi_swa_q_vmid_s cn78xx;
+       struct cvmx_dpi_swa_q_vmid_s cn78xxp1;
+       struct cvmx_dpi_swa_q_vmid_s cnf75xx;
+};
+
+typedef union cvmx_dpi_swa_q_vmid cvmx_dpi_swa_q_vmid_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-dtx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-dtx-defs.h
new file mode 100644 (file)
index 0000000..afb581a
--- /dev/null
@@ -0,0 +1,6962 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon dtx.
+ */
+
+#ifndef __CVMX_DTX_DEFS_H__
+#define __CVMX_DTX_DEFS_H__
+
+#define CVMX_DTX_AGL_BCST_RSP         (0x00011800FE700080ull)
+#define CVMX_DTX_AGL_CTL              (0x00011800FE700060ull)
+#define CVMX_DTX_AGL_DATX(offset)      (0x00011800FE700040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_AGL_ENAX(offset)      (0x00011800FE700020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_AGL_SELX(offset)      (0x00011800FE700000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ASE_BCST_RSP         (0x00011800FE6E8080ull)
+#define CVMX_DTX_ASE_CTL              (0x00011800FE6E8060ull)
+#define CVMX_DTX_ASE_DATX(offset)      (0x00011800FE6E8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ASE_ENAX(offset)      (0x00011800FE6E8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ASE_SELX(offset)      (0x00011800FE6E8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX1I_BCST_RSP               (0x00011800FED78080ull)
+#define CVMX_DTX_BBX1I_CTL            (0x00011800FED78060ull)
+#define CVMX_DTX_BBX1I_DATX(offset)    (0x00011800FED78040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX1I_ENAX(offset)    (0x00011800FED78020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX1I_SELX(offset)    (0x00011800FED78000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX2I_BCST_RSP               (0x00011800FED80080ull)
+#define CVMX_DTX_BBX2I_CTL            (0x00011800FED80060ull)
+#define CVMX_DTX_BBX2I_DATX(offset)    (0x00011800FED80040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX2I_ENAX(offset)    (0x00011800FED80020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX2I_SELX(offset)    (0x00011800FED80000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX3I_BCST_RSP               (0x00011800FED88080ull)
+#define CVMX_DTX_BBX3I_CTL            (0x00011800FED88060ull)
+#define CVMX_DTX_BBX3I_DATX(offset)    (0x00011800FED88040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX3I_ENAX(offset)    (0x00011800FED88020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BBX3I_SELX(offset)    (0x00011800FED88000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BCH_BCST_RSP         (0x00011800FE388080ull)
+#define CVMX_DTX_BCH_CTL              (0x00011800FE388060ull)
+#define CVMX_DTX_BCH_DATX(offset)      (0x00011800FE388040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BCH_ENAX(offset)      (0x00011800FE388020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BCH_SELX(offset)      (0x00011800FE388000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BGXX_BCST_RSP(offset) (0x00011800FE700080ull + ((offset) & 7) * 32768)
+#define CVMX_DTX_BGXX_CTL(offset)      (0x00011800FE700060ull + ((offset) & 7) * 32768)
+#define CVMX_DTX_BGXX_DATX(offset, block_id)                                                       \
+       (0x00011800FE700040ull + (((offset) & 1) + ((block_id) & 7) * 0x1000ull) * 8)
+#define CVMX_DTX_BGXX_ENAX(offset, block_id)                                                       \
+       (0x00011800FE700020ull + (((offset) & 1) + ((block_id) & 7) * 0x1000ull) * 8)
+#define CVMX_DTX_BGXX_SELX(offset, block_id)                                                       \
+       (0x00011800FE700000ull + (((offset) & 1) + ((block_id) & 7) * 0x1000ull) * 8)
+#define CVMX_DTX_BROADCAST_CTL         (0x00011800FE7F0060ull)
+#define CVMX_DTX_BROADCAST_ENAX(offset) (0x00011800FE7F0020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BROADCAST_SELX(offset) (0x00011800FE7F0000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BTS_BCST_RSP          (0x00011800FE5B0080ull)
+#define CVMX_DTX_BTS_CTL               (0x00011800FE5B0060ull)
+#define CVMX_DTX_BTS_DATX(offset)      (0x00011800FE5B0040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BTS_ENAX(offset)      (0x00011800FE5B0020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_BTS_SELX(offset)      (0x00011800FE5B0000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_CIU_BCST_RSP          (0x00011800FE808080ull)
+#define CVMX_DTX_CIU_CTL               (0x00011800FE808060ull)
+#define CVMX_DTX_CIU_DATX(offset)      (0x00011800FE808040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_CIU_ENAX(offset)      (0x00011800FE808020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_CIU_SELX(offset)      (0x00011800FE808000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DENC_BCST_RSP         (0x00011800FED48080ull)
+#define CVMX_DTX_DENC_CTL              (0x00011800FED48060ull)
+#define CVMX_DTX_DENC_DATX(offset)     (0x00011800FED48040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DENC_ENAX(offset)     (0x00011800FED48020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DENC_SELX(offset)     (0x00011800FED48000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DFA_BCST_RSP          (0x00011800FE1B8080ull)
+#define CVMX_DTX_DFA_CTL               (0x00011800FE1B8060ull)
+#define CVMX_DTX_DFA_DATX(offset)      (0x00011800FE1B8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DFA_ENAX(offset)      (0x00011800FE1B8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DFA_SELX(offset)      (0x00011800FE1B8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DLFE_BCST_RSP         (0x00011800FED18080ull)
+#define CVMX_DTX_DLFE_CTL              (0x00011800FED18060ull)
+#define CVMX_DTX_DLFE_DATX(offset)     (0x00011800FED18040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DLFE_ENAX(offset)     (0x00011800FED18020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DLFE_SELX(offset)     (0x00011800FED18000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DPI_BCST_RSP          (0x00011800FEEF8080ull)
+#define CVMX_DTX_DPI_CTL               (0x00011800FEEF8060ull)
+#define CVMX_DTX_DPI_DATX(offset)      (0x00011800FEEF8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DPI_ENAX(offset)      (0x00011800FEEF8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_DPI_SELX(offset)      (0x00011800FEEF8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_FDEQX_BCST_RSP(offset) (0x00011800FED30080ull + ((offset) & 1) * 0x20000ull)
+#define CVMX_DTX_FDEQX_CTL(offset)     (0x00011800FED30060ull + ((offset) & 1) * 0x20000ull)
+#define CVMX_DTX_FDEQX_DATX(offset, block_id)                                                      \
+       (0x00011800FED30040ull + (((offset) & 1) + ((block_id) & 1) * 0x4000ull) * 8)
+#define CVMX_DTX_FDEQX_ENAX(offset, block_id)                                                      \
+       (0x00011800FED30020ull + (((offset) & 1) + ((block_id) & 1) * 0x4000ull) * 8)
+#define CVMX_DTX_FDEQX_SELX(offset, block_id)                                                      \
+       (0x00011800FED30000ull + (((offset) & 1) + ((block_id) & 1) * 0x4000ull) * 8)
+#define CVMX_DTX_FPA_BCST_RSP CVMX_DTX_FPA_BCST_RSP_FUNC()
+static inline u64 CVMX_DTX_FPA_BCST_RSP_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE940080ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE940080ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE940080ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE140080ull;
+       }
+       return 0x00011800FE940080ull;
+}
+
+#define CVMX_DTX_FPA_CTL CVMX_DTX_FPA_CTL_FUNC()
+static inline u64 CVMX_DTX_FPA_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE940060ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE940060ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE940060ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE140060ull;
+       }
+       return 0x00011800FE940060ull;
+}
+
+static inline u64 CVMX_DTX_FPA_DATX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE940040ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE940040ull + (offset) * 8;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE940040ull + (offset) * 8;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE140040ull + (offset) * 8;
+       }
+       return 0x00011800FE940040ull + (offset) * 8;
+}
+
+static inline u64 CVMX_DTX_FPA_ENAX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE940020ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE940020ull + (offset) * 8;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE940020ull + (offset) * 8;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE140020ull + (offset) * 8;
+       }
+       return 0x00011800FE940020ull + (offset) * 8;
+}
+
+static inline u64 CVMX_DTX_FPA_SELX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE940000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE940000ull + (offset) * 8;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE940000ull + (offset) * 8;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE140000ull + (offset) * 8;
+       }
+       return 0x00011800FE940000ull + (offset) * 8;
+}
+
+#define CVMX_DTX_GMXX_BCST_RSP(offset) (0x00011800FE040080ull + ((offset) & 1) * 0x40000ull)
+#define CVMX_DTX_GMXX_CTL(offset)      (0x00011800FE040060ull + ((offset) & 1) * 0x40000ull)
+#define CVMX_DTX_GMXX_DATX(offset, block_id)                                                       \
+       (0x00011800FE040040ull + (((offset) & 1) + ((block_id) & 1) * 0x8000ull) * 8)
+#define CVMX_DTX_GMXX_ENAX(offset, block_id)                                                       \
+       (0x00011800FE040020ull + (((offset) & 1) + ((block_id) & 1) * 0x8000ull) * 8)
+#define CVMX_DTX_GMXX_SELX(offset, block_id)                                                       \
+       (0x00011800FE040000ull + (((offset) & 1) + ((block_id) & 1) * 0x8000ull) * 8)
+#define CVMX_DTX_GSERX_BCST_RSP(offset) (0x00011800FE480080ull + ((offset) & 15) * 32768)
+#define CVMX_DTX_GSERX_CTL(offset)     (0x00011800FE480060ull + ((offset) & 15) * 32768)
+#define CVMX_DTX_GSERX_DATX(offset, block_id)                                                      \
+       (0x00011800FE480040ull + (((offset) & 1) + ((block_id) & 15) * 0x1000ull) * 8)
+#define CVMX_DTX_GSERX_ENAX(offset, block_id)                                                      \
+       (0x00011800FE480020ull + (((offset) & 1) + ((block_id) & 15) * 0x1000ull) * 8)
+#define CVMX_DTX_GSERX_SELX(offset, block_id)                                                      \
+       (0x00011800FE480000ull + (((offset) & 1) + ((block_id) & 15) * 0x1000ull) * 8)
+#define CVMX_DTX_HNA_BCST_RSP             (0x00011800FE238080ull)
+#define CVMX_DTX_HNA_CTL                  (0x00011800FE238060ull)
+#define CVMX_DTX_HNA_DATX(offset)         (0x00011800FE238040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_HNA_ENAX(offset)         (0x00011800FE238020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_HNA_SELX(offset)         (0x00011800FE238000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ILA_BCST_RSP             (0x00011800FE0B8080ull)
+#define CVMX_DTX_ILA_CTL                  (0x00011800FE0B8060ull)
+#define CVMX_DTX_ILA_DATX(offset)         (0x00011800FE0B8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ILA_ENAX(offset)         (0x00011800FE0B8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ILA_SELX(offset)         (0x00011800FE0B8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ILK_BCST_RSP             (0x00011800FE0A0080ull)
+#define CVMX_DTX_ILK_CTL                  (0x00011800FE0A0060ull)
+#define CVMX_DTX_ILK_DATX(offset)         (0x00011800FE0A0040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ILK_ENAX(offset)         (0x00011800FE0A0020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ILK_SELX(offset)         (0x00011800FE0A0000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOBN_BCST_RSP            (0x00011800FE780080ull)
+#define CVMX_DTX_IOBN_CTL                 (0x00011800FE780060ull)
+#define CVMX_DTX_IOBN_DATX(offset)        (0x00011800FE780040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOBN_ENAX(offset)        (0x00011800FE780020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOBN_SELX(offset)        (0x00011800FE780000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOBP_BCST_RSP            (0x00011800FE7A0080ull)
+#define CVMX_DTX_IOBP_CTL                 (0x00011800FE7A0060ull)
+#define CVMX_DTX_IOBP_DATX(offset)        (0x00011800FE7A0040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOBP_ENAX(offset)        (0x00011800FE7A0020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOBP_SELX(offset)        (0x00011800FE7A0000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOB_BCST_RSP             (0x00011800FE780080ull)
+#define CVMX_DTX_IOB_CTL                  (0x00011800FE780060ull)
+#define CVMX_DTX_IOB_DATX(offset)         (0x00011800FE780040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOB_ENAX(offset)         (0x00011800FE780020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IOB_SELX(offset)         (0x00011800FE780000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IPD_BCST_RSP             (0x00011800FE278080ull)
+#define CVMX_DTX_IPD_CTL                  (0x00011800FE278060ull)
+#define CVMX_DTX_IPD_DATX(offset)         (0x00011800FE278040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IPD_ENAX(offset)         (0x00011800FE278020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_IPD_SELX(offset)         (0x00011800FE278000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_KEY_BCST_RSP             (0x00011800FE100080ull)
+#define CVMX_DTX_KEY_CTL                  (0x00011800FE100060ull)
+#define CVMX_DTX_KEY_DATX(offset)         (0x00011800FE100040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_KEY_ENAX(offset)         (0x00011800FE100020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_KEY_SELX(offset)         (0x00011800FE100000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_L2C_CBCX_BCST_RSP(offset) (0x00011800FE420080ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_L2C_CBCX_CTL(offset)     (0x00011800FE420060ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_L2C_CBCX_DATX(offset, block_id)                                                   \
+       (0x00011800FE420040ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_CBCX_ENAX(offset, block_id)                                                   \
+       (0x00011800FE420020ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_CBCX_SELX(offset, block_id)                                                   \
+       (0x00011800FE420000ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_MCIX_BCST_RSP(offset) (0x00011800FE2E0080ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_L2C_MCIX_CTL(offset)     (0x00011800FE2E0060ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_L2C_MCIX_DATX(offset, block_id)                                                   \
+       (0x00011800FE2E0040ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_MCIX_ENAX(offset, block_id)                                                   \
+       (0x00011800FE2E0020ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_MCIX_SELX(offset, block_id)                                                   \
+       (0x00011800FE2E0000ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_TADX_BCST_RSP(offset) (0x00011800FE240080ull + ((offset) & 7) * 32768)
+#define CVMX_DTX_L2C_TADX_CTL(offset)     (0x00011800FE240060ull + ((offset) & 7) * 32768)
+#define CVMX_DTX_L2C_TADX_DATX(offset, block_id)                                                   \
+       (0x00011800FE240040ull + (((offset) & 1) + ((block_id) & 7) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_TADX_ENAX(offset, block_id)                                                   \
+       (0x00011800FE240020ull + (((offset) & 1) + ((block_id) & 7) * 0x1000ull) * 8)
+#define CVMX_DTX_L2C_TADX_SELX(offset, block_id)                                                   \
+       (0x00011800FE240000ull + (((offset) & 1) + ((block_id) & 7) * 0x1000ull) * 8)
+#define CVMX_DTX_LAPX_BCST_RSP(offset) (0x00011800FE060080ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_LAPX_CTL(offset)      (0x00011800FE060060ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_LAPX_DATX(offset, block_id)                                                       \
+       (0x00011800FE060040ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_LAPX_ENAX(offset, block_id)                                                       \
+       (0x00011800FE060020ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_LAPX_SELX(offset, block_id)                                                       \
+       (0x00011800FE060000ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_LBK_BCST_RSP         (0x00011800FE090080ull)
+#define CVMX_DTX_LBK_CTL              (0x00011800FE090060ull)
+#define CVMX_DTX_LBK_DATX(offset)      (0x00011800FE090040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_LBK_ENAX(offset)      (0x00011800FE090020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_LBK_SELX(offset)      (0x00011800FE090000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_LMCX_BCST_RSP(offset) (0x00011800FE440080ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_LMCX_CTL(offset)      (0x00011800FE440060ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_LMCX_DATX(offset, block_id)                                                       \
+       (0x00011800FE440040ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_LMCX_ENAX(offset, block_id)                                                       \
+       (0x00011800FE440020ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_LMCX_SELX(offset, block_id)                                                       \
+       (0x00011800FE440000ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_MDBX_BCST_RSP(offset) (0x00011800FEC00080ull + ((offset) & 31) * 32768)
+#define CVMX_DTX_MDBX_CTL(offset)      (0x00011800FEC00060ull + ((offset) & 31) * 32768)
+#define CVMX_DTX_MDBX_DATX(offset, block_id)                                                       \
+       (0x00011800FEC00040ull + (((offset) & 1) + ((block_id) & 31) * 0x1000ull) * 8)
+#define CVMX_DTX_MDBX_ENAX(offset, block_id)                                                       \
+       (0x00011800FEC00020ull + (((offset) & 1) + ((block_id) & 31) * 0x1000ull) * 8)
+#define CVMX_DTX_MDBX_SELX(offset, block_id)                                                       \
+       (0x00011800FEC00000ull + (((offset) & 1) + ((block_id) & 31) * 0x1000ull) * 8)
+#define CVMX_DTX_MHBW_BCST_RSP            (0x00011800FE598080ull)
+#define CVMX_DTX_MHBW_CTL                 (0x00011800FE598060ull)
+#define CVMX_DTX_MHBW_DATX(offset)        (0x00011800FE598040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_MHBW_ENAX(offset)        (0x00011800FE598020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_MHBW_SELX(offset)        (0x00011800FE598000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_MIO_BCST_RSP             (0x00011800FE000080ull)
+#define CVMX_DTX_MIO_CTL                  (0x00011800FE000060ull)
+#define CVMX_DTX_MIO_DATX(offset)         (0x00011800FE000040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_MIO_ENAX(offset)         (0x00011800FE000020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_MIO_SELX(offset)         (0x00011800FE000000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_OCX_BOT_BCST_RSP         (0x00011800FE198080ull)
+#define CVMX_DTX_OCX_BOT_CTL              (0x00011800FE198060ull)
+#define CVMX_DTX_OCX_BOT_DATX(offset)     (0x00011800FE198040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_OCX_BOT_ENAX(offset)     (0x00011800FE198020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_OCX_BOT_SELX(offset)     (0x00011800FE198000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_OCX_LNKX_BCST_RSP(offset) (0x00011800FE180080ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_OCX_LNKX_CTL(offset)     (0x00011800FE180060ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_OCX_LNKX_DATX(offset, block_id)                                                   \
+       (0x00011800FE180040ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_OCX_LNKX_ENAX(offset, block_id)                                                   \
+       (0x00011800FE180020ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_OCX_LNKX_SELX(offset, block_id)                                                   \
+       (0x00011800FE180000ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_OCX_OLEX_BCST_RSP(offset) (0x00011800FE1A0080ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_OCX_OLEX_CTL(offset)     (0x00011800FE1A0060ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_OCX_OLEX_DATX(offset, block_id)                                                   \
+       (0x00011800FE1A0040ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_OCX_OLEX_ENAX(offset, block_id)                                                   \
+       (0x00011800FE1A0020ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_OCX_OLEX_SELX(offset, block_id)                                                   \
+       (0x00011800FE1A0000ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_OCX_TOP_BCST_RSP     (0x00011800FE088080ull)
+#define CVMX_DTX_OCX_TOP_CTL         (0x00011800FE088060ull)
+#define CVMX_DTX_OCX_TOP_DATX(offset) (0x00011800FE088040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_OCX_TOP_ENAX(offset) (0x00011800FE088020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_OCX_TOP_SELX(offset) (0x00011800FE088000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_OSM_BCST_RSP        CVMX_DTX_OSM_BCST_RSP_FUNC()
+static inline u64 CVMX_DTX_OSM_BCST_RSP_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE6E0080ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE6E0080ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEEE0080ull;
+       }
+       return 0x00011800FE6E0080ull;
+}
+
+#define CVMX_DTX_OSM_CTL CVMX_DTX_OSM_CTL_FUNC()
+static inline u64 CVMX_DTX_OSM_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE6E0060ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE6E0060ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEEE0060ull;
+       }
+       return 0x00011800FE6E0060ull;
+}
+
+static inline u64 CVMX_DTX_OSM_DATX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE6E0040ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE6E0040ull + (offset) * 8;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEEE0040ull + (offset) * 8;
+       }
+       return 0x00011800FE6E0040ull + (offset) * 8;
+}
+
+static inline u64 CVMX_DTX_OSM_ENAX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE6E0020ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE6E0020ull + (offset) * 8;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEEE0020ull + (offset) * 8;
+       }
+       return 0x00011800FE6E0020ull + (offset) * 8;
+}
+
+static inline u64 CVMX_DTX_OSM_SELX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FE6E0000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FE6E0000ull + (offset) * 8;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEEE0000ull + (offset) * 8;
+       }
+       return 0x00011800FE6E0000ull + (offset) * 8;
+}
+
+#define CVMX_DTX_PCSX_BCST_RSP(offset) (0x00011800FE580080ull + ((offset) & 1) * 0x40000ull)
+#define CVMX_DTX_PCSX_CTL(offset)      (0x00011800FE580060ull + ((offset) & 1) * 0x40000ull)
+#define CVMX_DTX_PCSX_DATX(offset, block_id)                                                       \
+       (0x00011800FE580040ull + (((offset) & 1) + ((block_id) & 1) * 0x8000ull) * 8)
+#define CVMX_DTX_PCSX_ENAX(offset, block_id)                                                       \
+       (0x00011800FE580020ull + (((offset) & 1) + ((block_id) & 1) * 0x8000ull) * 8)
+#define CVMX_DTX_PCSX_SELX(offset, block_id)                                                       \
+       (0x00011800FE580000ull + (((offset) & 1) + ((block_id) & 1) * 0x8000ull) * 8)
+#define CVMX_DTX_PEMX_BCST_RSP(offset) (0x00011800FE600080ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_PEMX_CTL(offset)      (0x00011800FE600060ull + ((offset) & 3) * 32768)
+#define CVMX_DTX_PEMX_DATX(offset, block_id)                                                       \
+       (0x00011800FE600040ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_PEMX_ENAX(offset, block_id)                                                       \
+       (0x00011800FE600020ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_PEMX_SELX(offset, block_id)                                                       \
+       (0x00011800FE600000ull + (((offset) & 1) + ((block_id) & 3) * 0x1000ull) * 8)
+#define CVMX_DTX_PIP_BCST_RSP        (0x00011800FE500080ull)
+#define CVMX_DTX_PIP_CTL             (0x00011800FE500060ull)
+#define CVMX_DTX_PIP_DATX(offset)     (0x00011800FE500040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PIP_ENAX(offset)     (0x00011800FE500020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PIP_SELX(offset)     (0x00011800FE500000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PBE_BCST_RSP     (0x00011800FE228080ull)
+#define CVMX_DTX_PKI_PBE_CTL         (0x00011800FE228060ull)
+#define CVMX_DTX_PKI_PBE_DATX(offset) (0x00011800FE228040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PBE_ENAX(offset) (0x00011800FE228020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PBE_SELX(offset) (0x00011800FE228000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PFE_BCST_RSP     (0x00011800FE220080ull)
+#define CVMX_DTX_PKI_PFE_CTL         (0x00011800FE220060ull)
+#define CVMX_DTX_PKI_PFE_DATX(offset) (0x00011800FE220040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PFE_ENAX(offset) (0x00011800FE220020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PFE_SELX(offset) (0x00011800FE220000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PIX_BCST_RSP     (0x00011800FE230080ull)
+#define CVMX_DTX_PKI_PIX_CTL         (0x00011800FE230060ull)
+#define CVMX_DTX_PKI_PIX_DATX(offset) (0x00011800FE230040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PIX_ENAX(offset) (0x00011800FE230020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKI_PIX_SELX(offset) (0x00011800FE230000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PKO_BCST_RSP        CVMX_DTX_PKO_BCST_RSP_FUNC()
+static inline u64 CVMX_DTX_PKO_BCST_RSP_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FEAA0080ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FEAA0080ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEAA0080ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE280080ull;
+       }
+       return 0x00011800FEAA0080ull;
+}
+
+#define CVMX_DTX_PKO_CTL CVMX_DTX_PKO_CTL_FUNC()
+static inline u64 CVMX_DTX_PKO_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FEAA0060ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FEAA0060ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEAA0060ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE280060ull;
+       }
+       return 0x00011800FEAA0060ull;
+}
+
+static inline u64 CVMX_DTX_PKO_DATX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FEAA0040ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FEAA0040ull + (offset) * 8;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEAA0040ull + (offset) * 8;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE280040ull + (offset) * 8;
+       }
+       return 0x00011800FEAA0040ull + (offset) * 8;
+}
+
+static inline u64 CVMX_DTX_PKO_ENAX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FEAA0020ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FEAA0020ull + (offset) * 8;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEAA0020ull + (offset) * 8;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE280020ull + (offset) * 8;
+       }
+       return 0x00011800FEAA0020ull + (offset) * 8;
+}
+
+static inline u64 CVMX_DTX_PKO_SELX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800FEAA0000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800FEAA0000ull + (offset) * 8;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FEAA0000ull + (offset) * 8;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800FE280000ull + (offset) * 8;
+       }
+       return 0x00011800FEAA0000ull + (offset) * 8;
+}
+
+#define CVMX_DTX_PNBDX_BCST_RSP(offset) (0x00011800FED90080ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_PNBDX_CTL(offset)     (0x00011800FED90060ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_PNBDX_DATX(offset, block_id)                                                      \
+       (0x00011800FED90040ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_PNBDX_ENAX(offset, block_id)                                                      \
+       (0x00011800FED90020ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_PNBDX_SELX(offset, block_id)                                                      \
+       (0x00011800FED90000ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_PNBX_BCST_RSP(offset) (0x00011800FE580080ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_PNBX_CTL(offset)      (0x00011800FE580060ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_PNBX_DATX(offset, block_id)                                                       \
+       (0x00011800FE580040ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_PNBX_ENAX(offset, block_id)                                                       \
+       (0x00011800FE580020ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_PNBX_SELX(offset, block_id)                                                       \
+       (0x00011800FE580000ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_POW_BCST_RSP          (0x00011800FE338080ull)
+#define CVMX_DTX_POW_CTL               (0x00011800FE338060ull)
+#define CVMX_DTX_POW_DATX(offset)      (0x00011800FE338040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_POW_ENAX(offset)      (0x00011800FE338020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_POW_SELX(offset)      (0x00011800FE338000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PRCH_BCST_RSP         (0x00011800FED00080ull)
+#define CVMX_DTX_PRCH_CTL              (0x00011800FED00060ull)
+#define CVMX_DTX_PRCH_DATX(offset)     (0x00011800FED00040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PRCH_ENAX(offset)     (0x00011800FED00020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PRCH_SELX(offset)     (0x00011800FED00000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PSM_BCST_RSP          (0x00011800FEEA0080ull)
+#define CVMX_DTX_PSM_CTL               (0x00011800FEEA0060ull)
+#define CVMX_DTX_PSM_DATX(offset)      (0x00011800FEEA0040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PSM_ENAX(offset)      (0x00011800FEEA0020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_PSM_SELX(offset)      (0x00011800FEEA0000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RAD_BCST_RSP          (0x00011800FE380080ull)
+#define CVMX_DTX_RAD_CTL               (0x00011800FE380060ull)
+#define CVMX_DTX_RAD_DATX(offset)      (0x00011800FE380040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RAD_ENAX(offset)      (0x00011800FE380020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RAD_SELX(offset)      (0x00011800FE380000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RDEC_BCST_RSP         (0x00011800FED68080ull)
+#define CVMX_DTX_RDEC_CTL              (0x00011800FED68060ull)
+#define CVMX_DTX_RDEC_DATX(offset)     (0x00011800FED68040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RDEC_ENAX(offset)     (0x00011800FED68020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RDEC_SELX(offset)     (0x00011800FED68000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RFIF_BCST_RSP         (0x00011800FE6A8080ull)
+#define CVMX_DTX_RFIF_CTL              (0x00011800FE6A8060ull)
+#define CVMX_DTX_RFIF_DATX(offset)     (0x00011800FE6A8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RFIF_ENAX(offset)     (0x00011800FE6A8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RFIF_SELX(offset)     (0x00011800FE6A8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RMAP_BCST_RSP         (0x00011800FED40080ull)
+#define CVMX_DTX_RMAP_CTL              (0x00011800FED40060ull)
+#define CVMX_DTX_RMAP_DATX(offset)     (0x00011800FED40040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RMAP_ENAX(offset)     (0x00011800FED40020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RMAP_SELX(offset)     (0x00011800FED40000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RNM_BCST_RSP          (0x00011800FE200080ull)
+#define CVMX_DTX_RNM_CTL               (0x00011800FE200060ull)
+#define CVMX_DTX_RNM_DATX(offset)      (0x00011800FE200040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RNM_ENAX(offset)      (0x00011800FE200020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RNM_SELX(offset)      (0x00011800FE200000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RST_BCST_RSP          (0x00011800FE030080ull)
+#define CVMX_DTX_RST_CTL               (0x00011800FE030060ull)
+#define CVMX_DTX_RST_DATX(offset)      (0x00011800FE030040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RST_ENAX(offset)      (0x00011800FE030020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_RST_SELX(offset)      (0x00011800FE030000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SATA_BCST_RSP         (0x00011800FE360080ull)
+#define CVMX_DTX_SATA_CTL              (0x00011800FE360060ull)
+#define CVMX_DTX_SATA_DATX(offset)     (0x00011800FE360040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SATA_ENAX(offset)     (0x00011800FE360020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SATA_SELX(offset)     (0x00011800FE360000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SLI_BCST_RSP          (0x00011800FE8F8080ull)
+#define CVMX_DTX_SLI_CTL               (0x00011800FE8F8060ull)
+#define CVMX_DTX_SLI_DATX(offset)      (0x00011800FE8F8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SLI_ENAX(offset)      (0x00011800FE8F8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SLI_SELX(offset)      (0x00011800FE8F8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SPEM_BCST_RSP         (0x00011800FE600080ull)
+#define CVMX_DTX_SPEM_CTL              (0x00011800FE600060ull)
+#define CVMX_DTX_SPEM_DATX(offset)     (0x00011800FE600040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SPEM_ENAX(offset)     (0x00011800FE600020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SPEM_SELX(offset)     (0x00011800FE600000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SRIOX_BCST_RSP(offset) (0x00011800FE640080ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_SRIOX_CTL(offset)     (0x00011800FE640060ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_SRIOX_DATX(offset, block_id)                                                      \
+       (0x00011800FE640040ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_SRIOX_ENAX(offset, block_id)                                                      \
+       (0x00011800FE640020ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_SRIOX_SELX(offset, block_id)                                                      \
+       (0x00011800FE640000ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_SSO_BCST_RSP            (0x00011800FEB38080ull)
+#define CVMX_DTX_SSO_CTL                 (0x00011800FEB38060ull)
+#define CVMX_DTX_SSO_DATX(offset)        (0x00011800FEB38040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SSO_ENAX(offset)        (0x00011800FEB38020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_SSO_SELX(offset)        (0x00011800FEB38000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_TDEC_BCST_RSP           (0x00011800FED60080ull)
+#define CVMX_DTX_TDEC_CTL                (0x00011800FED60060ull)
+#define CVMX_DTX_TDEC_DATX(offset)       (0x00011800FED60040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_TDEC_ENAX(offset)       (0x00011800FED60020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_TDEC_SELX(offset)       (0x00011800FED60000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_TIM_BCST_RSP            (0x00011800FE2C0080ull)
+#define CVMX_DTX_TIM_CTL                 (0x00011800FE2C0060ull)
+#define CVMX_DTX_TIM_DATX(offset)        (0x00011800FE2C0040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_TIM_ENAX(offset)        (0x00011800FE2C0020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_TIM_SELX(offset)        (0x00011800FE2C0000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ULFE_BCST_RSP           (0x00011800FED08080ull)
+#define CVMX_DTX_ULFE_CTL                (0x00011800FED08060ull)
+#define CVMX_DTX_ULFE_DATX(offset)       (0x00011800FED08040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ULFE_ENAX(offset)       (0x00011800FED08020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ULFE_SELX(offset)       (0x00011800FED08000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_USBDRDX_BCST_RSP(offset) (0x00011800FE340080ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_USBDRDX_CTL(offset)     (0x00011800FE340060ull + ((offset) & 1) * 32768)
+#define CVMX_DTX_USBDRDX_DATX(offset, block_id)                                                    \
+       (0x00011800FE340040ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_USBDRDX_ENAX(offset, block_id)                                                    \
+       (0x00011800FE340020ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_USBDRDX_SELX(offset, block_id)                                                    \
+       (0x00011800FE340000ull + (((offset) & 1) + ((block_id) & 1) * 0x1000ull) * 8)
+#define CVMX_DTX_USBHX_BCST_RSP(offset) (0x00011800FE340080ull)
+#define CVMX_DTX_USBHX_CTL(offset)     (0x00011800FE340060ull)
+#define CVMX_DTX_USBHX_DATX(offset, block_id)                                                      \
+       (0x00011800FE340040ull + (((offset) & 1) + ((block_id) & 0) * 0x0ull) * 8)
+#define CVMX_DTX_USBHX_ENAX(offset, block_id)                                                      \
+       (0x00011800FE340020ull + (((offset) & 1) + ((block_id) & 0) * 0x0ull) * 8)
+#define CVMX_DTX_USBHX_SELX(offset, block_id)                                                      \
+       (0x00011800FE340000ull + (((offset) & 1) + ((block_id) & 0) * 0x0ull) * 8)
+#define CVMX_DTX_VDEC_BCST_RSP    (0x00011800FED70080ull)
+#define CVMX_DTX_VDEC_CTL         (0x00011800FED70060ull)
+#define CVMX_DTX_VDEC_DATX(offset) (0x00011800FED70040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_VDEC_ENAX(offset) (0x00011800FED70020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_VDEC_SELX(offset) (0x00011800FED70000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WPSE_BCST_RSP    (0x00011800FED10080ull)
+#define CVMX_DTX_WPSE_CTL         (0x00011800FED10060ull)
+#define CVMX_DTX_WPSE_DATX(offset) (0x00011800FED10040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WPSE_ENAX(offset) (0x00011800FED10020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WPSE_SELX(offset) (0x00011800FED10000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRCE_BCST_RSP    (0x00011800FED38080ull)
+#define CVMX_DTX_WRCE_CTL         (0x00011800FED38060ull)
+#define CVMX_DTX_WRCE_DATX(offset) (0x00011800FED38040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRCE_ENAX(offset) (0x00011800FED38020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRCE_SELX(offset) (0x00011800FED38000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRDE_BCST_RSP    (0x00011800FED58080ull)
+#define CVMX_DTX_WRDE_CTL         (0x00011800FED58060ull)
+#define CVMX_DTX_WRDE_DATX(offset) (0x00011800FED58040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRDE_ENAX(offset) (0x00011800FED58020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRDE_SELX(offset) (0x00011800FED58000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRSE_BCST_RSP    (0x00011800FED28080ull)
+#define CVMX_DTX_WRSE_CTL         (0x00011800FED28060ull)
+#define CVMX_DTX_WRSE_DATX(offset) (0x00011800FED28040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRSE_ENAX(offset) (0x00011800FED28020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WRSE_SELX(offset) (0x00011800FED28000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WTXE_BCST_RSP    (0x00011800FED20080ull)
+#define CVMX_DTX_WTXE_CTL         (0x00011800FED20060ull)
+#define CVMX_DTX_WTXE_DATX(offset) (0x00011800FED20040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WTXE_ENAX(offset) (0x00011800FED20020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_WTXE_SELX(offset) (0x00011800FED20000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_XCV_BCST_RSP     (0x00011800FE6D8080ull)
+#define CVMX_DTX_XCV_CTL          (0x00011800FE6D8060ull)
+#define CVMX_DTX_XCV_DATX(offset)  (0x00011800FE6D8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_XCV_ENAX(offset)  (0x00011800FE6D8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_XCV_SELX(offset)  (0x00011800FE6D8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_XSX_BCST_RSP     (0x00011800FE5A8080ull)
+#define CVMX_DTX_XSX_CTL          (0x00011800FE5A8060ull)
+#define CVMX_DTX_XSX_DATX(offset)  (0x00011800FE5A8040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_XSX_ENAX(offset)  (0x00011800FE5A8020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_XSX_SELX(offset)  (0x00011800FE5A8000ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ZIP_BCST_RSP     (0x00011800FE1C0080ull)
+#define CVMX_DTX_ZIP_CTL          (0x00011800FE1C0060ull)
+#define CVMX_DTX_ZIP_DATX(offset)  (0x00011800FE1C0040ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ZIP_ENAX(offset)  (0x00011800FE1C0020ull + ((offset) & 1) * 8)
+#define CVMX_DTX_ZIP_SELX(offset)  (0x00011800FE1C0000ull + ((offset) & 1) * 8)
+
+/**
+ * cvmx_dtx_agl_bcst_rsp
+ */
+union cvmx_dtx_agl_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_agl_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_agl_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_agl_bcst_rsp_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_agl_bcst_rsp cvmx_dtx_agl_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_agl_ctl
+ */
+union cvmx_dtx_agl_ctl {
+       u64 u64;
+       struct cvmx_dtx_agl_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_agl_ctl_s cn70xx;
+       struct cvmx_dtx_agl_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_agl_ctl cvmx_dtx_agl_ctl_t;
+
+/**
+ * cvmx_dtx_agl_dat#
+ */
+union cvmx_dtx_agl_datx {
+       u64 u64;
+       struct cvmx_dtx_agl_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_agl_datx_s cn70xx;
+       struct cvmx_dtx_agl_datx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_agl_datx cvmx_dtx_agl_datx_t;
+
+/**
+ * cvmx_dtx_agl_ena#
+ */
+union cvmx_dtx_agl_enax {
+       u64 u64;
+       struct cvmx_dtx_agl_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_agl_enax_s cn70xx;
+       struct cvmx_dtx_agl_enax_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_agl_enax cvmx_dtx_agl_enax_t;
+
+/**
+ * cvmx_dtx_agl_sel#
+ */
+union cvmx_dtx_agl_selx {
+       u64 u64;
+       struct cvmx_dtx_agl_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_agl_selx_s cn70xx;
+       struct cvmx_dtx_agl_selx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_agl_selx cvmx_dtx_agl_selx_t;
+
+/**
+ * cvmx_dtx_ase_bcst_rsp
+ */
+union cvmx_dtx_ase_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ase_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ase_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ase_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ase_bcst_rsp cvmx_dtx_ase_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ase_ctl
+ */
+union cvmx_dtx_ase_ctl {
+       u64 u64;
+       struct cvmx_dtx_ase_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ase_ctl_s cn78xx;
+       struct cvmx_dtx_ase_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ase_ctl cvmx_dtx_ase_ctl_t;
+
+/**
+ * cvmx_dtx_ase_dat#
+ */
+union cvmx_dtx_ase_datx {
+       u64 u64;
+       struct cvmx_dtx_ase_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ase_datx_s cn78xx;
+       struct cvmx_dtx_ase_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ase_datx cvmx_dtx_ase_datx_t;
+
+/**
+ * cvmx_dtx_ase_ena#
+ */
+union cvmx_dtx_ase_enax {
+       u64 u64;
+       struct cvmx_dtx_ase_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ase_enax_s cn78xx;
+       struct cvmx_dtx_ase_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ase_enax cvmx_dtx_ase_enax_t;
+
+/**
+ * cvmx_dtx_ase_sel#
+ */
+union cvmx_dtx_ase_selx {
+       u64 u64;
+       struct cvmx_dtx_ase_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ase_selx_s cn78xx;
+       struct cvmx_dtx_ase_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ase_selx cvmx_dtx_ase_selx_t;
+
+/**
+ * cvmx_dtx_bbx1i_bcst_rsp
+ */
+union cvmx_dtx_bbx1i_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_bbx1i_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_bbx1i_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx1i_bcst_rsp cvmx_dtx_bbx1i_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_bbx1i_ctl
+ */
+union cvmx_dtx_bbx1i_ctl {
+       u64 u64;
+       struct cvmx_dtx_bbx1i_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_bbx1i_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx1i_ctl cvmx_dtx_bbx1i_ctl_t;
+
+/**
+ * cvmx_dtx_bbx1i_dat#
+ */
+union cvmx_dtx_bbx1i_datx {
+       u64 u64;
+       struct cvmx_dtx_bbx1i_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_bbx1i_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx1i_datx cvmx_dtx_bbx1i_datx_t;
+
+/**
+ * cvmx_dtx_bbx1i_ena#
+ */
+union cvmx_dtx_bbx1i_enax {
+       u64 u64;
+       struct cvmx_dtx_bbx1i_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_bbx1i_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx1i_enax cvmx_dtx_bbx1i_enax_t;
+
+/**
+ * cvmx_dtx_bbx1i_sel#
+ */
+union cvmx_dtx_bbx1i_selx {
+       u64 u64;
+       struct cvmx_dtx_bbx1i_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_bbx1i_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx1i_selx cvmx_dtx_bbx1i_selx_t;
+
+/**
+ * cvmx_dtx_bbx2i_bcst_rsp
+ */
+union cvmx_dtx_bbx2i_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_bbx2i_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_bbx2i_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx2i_bcst_rsp cvmx_dtx_bbx2i_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_bbx2i_ctl
+ */
+union cvmx_dtx_bbx2i_ctl {
+       u64 u64;
+       struct cvmx_dtx_bbx2i_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_bbx2i_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx2i_ctl cvmx_dtx_bbx2i_ctl_t;
+
+/**
+ * cvmx_dtx_bbx2i_dat#
+ */
+union cvmx_dtx_bbx2i_datx {
+       u64 u64;
+       struct cvmx_dtx_bbx2i_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_bbx2i_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx2i_datx cvmx_dtx_bbx2i_datx_t;
+
+/**
+ * cvmx_dtx_bbx2i_ena#
+ */
+union cvmx_dtx_bbx2i_enax {
+       u64 u64;
+       struct cvmx_dtx_bbx2i_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_bbx2i_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx2i_enax cvmx_dtx_bbx2i_enax_t;
+
+/**
+ * cvmx_dtx_bbx2i_sel#
+ */
+union cvmx_dtx_bbx2i_selx {
+       u64 u64;
+       struct cvmx_dtx_bbx2i_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_bbx2i_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx2i_selx cvmx_dtx_bbx2i_selx_t;
+
+/**
+ * cvmx_dtx_bbx3i_bcst_rsp
+ */
+union cvmx_dtx_bbx3i_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_bbx3i_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_bbx3i_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx3i_bcst_rsp cvmx_dtx_bbx3i_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_bbx3i_ctl
+ */
+union cvmx_dtx_bbx3i_ctl {
+       u64 u64;
+       struct cvmx_dtx_bbx3i_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_bbx3i_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx3i_ctl cvmx_dtx_bbx3i_ctl_t;
+
+/**
+ * cvmx_dtx_bbx3i_dat#
+ */
+union cvmx_dtx_bbx3i_datx {
+       u64 u64;
+       struct cvmx_dtx_bbx3i_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_bbx3i_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx3i_datx cvmx_dtx_bbx3i_datx_t;
+
+/**
+ * cvmx_dtx_bbx3i_ena#
+ */
+union cvmx_dtx_bbx3i_enax {
+       u64 u64;
+       struct cvmx_dtx_bbx3i_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_bbx3i_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx3i_enax cvmx_dtx_bbx3i_enax_t;
+
+/**
+ * cvmx_dtx_bbx3i_sel#
+ */
+union cvmx_dtx_bbx3i_selx {
+       u64 u64;
+       struct cvmx_dtx_bbx3i_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_bbx3i_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bbx3i_selx cvmx_dtx_bbx3i_selx_t;
+
+/**
+ * cvmx_dtx_bch_bcst_rsp
+ */
+union cvmx_dtx_bch_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_bch_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_bch_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_bch_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bch_bcst_rsp cvmx_dtx_bch_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_bch_ctl
+ */
+union cvmx_dtx_bch_ctl {
+       u64 u64;
+       struct cvmx_dtx_bch_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_bch_ctl_s cn73xx;
+       struct cvmx_dtx_bch_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bch_ctl cvmx_dtx_bch_ctl_t;
+
+/**
+ * cvmx_dtx_bch_dat#
+ */
+union cvmx_dtx_bch_datx {
+       u64 u64;
+       struct cvmx_dtx_bch_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_bch_datx_s cn73xx;
+       struct cvmx_dtx_bch_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bch_datx cvmx_dtx_bch_datx_t;
+
+/**
+ * cvmx_dtx_bch_ena#
+ */
+union cvmx_dtx_bch_enax {
+       u64 u64;
+       struct cvmx_dtx_bch_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_bch_enax_s cn73xx;
+       struct cvmx_dtx_bch_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bch_enax cvmx_dtx_bch_enax_t;
+
+/**
+ * cvmx_dtx_bch_sel#
+ */
+union cvmx_dtx_bch_selx {
+       u64 u64;
+       struct cvmx_dtx_bch_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_bch_selx_s cn73xx;
+       struct cvmx_dtx_bch_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bch_selx cvmx_dtx_bch_selx_t;
+
+/**
+ * cvmx_dtx_bgx#_bcst_rsp
+ */
+union cvmx_dtx_bgxx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_bgxx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_bgxx_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_bgxx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_bgxx_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_bgxx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bgxx_bcst_rsp cvmx_dtx_bgxx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_bgx#_ctl
+ */
+union cvmx_dtx_bgxx_ctl {
+       u64 u64;
+       struct cvmx_dtx_bgxx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_bgxx_ctl_s cn73xx;
+       struct cvmx_dtx_bgxx_ctl_s cn78xx;
+       struct cvmx_dtx_bgxx_ctl_s cn78xxp1;
+       struct cvmx_dtx_bgxx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bgxx_ctl cvmx_dtx_bgxx_ctl_t;
+
+/**
+ * cvmx_dtx_bgx#_dat#
+ */
+union cvmx_dtx_bgxx_datx {
+       u64 u64;
+       struct cvmx_dtx_bgxx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_bgxx_datx_s cn73xx;
+       struct cvmx_dtx_bgxx_datx_s cn78xx;
+       struct cvmx_dtx_bgxx_datx_s cn78xxp1;
+       struct cvmx_dtx_bgxx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bgxx_datx cvmx_dtx_bgxx_datx_t;
+
+/**
+ * cvmx_dtx_bgx#_ena#
+ */
+union cvmx_dtx_bgxx_enax {
+       u64 u64;
+       struct cvmx_dtx_bgxx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_bgxx_enax_s cn73xx;
+       struct cvmx_dtx_bgxx_enax_s cn78xx;
+       struct cvmx_dtx_bgxx_enax_s cn78xxp1;
+       struct cvmx_dtx_bgxx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bgxx_enax cvmx_dtx_bgxx_enax_t;
+
+/**
+ * cvmx_dtx_bgx#_sel#
+ */
+union cvmx_dtx_bgxx_selx {
+       u64 u64;
+       struct cvmx_dtx_bgxx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_bgxx_selx_s cn73xx;
+       struct cvmx_dtx_bgxx_selx_s cn78xx;
+       struct cvmx_dtx_bgxx_selx_s cn78xxp1;
+       struct cvmx_dtx_bgxx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bgxx_selx cvmx_dtx_bgxx_selx_t;
+
+/**
+ * cvmx_dtx_broadcast_ctl
+ */
+union cvmx_dtx_broadcast_ctl {
+       u64 u64;
+       struct cvmx_dtx_broadcast_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_broadcast_ctl_s cn70xx;
+       struct cvmx_dtx_broadcast_ctl_s cn70xxp1;
+       struct cvmx_dtx_broadcast_ctl_s cn73xx;
+       struct cvmx_dtx_broadcast_ctl_s cn78xx;
+       struct cvmx_dtx_broadcast_ctl_s cn78xxp1;
+       struct cvmx_dtx_broadcast_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_broadcast_ctl cvmx_dtx_broadcast_ctl_t;
+
+/**
+ * cvmx_dtx_broadcast_ena#
+ */
+union cvmx_dtx_broadcast_enax {
+       u64 u64;
+       struct cvmx_dtx_broadcast_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_broadcast_enax_s cn70xx;
+       struct cvmx_dtx_broadcast_enax_s cn70xxp1;
+       struct cvmx_dtx_broadcast_enax_s cn73xx;
+       struct cvmx_dtx_broadcast_enax_s cn78xx;
+       struct cvmx_dtx_broadcast_enax_s cn78xxp1;
+       struct cvmx_dtx_broadcast_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_broadcast_enax cvmx_dtx_broadcast_enax_t;
+
+/**
+ * cvmx_dtx_broadcast_sel#
+ */
+union cvmx_dtx_broadcast_selx {
+       u64 u64;
+       struct cvmx_dtx_broadcast_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_broadcast_selx_s cn70xx;
+       struct cvmx_dtx_broadcast_selx_s cn70xxp1;
+       struct cvmx_dtx_broadcast_selx_s cn73xx;
+       struct cvmx_dtx_broadcast_selx_s cn78xx;
+       struct cvmx_dtx_broadcast_selx_s cn78xxp1;
+       struct cvmx_dtx_broadcast_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_broadcast_selx cvmx_dtx_broadcast_selx_t;
+
+/**
+ * cvmx_dtx_bts_bcst_rsp
+ */
+union cvmx_dtx_bts_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_bts_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_bts_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bts_bcst_rsp cvmx_dtx_bts_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_bts_ctl
+ */
+union cvmx_dtx_bts_ctl {
+       u64 u64;
+       struct cvmx_dtx_bts_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_bts_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bts_ctl cvmx_dtx_bts_ctl_t;
+
+/**
+ * cvmx_dtx_bts_dat#
+ */
+union cvmx_dtx_bts_datx {
+       u64 u64;
+       struct cvmx_dtx_bts_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_bts_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bts_datx cvmx_dtx_bts_datx_t;
+
+/**
+ * cvmx_dtx_bts_ena#
+ */
+union cvmx_dtx_bts_enax {
+       u64 u64;
+       struct cvmx_dtx_bts_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_bts_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bts_enax cvmx_dtx_bts_enax_t;
+
+/**
+ * cvmx_dtx_bts_sel#
+ */
+union cvmx_dtx_bts_selx {
+       u64 u64;
+       struct cvmx_dtx_bts_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_bts_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_bts_selx cvmx_dtx_bts_selx_t;
+
+/**
+ * cvmx_dtx_ciu_bcst_rsp
+ */
+union cvmx_dtx_ciu_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ciu_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ciu_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_ciu_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ciu_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_ciu_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ciu_bcst_rsp cvmx_dtx_ciu_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ciu_ctl
+ */
+union cvmx_dtx_ciu_ctl {
+       u64 u64;
+       struct cvmx_dtx_ciu_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ciu_ctl_s cn73xx;
+       struct cvmx_dtx_ciu_ctl_s cn78xx;
+       struct cvmx_dtx_ciu_ctl_s cn78xxp1;
+       struct cvmx_dtx_ciu_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ciu_ctl cvmx_dtx_ciu_ctl_t;
+
+/**
+ * cvmx_dtx_ciu_dat#
+ */
+union cvmx_dtx_ciu_datx {
+       u64 u64;
+       struct cvmx_dtx_ciu_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ciu_datx_s cn73xx;
+       struct cvmx_dtx_ciu_datx_s cn78xx;
+       struct cvmx_dtx_ciu_datx_s cn78xxp1;
+       struct cvmx_dtx_ciu_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ciu_datx cvmx_dtx_ciu_datx_t;
+
+/**
+ * cvmx_dtx_ciu_ena#
+ */
+union cvmx_dtx_ciu_enax {
+       u64 u64;
+       struct cvmx_dtx_ciu_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ciu_enax_s cn73xx;
+       struct cvmx_dtx_ciu_enax_s cn78xx;
+       struct cvmx_dtx_ciu_enax_s cn78xxp1;
+       struct cvmx_dtx_ciu_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ciu_enax cvmx_dtx_ciu_enax_t;
+
+/**
+ * cvmx_dtx_ciu_sel#
+ */
+union cvmx_dtx_ciu_selx {
+       u64 u64;
+       struct cvmx_dtx_ciu_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ciu_selx_s cn73xx;
+       struct cvmx_dtx_ciu_selx_s cn78xx;
+       struct cvmx_dtx_ciu_selx_s cn78xxp1;
+       struct cvmx_dtx_ciu_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ciu_selx cvmx_dtx_ciu_selx_t;
+
+/**
+ * cvmx_dtx_denc_bcst_rsp
+ */
+union cvmx_dtx_denc_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_denc_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_denc_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_denc_bcst_rsp cvmx_dtx_denc_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_denc_ctl
+ */
+union cvmx_dtx_denc_ctl {
+       u64 u64;
+       struct cvmx_dtx_denc_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_denc_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_denc_ctl cvmx_dtx_denc_ctl_t;
+
+/**
+ * cvmx_dtx_denc_dat#
+ */
+union cvmx_dtx_denc_datx {
+       u64 u64;
+       struct cvmx_dtx_denc_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_denc_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_denc_datx cvmx_dtx_denc_datx_t;
+
+/**
+ * cvmx_dtx_denc_ena#
+ */
+union cvmx_dtx_denc_enax {
+       u64 u64;
+       struct cvmx_dtx_denc_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_denc_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_denc_enax cvmx_dtx_denc_enax_t;
+
+/**
+ * cvmx_dtx_denc_sel#
+ */
+union cvmx_dtx_denc_selx {
+       u64 u64;
+       struct cvmx_dtx_denc_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_denc_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_denc_selx cvmx_dtx_denc_selx_t;
+
+/**
+ * cvmx_dtx_dfa_bcst_rsp
+ */
+union cvmx_dtx_dfa_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_dfa_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_dfa_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_dfa_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_dfa_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_dfa_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_dfa_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_dfa_bcst_rsp cvmx_dtx_dfa_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_dfa_ctl
+ */
+union cvmx_dtx_dfa_ctl {
+       u64 u64;
+       struct cvmx_dtx_dfa_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_dfa_ctl_s cn70xx;
+       struct cvmx_dtx_dfa_ctl_s cn70xxp1;
+       struct cvmx_dtx_dfa_ctl_s cn73xx;
+       struct cvmx_dtx_dfa_ctl_s cn78xx;
+       struct cvmx_dtx_dfa_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_dfa_ctl cvmx_dtx_dfa_ctl_t;
+
+/**
+ * cvmx_dtx_dfa_dat#
+ */
+union cvmx_dtx_dfa_datx {
+       u64 u64;
+       struct cvmx_dtx_dfa_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_dfa_datx_s cn70xx;
+       struct cvmx_dtx_dfa_datx_s cn70xxp1;
+       struct cvmx_dtx_dfa_datx_s cn73xx;
+       struct cvmx_dtx_dfa_datx_s cn78xx;
+       struct cvmx_dtx_dfa_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_dfa_datx cvmx_dtx_dfa_datx_t;
+
+/**
+ * cvmx_dtx_dfa_ena#
+ */
+union cvmx_dtx_dfa_enax {
+       u64 u64;
+       struct cvmx_dtx_dfa_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_dfa_enax_s cn70xx;
+       struct cvmx_dtx_dfa_enax_s cn70xxp1;
+       struct cvmx_dtx_dfa_enax_s cn73xx;
+       struct cvmx_dtx_dfa_enax_s cn78xx;
+       struct cvmx_dtx_dfa_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_dfa_enax cvmx_dtx_dfa_enax_t;
+
+/**
+ * cvmx_dtx_dfa_sel#
+ */
+union cvmx_dtx_dfa_selx {
+       u64 u64;
+       struct cvmx_dtx_dfa_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_dfa_selx_s cn70xx;
+       struct cvmx_dtx_dfa_selx_s cn70xxp1;
+       struct cvmx_dtx_dfa_selx_s cn73xx;
+       struct cvmx_dtx_dfa_selx_s cn78xx;
+       struct cvmx_dtx_dfa_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_dfa_selx cvmx_dtx_dfa_selx_t;
+
+/**
+ * cvmx_dtx_dlfe_bcst_rsp
+ */
+union cvmx_dtx_dlfe_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_dlfe_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_dlfe_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dlfe_bcst_rsp cvmx_dtx_dlfe_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_dlfe_ctl
+ */
+union cvmx_dtx_dlfe_ctl {
+       u64 u64;
+       struct cvmx_dtx_dlfe_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_dlfe_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dlfe_ctl cvmx_dtx_dlfe_ctl_t;
+
+/**
+ * cvmx_dtx_dlfe_dat#
+ */
+union cvmx_dtx_dlfe_datx {
+       u64 u64;
+       struct cvmx_dtx_dlfe_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_dlfe_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dlfe_datx cvmx_dtx_dlfe_datx_t;
+
+/**
+ * cvmx_dtx_dlfe_ena#
+ */
+union cvmx_dtx_dlfe_enax {
+       u64 u64;
+       struct cvmx_dtx_dlfe_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_dlfe_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dlfe_enax cvmx_dtx_dlfe_enax_t;
+
+/**
+ * cvmx_dtx_dlfe_sel#
+ */
+union cvmx_dtx_dlfe_selx {
+       u64 u64;
+       struct cvmx_dtx_dlfe_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_dlfe_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dlfe_selx cvmx_dtx_dlfe_selx_t;
+
+/**
+ * cvmx_dtx_dpi_bcst_rsp
+ */
+union cvmx_dtx_dpi_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_dpi_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_dpi_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_dpi_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_dpi_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_dpi_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_dpi_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_dpi_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dpi_bcst_rsp cvmx_dtx_dpi_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_dpi_ctl
+ */
+union cvmx_dtx_dpi_ctl {
+       u64 u64;
+       struct cvmx_dtx_dpi_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_dpi_ctl_s cn70xx;
+       struct cvmx_dtx_dpi_ctl_s cn70xxp1;
+       struct cvmx_dtx_dpi_ctl_s cn73xx;
+       struct cvmx_dtx_dpi_ctl_s cn78xx;
+       struct cvmx_dtx_dpi_ctl_s cn78xxp1;
+       struct cvmx_dtx_dpi_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dpi_ctl cvmx_dtx_dpi_ctl_t;
+
+/**
+ * cvmx_dtx_dpi_dat#
+ */
+union cvmx_dtx_dpi_datx {
+       u64 u64;
+       struct cvmx_dtx_dpi_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_dpi_datx_s cn70xx;
+       struct cvmx_dtx_dpi_datx_s cn70xxp1;
+       struct cvmx_dtx_dpi_datx_s cn73xx;
+       struct cvmx_dtx_dpi_datx_s cn78xx;
+       struct cvmx_dtx_dpi_datx_s cn78xxp1;
+       struct cvmx_dtx_dpi_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dpi_datx cvmx_dtx_dpi_datx_t;
+
+/**
+ * cvmx_dtx_dpi_ena#
+ */
+union cvmx_dtx_dpi_enax {
+       u64 u64;
+       struct cvmx_dtx_dpi_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_dpi_enax_s cn70xx;
+       struct cvmx_dtx_dpi_enax_s cn70xxp1;
+       struct cvmx_dtx_dpi_enax_s cn73xx;
+       struct cvmx_dtx_dpi_enax_s cn78xx;
+       struct cvmx_dtx_dpi_enax_s cn78xxp1;
+       struct cvmx_dtx_dpi_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dpi_enax cvmx_dtx_dpi_enax_t;
+
+/**
+ * cvmx_dtx_dpi_sel#
+ */
+union cvmx_dtx_dpi_selx {
+       u64 u64;
+       struct cvmx_dtx_dpi_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_dpi_selx_s cn70xx;
+       struct cvmx_dtx_dpi_selx_s cn70xxp1;
+       struct cvmx_dtx_dpi_selx_s cn73xx;
+       struct cvmx_dtx_dpi_selx_s cn78xx;
+       struct cvmx_dtx_dpi_selx_s cn78xxp1;
+       struct cvmx_dtx_dpi_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_dpi_selx cvmx_dtx_dpi_selx_t;
+
+/**
+ * cvmx_dtx_fdeq#_bcst_rsp
+ */
+union cvmx_dtx_fdeqx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_fdeqx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_fdeqx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fdeqx_bcst_rsp cvmx_dtx_fdeqx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_fdeq#_ctl
+ */
+union cvmx_dtx_fdeqx_ctl {
+       u64 u64;
+       struct cvmx_dtx_fdeqx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_fdeqx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fdeqx_ctl cvmx_dtx_fdeqx_ctl_t;
+
+/**
+ * cvmx_dtx_fdeq#_dat#
+ */
+union cvmx_dtx_fdeqx_datx {
+       u64 u64;
+       struct cvmx_dtx_fdeqx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_fdeqx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fdeqx_datx cvmx_dtx_fdeqx_datx_t;
+
+/**
+ * cvmx_dtx_fdeq#_ena#
+ */
+union cvmx_dtx_fdeqx_enax {
+       u64 u64;
+       struct cvmx_dtx_fdeqx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_fdeqx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fdeqx_enax cvmx_dtx_fdeqx_enax_t;
+
+/**
+ * cvmx_dtx_fdeq#_sel#
+ */
+union cvmx_dtx_fdeqx_selx {
+       u64 u64;
+       struct cvmx_dtx_fdeqx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_fdeqx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fdeqx_selx cvmx_dtx_fdeqx_selx_t;
+
+/**
+ * cvmx_dtx_fpa_bcst_rsp
+ */
+union cvmx_dtx_fpa_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_fpa_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_fpa_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_fpa_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_fpa_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_fpa_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_fpa_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_fpa_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fpa_bcst_rsp cvmx_dtx_fpa_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_fpa_ctl
+ */
+union cvmx_dtx_fpa_ctl {
+       u64 u64;
+       struct cvmx_dtx_fpa_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_fpa_ctl_s cn70xx;
+       struct cvmx_dtx_fpa_ctl_s cn70xxp1;
+       struct cvmx_dtx_fpa_ctl_s cn73xx;
+       struct cvmx_dtx_fpa_ctl_s cn78xx;
+       struct cvmx_dtx_fpa_ctl_s cn78xxp1;
+       struct cvmx_dtx_fpa_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fpa_ctl cvmx_dtx_fpa_ctl_t;
+
+/**
+ * cvmx_dtx_fpa_dat#
+ */
+union cvmx_dtx_fpa_datx {
+       u64 u64;
+       struct cvmx_dtx_fpa_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_fpa_datx_s cn70xx;
+       struct cvmx_dtx_fpa_datx_s cn70xxp1;
+       struct cvmx_dtx_fpa_datx_s cn73xx;
+       struct cvmx_dtx_fpa_datx_s cn78xx;
+       struct cvmx_dtx_fpa_datx_s cn78xxp1;
+       struct cvmx_dtx_fpa_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fpa_datx cvmx_dtx_fpa_datx_t;
+
+/**
+ * cvmx_dtx_fpa_ena#
+ */
+union cvmx_dtx_fpa_enax {
+       u64 u64;
+       struct cvmx_dtx_fpa_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_fpa_enax_s cn70xx;
+       struct cvmx_dtx_fpa_enax_s cn70xxp1;
+       struct cvmx_dtx_fpa_enax_s cn73xx;
+       struct cvmx_dtx_fpa_enax_s cn78xx;
+       struct cvmx_dtx_fpa_enax_s cn78xxp1;
+       struct cvmx_dtx_fpa_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fpa_enax cvmx_dtx_fpa_enax_t;
+
+/**
+ * cvmx_dtx_fpa_sel#
+ */
+union cvmx_dtx_fpa_selx {
+       u64 u64;
+       struct cvmx_dtx_fpa_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_fpa_selx_s cn70xx;
+       struct cvmx_dtx_fpa_selx_s cn70xxp1;
+       struct cvmx_dtx_fpa_selx_s cn73xx;
+       struct cvmx_dtx_fpa_selx_s cn78xx;
+       struct cvmx_dtx_fpa_selx_s cn78xxp1;
+       struct cvmx_dtx_fpa_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_fpa_selx cvmx_dtx_fpa_selx_t;
+
+/**
+ * cvmx_dtx_gmx#_bcst_rsp
+ */
+union cvmx_dtx_gmxx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_gmxx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_gmxx_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_gmxx_bcst_rsp_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_gmxx_bcst_rsp cvmx_dtx_gmxx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_gmx#_ctl
+ */
+union cvmx_dtx_gmxx_ctl {
+       u64 u64;
+       struct cvmx_dtx_gmxx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_gmxx_ctl_s cn70xx;
+       struct cvmx_dtx_gmxx_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_gmxx_ctl cvmx_dtx_gmxx_ctl_t;
+
+/**
+ * cvmx_dtx_gmx#_dat#
+ */
+union cvmx_dtx_gmxx_datx {
+       u64 u64;
+       struct cvmx_dtx_gmxx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_gmxx_datx_s cn70xx;
+       struct cvmx_dtx_gmxx_datx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_gmxx_datx cvmx_dtx_gmxx_datx_t;
+
+/**
+ * cvmx_dtx_gmx#_ena#
+ */
+union cvmx_dtx_gmxx_enax {
+       u64 u64;
+       struct cvmx_dtx_gmxx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_gmxx_enax_s cn70xx;
+       struct cvmx_dtx_gmxx_enax_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_gmxx_enax cvmx_dtx_gmxx_enax_t;
+
+/**
+ * cvmx_dtx_gmx#_sel#
+ */
+union cvmx_dtx_gmxx_selx {
+       u64 u64;
+       struct cvmx_dtx_gmxx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_gmxx_selx_s cn70xx;
+       struct cvmx_dtx_gmxx_selx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_gmxx_selx cvmx_dtx_gmxx_selx_t;
+
+/**
+ * cvmx_dtx_gser#_bcst_rsp
+ */
+union cvmx_dtx_gserx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_gserx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_gserx_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_gserx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_gserx_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_gserx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_gserx_bcst_rsp cvmx_dtx_gserx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_gser#_ctl
+ */
+union cvmx_dtx_gserx_ctl {
+       u64 u64;
+       struct cvmx_dtx_gserx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_gserx_ctl_s cn73xx;
+       struct cvmx_dtx_gserx_ctl_s cn78xx;
+       struct cvmx_dtx_gserx_ctl_s cn78xxp1;
+       struct cvmx_dtx_gserx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_gserx_ctl cvmx_dtx_gserx_ctl_t;
+
+/**
+ * cvmx_dtx_gser#_dat#
+ */
+union cvmx_dtx_gserx_datx {
+       u64 u64;
+       struct cvmx_dtx_gserx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_gserx_datx_s cn73xx;
+       struct cvmx_dtx_gserx_datx_s cn78xx;
+       struct cvmx_dtx_gserx_datx_s cn78xxp1;
+       struct cvmx_dtx_gserx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_gserx_datx cvmx_dtx_gserx_datx_t;
+
+/**
+ * cvmx_dtx_gser#_ena#
+ */
+union cvmx_dtx_gserx_enax {
+       u64 u64;
+       struct cvmx_dtx_gserx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_gserx_enax_s cn73xx;
+       struct cvmx_dtx_gserx_enax_s cn78xx;
+       struct cvmx_dtx_gserx_enax_s cn78xxp1;
+       struct cvmx_dtx_gserx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_gserx_enax cvmx_dtx_gserx_enax_t;
+
+/**
+ * cvmx_dtx_gser#_sel#
+ */
+union cvmx_dtx_gserx_selx {
+       u64 u64;
+       struct cvmx_dtx_gserx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_gserx_selx_s cn73xx;
+       struct cvmx_dtx_gserx_selx_s cn78xx;
+       struct cvmx_dtx_gserx_selx_s cn78xxp1;
+       struct cvmx_dtx_gserx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_gserx_selx cvmx_dtx_gserx_selx_t;
+
+/**
+ * cvmx_dtx_hna_bcst_rsp
+ */
+union cvmx_dtx_hna_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_hna_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_hna_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_hna_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_hna_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_hna_bcst_rsp cvmx_dtx_hna_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_hna_ctl
+ */
+union cvmx_dtx_hna_ctl {
+       u64 u64;
+       struct cvmx_dtx_hna_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_hna_ctl_s cn73xx;
+       struct cvmx_dtx_hna_ctl_s cn78xx;
+       struct cvmx_dtx_hna_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_hna_ctl cvmx_dtx_hna_ctl_t;
+
+/**
+ * cvmx_dtx_hna_dat#
+ */
+union cvmx_dtx_hna_datx {
+       u64 u64;
+       struct cvmx_dtx_hna_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_hna_datx_s cn73xx;
+       struct cvmx_dtx_hna_datx_s cn78xx;
+       struct cvmx_dtx_hna_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_hna_datx cvmx_dtx_hna_datx_t;
+
+/**
+ * cvmx_dtx_hna_ena#
+ */
+union cvmx_dtx_hna_enax {
+       u64 u64;
+       struct cvmx_dtx_hna_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_hna_enax_s cn73xx;
+       struct cvmx_dtx_hna_enax_s cn78xx;
+       struct cvmx_dtx_hna_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_hna_enax cvmx_dtx_hna_enax_t;
+
+/**
+ * cvmx_dtx_hna_sel#
+ */
+union cvmx_dtx_hna_selx {
+       u64 u64;
+       struct cvmx_dtx_hna_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_hna_selx_s cn73xx;
+       struct cvmx_dtx_hna_selx_s cn78xx;
+       struct cvmx_dtx_hna_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_hna_selx cvmx_dtx_hna_selx_t;
+
+/**
+ * cvmx_dtx_ila_bcst_rsp
+ */
+union cvmx_dtx_ila_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ila_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ila_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ila_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ila_bcst_rsp cvmx_dtx_ila_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ila_ctl
+ */
+union cvmx_dtx_ila_ctl {
+       u64 u64;
+       struct cvmx_dtx_ila_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ila_ctl_s cn78xx;
+       struct cvmx_dtx_ila_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ila_ctl cvmx_dtx_ila_ctl_t;
+
+/**
+ * cvmx_dtx_ila_dat#
+ */
+union cvmx_dtx_ila_datx {
+       u64 u64;
+       struct cvmx_dtx_ila_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ila_datx_s cn78xx;
+       struct cvmx_dtx_ila_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ila_datx cvmx_dtx_ila_datx_t;
+
+/**
+ * cvmx_dtx_ila_ena#
+ */
+union cvmx_dtx_ila_enax {
+       u64 u64;
+       struct cvmx_dtx_ila_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ila_enax_s cn78xx;
+       struct cvmx_dtx_ila_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ila_enax cvmx_dtx_ila_enax_t;
+
+/**
+ * cvmx_dtx_ila_sel#
+ */
+union cvmx_dtx_ila_selx {
+       u64 u64;
+       struct cvmx_dtx_ila_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ila_selx_s cn78xx;
+       struct cvmx_dtx_ila_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ila_selx cvmx_dtx_ila_selx_t;
+
+/**
+ * cvmx_dtx_ilk_bcst_rsp
+ */
+union cvmx_dtx_ilk_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ilk_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ilk_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ilk_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ilk_bcst_rsp cvmx_dtx_ilk_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ilk_ctl
+ */
+union cvmx_dtx_ilk_ctl {
+       u64 u64;
+       struct cvmx_dtx_ilk_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ilk_ctl_s cn78xx;
+       struct cvmx_dtx_ilk_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ilk_ctl cvmx_dtx_ilk_ctl_t;
+
+/**
+ * cvmx_dtx_ilk_dat#
+ */
+union cvmx_dtx_ilk_datx {
+       u64 u64;
+       struct cvmx_dtx_ilk_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ilk_datx_s cn78xx;
+       struct cvmx_dtx_ilk_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ilk_datx cvmx_dtx_ilk_datx_t;
+
+/**
+ * cvmx_dtx_ilk_ena#
+ */
+union cvmx_dtx_ilk_enax {
+       u64 u64;
+       struct cvmx_dtx_ilk_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ilk_enax_s cn78xx;
+       struct cvmx_dtx_ilk_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ilk_enax cvmx_dtx_ilk_enax_t;
+
+/**
+ * cvmx_dtx_ilk_sel#
+ */
+union cvmx_dtx_ilk_selx {
+       u64 u64;
+       struct cvmx_dtx_ilk_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ilk_selx_s cn78xx;
+       struct cvmx_dtx_ilk_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ilk_selx cvmx_dtx_ilk_selx_t;
+
+/**
+ * cvmx_dtx_iob_bcst_rsp
+ */
+union cvmx_dtx_iob_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_iob_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_iob_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_iob_bcst_rsp_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_iob_bcst_rsp cvmx_dtx_iob_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_iob_ctl
+ */
+union cvmx_dtx_iob_ctl {
+       u64 u64;
+       struct cvmx_dtx_iob_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_iob_ctl_s cn70xx;
+       struct cvmx_dtx_iob_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_iob_ctl cvmx_dtx_iob_ctl_t;
+
+/**
+ * cvmx_dtx_iob_dat#
+ */
+union cvmx_dtx_iob_datx {
+       u64 u64;
+       struct cvmx_dtx_iob_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_iob_datx_s cn70xx;
+       struct cvmx_dtx_iob_datx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_iob_datx cvmx_dtx_iob_datx_t;
+
+/**
+ * cvmx_dtx_iob_ena#
+ */
+union cvmx_dtx_iob_enax {
+       u64 u64;
+       struct cvmx_dtx_iob_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_iob_enax_s cn70xx;
+       struct cvmx_dtx_iob_enax_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_iob_enax cvmx_dtx_iob_enax_t;
+
+/**
+ * cvmx_dtx_iob_sel#
+ */
+union cvmx_dtx_iob_selx {
+       u64 u64;
+       struct cvmx_dtx_iob_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_iob_selx_s cn70xx;
+       struct cvmx_dtx_iob_selx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_iob_selx cvmx_dtx_iob_selx_t;
+
+/**
+ * cvmx_dtx_iobn_bcst_rsp
+ */
+union cvmx_dtx_iobn_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_iobn_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_iobn_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_iobn_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_iobn_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_iobn_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobn_bcst_rsp cvmx_dtx_iobn_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_iobn_ctl
+ */
+union cvmx_dtx_iobn_ctl {
+       u64 u64;
+       struct cvmx_dtx_iobn_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_iobn_ctl_s cn73xx;
+       struct cvmx_dtx_iobn_ctl_s cn78xx;
+       struct cvmx_dtx_iobn_ctl_s cn78xxp1;
+       struct cvmx_dtx_iobn_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobn_ctl cvmx_dtx_iobn_ctl_t;
+
+/**
+ * cvmx_dtx_iobn_dat#
+ */
+union cvmx_dtx_iobn_datx {
+       u64 u64;
+       struct cvmx_dtx_iobn_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_iobn_datx_s cn73xx;
+       struct cvmx_dtx_iobn_datx_s cn78xx;
+       struct cvmx_dtx_iobn_datx_s cn78xxp1;
+       struct cvmx_dtx_iobn_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobn_datx cvmx_dtx_iobn_datx_t;
+
+/**
+ * cvmx_dtx_iobn_ena#
+ */
+union cvmx_dtx_iobn_enax {
+       u64 u64;
+       struct cvmx_dtx_iobn_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_iobn_enax_s cn73xx;
+       struct cvmx_dtx_iobn_enax_s cn78xx;
+       struct cvmx_dtx_iobn_enax_s cn78xxp1;
+       struct cvmx_dtx_iobn_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobn_enax cvmx_dtx_iobn_enax_t;
+
+/**
+ * cvmx_dtx_iobn_sel#
+ */
+union cvmx_dtx_iobn_selx {
+       u64 u64;
+       struct cvmx_dtx_iobn_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_iobn_selx_s cn73xx;
+       struct cvmx_dtx_iobn_selx_s cn78xx;
+       struct cvmx_dtx_iobn_selx_s cn78xxp1;
+       struct cvmx_dtx_iobn_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobn_selx cvmx_dtx_iobn_selx_t;
+
+/**
+ * cvmx_dtx_iobp_bcst_rsp
+ */
+union cvmx_dtx_iobp_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_iobp_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_iobp_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_iobp_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_iobp_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_iobp_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobp_bcst_rsp cvmx_dtx_iobp_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_iobp_ctl
+ */
+union cvmx_dtx_iobp_ctl {
+       u64 u64;
+       struct cvmx_dtx_iobp_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_iobp_ctl_s cn73xx;
+       struct cvmx_dtx_iobp_ctl_s cn78xx;
+       struct cvmx_dtx_iobp_ctl_s cn78xxp1;
+       struct cvmx_dtx_iobp_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobp_ctl cvmx_dtx_iobp_ctl_t;
+
+/**
+ * cvmx_dtx_iobp_dat#
+ */
+union cvmx_dtx_iobp_datx {
+       u64 u64;
+       struct cvmx_dtx_iobp_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_iobp_datx_s cn73xx;
+       struct cvmx_dtx_iobp_datx_s cn78xx;
+       struct cvmx_dtx_iobp_datx_s cn78xxp1;
+       struct cvmx_dtx_iobp_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobp_datx cvmx_dtx_iobp_datx_t;
+
+/**
+ * cvmx_dtx_iobp_ena#
+ */
+union cvmx_dtx_iobp_enax {
+       u64 u64;
+       struct cvmx_dtx_iobp_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_iobp_enax_s cn73xx;
+       struct cvmx_dtx_iobp_enax_s cn78xx;
+       struct cvmx_dtx_iobp_enax_s cn78xxp1;
+       struct cvmx_dtx_iobp_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobp_enax cvmx_dtx_iobp_enax_t;
+
+/**
+ * cvmx_dtx_iobp_sel#
+ */
+union cvmx_dtx_iobp_selx {
+       u64 u64;
+       struct cvmx_dtx_iobp_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_iobp_selx_s cn73xx;
+       struct cvmx_dtx_iobp_selx_s cn78xx;
+       struct cvmx_dtx_iobp_selx_s cn78xxp1;
+       struct cvmx_dtx_iobp_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_iobp_selx cvmx_dtx_iobp_selx_t;
+
+/**
+ * cvmx_dtx_ipd_bcst_rsp
+ */
+union cvmx_dtx_ipd_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ipd_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ipd_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_ipd_bcst_rsp_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_ipd_bcst_rsp cvmx_dtx_ipd_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ipd_ctl
+ */
+union cvmx_dtx_ipd_ctl {
+       u64 u64;
+       struct cvmx_dtx_ipd_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ipd_ctl_s cn70xx;
+       struct cvmx_dtx_ipd_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_ipd_ctl cvmx_dtx_ipd_ctl_t;
+
+/**
+ * cvmx_dtx_ipd_dat#
+ */
+union cvmx_dtx_ipd_datx {
+       u64 u64;
+       struct cvmx_dtx_ipd_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ipd_datx_s cn70xx;
+       struct cvmx_dtx_ipd_datx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_ipd_datx cvmx_dtx_ipd_datx_t;
+
+/**
+ * cvmx_dtx_ipd_ena#
+ */
+union cvmx_dtx_ipd_enax {
+       u64 u64;
+       struct cvmx_dtx_ipd_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ipd_enax_s cn70xx;
+       struct cvmx_dtx_ipd_enax_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_ipd_enax cvmx_dtx_ipd_enax_t;
+
+/**
+ * cvmx_dtx_ipd_sel#
+ */
+union cvmx_dtx_ipd_selx {
+       u64 u64;
+       struct cvmx_dtx_ipd_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ipd_selx_s cn70xx;
+       struct cvmx_dtx_ipd_selx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_ipd_selx cvmx_dtx_ipd_selx_t;
+
+/**
+ * cvmx_dtx_key_bcst_rsp
+ */
+union cvmx_dtx_key_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_key_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_key_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_key_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_key_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_key_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_key_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_key_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_key_bcst_rsp cvmx_dtx_key_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_key_ctl
+ */
+union cvmx_dtx_key_ctl {
+       u64 u64;
+       struct cvmx_dtx_key_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_key_ctl_s cn70xx;
+       struct cvmx_dtx_key_ctl_s cn70xxp1;
+       struct cvmx_dtx_key_ctl_s cn73xx;
+       struct cvmx_dtx_key_ctl_s cn78xx;
+       struct cvmx_dtx_key_ctl_s cn78xxp1;
+       struct cvmx_dtx_key_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_key_ctl cvmx_dtx_key_ctl_t;
+
+/**
+ * cvmx_dtx_key_dat#
+ */
+union cvmx_dtx_key_datx {
+       u64 u64;
+       struct cvmx_dtx_key_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_key_datx_s cn70xx;
+       struct cvmx_dtx_key_datx_s cn70xxp1;
+       struct cvmx_dtx_key_datx_s cn73xx;
+       struct cvmx_dtx_key_datx_s cn78xx;
+       struct cvmx_dtx_key_datx_s cn78xxp1;
+       struct cvmx_dtx_key_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_key_datx cvmx_dtx_key_datx_t;
+
+/**
+ * cvmx_dtx_key_ena#
+ */
+union cvmx_dtx_key_enax {
+       u64 u64;
+       struct cvmx_dtx_key_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_key_enax_s cn70xx;
+       struct cvmx_dtx_key_enax_s cn70xxp1;
+       struct cvmx_dtx_key_enax_s cn73xx;
+       struct cvmx_dtx_key_enax_s cn78xx;
+       struct cvmx_dtx_key_enax_s cn78xxp1;
+       struct cvmx_dtx_key_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_key_enax cvmx_dtx_key_enax_t;
+
+/**
+ * cvmx_dtx_key_sel#
+ */
+union cvmx_dtx_key_selx {
+       u64 u64;
+       struct cvmx_dtx_key_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_key_selx_s cn70xx;
+       struct cvmx_dtx_key_selx_s cn70xxp1;
+       struct cvmx_dtx_key_selx_s cn73xx;
+       struct cvmx_dtx_key_selx_s cn78xx;
+       struct cvmx_dtx_key_selx_s cn78xxp1;
+       struct cvmx_dtx_key_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_key_selx cvmx_dtx_key_selx_t;
+
+/**
+ * cvmx_dtx_l2c_cbc#_bcst_rsp
+ */
+union cvmx_dtx_l2c_cbcx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_l2c_cbcx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_l2c_cbcx_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_l2c_cbcx_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_l2c_cbcx_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_l2c_cbcx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_l2c_cbcx_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_l2c_cbcx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_cbcx_bcst_rsp cvmx_dtx_l2c_cbcx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_l2c_cbc#_ctl
+ */
+union cvmx_dtx_l2c_cbcx_ctl {
+       u64 u64;
+       struct cvmx_dtx_l2c_cbcx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_l2c_cbcx_ctl_s cn70xx;
+       struct cvmx_dtx_l2c_cbcx_ctl_s cn70xxp1;
+       struct cvmx_dtx_l2c_cbcx_ctl_s cn73xx;
+       struct cvmx_dtx_l2c_cbcx_ctl_s cn78xx;
+       struct cvmx_dtx_l2c_cbcx_ctl_s cn78xxp1;
+       struct cvmx_dtx_l2c_cbcx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_cbcx_ctl cvmx_dtx_l2c_cbcx_ctl_t;
+
+/**
+ * cvmx_dtx_l2c_cbc#_dat#
+ */
+union cvmx_dtx_l2c_cbcx_datx {
+       u64 u64;
+       struct cvmx_dtx_l2c_cbcx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_l2c_cbcx_datx_s cn70xx;
+       struct cvmx_dtx_l2c_cbcx_datx_s cn70xxp1;
+       struct cvmx_dtx_l2c_cbcx_datx_s cn73xx;
+       struct cvmx_dtx_l2c_cbcx_datx_s cn78xx;
+       struct cvmx_dtx_l2c_cbcx_datx_s cn78xxp1;
+       struct cvmx_dtx_l2c_cbcx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_cbcx_datx cvmx_dtx_l2c_cbcx_datx_t;
+
+/**
+ * cvmx_dtx_l2c_cbc#_ena#
+ */
+union cvmx_dtx_l2c_cbcx_enax {
+       u64 u64;
+       struct cvmx_dtx_l2c_cbcx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_l2c_cbcx_enax_s cn70xx;
+       struct cvmx_dtx_l2c_cbcx_enax_s cn70xxp1;
+       struct cvmx_dtx_l2c_cbcx_enax_s cn73xx;
+       struct cvmx_dtx_l2c_cbcx_enax_s cn78xx;
+       struct cvmx_dtx_l2c_cbcx_enax_s cn78xxp1;
+       struct cvmx_dtx_l2c_cbcx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_cbcx_enax cvmx_dtx_l2c_cbcx_enax_t;
+
+/**
+ * cvmx_dtx_l2c_cbc#_sel#
+ */
+union cvmx_dtx_l2c_cbcx_selx {
+       u64 u64;
+       struct cvmx_dtx_l2c_cbcx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_l2c_cbcx_selx_s cn70xx;
+       struct cvmx_dtx_l2c_cbcx_selx_s cn70xxp1;
+       struct cvmx_dtx_l2c_cbcx_selx_s cn73xx;
+       struct cvmx_dtx_l2c_cbcx_selx_s cn78xx;
+       struct cvmx_dtx_l2c_cbcx_selx_s cn78xxp1;
+       struct cvmx_dtx_l2c_cbcx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_cbcx_selx cvmx_dtx_l2c_cbcx_selx_t;
+
+/**
+ * cvmx_dtx_l2c_mci#_bcst_rsp
+ */
+union cvmx_dtx_l2c_mcix_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_l2c_mcix_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_l2c_mcix_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_l2c_mcix_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_l2c_mcix_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_l2c_mcix_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_l2c_mcix_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_l2c_mcix_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_mcix_bcst_rsp cvmx_dtx_l2c_mcix_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_l2c_mci#_ctl
+ */
+union cvmx_dtx_l2c_mcix_ctl {
+       u64 u64;
+       struct cvmx_dtx_l2c_mcix_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_l2c_mcix_ctl_s cn70xx;
+       struct cvmx_dtx_l2c_mcix_ctl_s cn70xxp1;
+       struct cvmx_dtx_l2c_mcix_ctl_s cn73xx;
+       struct cvmx_dtx_l2c_mcix_ctl_s cn78xx;
+       struct cvmx_dtx_l2c_mcix_ctl_s cn78xxp1;
+       struct cvmx_dtx_l2c_mcix_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_mcix_ctl cvmx_dtx_l2c_mcix_ctl_t;
+
+/**
+ * cvmx_dtx_l2c_mci#_dat#
+ */
+union cvmx_dtx_l2c_mcix_datx {
+       u64 u64;
+       struct cvmx_dtx_l2c_mcix_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_l2c_mcix_datx_s cn70xx;
+       struct cvmx_dtx_l2c_mcix_datx_s cn70xxp1;
+       struct cvmx_dtx_l2c_mcix_datx_s cn73xx;
+       struct cvmx_dtx_l2c_mcix_datx_s cn78xx;
+       struct cvmx_dtx_l2c_mcix_datx_s cn78xxp1;
+       struct cvmx_dtx_l2c_mcix_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_mcix_datx cvmx_dtx_l2c_mcix_datx_t;
+
+/**
+ * cvmx_dtx_l2c_mci#_ena#
+ */
+union cvmx_dtx_l2c_mcix_enax {
+       u64 u64;
+       struct cvmx_dtx_l2c_mcix_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_l2c_mcix_enax_s cn70xx;
+       struct cvmx_dtx_l2c_mcix_enax_s cn70xxp1;
+       struct cvmx_dtx_l2c_mcix_enax_s cn73xx;
+       struct cvmx_dtx_l2c_mcix_enax_s cn78xx;
+       struct cvmx_dtx_l2c_mcix_enax_s cn78xxp1;
+       struct cvmx_dtx_l2c_mcix_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_mcix_enax cvmx_dtx_l2c_mcix_enax_t;
+
+/**
+ * cvmx_dtx_l2c_mci#_sel#
+ */
+union cvmx_dtx_l2c_mcix_selx {
+       u64 u64;
+       struct cvmx_dtx_l2c_mcix_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_l2c_mcix_selx_s cn70xx;
+       struct cvmx_dtx_l2c_mcix_selx_s cn70xxp1;
+       struct cvmx_dtx_l2c_mcix_selx_s cn73xx;
+       struct cvmx_dtx_l2c_mcix_selx_s cn78xx;
+       struct cvmx_dtx_l2c_mcix_selx_s cn78xxp1;
+       struct cvmx_dtx_l2c_mcix_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_mcix_selx cvmx_dtx_l2c_mcix_selx_t;
+
+/**
+ * cvmx_dtx_l2c_tad#_bcst_rsp
+ */
+union cvmx_dtx_l2c_tadx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_l2c_tadx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_l2c_tadx_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_l2c_tadx_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_l2c_tadx_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_l2c_tadx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_l2c_tadx_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_l2c_tadx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_tadx_bcst_rsp cvmx_dtx_l2c_tadx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_l2c_tad#_ctl
+ */
+union cvmx_dtx_l2c_tadx_ctl {
+       u64 u64;
+       struct cvmx_dtx_l2c_tadx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_l2c_tadx_ctl_s cn70xx;
+       struct cvmx_dtx_l2c_tadx_ctl_s cn70xxp1;
+       struct cvmx_dtx_l2c_tadx_ctl_s cn73xx;
+       struct cvmx_dtx_l2c_tadx_ctl_s cn78xx;
+       struct cvmx_dtx_l2c_tadx_ctl_s cn78xxp1;
+       struct cvmx_dtx_l2c_tadx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_tadx_ctl cvmx_dtx_l2c_tadx_ctl_t;
+
+/**
+ * cvmx_dtx_l2c_tad#_dat#
+ */
+union cvmx_dtx_l2c_tadx_datx {
+       u64 u64;
+       struct cvmx_dtx_l2c_tadx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_l2c_tadx_datx_s cn70xx;
+       struct cvmx_dtx_l2c_tadx_datx_s cn70xxp1;
+       struct cvmx_dtx_l2c_tadx_datx_s cn73xx;
+       struct cvmx_dtx_l2c_tadx_datx_s cn78xx;
+       struct cvmx_dtx_l2c_tadx_datx_s cn78xxp1;
+       struct cvmx_dtx_l2c_tadx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_tadx_datx cvmx_dtx_l2c_tadx_datx_t;
+
+/**
+ * cvmx_dtx_l2c_tad#_ena#
+ */
+union cvmx_dtx_l2c_tadx_enax {
+       u64 u64;
+       struct cvmx_dtx_l2c_tadx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_l2c_tadx_enax_s cn70xx;
+       struct cvmx_dtx_l2c_tadx_enax_s cn70xxp1;
+       struct cvmx_dtx_l2c_tadx_enax_s cn73xx;
+       struct cvmx_dtx_l2c_tadx_enax_s cn78xx;
+       struct cvmx_dtx_l2c_tadx_enax_s cn78xxp1;
+       struct cvmx_dtx_l2c_tadx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_tadx_enax cvmx_dtx_l2c_tadx_enax_t;
+
+/**
+ * cvmx_dtx_l2c_tad#_sel#
+ */
+union cvmx_dtx_l2c_tadx_selx {
+       u64 u64;
+       struct cvmx_dtx_l2c_tadx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_l2c_tadx_selx_s cn70xx;
+       struct cvmx_dtx_l2c_tadx_selx_s cn70xxp1;
+       struct cvmx_dtx_l2c_tadx_selx_s cn73xx;
+       struct cvmx_dtx_l2c_tadx_selx_s cn78xx;
+       struct cvmx_dtx_l2c_tadx_selx_s cn78xxp1;
+       struct cvmx_dtx_l2c_tadx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_l2c_tadx_selx cvmx_dtx_l2c_tadx_selx_t;
+
+/**
+ * cvmx_dtx_lap#_bcst_rsp
+ */
+union cvmx_dtx_lapx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_lapx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_lapx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_lapx_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_lapx_bcst_rsp cvmx_dtx_lapx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_lap#_ctl
+ */
+union cvmx_dtx_lapx_ctl {
+       u64 u64;
+       struct cvmx_dtx_lapx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_lapx_ctl_s cn78xx;
+       struct cvmx_dtx_lapx_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_lapx_ctl cvmx_dtx_lapx_ctl_t;
+
+/**
+ * cvmx_dtx_lap#_dat#
+ */
+union cvmx_dtx_lapx_datx {
+       u64 u64;
+       struct cvmx_dtx_lapx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_lapx_datx_s cn78xx;
+       struct cvmx_dtx_lapx_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_lapx_datx cvmx_dtx_lapx_datx_t;
+
+/**
+ * cvmx_dtx_lap#_ena#
+ */
+union cvmx_dtx_lapx_enax {
+       u64 u64;
+       struct cvmx_dtx_lapx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_lapx_enax_s cn78xx;
+       struct cvmx_dtx_lapx_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_lapx_enax cvmx_dtx_lapx_enax_t;
+
+/**
+ * cvmx_dtx_lap#_sel#
+ */
+union cvmx_dtx_lapx_selx {
+       u64 u64;
+       struct cvmx_dtx_lapx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_lapx_selx_s cn78xx;
+       struct cvmx_dtx_lapx_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_lapx_selx cvmx_dtx_lapx_selx_t;
+
+/**
+ * cvmx_dtx_lbk_bcst_rsp
+ */
+union cvmx_dtx_lbk_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_lbk_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_lbk_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_lbk_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_lbk_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_lbk_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lbk_bcst_rsp cvmx_dtx_lbk_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_lbk_ctl
+ */
+union cvmx_dtx_lbk_ctl {
+       u64 u64;
+       struct cvmx_dtx_lbk_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_lbk_ctl_s cn73xx;
+       struct cvmx_dtx_lbk_ctl_s cn78xx;
+       struct cvmx_dtx_lbk_ctl_s cn78xxp1;
+       struct cvmx_dtx_lbk_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lbk_ctl cvmx_dtx_lbk_ctl_t;
+
+/**
+ * cvmx_dtx_lbk_dat#
+ */
+union cvmx_dtx_lbk_datx {
+       u64 u64;
+       struct cvmx_dtx_lbk_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_lbk_datx_s cn73xx;
+       struct cvmx_dtx_lbk_datx_s cn78xx;
+       struct cvmx_dtx_lbk_datx_s cn78xxp1;
+       struct cvmx_dtx_lbk_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lbk_datx cvmx_dtx_lbk_datx_t;
+
+/**
+ * cvmx_dtx_lbk_ena#
+ */
+union cvmx_dtx_lbk_enax {
+       u64 u64;
+       struct cvmx_dtx_lbk_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_lbk_enax_s cn73xx;
+       struct cvmx_dtx_lbk_enax_s cn78xx;
+       struct cvmx_dtx_lbk_enax_s cn78xxp1;
+       struct cvmx_dtx_lbk_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lbk_enax cvmx_dtx_lbk_enax_t;
+
+/**
+ * cvmx_dtx_lbk_sel#
+ */
+union cvmx_dtx_lbk_selx {
+       u64 u64;
+       struct cvmx_dtx_lbk_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_lbk_selx_s cn73xx;
+       struct cvmx_dtx_lbk_selx_s cn78xx;
+       struct cvmx_dtx_lbk_selx_s cn78xxp1;
+       struct cvmx_dtx_lbk_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lbk_selx cvmx_dtx_lbk_selx_t;
+
+/**
+ * cvmx_dtx_lmc#_bcst_rsp
+ */
+union cvmx_dtx_lmcx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_lmcx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_lmcx_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_lmcx_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_lmcx_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_lmcx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_lmcx_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_lmcx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lmcx_bcst_rsp cvmx_dtx_lmcx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_lmc#_ctl
+ */
+union cvmx_dtx_lmcx_ctl {
+       u64 u64;
+       struct cvmx_dtx_lmcx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_lmcx_ctl_s cn70xx;
+       struct cvmx_dtx_lmcx_ctl_s cn70xxp1;
+       struct cvmx_dtx_lmcx_ctl_s cn73xx;
+       struct cvmx_dtx_lmcx_ctl_s cn78xx;
+       struct cvmx_dtx_lmcx_ctl_s cn78xxp1;
+       struct cvmx_dtx_lmcx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lmcx_ctl cvmx_dtx_lmcx_ctl_t;
+
+/**
+ * cvmx_dtx_lmc#_dat#
+ */
+union cvmx_dtx_lmcx_datx {
+       u64 u64;
+       struct cvmx_dtx_lmcx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_lmcx_datx_s cn70xx;
+       struct cvmx_dtx_lmcx_datx_s cn70xxp1;
+       struct cvmx_dtx_lmcx_datx_s cn73xx;
+       struct cvmx_dtx_lmcx_datx_s cn78xx;
+       struct cvmx_dtx_lmcx_datx_s cn78xxp1;
+       struct cvmx_dtx_lmcx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lmcx_datx cvmx_dtx_lmcx_datx_t;
+
+/**
+ * cvmx_dtx_lmc#_ena#
+ */
+union cvmx_dtx_lmcx_enax {
+       u64 u64;
+       struct cvmx_dtx_lmcx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_lmcx_enax_s cn70xx;
+       struct cvmx_dtx_lmcx_enax_s cn70xxp1;
+       struct cvmx_dtx_lmcx_enax_s cn73xx;
+       struct cvmx_dtx_lmcx_enax_s cn78xx;
+       struct cvmx_dtx_lmcx_enax_s cn78xxp1;
+       struct cvmx_dtx_lmcx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lmcx_enax cvmx_dtx_lmcx_enax_t;
+
+/**
+ * cvmx_dtx_lmc#_sel#
+ */
+union cvmx_dtx_lmcx_selx {
+       u64 u64;
+       struct cvmx_dtx_lmcx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_lmcx_selx_s cn70xx;
+       struct cvmx_dtx_lmcx_selx_s cn70xxp1;
+       struct cvmx_dtx_lmcx_selx_s cn73xx;
+       struct cvmx_dtx_lmcx_selx_s cn78xx;
+       struct cvmx_dtx_lmcx_selx_s cn78xxp1;
+       struct cvmx_dtx_lmcx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_lmcx_selx cvmx_dtx_lmcx_selx_t;
+
+/**
+ * cvmx_dtx_mdb#_bcst_rsp
+ */
+union cvmx_dtx_mdbx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_mdbx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_mdbx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mdbx_bcst_rsp cvmx_dtx_mdbx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_mdb#_ctl
+ */
+union cvmx_dtx_mdbx_ctl {
+       u64 u64;
+       struct cvmx_dtx_mdbx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_mdbx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mdbx_ctl cvmx_dtx_mdbx_ctl_t;
+
+/**
+ * cvmx_dtx_mdb#_dat#
+ */
+union cvmx_dtx_mdbx_datx {
+       u64 u64;
+       struct cvmx_dtx_mdbx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_mdbx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mdbx_datx cvmx_dtx_mdbx_datx_t;
+
+/**
+ * cvmx_dtx_mdb#_ena#
+ */
+union cvmx_dtx_mdbx_enax {
+       u64 u64;
+       struct cvmx_dtx_mdbx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_mdbx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mdbx_enax cvmx_dtx_mdbx_enax_t;
+
+/**
+ * cvmx_dtx_mdb#_sel#
+ */
+union cvmx_dtx_mdbx_selx {
+       u64 u64;
+       struct cvmx_dtx_mdbx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_mdbx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mdbx_selx cvmx_dtx_mdbx_selx_t;
+
+/**
+ * cvmx_dtx_mhbw_bcst_rsp
+ */
+union cvmx_dtx_mhbw_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_mhbw_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_mhbw_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mhbw_bcst_rsp cvmx_dtx_mhbw_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_mhbw_ctl
+ */
+union cvmx_dtx_mhbw_ctl {
+       u64 u64;
+       struct cvmx_dtx_mhbw_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_mhbw_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mhbw_ctl cvmx_dtx_mhbw_ctl_t;
+
+/**
+ * cvmx_dtx_mhbw_dat#
+ */
+union cvmx_dtx_mhbw_datx {
+       u64 u64;
+       struct cvmx_dtx_mhbw_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_mhbw_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mhbw_datx cvmx_dtx_mhbw_datx_t;
+
+/**
+ * cvmx_dtx_mhbw_ena#
+ */
+union cvmx_dtx_mhbw_enax {
+       u64 u64;
+       struct cvmx_dtx_mhbw_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_mhbw_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mhbw_enax cvmx_dtx_mhbw_enax_t;
+
+/**
+ * cvmx_dtx_mhbw_sel#
+ */
+union cvmx_dtx_mhbw_selx {
+       u64 u64;
+       struct cvmx_dtx_mhbw_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_mhbw_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mhbw_selx cvmx_dtx_mhbw_selx_t;
+
+/**
+ * cvmx_dtx_mio_bcst_rsp
+ */
+union cvmx_dtx_mio_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_mio_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_mio_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_mio_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_mio_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_mio_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_mio_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_mio_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mio_bcst_rsp cvmx_dtx_mio_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_mio_ctl
+ */
+union cvmx_dtx_mio_ctl {
+       u64 u64;
+       struct cvmx_dtx_mio_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_mio_ctl_s cn70xx;
+       struct cvmx_dtx_mio_ctl_s cn70xxp1;
+       struct cvmx_dtx_mio_ctl_s cn73xx;
+       struct cvmx_dtx_mio_ctl_s cn78xx;
+       struct cvmx_dtx_mio_ctl_s cn78xxp1;
+       struct cvmx_dtx_mio_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mio_ctl cvmx_dtx_mio_ctl_t;
+
+/**
+ * cvmx_dtx_mio_dat#
+ */
+union cvmx_dtx_mio_datx {
+       u64 u64;
+       struct cvmx_dtx_mio_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_mio_datx_s cn70xx;
+       struct cvmx_dtx_mio_datx_s cn70xxp1;
+       struct cvmx_dtx_mio_datx_s cn73xx;
+       struct cvmx_dtx_mio_datx_s cn78xx;
+       struct cvmx_dtx_mio_datx_s cn78xxp1;
+       struct cvmx_dtx_mio_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mio_datx cvmx_dtx_mio_datx_t;
+
+/**
+ * cvmx_dtx_mio_ena#
+ */
+union cvmx_dtx_mio_enax {
+       u64 u64;
+       struct cvmx_dtx_mio_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_mio_enax_s cn70xx;
+       struct cvmx_dtx_mio_enax_s cn70xxp1;
+       struct cvmx_dtx_mio_enax_s cn73xx;
+       struct cvmx_dtx_mio_enax_s cn78xx;
+       struct cvmx_dtx_mio_enax_s cn78xxp1;
+       struct cvmx_dtx_mio_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mio_enax cvmx_dtx_mio_enax_t;
+
+/**
+ * cvmx_dtx_mio_sel#
+ */
+union cvmx_dtx_mio_selx {
+       u64 u64;
+       struct cvmx_dtx_mio_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_mio_selx_s cn70xx;
+       struct cvmx_dtx_mio_selx_s cn70xxp1;
+       struct cvmx_dtx_mio_selx_s cn73xx;
+       struct cvmx_dtx_mio_selx_s cn78xx;
+       struct cvmx_dtx_mio_selx_s cn78xxp1;
+       struct cvmx_dtx_mio_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_mio_selx cvmx_dtx_mio_selx_t;
+
+/**
+ * cvmx_dtx_ocx_bot_bcst_rsp
+ */
+union cvmx_dtx_ocx_bot_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ocx_bot_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ocx_bot_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ocx_bot_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_bot_bcst_rsp cvmx_dtx_ocx_bot_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ocx_bot_ctl
+ */
+union cvmx_dtx_ocx_bot_ctl {
+       u64 u64;
+       struct cvmx_dtx_ocx_bot_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ocx_bot_ctl_s cn78xx;
+       struct cvmx_dtx_ocx_bot_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_bot_ctl cvmx_dtx_ocx_bot_ctl_t;
+
+/**
+ * cvmx_dtx_ocx_bot_dat#
+ */
+union cvmx_dtx_ocx_bot_datx {
+       u64 u64;
+       struct cvmx_dtx_ocx_bot_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ocx_bot_datx_s cn78xx;
+       struct cvmx_dtx_ocx_bot_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_bot_datx cvmx_dtx_ocx_bot_datx_t;
+
+/**
+ * cvmx_dtx_ocx_bot_ena#
+ */
+union cvmx_dtx_ocx_bot_enax {
+       u64 u64;
+       struct cvmx_dtx_ocx_bot_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ocx_bot_enax_s cn78xx;
+       struct cvmx_dtx_ocx_bot_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_bot_enax cvmx_dtx_ocx_bot_enax_t;
+
+/**
+ * cvmx_dtx_ocx_bot_sel#
+ */
+union cvmx_dtx_ocx_bot_selx {
+       u64 u64;
+       struct cvmx_dtx_ocx_bot_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ocx_bot_selx_s cn78xx;
+       struct cvmx_dtx_ocx_bot_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_bot_selx cvmx_dtx_ocx_bot_selx_t;
+
+/**
+ * cvmx_dtx_ocx_lnk#_bcst_rsp
+ */
+union cvmx_dtx_ocx_lnkx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ocx_lnkx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ocx_lnkx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ocx_lnkx_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_lnkx_bcst_rsp cvmx_dtx_ocx_lnkx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ocx_lnk#_ctl
+ */
+union cvmx_dtx_ocx_lnkx_ctl {
+       u64 u64;
+       struct cvmx_dtx_ocx_lnkx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ocx_lnkx_ctl_s cn78xx;
+       struct cvmx_dtx_ocx_lnkx_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_lnkx_ctl cvmx_dtx_ocx_lnkx_ctl_t;
+
+/**
+ * cvmx_dtx_ocx_lnk#_dat#
+ */
+union cvmx_dtx_ocx_lnkx_datx {
+       u64 u64;
+       struct cvmx_dtx_ocx_lnkx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ocx_lnkx_datx_s cn78xx;
+       struct cvmx_dtx_ocx_lnkx_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_lnkx_datx cvmx_dtx_ocx_lnkx_datx_t;
+
+/**
+ * cvmx_dtx_ocx_lnk#_ena#
+ */
+union cvmx_dtx_ocx_lnkx_enax {
+       u64 u64;
+       struct cvmx_dtx_ocx_lnkx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ocx_lnkx_enax_s cn78xx;
+       struct cvmx_dtx_ocx_lnkx_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_lnkx_enax cvmx_dtx_ocx_lnkx_enax_t;
+
+/**
+ * cvmx_dtx_ocx_lnk#_sel#
+ */
+union cvmx_dtx_ocx_lnkx_selx {
+       u64 u64;
+       struct cvmx_dtx_ocx_lnkx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ocx_lnkx_selx_s cn78xx;
+       struct cvmx_dtx_ocx_lnkx_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_lnkx_selx cvmx_dtx_ocx_lnkx_selx_t;
+
+/**
+ * cvmx_dtx_ocx_ole#_bcst_rsp
+ */
+union cvmx_dtx_ocx_olex_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ocx_olex_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ocx_olex_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ocx_olex_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_olex_bcst_rsp cvmx_dtx_ocx_olex_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ocx_ole#_ctl
+ */
+union cvmx_dtx_ocx_olex_ctl {
+       u64 u64;
+       struct cvmx_dtx_ocx_olex_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ocx_olex_ctl_s cn78xx;
+       struct cvmx_dtx_ocx_olex_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_olex_ctl cvmx_dtx_ocx_olex_ctl_t;
+
+/**
+ * cvmx_dtx_ocx_ole#_dat#
+ */
+union cvmx_dtx_ocx_olex_datx {
+       u64 u64;
+       struct cvmx_dtx_ocx_olex_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ocx_olex_datx_s cn78xx;
+       struct cvmx_dtx_ocx_olex_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_olex_datx cvmx_dtx_ocx_olex_datx_t;
+
+/**
+ * cvmx_dtx_ocx_ole#_ena#
+ */
+union cvmx_dtx_ocx_olex_enax {
+       u64 u64;
+       struct cvmx_dtx_ocx_olex_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ocx_olex_enax_s cn78xx;
+       struct cvmx_dtx_ocx_olex_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_olex_enax cvmx_dtx_ocx_olex_enax_t;
+
+/**
+ * cvmx_dtx_ocx_ole#_sel#
+ */
+union cvmx_dtx_ocx_olex_selx {
+       u64 u64;
+       struct cvmx_dtx_ocx_olex_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ocx_olex_selx_s cn78xx;
+       struct cvmx_dtx_ocx_olex_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_olex_selx cvmx_dtx_ocx_olex_selx_t;
+
+/**
+ * cvmx_dtx_ocx_top_bcst_rsp
+ */
+union cvmx_dtx_ocx_top_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ocx_top_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ocx_top_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_ocx_top_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_top_bcst_rsp cvmx_dtx_ocx_top_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ocx_top_ctl
+ */
+union cvmx_dtx_ocx_top_ctl {
+       u64 u64;
+       struct cvmx_dtx_ocx_top_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ocx_top_ctl_s cn78xx;
+       struct cvmx_dtx_ocx_top_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_top_ctl cvmx_dtx_ocx_top_ctl_t;
+
+/**
+ * cvmx_dtx_ocx_top_dat#
+ */
+union cvmx_dtx_ocx_top_datx {
+       u64 u64;
+       struct cvmx_dtx_ocx_top_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ocx_top_datx_s cn78xx;
+       struct cvmx_dtx_ocx_top_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_top_datx cvmx_dtx_ocx_top_datx_t;
+
+/**
+ * cvmx_dtx_ocx_top_ena#
+ */
+union cvmx_dtx_ocx_top_enax {
+       u64 u64;
+       struct cvmx_dtx_ocx_top_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ocx_top_enax_s cn78xx;
+       struct cvmx_dtx_ocx_top_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_top_enax cvmx_dtx_ocx_top_enax_t;
+
+/**
+ * cvmx_dtx_ocx_top_sel#
+ */
+union cvmx_dtx_ocx_top_selx {
+       u64 u64;
+       struct cvmx_dtx_ocx_top_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ocx_top_selx_s cn78xx;
+       struct cvmx_dtx_ocx_top_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_ocx_top_selx cvmx_dtx_ocx_top_selx_t;
+
+/**
+ * cvmx_dtx_osm_bcst_rsp
+ */
+union cvmx_dtx_osm_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_osm_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_osm_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_osm_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_osm_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_osm_bcst_rsp cvmx_dtx_osm_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_osm_ctl
+ */
+union cvmx_dtx_osm_ctl {
+       u64 u64;
+       struct cvmx_dtx_osm_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_osm_ctl_s cn73xx;
+       struct cvmx_dtx_osm_ctl_s cn78xx;
+       struct cvmx_dtx_osm_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_osm_ctl cvmx_dtx_osm_ctl_t;
+
+/**
+ * cvmx_dtx_osm_dat#
+ */
+union cvmx_dtx_osm_datx {
+       u64 u64;
+       struct cvmx_dtx_osm_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_osm_datx_s cn73xx;
+       struct cvmx_dtx_osm_datx_s cn78xx;
+       struct cvmx_dtx_osm_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_osm_datx cvmx_dtx_osm_datx_t;
+
+/**
+ * cvmx_dtx_osm_ena#
+ */
+union cvmx_dtx_osm_enax {
+       u64 u64;
+       struct cvmx_dtx_osm_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_osm_enax_s cn73xx;
+       struct cvmx_dtx_osm_enax_s cn78xx;
+       struct cvmx_dtx_osm_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_osm_enax cvmx_dtx_osm_enax_t;
+
+/**
+ * cvmx_dtx_osm_sel#
+ */
+union cvmx_dtx_osm_selx {
+       u64 u64;
+       struct cvmx_dtx_osm_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_osm_selx_s cn73xx;
+       struct cvmx_dtx_osm_selx_s cn78xx;
+       struct cvmx_dtx_osm_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_osm_selx cvmx_dtx_osm_selx_t;
+
+/**
+ * cvmx_dtx_pcs#_bcst_rsp
+ */
+union cvmx_dtx_pcsx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pcsx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pcsx_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_pcsx_bcst_rsp_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pcsx_bcst_rsp cvmx_dtx_pcsx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pcs#_ctl
+ */
+union cvmx_dtx_pcsx_ctl {
+       u64 u64;
+       struct cvmx_dtx_pcsx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pcsx_ctl_s cn70xx;
+       struct cvmx_dtx_pcsx_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pcsx_ctl cvmx_dtx_pcsx_ctl_t;
+
+/**
+ * cvmx_dtx_pcs#_dat#
+ */
+union cvmx_dtx_pcsx_datx {
+       u64 u64;
+       struct cvmx_dtx_pcsx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pcsx_datx_s cn70xx;
+       struct cvmx_dtx_pcsx_datx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pcsx_datx cvmx_dtx_pcsx_datx_t;
+
+/**
+ * cvmx_dtx_pcs#_ena#
+ */
+union cvmx_dtx_pcsx_enax {
+       u64 u64;
+       struct cvmx_dtx_pcsx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pcsx_enax_s cn70xx;
+       struct cvmx_dtx_pcsx_enax_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pcsx_enax cvmx_dtx_pcsx_enax_t;
+
+/**
+ * cvmx_dtx_pcs#_sel#
+ */
+union cvmx_dtx_pcsx_selx {
+       u64 u64;
+       struct cvmx_dtx_pcsx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pcsx_selx_s cn70xx;
+       struct cvmx_dtx_pcsx_selx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pcsx_selx cvmx_dtx_pcsx_selx_t;
+
+/**
+ * cvmx_dtx_pem#_bcst_rsp
+ */
+union cvmx_dtx_pemx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pemx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pemx_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_pemx_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_pemx_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_pemx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_pemx_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_pemx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pemx_bcst_rsp cvmx_dtx_pemx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pem#_ctl
+ */
+union cvmx_dtx_pemx_ctl {
+       u64 u64;
+       struct cvmx_dtx_pemx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pemx_ctl_s cn70xx;
+       struct cvmx_dtx_pemx_ctl_s cn70xxp1;
+       struct cvmx_dtx_pemx_ctl_s cn73xx;
+       struct cvmx_dtx_pemx_ctl_s cn78xx;
+       struct cvmx_dtx_pemx_ctl_s cn78xxp1;
+       struct cvmx_dtx_pemx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pemx_ctl cvmx_dtx_pemx_ctl_t;
+
+/**
+ * cvmx_dtx_pem#_dat#
+ */
+union cvmx_dtx_pemx_datx {
+       u64 u64;
+       struct cvmx_dtx_pemx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pemx_datx_s cn70xx;
+       struct cvmx_dtx_pemx_datx_s cn70xxp1;
+       struct cvmx_dtx_pemx_datx_s cn73xx;
+       struct cvmx_dtx_pemx_datx_s cn78xx;
+       struct cvmx_dtx_pemx_datx_s cn78xxp1;
+       struct cvmx_dtx_pemx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pemx_datx cvmx_dtx_pemx_datx_t;
+
+/**
+ * cvmx_dtx_pem#_ena#
+ */
+union cvmx_dtx_pemx_enax {
+       u64 u64;
+       struct cvmx_dtx_pemx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pemx_enax_s cn70xx;
+       struct cvmx_dtx_pemx_enax_s cn70xxp1;
+       struct cvmx_dtx_pemx_enax_s cn73xx;
+       struct cvmx_dtx_pemx_enax_s cn78xx;
+       struct cvmx_dtx_pemx_enax_s cn78xxp1;
+       struct cvmx_dtx_pemx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pemx_enax cvmx_dtx_pemx_enax_t;
+
+/**
+ * cvmx_dtx_pem#_sel#
+ */
+union cvmx_dtx_pemx_selx {
+       u64 u64;
+       struct cvmx_dtx_pemx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pemx_selx_s cn70xx;
+       struct cvmx_dtx_pemx_selx_s cn70xxp1;
+       struct cvmx_dtx_pemx_selx_s cn73xx;
+       struct cvmx_dtx_pemx_selx_s cn78xx;
+       struct cvmx_dtx_pemx_selx_s cn78xxp1;
+       struct cvmx_dtx_pemx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pemx_selx cvmx_dtx_pemx_selx_t;
+
+/**
+ * cvmx_dtx_pip_bcst_rsp
+ */
+union cvmx_dtx_pip_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pip_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pip_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_pip_bcst_rsp_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pip_bcst_rsp cvmx_dtx_pip_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pip_ctl
+ */
+union cvmx_dtx_pip_ctl {
+       u64 u64;
+       struct cvmx_dtx_pip_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pip_ctl_s cn70xx;
+       struct cvmx_dtx_pip_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pip_ctl cvmx_dtx_pip_ctl_t;
+
+/**
+ * cvmx_dtx_pip_dat#
+ */
+union cvmx_dtx_pip_datx {
+       u64 u64;
+       struct cvmx_dtx_pip_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pip_datx_s cn70xx;
+       struct cvmx_dtx_pip_datx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pip_datx cvmx_dtx_pip_datx_t;
+
+/**
+ * cvmx_dtx_pip_ena#
+ */
+union cvmx_dtx_pip_enax {
+       u64 u64;
+       struct cvmx_dtx_pip_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pip_enax_s cn70xx;
+       struct cvmx_dtx_pip_enax_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pip_enax cvmx_dtx_pip_enax_t;
+
+/**
+ * cvmx_dtx_pip_sel#
+ */
+union cvmx_dtx_pip_selx {
+       u64 u64;
+       struct cvmx_dtx_pip_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pip_selx_s cn70xx;
+       struct cvmx_dtx_pip_selx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pip_selx cvmx_dtx_pip_selx_t;
+
+/**
+ * cvmx_dtx_pki_pbe_bcst_rsp
+ */
+union cvmx_dtx_pki_pbe_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pki_pbe_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pki_pbe_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_pki_pbe_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_pki_pbe_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_pki_pbe_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pbe_bcst_rsp cvmx_dtx_pki_pbe_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pki_pbe_ctl
+ */
+union cvmx_dtx_pki_pbe_ctl {
+       u64 u64;
+       struct cvmx_dtx_pki_pbe_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pki_pbe_ctl_s cn73xx;
+       struct cvmx_dtx_pki_pbe_ctl_s cn78xx;
+       struct cvmx_dtx_pki_pbe_ctl_s cn78xxp1;
+       struct cvmx_dtx_pki_pbe_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pbe_ctl cvmx_dtx_pki_pbe_ctl_t;
+
+/**
+ * cvmx_dtx_pki_pbe_dat#
+ */
+union cvmx_dtx_pki_pbe_datx {
+       u64 u64;
+       struct cvmx_dtx_pki_pbe_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pki_pbe_datx_s cn73xx;
+       struct cvmx_dtx_pki_pbe_datx_s cn78xx;
+       struct cvmx_dtx_pki_pbe_datx_s cn78xxp1;
+       struct cvmx_dtx_pki_pbe_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pbe_datx cvmx_dtx_pki_pbe_datx_t;
+
+/**
+ * cvmx_dtx_pki_pbe_ena#
+ */
+union cvmx_dtx_pki_pbe_enax {
+       u64 u64;
+       struct cvmx_dtx_pki_pbe_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pki_pbe_enax_s cn73xx;
+       struct cvmx_dtx_pki_pbe_enax_s cn78xx;
+       struct cvmx_dtx_pki_pbe_enax_s cn78xxp1;
+       struct cvmx_dtx_pki_pbe_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pbe_enax cvmx_dtx_pki_pbe_enax_t;
+
+/**
+ * cvmx_dtx_pki_pbe_sel#
+ */
+union cvmx_dtx_pki_pbe_selx {
+       u64 u64;
+       struct cvmx_dtx_pki_pbe_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pki_pbe_selx_s cn73xx;
+       struct cvmx_dtx_pki_pbe_selx_s cn78xx;
+       struct cvmx_dtx_pki_pbe_selx_s cn78xxp1;
+       struct cvmx_dtx_pki_pbe_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pbe_selx cvmx_dtx_pki_pbe_selx_t;
+
+/**
+ * cvmx_dtx_pki_pfe_bcst_rsp
+ */
+union cvmx_dtx_pki_pfe_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pki_pfe_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pki_pfe_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_pki_pfe_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_pki_pfe_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_pki_pfe_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pfe_bcst_rsp cvmx_dtx_pki_pfe_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pki_pfe_ctl
+ */
+union cvmx_dtx_pki_pfe_ctl {
+       u64 u64;
+       struct cvmx_dtx_pki_pfe_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pki_pfe_ctl_s cn73xx;
+       struct cvmx_dtx_pki_pfe_ctl_s cn78xx;
+       struct cvmx_dtx_pki_pfe_ctl_s cn78xxp1;
+       struct cvmx_dtx_pki_pfe_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pfe_ctl cvmx_dtx_pki_pfe_ctl_t;
+
+/**
+ * cvmx_dtx_pki_pfe_dat#
+ */
+union cvmx_dtx_pki_pfe_datx {
+       u64 u64;
+       struct cvmx_dtx_pki_pfe_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pki_pfe_datx_s cn73xx;
+       struct cvmx_dtx_pki_pfe_datx_s cn78xx;
+       struct cvmx_dtx_pki_pfe_datx_s cn78xxp1;
+       struct cvmx_dtx_pki_pfe_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pfe_datx cvmx_dtx_pki_pfe_datx_t;
+
+/**
+ * cvmx_dtx_pki_pfe_ena#
+ */
+union cvmx_dtx_pki_pfe_enax {
+       u64 u64;
+       struct cvmx_dtx_pki_pfe_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pki_pfe_enax_s cn73xx;
+       struct cvmx_dtx_pki_pfe_enax_s cn78xx;
+       struct cvmx_dtx_pki_pfe_enax_s cn78xxp1;
+       struct cvmx_dtx_pki_pfe_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pfe_enax cvmx_dtx_pki_pfe_enax_t;
+
+/**
+ * cvmx_dtx_pki_pfe_sel#
+ */
+union cvmx_dtx_pki_pfe_selx {
+       u64 u64;
+       struct cvmx_dtx_pki_pfe_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pki_pfe_selx_s cn73xx;
+       struct cvmx_dtx_pki_pfe_selx_s cn78xx;
+       struct cvmx_dtx_pki_pfe_selx_s cn78xxp1;
+       struct cvmx_dtx_pki_pfe_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pfe_selx cvmx_dtx_pki_pfe_selx_t;
+
+/**
+ * cvmx_dtx_pki_pix_bcst_rsp
+ */
+union cvmx_dtx_pki_pix_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pki_pix_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pki_pix_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_pki_pix_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_pki_pix_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_pki_pix_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pix_bcst_rsp cvmx_dtx_pki_pix_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pki_pix_ctl
+ */
+union cvmx_dtx_pki_pix_ctl {
+       u64 u64;
+       struct cvmx_dtx_pki_pix_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pki_pix_ctl_s cn73xx;
+       struct cvmx_dtx_pki_pix_ctl_s cn78xx;
+       struct cvmx_dtx_pki_pix_ctl_s cn78xxp1;
+       struct cvmx_dtx_pki_pix_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pix_ctl cvmx_dtx_pki_pix_ctl_t;
+
+/**
+ * cvmx_dtx_pki_pix_dat#
+ */
+union cvmx_dtx_pki_pix_datx {
+       u64 u64;
+       struct cvmx_dtx_pki_pix_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pki_pix_datx_s cn73xx;
+       struct cvmx_dtx_pki_pix_datx_s cn78xx;
+       struct cvmx_dtx_pki_pix_datx_s cn78xxp1;
+       struct cvmx_dtx_pki_pix_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pix_datx cvmx_dtx_pki_pix_datx_t;
+
+/**
+ * cvmx_dtx_pki_pix_ena#
+ */
+union cvmx_dtx_pki_pix_enax {
+       u64 u64;
+       struct cvmx_dtx_pki_pix_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pki_pix_enax_s cn73xx;
+       struct cvmx_dtx_pki_pix_enax_s cn78xx;
+       struct cvmx_dtx_pki_pix_enax_s cn78xxp1;
+       struct cvmx_dtx_pki_pix_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pix_enax cvmx_dtx_pki_pix_enax_t;
+
+/**
+ * cvmx_dtx_pki_pix_sel#
+ */
+union cvmx_dtx_pki_pix_selx {
+       u64 u64;
+       struct cvmx_dtx_pki_pix_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pki_pix_selx_s cn73xx;
+       struct cvmx_dtx_pki_pix_selx_s cn78xx;
+       struct cvmx_dtx_pki_pix_selx_s cn78xxp1;
+       struct cvmx_dtx_pki_pix_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pki_pix_selx cvmx_dtx_pki_pix_selx_t;
+
+/**
+ * cvmx_dtx_pko_bcst_rsp
+ */
+union cvmx_dtx_pko_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pko_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pko_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_pko_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_pko_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_pko_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_pko_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_pko_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pko_bcst_rsp cvmx_dtx_pko_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pko_ctl
+ */
+union cvmx_dtx_pko_ctl {
+       u64 u64;
+       struct cvmx_dtx_pko_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pko_ctl_s cn70xx;
+       struct cvmx_dtx_pko_ctl_s cn70xxp1;
+       struct cvmx_dtx_pko_ctl_s cn73xx;
+       struct cvmx_dtx_pko_ctl_s cn78xx;
+       struct cvmx_dtx_pko_ctl_s cn78xxp1;
+       struct cvmx_dtx_pko_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pko_ctl cvmx_dtx_pko_ctl_t;
+
+/**
+ * cvmx_dtx_pko_dat#
+ */
+union cvmx_dtx_pko_datx {
+       u64 u64;
+       struct cvmx_dtx_pko_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pko_datx_s cn70xx;
+       struct cvmx_dtx_pko_datx_s cn70xxp1;
+       struct cvmx_dtx_pko_datx_s cn73xx;
+       struct cvmx_dtx_pko_datx_s cn78xx;
+       struct cvmx_dtx_pko_datx_s cn78xxp1;
+       struct cvmx_dtx_pko_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pko_datx cvmx_dtx_pko_datx_t;
+
+/**
+ * cvmx_dtx_pko_ena#
+ */
+union cvmx_dtx_pko_enax {
+       u64 u64;
+       struct cvmx_dtx_pko_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pko_enax_s cn70xx;
+       struct cvmx_dtx_pko_enax_s cn70xxp1;
+       struct cvmx_dtx_pko_enax_s cn73xx;
+       struct cvmx_dtx_pko_enax_s cn78xx;
+       struct cvmx_dtx_pko_enax_s cn78xxp1;
+       struct cvmx_dtx_pko_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pko_enax cvmx_dtx_pko_enax_t;
+
+/**
+ * cvmx_dtx_pko_sel#
+ */
+union cvmx_dtx_pko_selx {
+       u64 u64;
+       struct cvmx_dtx_pko_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pko_selx_s cn70xx;
+       struct cvmx_dtx_pko_selx_s cn70xxp1;
+       struct cvmx_dtx_pko_selx_s cn73xx;
+       struct cvmx_dtx_pko_selx_s cn78xx;
+       struct cvmx_dtx_pko_selx_s cn78xxp1;
+       struct cvmx_dtx_pko_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pko_selx cvmx_dtx_pko_selx_t;
+
+/**
+ * cvmx_dtx_pnb#_bcst_rsp
+ */
+union cvmx_dtx_pnbx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pnbx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pnbx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbx_bcst_rsp cvmx_dtx_pnbx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pnb#_ctl
+ */
+union cvmx_dtx_pnbx_ctl {
+       u64 u64;
+       struct cvmx_dtx_pnbx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pnbx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbx_ctl cvmx_dtx_pnbx_ctl_t;
+
+/**
+ * cvmx_dtx_pnb#_dat#
+ */
+union cvmx_dtx_pnbx_datx {
+       u64 u64;
+       struct cvmx_dtx_pnbx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pnbx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbx_datx cvmx_dtx_pnbx_datx_t;
+
+/**
+ * cvmx_dtx_pnb#_ena#
+ */
+union cvmx_dtx_pnbx_enax {
+       u64 u64;
+       struct cvmx_dtx_pnbx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pnbx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbx_enax cvmx_dtx_pnbx_enax_t;
+
+/**
+ * cvmx_dtx_pnb#_sel#
+ */
+union cvmx_dtx_pnbx_selx {
+       u64 u64;
+       struct cvmx_dtx_pnbx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pnbx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbx_selx cvmx_dtx_pnbx_selx_t;
+
+/**
+ * cvmx_dtx_pnbd#_bcst_rsp
+ */
+union cvmx_dtx_pnbdx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pnbdx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pnbdx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbdx_bcst_rsp cvmx_dtx_pnbdx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pnbd#_ctl
+ */
+union cvmx_dtx_pnbdx_ctl {
+       u64 u64;
+       struct cvmx_dtx_pnbdx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pnbdx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbdx_ctl cvmx_dtx_pnbdx_ctl_t;
+
+/**
+ * cvmx_dtx_pnbd#_dat#
+ */
+union cvmx_dtx_pnbdx_datx {
+       u64 u64;
+       struct cvmx_dtx_pnbdx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pnbdx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbdx_datx cvmx_dtx_pnbdx_datx_t;
+
+/**
+ * cvmx_dtx_pnbd#_ena#
+ */
+union cvmx_dtx_pnbdx_enax {
+       u64 u64;
+       struct cvmx_dtx_pnbdx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pnbdx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbdx_enax cvmx_dtx_pnbdx_enax_t;
+
+/**
+ * cvmx_dtx_pnbd#_sel#
+ */
+union cvmx_dtx_pnbdx_selx {
+       u64 u64;
+       struct cvmx_dtx_pnbdx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pnbdx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_pnbdx_selx cvmx_dtx_pnbdx_selx_t;
+
+/**
+ * cvmx_dtx_pow_bcst_rsp
+ */
+union cvmx_dtx_pow_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_pow_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_pow_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_pow_bcst_rsp_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pow_bcst_rsp cvmx_dtx_pow_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_pow_ctl
+ */
+union cvmx_dtx_pow_ctl {
+       u64 u64;
+       struct cvmx_dtx_pow_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_pow_ctl_s cn70xx;
+       struct cvmx_dtx_pow_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pow_ctl cvmx_dtx_pow_ctl_t;
+
+/**
+ * cvmx_dtx_pow_dat#
+ */
+union cvmx_dtx_pow_datx {
+       u64 u64;
+       struct cvmx_dtx_pow_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_pow_datx_s cn70xx;
+       struct cvmx_dtx_pow_datx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pow_datx cvmx_dtx_pow_datx_t;
+
+/**
+ * cvmx_dtx_pow_ena#
+ */
+union cvmx_dtx_pow_enax {
+       u64 u64;
+       struct cvmx_dtx_pow_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_pow_enax_s cn70xx;
+       struct cvmx_dtx_pow_enax_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pow_enax cvmx_dtx_pow_enax_t;
+
+/**
+ * cvmx_dtx_pow_sel#
+ */
+union cvmx_dtx_pow_selx {
+       u64 u64;
+       struct cvmx_dtx_pow_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_pow_selx_s cn70xx;
+       struct cvmx_dtx_pow_selx_s cn70xxp1;
+};
+
+typedef union cvmx_dtx_pow_selx cvmx_dtx_pow_selx_t;
+
+/**
+ * cvmx_dtx_prch_bcst_rsp
+ */
+union cvmx_dtx_prch_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_prch_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_prch_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_prch_bcst_rsp cvmx_dtx_prch_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_prch_ctl
+ */
+union cvmx_dtx_prch_ctl {
+       u64 u64;
+       struct cvmx_dtx_prch_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_prch_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_prch_ctl cvmx_dtx_prch_ctl_t;
+
+/**
+ * cvmx_dtx_prch_dat#
+ */
+union cvmx_dtx_prch_datx {
+       u64 u64;
+       struct cvmx_dtx_prch_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_prch_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_prch_datx cvmx_dtx_prch_datx_t;
+
+/**
+ * cvmx_dtx_prch_ena#
+ */
+union cvmx_dtx_prch_enax {
+       u64 u64;
+       struct cvmx_dtx_prch_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_prch_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_prch_enax cvmx_dtx_prch_enax_t;
+
+/**
+ * cvmx_dtx_prch_sel#
+ */
+union cvmx_dtx_prch_selx {
+       u64 u64;
+       struct cvmx_dtx_prch_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_prch_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_prch_selx cvmx_dtx_prch_selx_t;
+
+/**
+ * cvmx_dtx_psm_bcst_rsp
+ */
+union cvmx_dtx_psm_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_psm_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_psm_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_psm_bcst_rsp cvmx_dtx_psm_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_psm_ctl
+ */
+union cvmx_dtx_psm_ctl {
+       u64 u64;
+       struct cvmx_dtx_psm_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_psm_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_psm_ctl cvmx_dtx_psm_ctl_t;
+
+/**
+ * cvmx_dtx_psm_dat#
+ */
+union cvmx_dtx_psm_datx {
+       u64 u64;
+       struct cvmx_dtx_psm_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_psm_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_psm_datx cvmx_dtx_psm_datx_t;
+
+/**
+ * cvmx_dtx_psm_ena#
+ */
+union cvmx_dtx_psm_enax {
+       u64 u64;
+       struct cvmx_dtx_psm_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_psm_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_psm_enax cvmx_dtx_psm_enax_t;
+
+/**
+ * cvmx_dtx_psm_sel#
+ */
+union cvmx_dtx_psm_selx {
+       u64 u64;
+       struct cvmx_dtx_psm_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_psm_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_psm_selx cvmx_dtx_psm_selx_t;
+
+/**
+ * cvmx_dtx_rad_bcst_rsp
+ */
+union cvmx_dtx_rad_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_rad_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_rad_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_rad_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_rad_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_rad_bcst_rsp cvmx_dtx_rad_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_rad_ctl
+ */
+union cvmx_dtx_rad_ctl {
+       u64 u64;
+       struct cvmx_dtx_rad_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_rad_ctl_s cn73xx;
+       struct cvmx_dtx_rad_ctl_s cn78xx;
+       struct cvmx_dtx_rad_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_rad_ctl cvmx_dtx_rad_ctl_t;
+
+/**
+ * cvmx_dtx_rad_dat#
+ */
+union cvmx_dtx_rad_datx {
+       u64 u64;
+       struct cvmx_dtx_rad_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_rad_datx_s cn73xx;
+       struct cvmx_dtx_rad_datx_s cn78xx;
+       struct cvmx_dtx_rad_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_rad_datx cvmx_dtx_rad_datx_t;
+
+/**
+ * cvmx_dtx_rad_ena#
+ */
+union cvmx_dtx_rad_enax {
+       u64 u64;
+       struct cvmx_dtx_rad_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_rad_enax_s cn73xx;
+       struct cvmx_dtx_rad_enax_s cn78xx;
+       struct cvmx_dtx_rad_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_rad_enax cvmx_dtx_rad_enax_t;
+
+/**
+ * cvmx_dtx_rad_sel#
+ */
+union cvmx_dtx_rad_selx {
+       u64 u64;
+       struct cvmx_dtx_rad_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_rad_selx_s cn73xx;
+       struct cvmx_dtx_rad_selx_s cn78xx;
+       struct cvmx_dtx_rad_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_rad_selx cvmx_dtx_rad_selx_t;
+
+/**
+ * cvmx_dtx_rdec_bcst_rsp
+ */
+union cvmx_dtx_rdec_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_rdec_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_rdec_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rdec_bcst_rsp cvmx_dtx_rdec_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_rdec_ctl
+ */
+union cvmx_dtx_rdec_ctl {
+       u64 u64;
+       struct cvmx_dtx_rdec_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_rdec_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rdec_ctl cvmx_dtx_rdec_ctl_t;
+
+/**
+ * cvmx_dtx_rdec_dat#
+ */
+union cvmx_dtx_rdec_datx {
+       u64 u64;
+       struct cvmx_dtx_rdec_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_rdec_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rdec_datx cvmx_dtx_rdec_datx_t;
+
+/**
+ * cvmx_dtx_rdec_ena#
+ */
+union cvmx_dtx_rdec_enax {
+       u64 u64;
+       struct cvmx_dtx_rdec_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_rdec_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rdec_enax cvmx_dtx_rdec_enax_t;
+
+/**
+ * cvmx_dtx_rdec_sel#
+ */
+union cvmx_dtx_rdec_selx {
+       u64 u64;
+       struct cvmx_dtx_rdec_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_rdec_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rdec_selx cvmx_dtx_rdec_selx_t;
+
+/**
+ * cvmx_dtx_rfif_bcst_rsp
+ */
+union cvmx_dtx_rfif_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_rfif_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_rfif_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rfif_bcst_rsp cvmx_dtx_rfif_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_rfif_ctl
+ */
+union cvmx_dtx_rfif_ctl {
+       u64 u64;
+       struct cvmx_dtx_rfif_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_rfif_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rfif_ctl cvmx_dtx_rfif_ctl_t;
+
+/**
+ * cvmx_dtx_rfif_dat#
+ */
+union cvmx_dtx_rfif_datx {
+       u64 u64;
+       struct cvmx_dtx_rfif_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_rfif_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rfif_datx cvmx_dtx_rfif_datx_t;
+
+/**
+ * cvmx_dtx_rfif_ena#
+ */
+union cvmx_dtx_rfif_enax {
+       u64 u64;
+       struct cvmx_dtx_rfif_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_rfif_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rfif_enax cvmx_dtx_rfif_enax_t;
+
+/**
+ * cvmx_dtx_rfif_sel#
+ */
+union cvmx_dtx_rfif_selx {
+       u64 u64;
+       struct cvmx_dtx_rfif_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_rfif_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rfif_selx cvmx_dtx_rfif_selx_t;
+
+/**
+ * cvmx_dtx_rmap_bcst_rsp
+ */
+union cvmx_dtx_rmap_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_rmap_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_rmap_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rmap_bcst_rsp cvmx_dtx_rmap_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_rmap_ctl
+ */
+union cvmx_dtx_rmap_ctl {
+       u64 u64;
+       struct cvmx_dtx_rmap_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_rmap_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rmap_ctl cvmx_dtx_rmap_ctl_t;
+
+/**
+ * cvmx_dtx_rmap_dat#
+ */
+union cvmx_dtx_rmap_datx {
+       u64 u64;
+       struct cvmx_dtx_rmap_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_rmap_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rmap_datx cvmx_dtx_rmap_datx_t;
+
+/**
+ * cvmx_dtx_rmap_ena#
+ */
+union cvmx_dtx_rmap_enax {
+       u64 u64;
+       struct cvmx_dtx_rmap_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_rmap_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rmap_enax cvmx_dtx_rmap_enax_t;
+
+/**
+ * cvmx_dtx_rmap_sel#
+ */
+union cvmx_dtx_rmap_selx {
+       u64 u64;
+       struct cvmx_dtx_rmap_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_rmap_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rmap_selx cvmx_dtx_rmap_selx_t;
+
+/**
+ * cvmx_dtx_rnm_bcst_rsp
+ */
+union cvmx_dtx_rnm_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_rnm_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_rnm_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_rnm_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_rnm_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_rnm_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rnm_bcst_rsp cvmx_dtx_rnm_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_rnm_ctl
+ */
+union cvmx_dtx_rnm_ctl {
+       u64 u64;
+       struct cvmx_dtx_rnm_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_rnm_ctl_s cn73xx;
+       struct cvmx_dtx_rnm_ctl_s cn78xx;
+       struct cvmx_dtx_rnm_ctl_s cn78xxp1;
+       struct cvmx_dtx_rnm_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rnm_ctl cvmx_dtx_rnm_ctl_t;
+
+/**
+ * cvmx_dtx_rnm_dat#
+ */
+union cvmx_dtx_rnm_datx {
+       u64 u64;
+       struct cvmx_dtx_rnm_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_rnm_datx_s cn73xx;
+       struct cvmx_dtx_rnm_datx_s cn78xx;
+       struct cvmx_dtx_rnm_datx_s cn78xxp1;
+       struct cvmx_dtx_rnm_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rnm_datx cvmx_dtx_rnm_datx_t;
+
+/**
+ * cvmx_dtx_rnm_ena#
+ */
+union cvmx_dtx_rnm_enax {
+       u64 u64;
+       struct cvmx_dtx_rnm_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_rnm_enax_s cn73xx;
+       struct cvmx_dtx_rnm_enax_s cn78xx;
+       struct cvmx_dtx_rnm_enax_s cn78xxp1;
+       struct cvmx_dtx_rnm_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rnm_enax cvmx_dtx_rnm_enax_t;
+
+/**
+ * cvmx_dtx_rnm_sel#
+ */
+union cvmx_dtx_rnm_selx {
+       u64 u64;
+       struct cvmx_dtx_rnm_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_rnm_selx_s cn73xx;
+       struct cvmx_dtx_rnm_selx_s cn78xx;
+       struct cvmx_dtx_rnm_selx_s cn78xxp1;
+       struct cvmx_dtx_rnm_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rnm_selx cvmx_dtx_rnm_selx_t;
+
+/**
+ * cvmx_dtx_rst_bcst_rsp
+ */
+union cvmx_dtx_rst_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_rst_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_rst_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_rst_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_rst_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_rst_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_rst_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_rst_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rst_bcst_rsp cvmx_dtx_rst_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_rst_ctl
+ */
+union cvmx_dtx_rst_ctl {
+       u64 u64;
+       struct cvmx_dtx_rst_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_rst_ctl_s cn70xx;
+       struct cvmx_dtx_rst_ctl_s cn70xxp1;
+       struct cvmx_dtx_rst_ctl_s cn73xx;
+       struct cvmx_dtx_rst_ctl_s cn78xx;
+       struct cvmx_dtx_rst_ctl_s cn78xxp1;
+       struct cvmx_dtx_rst_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rst_ctl cvmx_dtx_rst_ctl_t;
+
+/**
+ * cvmx_dtx_rst_dat#
+ */
+union cvmx_dtx_rst_datx {
+       u64 u64;
+       struct cvmx_dtx_rst_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_rst_datx_s cn70xx;
+       struct cvmx_dtx_rst_datx_s cn70xxp1;
+       struct cvmx_dtx_rst_datx_s cn73xx;
+       struct cvmx_dtx_rst_datx_s cn78xx;
+       struct cvmx_dtx_rst_datx_s cn78xxp1;
+       struct cvmx_dtx_rst_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rst_datx cvmx_dtx_rst_datx_t;
+
+/**
+ * cvmx_dtx_rst_ena#
+ */
+union cvmx_dtx_rst_enax {
+       u64 u64;
+       struct cvmx_dtx_rst_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_rst_enax_s cn70xx;
+       struct cvmx_dtx_rst_enax_s cn70xxp1;
+       struct cvmx_dtx_rst_enax_s cn73xx;
+       struct cvmx_dtx_rst_enax_s cn78xx;
+       struct cvmx_dtx_rst_enax_s cn78xxp1;
+       struct cvmx_dtx_rst_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rst_enax cvmx_dtx_rst_enax_t;
+
+/**
+ * cvmx_dtx_rst_sel#
+ */
+union cvmx_dtx_rst_selx {
+       u64 u64;
+       struct cvmx_dtx_rst_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_rst_selx_s cn70xx;
+       struct cvmx_dtx_rst_selx_s cn70xxp1;
+       struct cvmx_dtx_rst_selx_s cn73xx;
+       struct cvmx_dtx_rst_selx_s cn78xx;
+       struct cvmx_dtx_rst_selx_s cn78xxp1;
+       struct cvmx_dtx_rst_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_rst_selx cvmx_dtx_rst_selx_t;
+
+/**
+ * cvmx_dtx_sata_bcst_rsp
+ */
+union cvmx_dtx_sata_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_sata_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_sata_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_sata_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_sata_bcst_rsp_s cn73xx;
+};
+
+typedef union cvmx_dtx_sata_bcst_rsp cvmx_dtx_sata_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_sata_ctl
+ */
+union cvmx_dtx_sata_ctl {
+       u64 u64;
+       struct cvmx_dtx_sata_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_sata_ctl_s cn70xx;
+       struct cvmx_dtx_sata_ctl_s cn70xxp1;
+       struct cvmx_dtx_sata_ctl_s cn73xx;
+};
+
+typedef union cvmx_dtx_sata_ctl cvmx_dtx_sata_ctl_t;
+
+/**
+ * cvmx_dtx_sata_dat#
+ */
+union cvmx_dtx_sata_datx {
+       u64 u64;
+       struct cvmx_dtx_sata_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_sata_datx_s cn70xx;
+       struct cvmx_dtx_sata_datx_s cn70xxp1;
+       struct cvmx_dtx_sata_datx_s cn73xx;
+};
+
+typedef union cvmx_dtx_sata_datx cvmx_dtx_sata_datx_t;
+
+/**
+ * cvmx_dtx_sata_ena#
+ */
+union cvmx_dtx_sata_enax {
+       u64 u64;
+       struct cvmx_dtx_sata_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_sata_enax_s cn70xx;
+       struct cvmx_dtx_sata_enax_s cn70xxp1;
+       struct cvmx_dtx_sata_enax_s cn73xx;
+};
+
+typedef union cvmx_dtx_sata_enax cvmx_dtx_sata_enax_t;
+
+/**
+ * cvmx_dtx_sata_sel#
+ */
+union cvmx_dtx_sata_selx {
+       u64 u64;
+       struct cvmx_dtx_sata_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_sata_selx_s cn70xx;
+       struct cvmx_dtx_sata_selx_s cn70xxp1;
+       struct cvmx_dtx_sata_selx_s cn73xx;
+};
+
+typedef union cvmx_dtx_sata_selx cvmx_dtx_sata_selx_t;
+
+/**
+ * cvmx_dtx_sli_bcst_rsp
+ */
+union cvmx_dtx_sli_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_sli_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_sli_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_sli_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_sli_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_sli_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_sli_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_sli_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sli_bcst_rsp cvmx_dtx_sli_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_sli_ctl
+ */
+union cvmx_dtx_sli_ctl {
+       u64 u64;
+       struct cvmx_dtx_sli_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_sli_ctl_s cn70xx;
+       struct cvmx_dtx_sli_ctl_s cn70xxp1;
+       struct cvmx_dtx_sli_ctl_s cn73xx;
+       struct cvmx_dtx_sli_ctl_s cn78xx;
+       struct cvmx_dtx_sli_ctl_s cn78xxp1;
+       struct cvmx_dtx_sli_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sli_ctl cvmx_dtx_sli_ctl_t;
+
+/**
+ * cvmx_dtx_sli_dat#
+ */
+union cvmx_dtx_sli_datx {
+       u64 u64;
+       struct cvmx_dtx_sli_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_sli_datx_s cn70xx;
+       struct cvmx_dtx_sli_datx_s cn70xxp1;
+       struct cvmx_dtx_sli_datx_s cn73xx;
+       struct cvmx_dtx_sli_datx_s cn78xx;
+       struct cvmx_dtx_sli_datx_s cn78xxp1;
+       struct cvmx_dtx_sli_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sli_datx cvmx_dtx_sli_datx_t;
+
+/**
+ * cvmx_dtx_sli_ena#
+ */
+union cvmx_dtx_sli_enax {
+       u64 u64;
+       struct cvmx_dtx_sli_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_sli_enax_s cn70xx;
+       struct cvmx_dtx_sli_enax_s cn70xxp1;
+       struct cvmx_dtx_sli_enax_s cn73xx;
+       struct cvmx_dtx_sli_enax_s cn78xx;
+       struct cvmx_dtx_sli_enax_s cn78xxp1;
+       struct cvmx_dtx_sli_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sli_enax cvmx_dtx_sli_enax_t;
+
+/**
+ * cvmx_dtx_sli_sel#
+ */
+union cvmx_dtx_sli_selx {
+       u64 u64;
+       struct cvmx_dtx_sli_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_sli_selx_s cn70xx;
+       struct cvmx_dtx_sli_selx_s cn70xxp1;
+       struct cvmx_dtx_sli_selx_s cn73xx;
+       struct cvmx_dtx_sli_selx_s cn78xx;
+       struct cvmx_dtx_sli_selx_s cn78xxp1;
+       struct cvmx_dtx_sli_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sli_selx cvmx_dtx_sli_selx_t;
+
+/**
+ * cvmx_dtx_spem_bcst_rsp
+ */
+union cvmx_dtx_spem_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_spem_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_spem_bcst_rsp_s cn73xx;
+};
+
+typedef union cvmx_dtx_spem_bcst_rsp cvmx_dtx_spem_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_spem_ctl
+ */
+union cvmx_dtx_spem_ctl {
+       u64 u64;
+       struct cvmx_dtx_spem_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_spem_ctl_s cn73xx;
+};
+
+typedef union cvmx_dtx_spem_ctl cvmx_dtx_spem_ctl_t;
+
+/**
+ * cvmx_dtx_spem_dat#
+ */
+union cvmx_dtx_spem_datx {
+       u64 u64;
+       struct cvmx_dtx_spem_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_spem_datx_s cn73xx;
+};
+
+typedef union cvmx_dtx_spem_datx cvmx_dtx_spem_datx_t;
+
+/**
+ * cvmx_dtx_spem_ena#
+ */
+union cvmx_dtx_spem_enax {
+       u64 u64;
+       struct cvmx_dtx_spem_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_spem_enax_s cn73xx;
+};
+
+typedef union cvmx_dtx_spem_enax cvmx_dtx_spem_enax_t;
+
+/**
+ * cvmx_dtx_spem_sel#
+ */
+union cvmx_dtx_spem_selx {
+       u64 u64;
+       struct cvmx_dtx_spem_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_spem_selx_s cn73xx;
+};
+
+typedef union cvmx_dtx_spem_selx cvmx_dtx_spem_selx_t;
+
+/**
+ * cvmx_dtx_srio#_bcst_rsp
+ */
+union cvmx_dtx_sriox_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_sriox_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_sriox_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sriox_bcst_rsp cvmx_dtx_sriox_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_srio#_ctl
+ */
+union cvmx_dtx_sriox_ctl {
+       u64 u64;
+       struct cvmx_dtx_sriox_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_sriox_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sriox_ctl cvmx_dtx_sriox_ctl_t;
+
+/**
+ * cvmx_dtx_srio#_dat#
+ */
+union cvmx_dtx_sriox_datx {
+       u64 u64;
+       struct cvmx_dtx_sriox_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_sriox_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sriox_datx cvmx_dtx_sriox_datx_t;
+
+/**
+ * cvmx_dtx_srio#_ena#
+ */
+union cvmx_dtx_sriox_enax {
+       u64 u64;
+       struct cvmx_dtx_sriox_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_sriox_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sriox_enax cvmx_dtx_sriox_enax_t;
+
+/**
+ * cvmx_dtx_srio#_sel#
+ */
+union cvmx_dtx_sriox_selx {
+       u64 u64;
+       struct cvmx_dtx_sriox_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_sriox_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sriox_selx cvmx_dtx_sriox_selx_t;
+
+/**
+ * cvmx_dtx_sso_bcst_rsp
+ */
+union cvmx_dtx_sso_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_sso_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_sso_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_sso_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_sso_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_sso_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sso_bcst_rsp cvmx_dtx_sso_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_sso_ctl
+ */
+union cvmx_dtx_sso_ctl {
+       u64 u64;
+       struct cvmx_dtx_sso_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_sso_ctl_s cn73xx;
+       struct cvmx_dtx_sso_ctl_s cn78xx;
+       struct cvmx_dtx_sso_ctl_s cn78xxp1;
+       struct cvmx_dtx_sso_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sso_ctl cvmx_dtx_sso_ctl_t;
+
+/**
+ * cvmx_dtx_sso_dat#
+ */
+union cvmx_dtx_sso_datx {
+       u64 u64;
+       struct cvmx_dtx_sso_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_sso_datx_s cn73xx;
+       struct cvmx_dtx_sso_datx_s cn78xx;
+       struct cvmx_dtx_sso_datx_s cn78xxp1;
+       struct cvmx_dtx_sso_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sso_datx cvmx_dtx_sso_datx_t;
+
+/**
+ * cvmx_dtx_sso_ena#
+ */
+union cvmx_dtx_sso_enax {
+       u64 u64;
+       struct cvmx_dtx_sso_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_sso_enax_s cn73xx;
+       struct cvmx_dtx_sso_enax_s cn78xx;
+       struct cvmx_dtx_sso_enax_s cn78xxp1;
+       struct cvmx_dtx_sso_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sso_enax cvmx_dtx_sso_enax_t;
+
+/**
+ * cvmx_dtx_sso_sel#
+ */
+union cvmx_dtx_sso_selx {
+       u64 u64;
+       struct cvmx_dtx_sso_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_sso_selx_s cn73xx;
+       struct cvmx_dtx_sso_selx_s cn78xx;
+       struct cvmx_dtx_sso_selx_s cn78xxp1;
+       struct cvmx_dtx_sso_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_sso_selx cvmx_dtx_sso_selx_t;
+
+/**
+ * cvmx_dtx_tdec_bcst_rsp
+ */
+union cvmx_dtx_tdec_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_tdec_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_tdec_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tdec_bcst_rsp cvmx_dtx_tdec_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_tdec_ctl
+ */
+union cvmx_dtx_tdec_ctl {
+       u64 u64;
+       struct cvmx_dtx_tdec_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_tdec_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tdec_ctl cvmx_dtx_tdec_ctl_t;
+
+/**
+ * cvmx_dtx_tdec_dat#
+ */
+union cvmx_dtx_tdec_datx {
+       u64 u64;
+       struct cvmx_dtx_tdec_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_tdec_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tdec_datx cvmx_dtx_tdec_datx_t;
+
+/**
+ * cvmx_dtx_tdec_ena#
+ */
+union cvmx_dtx_tdec_enax {
+       u64 u64;
+       struct cvmx_dtx_tdec_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_tdec_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tdec_enax cvmx_dtx_tdec_enax_t;
+
+/**
+ * cvmx_dtx_tdec_sel#
+ */
+union cvmx_dtx_tdec_selx {
+       u64 u64;
+       struct cvmx_dtx_tdec_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_tdec_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tdec_selx cvmx_dtx_tdec_selx_t;
+
+/**
+ * cvmx_dtx_tim_bcst_rsp
+ */
+union cvmx_dtx_tim_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_tim_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_tim_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_tim_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_tim_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_tim_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_tim_bcst_rsp_s cn78xxp1;
+       struct cvmx_dtx_tim_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tim_bcst_rsp cvmx_dtx_tim_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_tim_ctl
+ */
+union cvmx_dtx_tim_ctl {
+       u64 u64;
+       struct cvmx_dtx_tim_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_tim_ctl_s cn70xx;
+       struct cvmx_dtx_tim_ctl_s cn70xxp1;
+       struct cvmx_dtx_tim_ctl_s cn73xx;
+       struct cvmx_dtx_tim_ctl_s cn78xx;
+       struct cvmx_dtx_tim_ctl_s cn78xxp1;
+       struct cvmx_dtx_tim_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tim_ctl cvmx_dtx_tim_ctl_t;
+
+/**
+ * cvmx_dtx_tim_dat#
+ */
+union cvmx_dtx_tim_datx {
+       u64 u64;
+       struct cvmx_dtx_tim_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_tim_datx_s cn70xx;
+       struct cvmx_dtx_tim_datx_s cn70xxp1;
+       struct cvmx_dtx_tim_datx_s cn73xx;
+       struct cvmx_dtx_tim_datx_s cn78xx;
+       struct cvmx_dtx_tim_datx_s cn78xxp1;
+       struct cvmx_dtx_tim_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tim_datx cvmx_dtx_tim_datx_t;
+
+/**
+ * cvmx_dtx_tim_ena#
+ */
+union cvmx_dtx_tim_enax {
+       u64 u64;
+       struct cvmx_dtx_tim_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_tim_enax_s cn70xx;
+       struct cvmx_dtx_tim_enax_s cn70xxp1;
+       struct cvmx_dtx_tim_enax_s cn73xx;
+       struct cvmx_dtx_tim_enax_s cn78xx;
+       struct cvmx_dtx_tim_enax_s cn78xxp1;
+       struct cvmx_dtx_tim_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tim_enax cvmx_dtx_tim_enax_t;
+
+/**
+ * cvmx_dtx_tim_sel#
+ */
+union cvmx_dtx_tim_selx {
+       u64 u64;
+       struct cvmx_dtx_tim_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_tim_selx_s cn70xx;
+       struct cvmx_dtx_tim_selx_s cn70xxp1;
+       struct cvmx_dtx_tim_selx_s cn73xx;
+       struct cvmx_dtx_tim_selx_s cn78xx;
+       struct cvmx_dtx_tim_selx_s cn78xxp1;
+       struct cvmx_dtx_tim_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_tim_selx cvmx_dtx_tim_selx_t;
+
+/**
+ * cvmx_dtx_ulfe_bcst_rsp
+ */
+union cvmx_dtx_ulfe_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_ulfe_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_ulfe_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ulfe_bcst_rsp cvmx_dtx_ulfe_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_ulfe_ctl
+ */
+union cvmx_dtx_ulfe_ctl {
+       u64 u64;
+       struct cvmx_dtx_ulfe_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_ulfe_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ulfe_ctl cvmx_dtx_ulfe_ctl_t;
+
+/**
+ * cvmx_dtx_ulfe_dat#
+ */
+union cvmx_dtx_ulfe_datx {
+       u64 u64;
+       struct cvmx_dtx_ulfe_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_ulfe_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ulfe_datx cvmx_dtx_ulfe_datx_t;
+
+/**
+ * cvmx_dtx_ulfe_ena#
+ */
+union cvmx_dtx_ulfe_enax {
+       u64 u64;
+       struct cvmx_dtx_ulfe_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_ulfe_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ulfe_enax cvmx_dtx_ulfe_enax_t;
+
+/**
+ * cvmx_dtx_ulfe_sel#
+ */
+union cvmx_dtx_ulfe_selx {
+       u64 u64;
+       struct cvmx_dtx_ulfe_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_ulfe_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_ulfe_selx cvmx_dtx_ulfe_selx_t;
+
+/**
+ * cvmx_dtx_usbdrd#_bcst_rsp
+ */
+union cvmx_dtx_usbdrdx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_usbdrdx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_usbdrdx_bcst_rsp_s cn70xx;
+       struct cvmx_dtx_usbdrdx_bcst_rsp_s cn70xxp1;
+       struct cvmx_dtx_usbdrdx_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_usbdrdx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_usbdrdx_bcst_rsp cvmx_dtx_usbdrdx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_usbdrd#_ctl
+ */
+union cvmx_dtx_usbdrdx_ctl {
+       u64 u64;
+       struct cvmx_dtx_usbdrdx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_usbdrdx_ctl_s cn70xx;
+       struct cvmx_dtx_usbdrdx_ctl_s cn70xxp1;
+       struct cvmx_dtx_usbdrdx_ctl_s cn73xx;
+       struct cvmx_dtx_usbdrdx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_usbdrdx_ctl cvmx_dtx_usbdrdx_ctl_t;
+
+/**
+ * cvmx_dtx_usbdrd#_dat#
+ */
+union cvmx_dtx_usbdrdx_datx {
+       u64 u64;
+       struct cvmx_dtx_usbdrdx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_usbdrdx_datx_s cn70xx;
+       struct cvmx_dtx_usbdrdx_datx_s cn70xxp1;
+       struct cvmx_dtx_usbdrdx_datx_s cn73xx;
+       struct cvmx_dtx_usbdrdx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_usbdrdx_datx cvmx_dtx_usbdrdx_datx_t;
+
+/**
+ * cvmx_dtx_usbdrd#_ena#
+ */
+union cvmx_dtx_usbdrdx_enax {
+       u64 u64;
+       struct cvmx_dtx_usbdrdx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_usbdrdx_enax_s cn70xx;
+       struct cvmx_dtx_usbdrdx_enax_s cn70xxp1;
+       struct cvmx_dtx_usbdrdx_enax_s cn73xx;
+       struct cvmx_dtx_usbdrdx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_usbdrdx_enax cvmx_dtx_usbdrdx_enax_t;
+
+/**
+ * cvmx_dtx_usbdrd#_sel#
+ */
+union cvmx_dtx_usbdrdx_selx {
+       u64 u64;
+       struct cvmx_dtx_usbdrdx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_usbdrdx_selx_s cn70xx;
+       struct cvmx_dtx_usbdrdx_selx_s cn70xxp1;
+       struct cvmx_dtx_usbdrdx_selx_s cn73xx;
+       struct cvmx_dtx_usbdrdx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_usbdrdx_selx cvmx_dtx_usbdrdx_selx_t;
+
+/**
+ * cvmx_dtx_usbh#_bcst_rsp
+ */
+union cvmx_dtx_usbhx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_usbhx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_usbhx_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_usbhx_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_usbhx_bcst_rsp cvmx_dtx_usbhx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_usbh#_ctl
+ */
+union cvmx_dtx_usbhx_ctl {
+       u64 u64;
+       struct cvmx_dtx_usbhx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_usbhx_ctl_s cn78xx;
+       struct cvmx_dtx_usbhx_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_usbhx_ctl cvmx_dtx_usbhx_ctl_t;
+
+/**
+ * cvmx_dtx_usbh#_dat#
+ */
+union cvmx_dtx_usbhx_datx {
+       u64 u64;
+       struct cvmx_dtx_usbhx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_usbhx_datx_s cn78xx;
+       struct cvmx_dtx_usbhx_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_usbhx_datx cvmx_dtx_usbhx_datx_t;
+
+/**
+ * cvmx_dtx_usbh#_ena#
+ */
+union cvmx_dtx_usbhx_enax {
+       u64 u64;
+       struct cvmx_dtx_usbhx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_usbhx_enax_s cn78xx;
+       struct cvmx_dtx_usbhx_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_usbhx_enax cvmx_dtx_usbhx_enax_t;
+
+/**
+ * cvmx_dtx_usbh#_sel#
+ */
+union cvmx_dtx_usbhx_selx {
+       u64 u64;
+       struct cvmx_dtx_usbhx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_usbhx_selx_s cn78xx;
+       struct cvmx_dtx_usbhx_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_usbhx_selx cvmx_dtx_usbhx_selx_t;
+
+/**
+ * cvmx_dtx_vdec_bcst_rsp
+ */
+union cvmx_dtx_vdec_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_vdec_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_vdec_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_vdec_bcst_rsp cvmx_dtx_vdec_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_vdec_ctl
+ */
+union cvmx_dtx_vdec_ctl {
+       u64 u64;
+       struct cvmx_dtx_vdec_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_vdec_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_vdec_ctl cvmx_dtx_vdec_ctl_t;
+
+/**
+ * cvmx_dtx_vdec_dat#
+ */
+union cvmx_dtx_vdec_datx {
+       u64 u64;
+       struct cvmx_dtx_vdec_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_vdec_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_vdec_datx cvmx_dtx_vdec_datx_t;
+
+/**
+ * cvmx_dtx_vdec_ena#
+ */
+union cvmx_dtx_vdec_enax {
+       u64 u64;
+       struct cvmx_dtx_vdec_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_vdec_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_vdec_enax cvmx_dtx_vdec_enax_t;
+
+/**
+ * cvmx_dtx_vdec_sel#
+ */
+union cvmx_dtx_vdec_selx {
+       u64 u64;
+       struct cvmx_dtx_vdec_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_vdec_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_vdec_selx cvmx_dtx_vdec_selx_t;
+
+/**
+ * cvmx_dtx_wpse_bcst_rsp
+ */
+union cvmx_dtx_wpse_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_wpse_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_wpse_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wpse_bcst_rsp cvmx_dtx_wpse_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_wpse_ctl
+ */
+union cvmx_dtx_wpse_ctl {
+       u64 u64;
+       struct cvmx_dtx_wpse_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_wpse_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wpse_ctl cvmx_dtx_wpse_ctl_t;
+
+/**
+ * cvmx_dtx_wpse_dat#
+ */
+union cvmx_dtx_wpse_datx {
+       u64 u64;
+       struct cvmx_dtx_wpse_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_wpse_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wpse_datx cvmx_dtx_wpse_datx_t;
+
+/**
+ * cvmx_dtx_wpse_ena#
+ */
+union cvmx_dtx_wpse_enax {
+       u64 u64;
+       struct cvmx_dtx_wpse_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_wpse_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wpse_enax cvmx_dtx_wpse_enax_t;
+
+/**
+ * cvmx_dtx_wpse_sel#
+ */
+union cvmx_dtx_wpse_selx {
+       u64 u64;
+       struct cvmx_dtx_wpse_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_wpse_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wpse_selx cvmx_dtx_wpse_selx_t;
+
+/**
+ * cvmx_dtx_wrce_bcst_rsp
+ */
+union cvmx_dtx_wrce_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_wrce_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_wrce_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrce_bcst_rsp cvmx_dtx_wrce_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_wrce_ctl
+ */
+union cvmx_dtx_wrce_ctl {
+       u64 u64;
+       struct cvmx_dtx_wrce_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_wrce_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrce_ctl cvmx_dtx_wrce_ctl_t;
+
+/**
+ * cvmx_dtx_wrce_dat#
+ */
+union cvmx_dtx_wrce_datx {
+       u64 u64;
+       struct cvmx_dtx_wrce_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_wrce_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrce_datx cvmx_dtx_wrce_datx_t;
+
+/**
+ * cvmx_dtx_wrce_ena#
+ */
+union cvmx_dtx_wrce_enax {
+       u64 u64;
+       struct cvmx_dtx_wrce_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_wrce_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrce_enax cvmx_dtx_wrce_enax_t;
+
+/**
+ * cvmx_dtx_wrce_sel#
+ */
+union cvmx_dtx_wrce_selx {
+       u64 u64;
+       struct cvmx_dtx_wrce_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_wrce_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrce_selx cvmx_dtx_wrce_selx_t;
+
+/**
+ * cvmx_dtx_wrde_bcst_rsp
+ */
+union cvmx_dtx_wrde_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_wrde_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_wrde_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrde_bcst_rsp cvmx_dtx_wrde_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_wrde_ctl
+ */
+union cvmx_dtx_wrde_ctl {
+       u64 u64;
+       struct cvmx_dtx_wrde_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_wrde_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrde_ctl cvmx_dtx_wrde_ctl_t;
+
+/**
+ * cvmx_dtx_wrde_dat#
+ */
+union cvmx_dtx_wrde_datx {
+       u64 u64;
+       struct cvmx_dtx_wrde_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_wrde_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrde_datx cvmx_dtx_wrde_datx_t;
+
+/**
+ * cvmx_dtx_wrde_ena#
+ */
+union cvmx_dtx_wrde_enax {
+       u64 u64;
+       struct cvmx_dtx_wrde_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_wrde_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrde_enax cvmx_dtx_wrde_enax_t;
+
+/**
+ * cvmx_dtx_wrde_sel#
+ */
+union cvmx_dtx_wrde_selx {
+       u64 u64;
+       struct cvmx_dtx_wrde_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_wrde_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrde_selx cvmx_dtx_wrde_selx_t;
+
+/**
+ * cvmx_dtx_wrse_bcst_rsp
+ */
+union cvmx_dtx_wrse_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_wrse_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_wrse_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrse_bcst_rsp cvmx_dtx_wrse_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_wrse_ctl
+ */
+union cvmx_dtx_wrse_ctl {
+       u64 u64;
+       struct cvmx_dtx_wrse_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_wrse_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrse_ctl cvmx_dtx_wrse_ctl_t;
+
+/**
+ * cvmx_dtx_wrse_dat#
+ */
+union cvmx_dtx_wrse_datx {
+       u64 u64;
+       struct cvmx_dtx_wrse_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_wrse_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrse_datx cvmx_dtx_wrse_datx_t;
+
+/**
+ * cvmx_dtx_wrse_ena#
+ */
+union cvmx_dtx_wrse_enax {
+       u64 u64;
+       struct cvmx_dtx_wrse_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_wrse_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrse_enax cvmx_dtx_wrse_enax_t;
+
+/**
+ * cvmx_dtx_wrse_sel#
+ */
+union cvmx_dtx_wrse_selx {
+       u64 u64;
+       struct cvmx_dtx_wrse_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_wrse_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wrse_selx cvmx_dtx_wrse_selx_t;
+
+/**
+ * cvmx_dtx_wtxe_bcst_rsp
+ */
+union cvmx_dtx_wtxe_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_wtxe_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_wtxe_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wtxe_bcst_rsp cvmx_dtx_wtxe_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_wtxe_ctl
+ */
+union cvmx_dtx_wtxe_ctl {
+       u64 u64;
+       struct cvmx_dtx_wtxe_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_wtxe_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wtxe_ctl cvmx_dtx_wtxe_ctl_t;
+
+/**
+ * cvmx_dtx_wtxe_dat#
+ */
+union cvmx_dtx_wtxe_datx {
+       u64 u64;
+       struct cvmx_dtx_wtxe_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_wtxe_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wtxe_datx cvmx_dtx_wtxe_datx_t;
+
+/**
+ * cvmx_dtx_wtxe_ena#
+ */
+union cvmx_dtx_wtxe_enax {
+       u64 u64;
+       struct cvmx_dtx_wtxe_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_wtxe_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wtxe_enax cvmx_dtx_wtxe_enax_t;
+
+/**
+ * cvmx_dtx_wtxe_sel#
+ */
+union cvmx_dtx_wtxe_selx {
+       u64 u64;
+       struct cvmx_dtx_wtxe_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_wtxe_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_wtxe_selx cvmx_dtx_wtxe_selx_t;
+
+/**
+ * cvmx_dtx_xcv_bcst_rsp
+ */
+union cvmx_dtx_xcv_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_xcv_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_xcv_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_xcv_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xcv_bcst_rsp cvmx_dtx_xcv_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_xcv_ctl
+ */
+union cvmx_dtx_xcv_ctl {
+       u64 u64;
+       struct cvmx_dtx_xcv_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_xcv_ctl_s cn73xx;
+       struct cvmx_dtx_xcv_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xcv_ctl cvmx_dtx_xcv_ctl_t;
+
+/**
+ * cvmx_dtx_xcv_dat#
+ */
+union cvmx_dtx_xcv_datx {
+       u64 u64;
+       struct cvmx_dtx_xcv_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_xcv_datx_s cn73xx;
+       struct cvmx_dtx_xcv_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xcv_datx cvmx_dtx_xcv_datx_t;
+
+/**
+ * cvmx_dtx_xcv_ena#
+ */
+union cvmx_dtx_xcv_enax {
+       u64 u64;
+       struct cvmx_dtx_xcv_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_xcv_enax_s cn73xx;
+       struct cvmx_dtx_xcv_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xcv_enax cvmx_dtx_xcv_enax_t;
+
+/**
+ * cvmx_dtx_xcv_sel#
+ */
+union cvmx_dtx_xcv_selx {
+       u64 u64;
+       struct cvmx_dtx_xcv_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_xcv_selx_s cn73xx;
+       struct cvmx_dtx_xcv_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xcv_selx cvmx_dtx_xcv_selx_t;
+
+/**
+ * cvmx_dtx_xsx_bcst_rsp
+ */
+union cvmx_dtx_xsx_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_xsx_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_xsx_bcst_rsp_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xsx_bcst_rsp cvmx_dtx_xsx_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_xsx_ctl
+ */
+union cvmx_dtx_xsx_ctl {
+       u64 u64;
+       struct cvmx_dtx_xsx_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_xsx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xsx_ctl cvmx_dtx_xsx_ctl_t;
+
+/**
+ * cvmx_dtx_xsx_dat#
+ */
+union cvmx_dtx_xsx_datx {
+       u64 u64;
+       struct cvmx_dtx_xsx_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_xsx_datx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xsx_datx cvmx_dtx_xsx_datx_t;
+
+/**
+ * cvmx_dtx_xsx_ena#
+ */
+union cvmx_dtx_xsx_enax {
+       u64 u64;
+       struct cvmx_dtx_xsx_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_xsx_enax_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xsx_enax cvmx_dtx_xsx_enax_t;
+
+/**
+ * cvmx_dtx_xsx_sel#
+ */
+union cvmx_dtx_xsx_selx {
+       u64 u64;
+       struct cvmx_dtx_xsx_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_xsx_selx_s cnf75xx;
+};
+
+typedef union cvmx_dtx_xsx_selx cvmx_dtx_xsx_selx_t;
+
+/**
+ * cvmx_dtx_zip_bcst_rsp
+ */
+union cvmx_dtx_zip_bcst_rsp {
+       u64 u64;
+       struct cvmx_dtx_zip_bcst_rsp_s {
+               u64 reserved_1_63 : 63;
+               u64 ena : 1;
+       } s;
+       struct cvmx_dtx_zip_bcst_rsp_s cn73xx;
+       struct cvmx_dtx_zip_bcst_rsp_s cn78xx;
+       struct cvmx_dtx_zip_bcst_rsp_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_zip_bcst_rsp cvmx_dtx_zip_bcst_rsp_t;
+
+/**
+ * cvmx_dtx_zip_ctl
+ */
+union cvmx_dtx_zip_ctl {
+       u64 u64;
+       struct cvmx_dtx_zip_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 active : 1;
+               u64 reserved_2_3 : 2;
+               u64 echoen : 1;
+               u64 swap : 1;
+       } s;
+       struct cvmx_dtx_zip_ctl_s cn73xx;
+       struct cvmx_dtx_zip_ctl_s cn78xx;
+       struct cvmx_dtx_zip_ctl_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_zip_ctl cvmx_dtx_zip_ctl_t;
+
+/**
+ * cvmx_dtx_zip_dat#
+ */
+union cvmx_dtx_zip_datx {
+       u64 u64;
+       struct cvmx_dtx_zip_datx_s {
+               u64 reserved_36_63 : 28;
+               u64 raw : 36;
+       } s;
+       struct cvmx_dtx_zip_datx_s cn73xx;
+       struct cvmx_dtx_zip_datx_s cn78xx;
+       struct cvmx_dtx_zip_datx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_zip_datx cvmx_dtx_zip_datx_t;
+
+/**
+ * cvmx_dtx_zip_ena#
+ */
+union cvmx_dtx_zip_enax {
+       u64 u64;
+       struct cvmx_dtx_zip_enax_s {
+               u64 reserved_36_63 : 28;
+               u64 ena : 36;
+       } s;
+       struct cvmx_dtx_zip_enax_s cn73xx;
+       struct cvmx_dtx_zip_enax_s cn78xx;
+       struct cvmx_dtx_zip_enax_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_zip_enax cvmx_dtx_zip_enax_t;
+
+/**
+ * cvmx_dtx_zip_sel#
+ */
+union cvmx_dtx_zip_selx {
+       u64 u64;
+       struct cvmx_dtx_zip_selx_s {
+               u64 reserved_24_63 : 40;
+               u64 value : 24;
+       } s;
+       struct cvmx_dtx_zip_selx_s cn73xx;
+       struct cvmx_dtx_zip_selx_s cn78xx;
+       struct cvmx_dtx_zip_selx_s cn78xxp1;
+};
+
+typedef union cvmx_dtx_zip_selx cvmx_dtx_zip_selx_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-error.h b/arch/mips/mach-octeon/include/mach/cvmx-error.h
new file mode 100644 (file)
index 0000000..9a13ed4
--- /dev/null
@@ -0,0 +1,456 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the Octeon extended error status.
+ */
+
+#ifndef __CVMX_ERROR_H__
+#define __CVMX_ERROR_H__
+
+/**
+ * There are generally many error status bits associated with a
+ * single logical group. The enumeration below is used to
+ * communicate high level groups to the error infastructure so
+ * error status bits can be enable or disabled in large groups.
+ */
+typedef enum {
+       CVMX_ERROR_GROUP_INTERNAL,
+       CVMX_ERROR_GROUP_L2C,
+       CVMX_ERROR_GROUP_ETHERNET,
+       CVMX_ERROR_GROUP_MGMT_PORT,
+       CVMX_ERROR_GROUP_PCI,
+       CVMX_ERROR_GROUP_SRIO,
+       CVMX_ERROR_GROUP_USB,
+       CVMX_ERROR_GROUP_LMC,
+       CVMX_ERROR_GROUP_ILK,
+       CVMX_ERROR_GROUP_DFM,
+       CVMX_ERROR_GROUP_ILA,
+} cvmx_error_group_t;
+
+/**
+ * Flags representing special handling for some error registers.
+ * These flags are passed to cvmx_error_initialize() to control
+ * the handling of bits where the same flags were passed to the
+ * added cvmx_error_info_t.
+ */
+typedef enum {
+       CVMX_ERROR_TYPE_NONE = 0,
+       CVMX_ERROR_TYPE_SBE = 1 << 0,
+       CVMX_ERROR_TYPE_DBE = 1 << 1,
+} cvmx_error_type_t;
+
+/**
+ * When registering for interest in an error status register, the
+ * type of the register needs to be known by cvmx-error. Most
+ * registers are either IO64 or IO32, but some blocks contain
+ * registers that can't be directly accessed. A good example of
+ * would be PCIe extended error state stored in config space.
+ */
+typedef enum {
+       __CVMX_ERROR_REGISTER_NONE,
+       CVMX_ERROR_REGISTER_IO64,
+       CVMX_ERROR_REGISTER_IO32,
+       CVMX_ERROR_REGISTER_PCICONFIG,
+       CVMX_ERROR_REGISTER_SRIOMAINT,
+} cvmx_error_register_t;
+
+struct cvmx_error_info;
+/**
+ * Error handling functions must have the following prototype.
+ */
+typedef int (*cvmx_error_func_t)(const struct cvmx_error_info *info);
+
+/**
+ * This structure is passed to all error handling functions.
+ */
+typedef struct cvmx_error_info {
+       cvmx_error_register_t reg_type;
+       u64 status_addr;
+       u64 status_mask;
+       u64 enable_addr;
+       u64 enable_mask;
+       cvmx_error_type_t flags;
+       cvmx_error_group_t group;
+       int group_index;
+       cvmx_error_func_t func;
+       u64 user_info;
+       struct {
+               cvmx_error_register_t reg_type;
+               u64 status_addr;
+               u64 status_mask;
+       } parent;
+} cvmx_error_info_t;
+
+/**
+ * Initialize the error status system. This should be called once
+ * before any other functions are called. This function adds default
+ * handlers for most all error events but does not enable them. Later
+ * calls to cvmx_error_enable() are needed.
+ *
+ * @param flags  Optional flags.
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_initialize(void);
+
+/**
+ * Poll the error status registers and call the appropriate error
+ * handlers. This should be called in the RSL interrupt handler
+ * for your application or operating system.
+ *
+ * @return Number of error handlers called. Zero means this call
+ *         found no errors and was spurious.
+ */
+int cvmx_error_poll(void);
+
+/**
+ * Register to be called when an error status bit is set. Most users
+ * will not need to call this function as cvmx_error_initialize()
+ * registers default handlers for most error conditions. This function
+ * is normally used to add more handlers without changing the existing
+ * handlers.
+ *
+ * @param new_info Information about the handler for a error register. The
+ *                 structure passed is copied and can be destroyed after the
+ *                 call. All members of the structure must be populated, even the
+ *                 parent information.
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_add(const cvmx_error_info_t *new_info);
+
+/**
+ * Remove all handlers for a status register and mask. Normally
+ * this function should not be called. Instead a new handler should be
+ * installed to replace the existing handler. In the even that all
+ * reporting of a error bit should be removed, then use this
+ * function.
+ *
+ * @param reg_type Type of the status register to remove
+ * @param status_addr
+ *                 Status register to remove.
+ * @param status_mask
+ *                 All handlers for this status register with this mask will be
+ *                 removed.
+ * @param old_info If not NULL, this is filled with information about the handler
+ *                 that was removed.
+ *
+ * @return Zero on success, negative on failure (not found).
+ */
+int cvmx_error_remove(cvmx_error_register_t reg_type, u64 status_addr, u64 status_mask,
+                     cvmx_error_info_t *old_info);
+
+/**
+ * Change the function and user_info for an existing error status
+ * register. This function should be used to replace the default
+ * handler with an application specific version as needed.
+ *
+ * @param reg_type Type of the status register to change
+ * @param status_addr
+ *                 Status register to change.
+ * @param status_mask
+ *                 All handlers for this status register with this mask will be
+ *                 changed.
+ * @param new_func New function to use to handle the error status
+ * @param new_user_info
+ *                 New user info parameter for the function
+ * @param old_func If not NULL, the old function is returned. Useful for restoring
+ *                 the old handler.
+ * @param old_user_info
+ *                 If not NULL, the old user info parameter.
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_error_change_handler(cvmx_error_register_t reg_type, u64 status_addr, u64 status_mask,
+                             cvmx_error_func_t new_func, u64 new_user_info,
+                             cvmx_error_func_t *old_func, u64 *old_user_info);
+
+/**
+ * Enable all error registers for a logical group. This should be
+ * called whenever a logical group is brought online.
+ *
+ * @param group  Logical group to enable
+ * @param group_index
+ *               Index for the group as defined in the cvmx_error_group_t
+ *               comments.
+ *
+ * @return Zero on success, negative on failure.
+ */
+/*
+ * Rather than conditionalize the calls throughout the executive to not enable
+ * interrupts in Uboot, simply make the enable function do nothing
+ */
+static inline int cvmx_error_enable_group(cvmx_error_group_t group, int group_index)
+{
+       return 0;
+}
+
+/**
+ * Disable all error registers for a logical group. This should be
+ * called whenever a logical group is brought offline. Many blocks
+ * will report spurious errors when offline unless this function
+ * is called.
+ *
+ * @param group  Logical group to disable
+ * @param group_index
+ *               Index for the group as defined in the cvmx_error_group_t
+ *               comments.
+ *
+ * @return Zero on success, negative on failure.
+ */
+/*
+ * Rather than conditionalize the calls throughout the executive to not disable
+ * interrupts in Uboot, simply make the enable function do nothing
+ */
+static inline int cvmx_error_disable_group(cvmx_error_group_t group, int group_index)
+{
+       return 0;
+}
+
+/**
+ * Enable all handlers for a specific status register mask.
+ *
+ * @param reg_type Type of the status register
+ * @param status_addr
+ *                 Status register address
+ * @param status_mask
+ *                 All handlers for this status register with this mask will be
+ *                 enabled.
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_enable(cvmx_error_register_t reg_type, u64 status_addr, u64 status_mask);
+
+/**
+ * Disable all handlers for a specific status register and mask.
+ *
+ * @param reg_type Type of the status register
+ * @param status_addr
+ *                 Status register address
+ * @param status_mask
+ *                 All handlers for this status register with this mask will be
+ *                 disabled.
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_disable(cvmx_error_register_t reg_type, u64 status_addr, u64 status_mask);
+
+/**
+ * @INTERNAL
+ * Function for processing non leaf error status registers. This function
+ * calls all handlers for this passed register and all children linked
+ * to it.
+ *
+ * @param info   Error register to check
+ *
+ * @return Number of error status bits found or zero if no bits were set.
+ */
+int __cvmx_error_decode(const cvmx_error_info_t *info);
+
+/**
+ * @INTERNAL
+ * This error bit handler simply prints a message and clears the status bit
+ *
+ * @param info   Error register to check
+ *
+ * @return
+ */
+int __cvmx_error_display(const cvmx_error_info_t *info);
+
+/**
+ * Find the handler for a specific status register and mask
+ *
+ * @param status_addr
+ *                Status register address
+ *
+ * @return  Return the handler on success or null on failure.
+ */
+cvmx_error_info_t *cvmx_error_get_index(u64 status_addr);
+
+void __cvmx_install_gmx_error_handler_for_xaui(void);
+
+/**
+ * 78xx related
+ */
+/**
+ * Compare two INTSN values.
+ *
+ * @param key INTSN value to search for
+ * @param data current entry from the searched array
+ *
+ * @return Negative, 0 or positive when respectively key is less than,
+ *             equal or greater than data.
+ */
+int cvmx_error_intsn_cmp(const void *key, const void *data);
+
+/**
+ * @INTERNAL
+ *
+ * @param intsn   Interrupt source number to display
+ *
+ * @param node Node number
+ *
+ * @return Zero on success, -1 on error
+ */
+int cvmx_error_intsn_display_v3(int node, u32 intsn);
+
+/**
+ * Initialize the error status system for cn78xx. This should be called once
+ * before any other functions are called. This function enables the interrupts
+ * described in the array.
+ *
+ * @param node Node number
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_initialize_cn78xx(int node);
+
+/**
+ * Enable interrupt for a specific INTSN.
+ *
+ * @param node Node number
+ * @param intsn Interrupt source number
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_intsn_enable_v3(int node, u32 intsn);
+
+/**
+ * Disable interrupt for a specific INTSN.
+ *
+ * @param node Node number
+ * @param intsn Interrupt source number
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_intsn_disable_v3(int node, u32 intsn);
+
+/**
+ * Clear interrupt for a specific INTSN.
+ *
+ * @param intsn Interrupt source number
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_intsn_clear_v3(int node, u32 intsn);
+
+/**
+ * Enable interrupts for a specific CSR(all the bits/intsn in the csr).
+ *
+ * @param node Node number
+ * @param csr_address CSR address
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_error_csr_enable_v3(int node, u64 csr_address);
+
+/**
+ * Disable interrupts for a specific CSR (all the bits/intsn in the csr).
+ *
+ * @param node Node number
+ * @param csr_address CSR address
+ *
+ * @return Zero
+ */
+int cvmx_error_csr_disable_v3(int node, u64 csr_address);
+
+/**
+ * Enable all error registers for a logical group. This should be
+ * called whenever a logical group is brought online.
+ *
+ * @param group  Logical group to enable
+ * @param xipd_port  The IPD port value
+ *
+ * @return Zero.
+ */
+int cvmx_error_enable_group_v3(cvmx_error_group_t group, int xipd_port);
+
+/**
+ * Disable all error registers for a logical group.
+ *
+ * @param group  Logical group to enable
+ * @param xipd_port  The IPD port value
+ *
+ * @return Zero.
+ */
+int cvmx_error_disable_group_v3(cvmx_error_group_t group, int xipd_port);
+
+/**
+ * Enable all error registers for a specific category in a logical group.
+ * This should be called whenever a logical group is brought online.
+ *
+ * @param group  Logical group to enable
+ * @param type   Category in a logical group to enable
+ * @param xipd_port  The IPD port value
+ *
+ * @return Zero.
+ */
+int cvmx_error_enable_group_type_v3(cvmx_error_group_t group, cvmx_error_type_t type,
+                                   int xipd_port);
+
+/**
+ * Disable all error registers for a specific category in a logical group.
+ * This should be called whenever a logical group is brought online.
+ *
+ * @param group  Logical group to disable
+ * @param type   Category in a logical group to disable
+ * @param xipd_port  The IPD port value
+ *
+ * @return Zero.
+ */
+int cvmx_error_disable_group_type_v3(cvmx_error_group_t group, cvmx_error_type_t type,
+                                    int xipd_port);
+
+/**
+ * Clear all error registers for a logical group.
+ *
+ * @param group  Logical group to disable
+ * @param xipd_port  The IPD port value
+ *
+ * @return Zero.
+ */
+int cvmx_error_clear_group_v3(cvmx_error_group_t group, int xipd_port);
+
+/**
+ * Enable all error registers for a particular category.
+ *
+ * @param node  CCPI node
+ * @param type  category to enable
+ *
+ *@return Zero.
+ */
+int cvmx_error_enable_type_v3(int node, cvmx_error_type_t type);
+
+/**
+ * Disable all error registers for a particular category.
+ *
+ * @param node  CCPI node
+ * @param type  category to disable
+ *
+ *@return Zero.
+ */
+int cvmx_error_disable_type_v3(int node, cvmx_error_type_t type);
+
+void cvmx_octeon_hang(void) __attribute__((__noreturn__));
+
+/**
+ * @INTERNAL
+ *
+ * Process L2C single and multi-bit ECC errors
+ *
+ */
+int __cvmx_cn7xxx_l2c_l2d_ecc_error_display(int node, int intsn);
+
+/**
+ * Handle L2 cache TAG ECC errors and noway errors
+ *
+ * @param      CCPI node
+ * @param      intsn   intsn from error array.
+ * @param      remote  true for remote node (cn78xx only)
+ *
+ * @return     1 if handled, 0 if not handled
+ */
+int __cvmx_cn7xxx_l2c_tag_error_display(int node, int intsn, bool remote);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-fpa-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-fpa-defs.h
new file mode 100644 (file)
index 0000000..13ce7d8
--- /dev/null
@@ -0,0 +1,1866 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon fpa.
+ */
+
+#ifndef __CVMX_FPA_DEFS_H__
+#define __CVMX_FPA_DEFS_H__
+
+#define CVMX_FPA_ADDR_RANGE_ERROR CVMX_FPA_ADDR_RANGE_ERROR_FUNC()
+static inline u64 CVMX_FPA_ADDR_RANGE_ERROR_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180028000458ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001280000000458ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001280000000458ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001280000000458ull;
+       }
+       return 0x0001280000000458ull;
+}
+
+#define CVMX_FPA_AURAX_CFG(offset)          (0x0001280020100000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_CNT(offset)          (0x0001280020200000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_CNT_ADD(offset)      (0x0001280020300000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_CNT_LEVELS(offset)    (0x0001280020800000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_CNT_LIMIT(offset)     (0x0001280020400000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_CNT_THRESHOLD(offset) (0x0001280020500000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_INT(offset)          (0x0001280020600000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_POOL(offset)         (0x0001280020000000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_AURAX_POOL_LEVELS(offset)   (0x0001280020700000ull + ((offset) & 1023) * 8)
+#define CVMX_FPA_BIST_STATUS                CVMX_FPA_BIST_STATUS_FUNC()
+static inline u64 CVMX_FPA_BIST_STATUS_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800280000E8ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00012800000000E8ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00012800000000E8ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00012800000000E8ull;
+       }
+       return 0x00012800000000E8ull;
+}
+
+#ifndef CVMX_FPA_CLK_COUNT // test-only (also in octeon_ddr.h)
+#define CVMX_FPA_CLK_COUNT (0x00012800000000F0ull)
+#endif
+#define CVMX_FPA_CTL_STATUS             (0x0001180028000050ull)
+#define CVMX_FPA_ECC_CTL                (0x0001280000000058ull)
+#define CVMX_FPA_ECC_INT                (0x0001280000000068ull)
+#define CVMX_FPA_ERR_INT                (0x0001280000000040ull)
+#define CVMX_FPA_FPF0_MARKS             (0x0001180028000000ull)
+#define CVMX_FPA_FPF0_SIZE              (0x0001180028000058ull)
+#define CVMX_FPA_FPF1_MARKS             CVMX_FPA_FPFX_MARKS(1)
+#define CVMX_FPA_FPF2_MARKS             CVMX_FPA_FPFX_MARKS(2)
+#define CVMX_FPA_FPF3_MARKS             CVMX_FPA_FPFX_MARKS(3)
+#define CVMX_FPA_FPF4_MARKS             CVMX_FPA_FPFX_MARKS(4)
+#define CVMX_FPA_FPF5_MARKS             CVMX_FPA_FPFX_MARKS(5)
+#define CVMX_FPA_FPF6_MARKS             CVMX_FPA_FPFX_MARKS(6)
+#define CVMX_FPA_FPF7_MARKS             CVMX_FPA_FPFX_MARKS(7)
+#define CVMX_FPA_FPF8_MARKS             (0x0001180028000240ull)
+#define CVMX_FPA_FPF8_SIZE              (0x0001180028000248ull)
+#define CVMX_FPA_FPFX_MARKS(offset)     (0x0001180028000008ull + ((offset) & 7) * 8 - 8 * 1)
+#define CVMX_FPA_FPFX_SIZE(offset)      (0x0001180028000060ull + ((offset) & 7) * 8 - 8 * 1)
+#define CVMX_FPA_GEN_CFG                (0x0001280000000050ull)
+#define CVMX_FPA_INT_ENB                (0x0001180028000048ull)
+#define CVMX_FPA_INT_SUM                (0x0001180028000040ull)
+#define CVMX_FPA_PACKET_THRESHOLD       (0x0001180028000460ull)
+#define CVMX_FPA_POOLX_AVAILABLE(offset) (0x0001280010300000ull + ((offset) & 63) * 8)
+#define CVMX_FPA_POOLX_CFG(offset)      (0x0001280010000000ull + ((offset) & 63) * 8)
+static inline u64 CVMX_FPA_POOLX_END_ADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180028000358ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180028000358ull + (offset) * 8;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001280010600000ull + (offset) * 8;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001280010600000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001280010600000ull + (offset) * 8;
+       }
+       return 0x0001280010600000ull + (offset) * 8;
+}
+
+#define CVMX_FPA_POOLX_FPF_MARKS(offset)  (0x0001280010100000ull + ((offset) & 63) * 8)
+#define CVMX_FPA_POOLX_INT(offset)       (0x0001280010A00000ull + ((offset) & 63) * 8)
+#define CVMX_FPA_POOLX_OP_PC(offset)     (0x0001280010F00000ull + ((offset) & 63) * 8)
+#define CVMX_FPA_POOLX_STACK_ADDR(offset) (0x0001280010900000ull + ((offset) & 63) * 8)
+#define CVMX_FPA_POOLX_STACK_BASE(offset) (0x0001280010700000ull + ((offset) & 63) * 8)
+#define CVMX_FPA_POOLX_STACK_END(offset)  (0x0001280010800000ull + ((offset) & 63) * 8)
+static inline u64 CVMX_FPA_POOLX_START_ADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180028000258ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180028000258ull + (offset) * 8;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001280010500000ull + (offset) * 8;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001280010500000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001280010500000ull + (offset) * 8;
+       }
+       return 0x0001280010500000ull + (offset) * 8;
+}
+
+static inline u64 CVMX_FPA_POOLX_THRESHOLD(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180028000140ull + (offset) * 8;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180028000140ull + (offset) * 8;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001280010400000ull + (offset) * 8;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001280010400000ull + (offset) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001280010400000ull + (offset) * 8;
+       }
+       return 0x0001280010400000ull + (offset) * 8;
+}
+
+#define CVMX_FPA_QUE0_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(0)
+#define CVMX_FPA_QUE1_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(1)
+#define CVMX_FPA_QUE2_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(2)
+#define CVMX_FPA_QUE3_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(3)
+#define CVMX_FPA_QUE4_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(4)
+#define CVMX_FPA_QUE5_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(5)
+#define CVMX_FPA_QUE6_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(6)
+#define CVMX_FPA_QUE7_PAGE_INDEX        CVMX_FPA_QUEX_PAGE_INDEX(7)
+#define CVMX_FPA_QUE8_PAGE_INDEX        (0x0001180028000250ull)
+#define CVMX_FPA_QUEX_AVAILABLE(offset)         (0x0001180028000098ull + ((offset) & 15) * 8)
+#define CVMX_FPA_QUEX_PAGE_INDEX(offset) (0x00011800280000F0ull + ((offset) & 7) * 8)
+#define CVMX_FPA_QUE_ACT                (0x0001180028000138ull)
+#define CVMX_FPA_QUE_EXP                (0x0001180028000130ull)
+#define CVMX_FPA_RD_LATENCY_PC          (0x0001280000000610ull)
+#define CVMX_FPA_RD_REQ_PC              (0x0001280000000600ull)
+#define CVMX_FPA_RED_DELAY              (0x0001280000000100ull)
+#define CVMX_FPA_SFT_RST                (0x0001280000000000ull)
+#define CVMX_FPA_WART_CTL               (0x00011800280000D8ull)
+#define CVMX_FPA_WART_STATUS            (0x00011800280000E0ull)
+#define CVMX_FPA_WQE_THRESHOLD          (0x0001180028000468ull)
+
+/**
+ * cvmx_fpa_addr_range_error
+ *
+ * When any FPA_POOL()_INT[RANGE] error occurs, this register is latched with additional
+ * error information.
+ */
+union cvmx_fpa_addr_range_error {
+       u64 u64;
+       struct cvmx_fpa_addr_range_error_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_fpa_addr_range_error_cn61xx {
+               u64 reserved_38_63 : 26;
+               u64 pool : 5;
+               u64 addr : 33;
+       } cn61xx;
+       struct cvmx_fpa_addr_range_error_cn61xx cn66xx;
+       struct cvmx_fpa_addr_range_error_cn61xx cn68xx;
+       struct cvmx_fpa_addr_range_error_cn61xx cn68xxp1;
+       struct cvmx_fpa_addr_range_error_cn61xx cn70xx;
+       struct cvmx_fpa_addr_range_error_cn61xx cn70xxp1;
+       struct cvmx_fpa_addr_range_error_cn73xx {
+               u64 reserved_54_63 : 10;
+               u64 pool : 6;
+               u64 reserved_42_47 : 6;
+               u64 addr : 42;
+       } cn73xx;
+       struct cvmx_fpa_addr_range_error_cn73xx cn78xx;
+       struct cvmx_fpa_addr_range_error_cn73xx cn78xxp1;
+       struct cvmx_fpa_addr_range_error_cn61xx cnf71xx;
+       struct cvmx_fpa_addr_range_error_cn73xx cnf75xx;
+};
+
+typedef union cvmx_fpa_addr_range_error cvmx_fpa_addr_range_error_t;
+
+/**
+ * cvmx_fpa_aura#_cfg
+ *
+ * This register configures aura backpressure, etc.
+ *
+ */
+union cvmx_fpa_aurax_cfg {
+       u64 u64;
+       struct cvmx_fpa_aurax_cfg_s {
+               u64 reserved_10_63 : 54;
+               u64 ptr_dis : 1;
+               u64 avg_con : 9;
+       } s;
+       struct cvmx_fpa_aurax_cfg_s cn73xx;
+       struct cvmx_fpa_aurax_cfg_s cn78xx;
+       struct cvmx_fpa_aurax_cfg_s cn78xxp1;
+       struct cvmx_fpa_aurax_cfg_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_cfg cvmx_fpa_aurax_cfg_t;
+
+/**
+ * cvmx_fpa_aura#_cnt
+ */
+union cvmx_fpa_aurax_cnt {
+       u64 u64;
+       struct cvmx_fpa_aurax_cnt_s {
+               u64 reserved_40_63 : 24;
+               u64 cnt : 40;
+       } s;
+       struct cvmx_fpa_aurax_cnt_s cn73xx;
+       struct cvmx_fpa_aurax_cnt_s cn78xx;
+       struct cvmx_fpa_aurax_cnt_s cn78xxp1;
+       struct cvmx_fpa_aurax_cnt_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_cnt cvmx_fpa_aurax_cnt_t;
+
+/**
+ * cvmx_fpa_aura#_cnt_add
+ */
+union cvmx_fpa_aurax_cnt_add {
+       u64 u64;
+       struct cvmx_fpa_aurax_cnt_add_s {
+               u64 reserved_40_63 : 24;
+               u64 cnt : 40;
+       } s;
+       struct cvmx_fpa_aurax_cnt_add_s cn73xx;
+       struct cvmx_fpa_aurax_cnt_add_s cn78xx;
+       struct cvmx_fpa_aurax_cnt_add_s cn78xxp1;
+       struct cvmx_fpa_aurax_cnt_add_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_cnt_add cvmx_fpa_aurax_cnt_add_t;
+
+/**
+ * cvmx_fpa_aura#_cnt_levels
+ */
+union cvmx_fpa_aurax_cnt_levels {
+       u64 u64;
+       struct cvmx_fpa_aurax_cnt_levels_s {
+               u64 reserved_41_63 : 23;
+               u64 drop_dis : 1;
+               u64 bp_ena : 1;
+               u64 red_ena : 1;
+               u64 shift : 6;
+               u64 bp : 8;
+               u64 drop : 8;
+               u64 pass : 8;
+               u64 level : 8;
+       } s;
+       struct cvmx_fpa_aurax_cnt_levels_s cn73xx;
+       struct cvmx_fpa_aurax_cnt_levels_s cn78xx;
+       struct cvmx_fpa_aurax_cnt_levels_s cn78xxp1;
+       struct cvmx_fpa_aurax_cnt_levels_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_cnt_levels cvmx_fpa_aurax_cnt_levels_t;
+
+/**
+ * cvmx_fpa_aura#_cnt_limit
+ */
+union cvmx_fpa_aurax_cnt_limit {
+       u64 u64;
+       struct cvmx_fpa_aurax_cnt_limit_s {
+               u64 reserved_40_63 : 24;
+               u64 limit : 40;
+       } s;
+       struct cvmx_fpa_aurax_cnt_limit_s cn73xx;
+       struct cvmx_fpa_aurax_cnt_limit_s cn78xx;
+       struct cvmx_fpa_aurax_cnt_limit_s cn78xxp1;
+       struct cvmx_fpa_aurax_cnt_limit_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_cnt_limit cvmx_fpa_aurax_cnt_limit_t;
+
+/**
+ * cvmx_fpa_aura#_cnt_threshold
+ */
+union cvmx_fpa_aurax_cnt_threshold {
+       u64 u64;
+       struct cvmx_fpa_aurax_cnt_threshold_s {
+               u64 reserved_40_63 : 24;
+               u64 thresh : 40;
+       } s;
+       struct cvmx_fpa_aurax_cnt_threshold_s cn73xx;
+       struct cvmx_fpa_aurax_cnt_threshold_s cn78xx;
+       struct cvmx_fpa_aurax_cnt_threshold_s cn78xxp1;
+       struct cvmx_fpa_aurax_cnt_threshold_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_cnt_threshold cvmx_fpa_aurax_cnt_threshold_t;
+
+/**
+ * cvmx_fpa_aura#_int
+ */
+union cvmx_fpa_aurax_int {
+       u64 u64;
+       struct cvmx_fpa_aurax_int_s {
+               u64 reserved_1_63 : 63;
+               u64 thresh : 1;
+       } s;
+       struct cvmx_fpa_aurax_int_s cn73xx;
+       struct cvmx_fpa_aurax_int_s cn78xx;
+       struct cvmx_fpa_aurax_int_s cn78xxp1;
+       struct cvmx_fpa_aurax_int_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_int cvmx_fpa_aurax_int_t;
+
+/**
+ * cvmx_fpa_aura#_pool
+ *
+ * Provides the mapping from each aura to the pool number.
+ *
+ */
+union cvmx_fpa_aurax_pool {
+       u64 u64;
+       struct cvmx_fpa_aurax_pool_s {
+               u64 reserved_6_63 : 58;
+               u64 pool : 6;
+       } s;
+       struct cvmx_fpa_aurax_pool_s cn73xx;
+       struct cvmx_fpa_aurax_pool_s cn78xx;
+       struct cvmx_fpa_aurax_pool_s cn78xxp1;
+       struct cvmx_fpa_aurax_pool_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_pool cvmx_fpa_aurax_pool_t;
+
+/**
+ * cvmx_fpa_aura#_pool_levels
+ */
+union cvmx_fpa_aurax_pool_levels {
+       u64 u64;
+       struct cvmx_fpa_aurax_pool_levels_s {
+               u64 reserved_41_63 : 23;
+               u64 drop_dis : 1;
+               u64 bp_ena : 1;
+               u64 red_ena : 1;
+               u64 shift : 6;
+               u64 bp : 8;
+               u64 drop : 8;
+               u64 pass : 8;
+               u64 level : 8;
+       } s;
+       struct cvmx_fpa_aurax_pool_levels_s cn73xx;
+       struct cvmx_fpa_aurax_pool_levels_s cn78xx;
+       struct cvmx_fpa_aurax_pool_levels_s cn78xxp1;
+       struct cvmx_fpa_aurax_pool_levels_s cnf75xx;
+};
+
+typedef union cvmx_fpa_aurax_pool_levels cvmx_fpa_aurax_pool_levels_t;
+
+/**
+ * cvmx_fpa_bist_status
+ *
+ * This register provides the result of the BIST run on the FPA memories.
+ *
+ */
+union cvmx_fpa_bist_status {
+       u64 u64;
+       struct cvmx_fpa_bist_status_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_fpa_bist_status_cn30xx {
+               u64 reserved_5_63 : 59;
+               u64 frd : 1;
+               u64 fpf0 : 1;
+               u64 fpf1 : 1;
+               u64 ffr : 1;
+               u64 fdr : 1;
+       } cn30xx;
+       struct cvmx_fpa_bist_status_cn30xx cn31xx;
+       struct cvmx_fpa_bist_status_cn30xx cn38xx;
+       struct cvmx_fpa_bist_status_cn30xx cn38xxp2;
+       struct cvmx_fpa_bist_status_cn30xx cn50xx;
+       struct cvmx_fpa_bist_status_cn30xx cn52xx;
+       struct cvmx_fpa_bist_status_cn30xx cn52xxp1;
+       struct cvmx_fpa_bist_status_cn30xx cn56xx;
+       struct cvmx_fpa_bist_status_cn30xx cn56xxp1;
+       struct cvmx_fpa_bist_status_cn30xx cn58xx;
+       struct cvmx_fpa_bist_status_cn30xx cn58xxp1;
+       struct cvmx_fpa_bist_status_cn30xx cn61xx;
+       struct cvmx_fpa_bist_status_cn30xx cn63xx;
+       struct cvmx_fpa_bist_status_cn30xx cn63xxp1;
+       struct cvmx_fpa_bist_status_cn30xx cn66xx;
+       struct cvmx_fpa_bist_status_cn30xx cn68xx;
+       struct cvmx_fpa_bist_status_cn30xx cn68xxp1;
+       struct cvmx_fpa_bist_status_cn30xx cn70xx;
+       struct cvmx_fpa_bist_status_cn30xx cn70xxp1;
+       struct cvmx_fpa_bist_status_cn73xx {
+               u64 reserved_38_63 : 26;
+               u64 status : 38;
+       } cn73xx;
+       struct cvmx_fpa_bist_status_cn73xx cn78xx;
+       struct cvmx_fpa_bist_status_cn73xx cn78xxp1;
+       struct cvmx_fpa_bist_status_cn30xx cnf71xx;
+       struct cvmx_fpa_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_fpa_bist_status cvmx_fpa_bist_status_t;
+
+/**
+ * cvmx_fpa_clk_count
+ *
+ * This register counts the number of coprocessor-clock cycles since the deassertion of reset.
+ *
+ */
+union cvmx_fpa_clk_count {
+       u64 u64;
+       struct cvmx_fpa_clk_count_s {
+               u64 clk_cnt : 64;
+       } s;
+       struct cvmx_fpa_clk_count_s cn73xx;
+       struct cvmx_fpa_clk_count_s cn78xx;
+       struct cvmx_fpa_clk_count_s cn78xxp1;
+       struct cvmx_fpa_clk_count_s cnf75xx;
+};
+
+typedef union cvmx_fpa_clk_count cvmx_fpa_clk_count_t;
+
+/**
+ * cvmx_fpa_ctl_status
+ *
+ * The FPA's interrupt enable register.
+ *
+ */
+union cvmx_fpa_ctl_status {
+       u64 u64;
+       struct cvmx_fpa_ctl_status_s {
+               u64 reserved_21_63 : 43;
+               u64 free_en : 1;
+               u64 ret_off : 1;
+               u64 req_off : 1;
+               u64 reset : 1;
+               u64 use_ldt : 1;
+               u64 use_stt : 1;
+               u64 enb : 1;
+               u64 mem1_err : 7;
+               u64 mem0_err : 7;
+       } s;
+       struct cvmx_fpa_ctl_status_cn30xx {
+               u64 reserved_18_63 : 46;
+               u64 reset : 1;
+               u64 use_ldt : 1;
+               u64 use_stt : 1;
+               u64 enb : 1;
+               u64 mem1_err : 7;
+               u64 mem0_err : 7;
+       } cn30xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn31xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn38xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn38xxp2;
+       struct cvmx_fpa_ctl_status_cn30xx cn50xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn52xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn52xxp1;
+       struct cvmx_fpa_ctl_status_cn30xx cn56xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn56xxp1;
+       struct cvmx_fpa_ctl_status_cn30xx cn58xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn58xxp1;
+       struct cvmx_fpa_ctl_status_s cn61xx;
+       struct cvmx_fpa_ctl_status_s cn63xx;
+       struct cvmx_fpa_ctl_status_cn30xx cn63xxp1;
+       struct cvmx_fpa_ctl_status_s cn66xx;
+       struct cvmx_fpa_ctl_status_s cn68xx;
+       struct cvmx_fpa_ctl_status_s cn68xxp1;
+       struct cvmx_fpa_ctl_status_s cn70xx;
+       struct cvmx_fpa_ctl_status_s cn70xxp1;
+       struct cvmx_fpa_ctl_status_s cnf71xx;
+};
+
+typedef union cvmx_fpa_ctl_status cvmx_fpa_ctl_status_t;
+
+/**
+ * cvmx_fpa_ecc_ctl
+ *
+ * This register allows inserting ECC errors for testing.
+ *
+ */
+union cvmx_fpa_ecc_ctl {
+       u64 u64;
+       struct cvmx_fpa_ecc_ctl_s {
+               u64 reserved_62_63 : 2;
+               u64 ram_flip1 : 20;
+               u64 reserved_41_41 : 1;
+               u64 ram_flip0 : 20;
+               u64 reserved_20_20 : 1;
+               u64 ram_cdis : 20;
+       } s;
+       struct cvmx_fpa_ecc_ctl_s cn73xx;
+       struct cvmx_fpa_ecc_ctl_s cn78xx;
+       struct cvmx_fpa_ecc_ctl_s cn78xxp1;
+       struct cvmx_fpa_ecc_ctl_s cnf75xx;
+};
+
+typedef union cvmx_fpa_ecc_ctl cvmx_fpa_ecc_ctl_t;
+
+/**
+ * cvmx_fpa_ecc_int
+ *
+ * This register contains ECC error interrupt summary bits.
+ *
+ */
+union cvmx_fpa_ecc_int {
+       u64 u64;
+       struct cvmx_fpa_ecc_int_s {
+               u64 reserved_52_63 : 12;
+               u64 ram_dbe : 20;
+               u64 reserved_20_31 : 12;
+               u64 ram_sbe : 20;
+       } s;
+       struct cvmx_fpa_ecc_int_s cn73xx;
+       struct cvmx_fpa_ecc_int_s cn78xx;
+       struct cvmx_fpa_ecc_int_s cn78xxp1;
+       struct cvmx_fpa_ecc_int_s cnf75xx;
+};
+
+typedef union cvmx_fpa_ecc_int cvmx_fpa_ecc_int_t;
+
+/**
+ * cvmx_fpa_err_int
+ *
+ * This register contains the global (non-pool) error interrupt summary bits of the FPA.
+ *
+ */
+union cvmx_fpa_err_int {
+       u64 u64;
+       struct cvmx_fpa_err_int_s {
+               u64 reserved_4_63 : 60;
+               u64 hw_sub : 1;
+               u64 hw_add : 1;
+               u64 cnt_sub : 1;
+               u64 cnt_add : 1;
+       } s;
+       struct cvmx_fpa_err_int_s cn73xx;
+       struct cvmx_fpa_err_int_s cn78xx;
+       struct cvmx_fpa_err_int_s cn78xxp1;
+       struct cvmx_fpa_err_int_s cnf75xx;
+};
+
+typedef union cvmx_fpa_err_int cvmx_fpa_err_int_t;
+
+/**
+ * cvmx_fpa_fpf#_marks
+ *
+ * "The high and low watermark register that determines when we write and read free pages from
+ * L2C
+ * for Queue 1. The value of FPF_RD and FPF_WR should have at least a 33 difference. Recommend
+ * value
+ * is FPF_RD == (FPA_FPF#_SIZE[FPF_SIZ] * .25) and FPF_WR == (FPA_FPF#_SIZE[FPF_SIZ] * .75)"
+ */
+union cvmx_fpa_fpfx_marks {
+       u64 u64;
+       struct cvmx_fpa_fpfx_marks_s {
+               u64 reserved_22_63 : 42;
+               u64 fpf_wr : 11;
+               u64 fpf_rd : 11;
+       } s;
+       struct cvmx_fpa_fpfx_marks_s cn38xx;
+       struct cvmx_fpa_fpfx_marks_s cn38xxp2;
+       struct cvmx_fpa_fpfx_marks_s cn56xx;
+       struct cvmx_fpa_fpfx_marks_s cn56xxp1;
+       struct cvmx_fpa_fpfx_marks_s cn58xx;
+       struct cvmx_fpa_fpfx_marks_s cn58xxp1;
+       struct cvmx_fpa_fpfx_marks_s cn61xx;
+       struct cvmx_fpa_fpfx_marks_s cn63xx;
+       struct cvmx_fpa_fpfx_marks_s cn63xxp1;
+       struct cvmx_fpa_fpfx_marks_s cn66xx;
+       struct cvmx_fpa_fpfx_marks_s cn68xx;
+       struct cvmx_fpa_fpfx_marks_s cn68xxp1;
+       struct cvmx_fpa_fpfx_marks_s cn70xx;
+       struct cvmx_fpa_fpfx_marks_s cn70xxp1;
+       struct cvmx_fpa_fpfx_marks_s cnf71xx;
+};
+
+typedef union cvmx_fpa_fpfx_marks cvmx_fpa_fpfx_marks_t;
+
+/**
+ * cvmx_fpa_fpf#_size
+ *
+ * "FPA_FPFX_SIZE = FPA's Queue 1-7 Free Page FIFO Size
+ * The number of page pointers that will be kept local to the FPA for this Queue. FPA Queues are
+ * assigned in order from Queue 0 to Queue 7, though only Queue 0 through Queue x can be used.
+ * The sum of the 8 (0-7) FPA_FPF#_SIZE registers must be limited to 2048."
+ */
+union cvmx_fpa_fpfx_size {
+       u64 u64;
+       struct cvmx_fpa_fpfx_size_s {
+               u64 reserved_11_63 : 53;
+               u64 fpf_siz : 11;
+       } s;
+       struct cvmx_fpa_fpfx_size_s cn38xx;
+       struct cvmx_fpa_fpfx_size_s cn38xxp2;
+       struct cvmx_fpa_fpfx_size_s cn56xx;
+       struct cvmx_fpa_fpfx_size_s cn56xxp1;
+       struct cvmx_fpa_fpfx_size_s cn58xx;
+       struct cvmx_fpa_fpfx_size_s cn58xxp1;
+       struct cvmx_fpa_fpfx_size_s cn61xx;
+       struct cvmx_fpa_fpfx_size_s cn63xx;
+       struct cvmx_fpa_fpfx_size_s cn63xxp1;
+       struct cvmx_fpa_fpfx_size_s cn66xx;
+       struct cvmx_fpa_fpfx_size_s cn68xx;
+       struct cvmx_fpa_fpfx_size_s cn68xxp1;
+       struct cvmx_fpa_fpfx_size_s cn70xx;
+       struct cvmx_fpa_fpfx_size_s cn70xxp1;
+       struct cvmx_fpa_fpfx_size_s cnf71xx;
+};
+
+typedef union cvmx_fpa_fpfx_size cvmx_fpa_fpfx_size_t;
+
+/**
+ * cvmx_fpa_fpf0_marks
+ *
+ * "The high and low watermark register that determines when we write and read free pages from
+ * L2C
+ * for Queue 0. The value of FPF_RD and FPF_WR should have at least a 33 difference. Recommend
+ * value
+ * is FPF_RD == (FPA_FPF#_SIZE[FPF_SIZ] * .25) and FPF_WR == (FPA_FPF#_SIZE[FPF_SIZ] * .75)"
+ */
+union cvmx_fpa_fpf0_marks {
+       u64 u64;
+       struct cvmx_fpa_fpf0_marks_s {
+               u64 reserved_24_63 : 40;
+               u64 fpf_wr : 12;
+               u64 fpf_rd : 12;
+       } s;
+       struct cvmx_fpa_fpf0_marks_s cn38xx;
+       struct cvmx_fpa_fpf0_marks_s cn38xxp2;
+       struct cvmx_fpa_fpf0_marks_s cn56xx;
+       struct cvmx_fpa_fpf0_marks_s cn56xxp1;
+       struct cvmx_fpa_fpf0_marks_s cn58xx;
+       struct cvmx_fpa_fpf0_marks_s cn58xxp1;
+       struct cvmx_fpa_fpf0_marks_s cn61xx;
+       struct cvmx_fpa_fpf0_marks_s cn63xx;
+       struct cvmx_fpa_fpf0_marks_s cn63xxp1;
+       struct cvmx_fpa_fpf0_marks_s cn66xx;
+       struct cvmx_fpa_fpf0_marks_s cn68xx;
+       struct cvmx_fpa_fpf0_marks_s cn68xxp1;
+       struct cvmx_fpa_fpf0_marks_s cn70xx;
+       struct cvmx_fpa_fpf0_marks_s cn70xxp1;
+       struct cvmx_fpa_fpf0_marks_s cnf71xx;
+};
+
+typedef union cvmx_fpa_fpf0_marks cvmx_fpa_fpf0_marks_t;
+
+/**
+ * cvmx_fpa_fpf0_size
+ *
+ * "The number of page pointers that will be kept local to the FPA for this Queue. FPA Queues are
+ * assigned in order from Queue 0 to Queue 7, though only Queue 0 through Queue x can be used.
+ * The sum of the 8 (0-7) FPA_FPF#_SIZE registers must be limited to 2048."
+ */
+union cvmx_fpa_fpf0_size {
+       u64 u64;
+       struct cvmx_fpa_fpf0_size_s {
+               u64 reserved_12_63 : 52;
+               u64 fpf_siz : 12;
+       } s;
+       struct cvmx_fpa_fpf0_size_s cn38xx;
+       struct cvmx_fpa_fpf0_size_s cn38xxp2;
+       struct cvmx_fpa_fpf0_size_s cn56xx;
+       struct cvmx_fpa_fpf0_size_s cn56xxp1;
+       struct cvmx_fpa_fpf0_size_s cn58xx;
+       struct cvmx_fpa_fpf0_size_s cn58xxp1;
+       struct cvmx_fpa_fpf0_size_s cn61xx;
+       struct cvmx_fpa_fpf0_size_s cn63xx;
+       struct cvmx_fpa_fpf0_size_s cn63xxp1;
+       struct cvmx_fpa_fpf0_size_s cn66xx;
+       struct cvmx_fpa_fpf0_size_s cn68xx;
+       struct cvmx_fpa_fpf0_size_s cn68xxp1;
+       struct cvmx_fpa_fpf0_size_s cn70xx;
+       struct cvmx_fpa_fpf0_size_s cn70xxp1;
+       struct cvmx_fpa_fpf0_size_s cnf71xx;
+};
+
+typedef union cvmx_fpa_fpf0_size cvmx_fpa_fpf0_size_t;
+
+/**
+ * cvmx_fpa_fpf8_marks
+ *
+ * Reserved through 0x238 for additional thresholds
+ *
+ *                  FPA_FPF8_MARKS = FPA's Queue 8 Free Page FIFO Read Write Marks
+ *
+ * The high and low watermark register that determines when we write and read free pages from L2C
+ * for Queue 8. The value of FPF_RD and FPF_WR should have at least a 33 difference. Recommend value
+ * is FPF_RD == (FPA_FPF#_SIZE[FPF_SIZ] * .25) and FPF_WR == (FPA_FPF#_SIZE[FPF_SIZ] * .75)
+ */
+union cvmx_fpa_fpf8_marks {
+       u64 u64;
+       struct cvmx_fpa_fpf8_marks_s {
+               u64 reserved_22_63 : 42;
+               u64 fpf_wr : 11;
+               u64 fpf_rd : 11;
+       } s;
+       struct cvmx_fpa_fpf8_marks_s cn68xx;
+       struct cvmx_fpa_fpf8_marks_s cn68xxp1;
+};
+
+typedef union cvmx_fpa_fpf8_marks cvmx_fpa_fpf8_marks_t;
+
+/**
+ * cvmx_fpa_fpf8_size
+ *
+ * FPA_FPF8_SIZE = FPA's Queue 8 Free Page FIFO Size
+ *
+ * The number of page pointers that will be kept local to the FPA for this Queue. FPA Queues are
+ * assigned in order from Queue 0 to Queue 7, though only Queue 0 through Queue x can be used.
+ * The sum of the 9 (0-8) FPA_FPF#_SIZE registers must be limited to 2048.
+ */
+union cvmx_fpa_fpf8_size {
+       u64 u64;
+       struct cvmx_fpa_fpf8_size_s {
+               u64 reserved_12_63 : 52;
+               u64 fpf_siz : 12;
+       } s;
+       struct cvmx_fpa_fpf8_size_s cn68xx;
+       struct cvmx_fpa_fpf8_size_s cn68xxp1;
+};
+
+typedef union cvmx_fpa_fpf8_size cvmx_fpa_fpf8_size_t;
+
+/**
+ * cvmx_fpa_gen_cfg
+ *
+ * This register provides FPA control and status information.
+ *
+ */
+union cvmx_fpa_gen_cfg {
+       u64 u64;
+       struct cvmx_fpa_gen_cfg_s {
+               u64 reserved_12_63 : 52;
+               u64 halfrate : 1;
+               u64 ocla_bp : 1;
+               u64 lvl_dly : 6;
+               u64 pools : 2;
+               u64 avg_en : 1;
+               u64 clk_override : 1;
+       } s;
+       struct cvmx_fpa_gen_cfg_s cn73xx;
+       struct cvmx_fpa_gen_cfg_s cn78xx;
+       struct cvmx_fpa_gen_cfg_s cn78xxp1;
+       struct cvmx_fpa_gen_cfg_s cnf75xx;
+};
+
+typedef union cvmx_fpa_gen_cfg cvmx_fpa_gen_cfg_t;
+
+/**
+ * cvmx_fpa_int_enb
+ *
+ * The FPA's interrupt enable register.
+ *
+ */
+union cvmx_fpa_int_enb {
+       u64 u64;
+       struct cvmx_fpa_int_enb_s {
+               u64 reserved_50_63 : 14;
+               u64 paddr_e : 1;
+               u64 reserved_44_48 : 5;
+               u64 free7 : 1;
+               u64 free6 : 1;
+               u64 free5 : 1;
+               u64 free4 : 1;
+               u64 free3 : 1;
+               u64 free2 : 1;
+               u64 free1 : 1;
+               u64 free0 : 1;
+               u64 pool7th : 1;
+               u64 pool6th : 1;
+               u64 pool5th : 1;
+               u64 pool4th : 1;
+               u64 pool3th : 1;
+               u64 pool2th : 1;
+               u64 pool1th : 1;
+               u64 pool0th : 1;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } s;
+       struct cvmx_fpa_int_enb_cn30xx {
+               u64 reserved_28_63 : 36;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } cn30xx;
+       struct cvmx_fpa_int_enb_cn30xx cn31xx;
+       struct cvmx_fpa_int_enb_cn30xx cn38xx;
+       struct cvmx_fpa_int_enb_cn30xx cn38xxp2;
+       struct cvmx_fpa_int_enb_cn30xx cn50xx;
+       struct cvmx_fpa_int_enb_cn30xx cn52xx;
+       struct cvmx_fpa_int_enb_cn30xx cn52xxp1;
+       struct cvmx_fpa_int_enb_cn30xx cn56xx;
+       struct cvmx_fpa_int_enb_cn30xx cn56xxp1;
+       struct cvmx_fpa_int_enb_cn30xx cn58xx;
+       struct cvmx_fpa_int_enb_cn30xx cn58xxp1;
+       struct cvmx_fpa_int_enb_cn61xx {
+               u64 reserved_50_63 : 14;
+               u64 paddr_e : 1;
+               u64 res_44 : 5;
+               u64 free7 : 1;
+               u64 free6 : 1;
+               u64 free5 : 1;
+               u64 free4 : 1;
+               u64 free3 : 1;
+               u64 free2 : 1;
+               u64 free1 : 1;
+               u64 free0 : 1;
+               u64 pool7th : 1;
+               u64 pool6th : 1;
+               u64 pool5th : 1;
+               u64 pool4th : 1;
+               u64 pool3th : 1;
+               u64 pool2th : 1;
+               u64 pool1th : 1;
+               u64 pool0th : 1;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } cn61xx;
+       struct cvmx_fpa_int_enb_cn63xx {
+               u64 reserved_44_63 : 20;
+               u64 free7 : 1;
+               u64 free6 : 1;
+               u64 free5 : 1;
+               u64 free4 : 1;
+               u64 free3 : 1;
+               u64 free2 : 1;
+               u64 free1 : 1;
+               u64 free0 : 1;
+               u64 pool7th : 1;
+               u64 pool6th : 1;
+               u64 pool5th : 1;
+               u64 pool4th : 1;
+               u64 pool3th : 1;
+               u64 pool2th : 1;
+               u64 pool1th : 1;
+               u64 pool0th : 1;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } cn63xx;
+       struct cvmx_fpa_int_enb_cn30xx cn63xxp1;
+       struct cvmx_fpa_int_enb_cn61xx cn66xx;
+       struct cvmx_fpa_int_enb_cn68xx {
+               u64 reserved_50_63 : 14;
+               u64 paddr_e : 1;
+               u64 pool8th : 1;
+               u64 q8_perr : 1;
+               u64 q8_coff : 1;
+               u64 q8_und : 1;
+               u64 free8 : 1;
+               u64 free7 : 1;
+               u64 free6 : 1;
+               u64 free5 : 1;
+               u64 free4 : 1;
+               u64 free3 : 1;
+               u64 free2 : 1;
+               u64 free1 : 1;
+               u64 free0 : 1;
+               u64 pool7th : 1;
+               u64 pool6th : 1;
+               u64 pool5th : 1;
+               u64 pool4th : 1;
+               u64 pool3th : 1;
+               u64 pool2th : 1;
+               u64 pool1th : 1;
+               u64 pool0th : 1;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } cn68xx;
+       struct cvmx_fpa_int_enb_cn68xx cn68xxp1;
+       struct cvmx_fpa_int_enb_cn61xx cn70xx;
+       struct cvmx_fpa_int_enb_cn61xx cn70xxp1;
+       struct cvmx_fpa_int_enb_cn61xx cnf71xx;
+};
+
+typedef union cvmx_fpa_int_enb cvmx_fpa_int_enb_t;
+
+/**
+ * cvmx_fpa_int_sum
+ *
+ * Contains the different interrupt summary bits of the FPA.
+ *
+ */
+union cvmx_fpa_int_sum {
+       u64 u64;
+       struct cvmx_fpa_int_sum_s {
+               u64 reserved_50_63 : 14;
+               u64 paddr_e : 1;
+               u64 pool8th : 1;
+               u64 q8_perr : 1;
+               u64 q8_coff : 1;
+               u64 q8_und : 1;
+               u64 free8 : 1;
+               u64 free7 : 1;
+               u64 free6 : 1;
+               u64 free5 : 1;
+               u64 free4 : 1;
+               u64 free3 : 1;
+               u64 free2 : 1;
+               u64 free1 : 1;
+               u64 free0 : 1;
+               u64 pool7th : 1;
+               u64 pool6th : 1;
+               u64 pool5th : 1;
+               u64 pool4th : 1;
+               u64 pool3th : 1;
+               u64 pool2th : 1;
+               u64 pool1th : 1;
+               u64 pool0th : 1;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } s;
+       struct cvmx_fpa_int_sum_cn30xx {
+               u64 reserved_28_63 : 36;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } cn30xx;
+       struct cvmx_fpa_int_sum_cn30xx cn31xx;
+       struct cvmx_fpa_int_sum_cn30xx cn38xx;
+       struct cvmx_fpa_int_sum_cn30xx cn38xxp2;
+       struct cvmx_fpa_int_sum_cn30xx cn50xx;
+       struct cvmx_fpa_int_sum_cn30xx cn52xx;
+       struct cvmx_fpa_int_sum_cn30xx cn52xxp1;
+       struct cvmx_fpa_int_sum_cn30xx cn56xx;
+       struct cvmx_fpa_int_sum_cn30xx cn56xxp1;
+       struct cvmx_fpa_int_sum_cn30xx cn58xx;
+       struct cvmx_fpa_int_sum_cn30xx cn58xxp1;
+       struct cvmx_fpa_int_sum_cn61xx {
+               u64 reserved_50_63 : 14;
+               u64 paddr_e : 1;
+               u64 reserved_44_48 : 5;
+               u64 free7 : 1;
+               u64 free6 : 1;
+               u64 free5 : 1;
+               u64 free4 : 1;
+               u64 free3 : 1;
+               u64 free2 : 1;
+               u64 free1 : 1;
+               u64 free0 : 1;
+               u64 pool7th : 1;
+               u64 pool6th : 1;
+               u64 pool5th : 1;
+               u64 pool4th : 1;
+               u64 pool3th : 1;
+               u64 pool2th : 1;
+               u64 pool1th : 1;
+               u64 pool0th : 1;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } cn61xx;
+       struct cvmx_fpa_int_sum_cn63xx {
+               u64 reserved_44_63 : 20;
+               u64 free7 : 1;
+               u64 free6 : 1;
+               u64 free5 : 1;
+               u64 free4 : 1;
+               u64 free3 : 1;
+               u64 free2 : 1;
+               u64 free1 : 1;
+               u64 free0 : 1;
+               u64 pool7th : 1;
+               u64 pool6th : 1;
+               u64 pool5th : 1;
+               u64 pool4th : 1;
+               u64 pool3th : 1;
+               u64 pool2th : 1;
+               u64 pool1th : 1;
+               u64 pool0th : 1;
+               u64 q7_perr : 1;
+               u64 q7_coff : 1;
+               u64 q7_und : 1;
+               u64 q6_perr : 1;
+               u64 q6_coff : 1;
+               u64 q6_und : 1;
+               u64 q5_perr : 1;
+               u64 q5_coff : 1;
+               u64 q5_und : 1;
+               u64 q4_perr : 1;
+               u64 q4_coff : 1;
+               u64 q4_und : 1;
+               u64 q3_perr : 1;
+               u64 q3_coff : 1;
+               u64 q3_und : 1;
+               u64 q2_perr : 1;
+               u64 q2_coff : 1;
+               u64 q2_und : 1;
+               u64 q1_perr : 1;
+               u64 q1_coff : 1;
+               u64 q1_und : 1;
+               u64 q0_perr : 1;
+               u64 q0_coff : 1;
+               u64 q0_und : 1;
+               u64 fed1_dbe : 1;
+               u64 fed1_sbe : 1;
+               u64 fed0_dbe : 1;
+               u64 fed0_sbe : 1;
+       } cn63xx;
+       struct cvmx_fpa_int_sum_cn30xx cn63xxp1;
+       struct cvmx_fpa_int_sum_cn61xx cn66xx;
+       struct cvmx_fpa_int_sum_s cn68xx;
+       struct cvmx_fpa_int_sum_s cn68xxp1;
+       struct cvmx_fpa_int_sum_cn61xx cn70xx;
+       struct cvmx_fpa_int_sum_cn61xx cn70xxp1;
+       struct cvmx_fpa_int_sum_cn61xx cnf71xx;
+};
+
+typedef union cvmx_fpa_int_sum cvmx_fpa_int_sum_t;
+
+/**
+ * cvmx_fpa_packet_threshold
+ *
+ * When the value of FPA_QUE0_AVAILABLE[QUE_SIZ] is Less than the value of this register a low
+ * pool count signal is sent to the
+ * PCIe packet instruction engine (to make it stop reading instructions) and to the Packet-
+ * Arbiter informing it to not give grants
+ * to packets MAC with the exception of the PCIe MAC.
+ */
+union cvmx_fpa_packet_threshold {
+       u64 u64;
+       struct cvmx_fpa_packet_threshold_s {
+               u64 reserved_32_63 : 32;
+               u64 thresh : 32;
+       } s;
+       struct cvmx_fpa_packet_threshold_s cn61xx;
+       struct cvmx_fpa_packet_threshold_s cn63xx;
+       struct cvmx_fpa_packet_threshold_s cn66xx;
+       struct cvmx_fpa_packet_threshold_s cn68xx;
+       struct cvmx_fpa_packet_threshold_s cn68xxp1;
+       struct cvmx_fpa_packet_threshold_s cn70xx;
+       struct cvmx_fpa_packet_threshold_s cn70xxp1;
+       struct cvmx_fpa_packet_threshold_s cnf71xx;
+};
+
+typedef union cvmx_fpa_packet_threshold cvmx_fpa_packet_threshold_t;
+
+/**
+ * cvmx_fpa_pool#_available
+ */
+union cvmx_fpa_poolx_available {
+       u64 u64;
+       struct cvmx_fpa_poolx_available_s {
+               u64 reserved_36_63 : 28;
+               u64 count : 36;
+       } s;
+       struct cvmx_fpa_poolx_available_s cn73xx;
+       struct cvmx_fpa_poolx_available_s cn78xx;
+       struct cvmx_fpa_poolx_available_s cn78xxp1;
+       struct cvmx_fpa_poolx_available_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_available cvmx_fpa_poolx_available_t;
+
+/**
+ * cvmx_fpa_pool#_cfg
+ */
+union cvmx_fpa_poolx_cfg {
+       u64 u64;
+       struct cvmx_fpa_poolx_cfg_s {
+               u64 reserved_43_63 : 21;
+               u64 buf_size : 11;
+               u64 reserved_31_31 : 1;
+               u64 buf_offset : 15;
+               u64 reserved_5_15 : 11;
+               u64 l_type : 2;
+               u64 s_type : 1;
+               u64 nat_align : 1;
+               u64 ena : 1;
+       } s;
+       struct cvmx_fpa_poolx_cfg_s cn73xx;
+       struct cvmx_fpa_poolx_cfg_s cn78xx;
+       struct cvmx_fpa_poolx_cfg_s cn78xxp1;
+       struct cvmx_fpa_poolx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_cfg cvmx_fpa_poolx_cfg_t;
+
+/**
+ * cvmx_fpa_pool#_end_addr
+ *
+ * Pointers sent to this pool after alignment must be equal to or less than this address.
+ *
+ */
+union cvmx_fpa_poolx_end_addr {
+       u64 u64;
+       struct cvmx_fpa_poolx_end_addr_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_fpa_poolx_end_addr_cn61xx {
+               u64 reserved_33_63 : 31;
+               u64 addr : 33;
+       } cn61xx;
+       struct cvmx_fpa_poolx_end_addr_cn61xx cn66xx;
+       struct cvmx_fpa_poolx_end_addr_cn61xx cn68xx;
+       struct cvmx_fpa_poolx_end_addr_cn61xx cn68xxp1;
+       struct cvmx_fpa_poolx_end_addr_cn61xx cn70xx;
+       struct cvmx_fpa_poolx_end_addr_cn61xx cn70xxp1;
+       struct cvmx_fpa_poolx_end_addr_cn73xx {
+               u64 reserved_42_63 : 22;
+               u64 addr : 35;
+               u64 reserved_0_6 : 7;
+       } cn73xx;
+       struct cvmx_fpa_poolx_end_addr_cn73xx cn78xx;
+       struct cvmx_fpa_poolx_end_addr_cn73xx cn78xxp1;
+       struct cvmx_fpa_poolx_end_addr_cn61xx cnf71xx;
+       struct cvmx_fpa_poolx_end_addr_cn73xx cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_end_addr cvmx_fpa_poolx_end_addr_t;
+
+/**
+ * cvmx_fpa_pool#_fpf_marks
+ *
+ * The low watermark register that determines when we read free pages from L2C.
+ *
+ */
+union cvmx_fpa_poolx_fpf_marks {
+       u64 u64;
+       struct cvmx_fpa_poolx_fpf_marks_s {
+               u64 reserved_27_63 : 37;
+               u64 fpf_rd : 11;
+               u64 reserved_11_15 : 5;
+               u64 fpf_level : 11;
+       } s;
+       struct cvmx_fpa_poolx_fpf_marks_s cn73xx;
+       struct cvmx_fpa_poolx_fpf_marks_s cn78xx;
+       struct cvmx_fpa_poolx_fpf_marks_s cn78xxp1;
+       struct cvmx_fpa_poolx_fpf_marks_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_fpf_marks cvmx_fpa_poolx_fpf_marks_t;
+
+/**
+ * cvmx_fpa_pool#_int
+ *
+ * This register indicates pool interrupts.
+ *
+ */
+union cvmx_fpa_poolx_int {
+       u64 u64;
+       struct cvmx_fpa_poolx_int_s {
+               u64 reserved_4_63 : 60;
+               u64 thresh : 1;
+               u64 range : 1;
+               u64 crcerr : 1;
+               u64 ovfls : 1;
+       } s;
+       struct cvmx_fpa_poolx_int_s cn73xx;
+       struct cvmx_fpa_poolx_int_s cn78xx;
+       struct cvmx_fpa_poolx_int_s cn78xxp1;
+       struct cvmx_fpa_poolx_int_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_int cvmx_fpa_poolx_int_t;
+
+/**
+ * cvmx_fpa_pool#_op_pc
+ */
+union cvmx_fpa_poolx_op_pc {
+       u64 u64;
+       struct cvmx_fpa_poolx_op_pc_s {
+               u64 count : 64;
+       } s;
+       struct cvmx_fpa_poolx_op_pc_s cn73xx;
+       struct cvmx_fpa_poolx_op_pc_s cn78xx;
+       struct cvmx_fpa_poolx_op_pc_s cn78xxp1;
+       struct cvmx_fpa_poolx_op_pc_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_op_pc cvmx_fpa_poolx_op_pc_t;
+
+/**
+ * cvmx_fpa_pool#_stack_addr
+ */
+union cvmx_fpa_poolx_stack_addr {
+       u64 u64;
+       struct cvmx_fpa_poolx_stack_addr_s {
+               u64 reserved_42_63 : 22;
+               u64 addr : 35;
+               u64 reserved_0_6 : 7;
+       } s;
+       struct cvmx_fpa_poolx_stack_addr_s cn73xx;
+       struct cvmx_fpa_poolx_stack_addr_s cn78xx;
+       struct cvmx_fpa_poolx_stack_addr_s cn78xxp1;
+       struct cvmx_fpa_poolx_stack_addr_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_stack_addr cvmx_fpa_poolx_stack_addr_t;
+
+/**
+ * cvmx_fpa_pool#_stack_base
+ */
+union cvmx_fpa_poolx_stack_base {
+       u64 u64;
+       struct cvmx_fpa_poolx_stack_base_s {
+               u64 reserved_42_63 : 22;
+               u64 addr : 35;
+               u64 reserved_0_6 : 7;
+       } s;
+       struct cvmx_fpa_poolx_stack_base_s cn73xx;
+       struct cvmx_fpa_poolx_stack_base_s cn78xx;
+       struct cvmx_fpa_poolx_stack_base_s cn78xxp1;
+       struct cvmx_fpa_poolx_stack_base_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_stack_base cvmx_fpa_poolx_stack_base_t;
+
+/**
+ * cvmx_fpa_pool#_stack_end
+ */
+union cvmx_fpa_poolx_stack_end {
+       u64 u64;
+       struct cvmx_fpa_poolx_stack_end_s {
+               u64 reserved_42_63 : 22;
+               u64 addr : 35;
+               u64 reserved_0_6 : 7;
+       } s;
+       struct cvmx_fpa_poolx_stack_end_s cn73xx;
+       struct cvmx_fpa_poolx_stack_end_s cn78xx;
+       struct cvmx_fpa_poolx_stack_end_s cn78xxp1;
+       struct cvmx_fpa_poolx_stack_end_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_stack_end cvmx_fpa_poolx_stack_end_t;
+
+/**
+ * cvmx_fpa_pool#_start_addr
+ *
+ * Pointers sent to this pool after alignment must be equal to or greater than this address.
+ *
+ */
+union cvmx_fpa_poolx_start_addr {
+       u64 u64;
+       struct cvmx_fpa_poolx_start_addr_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_fpa_poolx_start_addr_cn61xx {
+               u64 reserved_33_63 : 31;
+               u64 addr : 33;
+       } cn61xx;
+       struct cvmx_fpa_poolx_start_addr_cn61xx cn66xx;
+       struct cvmx_fpa_poolx_start_addr_cn61xx cn68xx;
+       struct cvmx_fpa_poolx_start_addr_cn61xx cn68xxp1;
+       struct cvmx_fpa_poolx_start_addr_cn61xx cn70xx;
+       struct cvmx_fpa_poolx_start_addr_cn61xx cn70xxp1;
+       struct cvmx_fpa_poolx_start_addr_cn73xx {
+               u64 reserved_42_63 : 22;
+               u64 addr : 35;
+               u64 reserved_0_6 : 7;
+       } cn73xx;
+       struct cvmx_fpa_poolx_start_addr_cn73xx cn78xx;
+       struct cvmx_fpa_poolx_start_addr_cn73xx cn78xxp1;
+       struct cvmx_fpa_poolx_start_addr_cn61xx cnf71xx;
+       struct cvmx_fpa_poolx_start_addr_cn73xx cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_start_addr cvmx_fpa_poolx_start_addr_t;
+
+/**
+ * cvmx_fpa_pool#_threshold
+ *
+ * FPA_POOLX_THRESHOLD = FPA's Pool 0-7 Threshold
+ * When the value of FPA_QUEX_AVAILABLE is equal to FPA_POOLX_THRESHOLD[THRESH] when a pointer is
+ * allocated
+ * or deallocated, set interrupt FPA_INT_SUM[POOLXTH].
+ */
+union cvmx_fpa_poolx_threshold {
+       u64 u64;
+       struct cvmx_fpa_poolx_threshold_s {
+               u64 reserved_36_63 : 28;
+               u64 thresh : 36;
+       } s;
+       struct cvmx_fpa_poolx_threshold_cn61xx {
+               u64 reserved_29_63 : 35;
+               u64 thresh : 29;
+       } cn61xx;
+       struct cvmx_fpa_poolx_threshold_cn61xx cn63xx;
+       struct cvmx_fpa_poolx_threshold_cn61xx cn66xx;
+       struct cvmx_fpa_poolx_threshold_cn68xx {
+               u64 reserved_32_63 : 32;
+               u64 thresh : 32;
+       } cn68xx;
+       struct cvmx_fpa_poolx_threshold_cn68xx cn68xxp1;
+       struct cvmx_fpa_poolx_threshold_cn61xx cn70xx;
+       struct cvmx_fpa_poolx_threshold_cn61xx cn70xxp1;
+       struct cvmx_fpa_poolx_threshold_s cn73xx;
+       struct cvmx_fpa_poolx_threshold_s cn78xx;
+       struct cvmx_fpa_poolx_threshold_s cn78xxp1;
+       struct cvmx_fpa_poolx_threshold_cn61xx cnf71xx;
+       struct cvmx_fpa_poolx_threshold_s cnf75xx;
+};
+
+typedef union cvmx_fpa_poolx_threshold cvmx_fpa_poolx_threshold_t;
+
+/**
+ * cvmx_fpa_que#_available
+ *
+ * FPA_QUEX_PAGES_AVAILABLE = FPA's Queue 0-7 Free Page Available Register
+ * The number of page pointers that are available in the FPA and local DRAM.
+ */
+union cvmx_fpa_quex_available {
+       u64 u64;
+       struct cvmx_fpa_quex_available_s {
+               u64 reserved_32_63 : 32;
+               u64 que_siz : 32;
+       } s;
+       struct cvmx_fpa_quex_available_cn30xx {
+               u64 reserved_29_63 : 35;
+               u64 que_siz : 29;
+       } cn30xx;
+       struct cvmx_fpa_quex_available_cn30xx cn31xx;
+       struct cvmx_fpa_quex_available_cn30xx cn38xx;
+       struct cvmx_fpa_quex_available_cn30xx cn38xxp2;
+       struct cvmx_fpa_quex_available_cn30xx cn50xx;
+       struct cvmx_fpa_quex_available_cn30xx cn52xx;
+       struct cvmx_fpa_quex_available_cn30xx cn52xxp1;
+       struct cvmx_fpa_quex_available_cn30xx cn56xx;
+       struct cvmx_fpa_quex_available_cn30xx cn56xxp1;
+       struct cvmx_fpa_quex_available_cn30xx cn58xx;
+       struct cvmx_fpa_quex_available_cn30xx cn58xxp1;
+       struct cvmx_fpa_quex_available_cn30xx cn61xx;
+       struct cvmx_fpa_quex_available_cn30xx cn63xx;
+       struct cvmx_fpa_quex_available_cn30xx cn63xxp1;
+       struct cvmx_fpa_quex_available_cn30xx cn66xx;
+       struct cvmx_fpa_quex_available_s cn68xx;
+       struct cvmx_fpa_quex_available_s cn68xxp1;
+       struct cvmx_fpa_quex_available_cn30xx cn70xx;
+       struct cvmx_fpa_quex_available_cn30xx cn70xxp1;
+       struct cvmx_fpa_quex_available_cn30xx cnf71xx;
+};
+
+typedef union cvmx_fpa_quex_available cvmx_fpa_quex_available_t;
+
+/**
+ * cvmx_fpa_que#_page_index
+ *
+ * The present index page for queue 0 of the FPA.
+ * This number reflects the number of pages of pointers that have been written to memory
+ * for this queue.
+ */
+union cvmx_fpa_quex_page_index {
+       u64 u64;
+       struct cvmx_fpa_quex_page_index_s {
+               u64 reserved_25_63 : 39;
+               u64 pg_num : 25;
+       } s;
+       struct cvmx_fpa_quex_page_index_s cn30xx;
+       struct cvmx_fpa_quex_page_index_s cn31xx;
+       struct cvmx_fpa_quex_page_index_s cn38xx;
+       struct cvmx_fpa_quex_page_index_s cn38xxp2;
+       struct cvmx_fpa_quex_page_index_s cn50xx;
+       struct cvmx_fpa_quex_page_index_s cn52xx;
+       struct cvmx_fpa_quex_page_index_s cn52xxp1;
+       struct cvmx_fpa_quex_page_index_s cn56xx;
+       struct cvmx_fpa_quex_page_index_s cn56xxp1;
+       struct cvmx_fpa_quex_page_index_s cn58xx;
+       struct cvmx_fpa_quex_page_index_s cn58xxp1;
+       struct cvmx_fpa_quex_page_index_s cn61xx;
+       struct cvmx_fpa_quex_page_index_s cn63xx;
+       struct cvmx_fpa_quex_page_index_s cn63xxp1;
+       struct cvmx_fpa_quex_page_index_s cn66xx;
+       struct cvmx_fpa_quex_page_index_s cn68xx;
+       struct cvmx_fpa_quex_page_index_s cn68xxp1;
+       struct cvmx_fpa_quex_page_index_s cn70xx;
+       struct cvmx_fpa_quex_page_index_s cn70xxp1;
+       struct cvmx_fpa_quex_page_index_s cnf71xx;
+};
+
+typedef union cvmx_fpa_quex_page_index cvmx_fpa_quex_page_index_t;
+
+/**
+ * cvmx_fpa_que8_page_index
+ *
+ * FPA_QUE8_PAGE_INDEX = FPA's Queue7 Page Index
+ *
+ * The present index page for queue 7 of the FPA.
+ * This number reflects the number of pages of pointers that have been written to memory
+ * for this queue.
+ * Because the address space is 38-bits the number of 128 byte pages could cause this register value to wrap.
+ */
+union cvmx_fpa_que8_page_index {
+       u64 u64;
+       struct cvmx_fpa_que8_page_index_s {
+               u64 reserved_25_63 : 39;
+               u64 pg_num : 25;
+       } s;
+       struct cvmx_fpa_que8_page_index_s cn68xx;
+       struct cvmx_fpa_que8_page_index_s cn68xxp1;
+};
+
+typedef union cvmx_fpa_que8_page_index cvmx_fpa_que8_page_index_t;
+
+/**
+ * cvmx_fpa_que_act
+ *
+ * "When a INT_SUM[PERR#] occurs this will be latched with the value read from L2C.
+ * This is latched on the first error and will not latch again unitl all errors are cleared."
+ */
+union cvmx_fpa_que_act {
+       u64 u64;
+       struct cvmx_fpa_que_act_s {
+               u64 reserved_29_63 : 35;
+               u64 act_que : 3;
+               u64 act_indx : 26;
+       } s;
+       struct cvmx_fpa_que_act_s cn30xx;
+       struct cvmx_fpa_que_act_s cn31xx;
+       struct cvmx_fpa_que_act_s cn38xx;
+       struct cvmx_fpa_que_act_s cn38xxp2;
+       struct cvmx_fpa_que_act_s cn50xx;
+       struct cvmx_fpa_que_act_s cn52xx;
+       struct cvmx_fpa_que_act_s cn52xxp1;
+       struct cvmx_fpa_que_act_s cn56xx;
+       struct cvmx_fpa_que_act_s cn56xxp1;
+       struct cvmx_fpa_que_act_s cn58xx;
+       struct cvmx_fpa_que_act_s cn58xxp1;
+       struct cvmx_fpa_que_act_s cn61xx;
+       struct cvmx_fpa_que_act_s cn63xx;
+       struct cvmx_fpa_que_act_s cn63xxp1;
+       struct cvmx_fpa_que_act_s cn66xx;
+       struct cvmx_fpa_que_act_s cn68xx;
+       struct cvmx_fpa_que_act_s cn68xxp1;
+       struct cvmx_fpa_que_act_s cn70xx;
+       struct cvmx_fpa_que_act_s cn70xxp1;
+       struct cvmx_fpa_que_act_s cnf71xx;
+};
+
+typedef union cvmx_fpa_que_act cvmx_fpa_que_act_t;
+
+/**
+ * cvmx_fpa_que_exp
+ *
+ * "When a INT_SUM[PERR#] occurs this will be latched with the expected value.
+ * This is latched on the first error and will not latch again unitl all errors are cleared."
+ */
+union cvmx_fpa_que_exp {
+       u64 u64;
+       struct cvmx_fpa_que_exp_s {
+               u64 reserved_29_63 : 35;
+               u64 exp_que : 3;
+               u64 exp_indx : 26;
+       } s;
+       struct cvmx_fpa_que_exp_s cn30xx;
+       struct cvmx_fpa_que_exp_s cn31xx;
+       struct cvmx_fpa_que_exp_s cn38xx;
+       struct cvmx_fpa_que_exp_s cn38xxp2;
+       struct cvmx_fpa_que_exp_s cn50xx;
+       struct cvmx_fpa_que_exp_s cn52xx;
+       struct cvmx_fpa_que_exp_s cn52xxp1;
+       struct cvmx_fpa_que_exp_s cn56xx;
+       struct cvmx_fpa_que_exp_s cn56xxp1;
+       struct cvmx_fpa_que_exp_s cn58xx;
+       struct cvmx_fpa_que_exp_s cn58xxp1;
+       struct cvmx_fpa_que_exp_s cn61xx;
+       struct cvmx_fpa_que_exp_s cn63xx;
+       struct cvmx_fpa_que_exp_s cn63xxp1;
+       struct cvmx_fpa_que_exp_s cn66xx;
+       struct cvmx_fpa_que_exp_s cn68xx;
+       struct cvmx_fpa_que_exp_s cn68xxp1;
+       struct cvmx_fpa_que_exp_s cn70xx;
+       struct cvmx_fpa_que_exp_s cn70xxp1;
+       struct cvmx_fpa_que_exp_s cnf71xx;
+};
+
+typedef union cvmx_fpa_que_exp cvmx_fpa_que_exp_t;
+
+/**
+ * cvmx_fpa_rd_latency_pc
+ */
+union cvmx_fpa_rd_latency_pc {
+       u64 u64;
+       struct cvmx_fpa_rd_latency_pc_s {
+               u64 count : 64;
+       } s;
+       struct cvmx_fpa_rd_latency_pc_s cn73xx;
+       struct cvmx_fpa_rd_latency_pc_s cn78xx;
+       struct cvmx_fpa_rd_latency_pc_s cn78xxp1;
+       struct cvmx_fpa_rd_latency_pc_s cnf75xx;
+};
+
+typedef union cvmx_fpa_rd_latency_pc cvmx_fpa_rd_latency_pc_t;
+
+/**
+ * cvmx_fpa_rd_req_pc
+ */
+union cvmx_fpa_rd_req_pc {
+       u64 u64;
+       struct cvmx_fpa_rd_req_pc_s {
+               u64 count : 64;
+       } s;
+       struct cvmx_fpa_rd_req_pc_s cn73xx;
+       struct cvmx_fpa_rd_req_pc_s cn78xx;
+       struct cvmx_fpa_rd_req_pc_s cn78xxp1;
+       struct cvmx_fpa_rd_req_pc_s cnf75xx;
+};
+
+typedef union cvmx_fpa_rd_req_pc cvmx_fpa_rd_req_pc_t;
+
+/**
+ * cvmx_fpa_red_delay
+ */
+union cvmx_fpa_red_delay {
+       u64 u64;
+       struct cvmx_fpa_red_delay_s {
+               u64 reserved_14_63 : 50;
+               u64 avg_dly : 14;
+       } s;
+       struct cvmx_fpa_red_delay_s cn73xx;
+       struct cvmx_fpa_red_delay_s cn78xx;
+       struct cvmx_fpa_red_delay_s cn78xxp1;
+       struct cvmx_fpa_red_delay_s cnf75xx;
+};
+
+typedef union cvmx_fpa_red_delay cvmx_fpa_red_delay_t;
+
+/**
+ * cvmx_fpa_sft_rst
+ *
+ * Allows soft reset.
+ *
+ */
+union cvmx_fpa_sft_rst {
+       u64 u64;
+       struct cvmx_fpa_sft_rst_s {
+               u64 busy : 1;
+               u64 reserved_1_62 : 62;
+               u64 rst : 1;
+       } s;
+       struct cvmx_fpa_sft_rst_s cn73xx;
+       struct cvmx_fpa_sft_rst_s cn78xx;
+       struct cvmx_fpa_sft_rst_s cn78xxp1;
+       struct cvmx_fpa_sft_rst_s cnf75xx;
+};
+
+typedef union cvmx_fpa_sft_rst cvmx_fpa_sft_rst_t;
+
+/**
+ * cvmx_fpa_wart_ctl
+ *
+ * FPA_WART_CTL = FPA's WART Control
+ *
+ * Control and status for the WART block.
+ */
+union cvmx_fpa_wart_ctl {
+       u64 u64;
+       struct cvmx_fpa_wart_ctl_s {
+               u64 reserved_16_63 : 48;
+               u64 ctl : 16;
+       } s;
+       struct cvmx_fpa_wart_ctl_s cn30xx;
+       struct cvmx_fpa_wart_ctl_s cn31xx;
+       struct cvmx_fpa_wart_ctl_s cn38xx;
+       struct cvmx_fpa_wart_ctl_s cn38xxp2;
+       struct cvmx_fpa_wart_ctl_s cn50xx;
+       struct cvmx_fpa_wart_ctl_s cn52xx;
+       struct cvmx_fpa_wart_ctl_s cn52xxp1;
+       struct cvmx_fpa_wart_ctl_s cn56xx;
+       struct cvmx_fpa_wart_ctl_s cn56xxp1;
+       struct cvmx_fpa_wart_ctl_s cn58xx;
+       struct cvmx_fpa_wart_ctl_s cn58xxp1;
+};
+
+typedef union cvmx_fpa_wart_ctl cvmx_fpa_wart_ctl_t;
+
+/**
+ * cvmx_fpa_wart_status
+ *
+ * FPA_WART_STATUS = FPA's WART Status
+ *
+ * Control and status for the WART block.
+ */
+union cvmx_fpa_wart_status {
+       u64 u64;
+       struct cvmx_fpa_wart_status_s {
+               u64 reserved_32_63 : 32;
+               u64 status : 32;
+       } s;
+       struct cvmx_fpa_wart_status_s cn30xx;
+       struct cvmx_fpa_wart_status_s cn31xx;
+       struct cvmx_fpa_wart_status_s cn38xx;
+       struct cvmx_fpa_wart_status_s cn38xxp2;
+       struct cvmx_fpa_wart_status_s cn50xx;
+       struct cvmx_fpa_wart_status_s cn52xx;
+       struct cvmx_fpa_wart_status_s cn52xxp1;
+       struct cvmx_fpa_wart_status_s cn56xx;
+       struct cvmx_fpa_wart_status_s cn56xxp1;
+       struct cvmx_fpa_wart_status_s cn58xx;
+       struct cvmx_fpa_wart_status_s cn58xxp1;
+};
+
+typedef union cvmx_fpa_wart_status cvmx_fpa_wart_status_t;
+
+/**
+ * cvmx_fpa_wqe_threshold
+ *
+ * "When the value of FPA_QUE#_AVAILABLE[QUE_SIZ] (\# is determined by the value of
+ * IPD_WQE_FPA_QUEUE) is Less than the value of this
+ * register a low pool count signal is sent to the PCIe packet instruction engine (to make it
+ * stop reading instructions) and to the
+ * Packet-Arbiter informing it to not give grants to packets MAC with the exception of the PCIe
+ * MAC."
+ */
+union cvmx_fpa_wqe_threshold {
+       u64 u64;
+       struct cvmx_fpa_wqe_threshold_s {
+               u64 reserved_32_63 : 32;
+               u64 thresh : 32;
+       } s;
+       struct cvmx_fpa_wqe_threshold_s cn61xx;
+       struct cvmx_fpa_wqe_threshold_s cn63xx;
+       struct cvmx_fpa_wqe_threshold_s cn66xx;
+       struct cvmx_fpa_wqe_threshold_s cn68xx;
+       struct cvmx_fpa_wqe_threshold_s cn68xxp1;
+       struct cvmx_fpa_wqe_threshold_s cn70xx;
+       struct cvmx_fpa_wqe_threshold_s cn70xxp1;
+       struct cvmx_fpa_wqe_threshold_s cnf71xx;
+};
+
+typedef union cvmx_fpa_wqe_threshold cvmx_fpa_wqe_threshold_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-fpa.h b/arch/mips/mach-octeon/include/mach/cvmx-fpa.h
new file mode 100644 (file)
index 0000000..297fb3f
--- /dev/null
@@ -0,0 +1,217 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Free Pool Allocator.
+ */
+
+#ifndef __CVMX_FPA_H__
+#define __CVMX_FPA_H__
+
+#include "cvmx-scratch.h"
+#include "cvmx-fpa-defs.h"
+#include "cvmx-fpa1.h"
+#include "cvmx-fpa3.h"
+
+#define CVMX_FPA_MIN_BLOCK_SIZE 128
+#define CVMX_FPA_ALIGNMENT     128
+#define CVMX_FPA_POOL_NAME_LEN 16
+
+/* On CN78XX in backward-compatible mode, pool is mapped to AURA */
+#define CVMX_FPA_NUM_POOLS                                                                         \
+       (octeon_has_feature(OCTEON_FEATURE_FPA3) ? cvmx_fpa3_num_auras() : CVMX_FPA1_NUM_POOLS)
+
+/**
+ * Structure to store FPA pool configuration parameters.
+ */
+struct cvmx_fpa_pool_config {
+       s64 pool_num;
+       u64 buffer_size;
+       u64 buffer_count;
+};
+
+typedef struct cvmx_fpa_pool_config cvmx_fpa_pool_config_t;
+
+/**
+ * Return the name of the pool
+ *
+ * @param pool_num   Pool to get the name of
+ * @return The name
+ */
+const char *cvmx_fpa_get_name(int pool_num);
+
+/**
+ * Initialize FPA per node
+ */
+int cvmx_fpa_global_init_node(int node);
+
+/**
+ * Enable the FPA
+ */
+static inline void cvmx_fpa_enable(void)
+{
+       if (!octeon_has_feature(OCTEON_FEATURE_FPA3))
+               cvmx_fpa1_enable();
+       else
+               cvmx_fpa_global_init_node(cvmx_get_node_num());
+}
+
+/**
+ * Disable the FPA
+ */
+static inline void cvmx_fpa_disable(void)
+{
+       if (!octeon_has_feature(OCTEON_FEATURE_FPA3))
+               cvmx_fpa1_disable();
+       /* FPA3 does not have a disable function */
+}
+
+/**
+ * @INTERNAL
+ * @deprecated OBSOLETE
+ *
+ * Kept for transition assistance only
+ */
+static inline void cvmx_fpa_global_initialize(void)
+{
+       cvmx_fpa_global_init_node(cvmx_get_node_num());
+}
+
+/**
+ * @INTERNAL
+ *
+ * Convert FPA1 style POOL into FPA3 AURA in
+ * backward compatibility mode.
+ */
+static inline cvmx_fpa3_gaura_t cvmx_fpa1_pool_to_fpa3_aura(cvmx_fpa1_pool_t pool)
+{
+       if ((octeon_has_feature(OCTEON_FEATURE_FPA3))) {
+               unsigned int node = cvmx_get_node_num();
+               cvmx_fpa3_gaura_t aura = __cvmx_fpa3_gaura(node, pool);
+               return aura;
+       }
+       return CVMX_FPA3_INVALID_GAURA;
+}
+
+/**
+ * Get a new block from the FPA
+ *
+ * @param pool   Pool to get the block from
+ * @return Pointer to the block or NULL on failure
+ */
+static inline void *cvmx_fpa_alloc(u64 pool)
+{
+       /* FPA3 is handled differently */
+       if ((octeon_has_feature(OCTEON_FEATURE_FPA3))) {
+               return cvmx_fpa3_alloc(cvmx_fpa1_pool_to_fpa3_aura(pool));
+       } else
+               return cvmx_fpa1_alloc(pool);
+}
+
+/**
+ * Asynchronously get a new block from the FPA
+ *
+ * The result of cvmx_fpa_async_alloc() may be retrieved using
+ * cvmx_fpa_async_alloc_finish().
+ *
+ * @param scr_addr Local scratch address to put response in.  This is a byte
+ *                address but must be 8 byte aligned.
+ * @param pool      Pool to get the block from
+ */
+static inline void cvmx_fpa_async_alloc(u64 scr_addr, u64 pool)
+{
+       if ((octeon_has_feature(OCTEON_FEATURE_FPA3))) {
+               return cvmx_fpa3_async_alloc(scr_addr, cvmx_fpa1_pool_to_fpa3_aura(pool));
+       } else
+               return cvmx_fpa1_async_alloc(scr_addr, pool);
+}
+
+/**
+ * Retrieve the result of cvmx_fpa_async_alloc
+ *
+ * @param scr_addr The Local scratch address.  Must be the same value
+ * passed to cvmx_fpa_async_alloc().
+ *
+ * @param pool Pool the block came from.  Must be the same value
+ * passed to cvmx_fpa_async_alloc.
+ *
+ * @return Pointer to the block or NULL on failure
+ */
+static inline void *cvmx_fpa_async_alloc_finish(u64 scr_addr, u64 pool)
+{
+       if ((octeon_has_feature(OCTEON_FEATURE_FPA3)))
+               return cvmx_fpa3_async_alloc_finish(scr_addr, cvmx_fpa1_pool_to_fpa3_aura(pool));
+       else
+               return cvmx_fpa1_async_alloc_finish(scr_addr, pool);
+}
+
+/**
+ * Free a block allocated with a FPA pool.
+ * Does NOT provide memory ordering in cases where the memory block was
+ * modified by the core.
+ *
+ * @param ptr    Block to free
+ * @param pool   Pool to put it in
+ * @param num_cache_lines
+ *               Cache lines to invalidate
+ */
+static inline void cvmx_fpa_free_nosync(void *ptr, u64 pool, u64 num_cache_lines)
+{
+       /* FPA3 is handled differently */
+       if ((octeon_has_feature(OCTEON_FEATURE_FPA3)))
+               cvmx_fpa3_free_nosync(ptr, cvmx_fpa1_pool_to_fpa3_aura(pool), num_cache_lines);
+       else
+               cvmx_fpa1_free_nosync(ptr, pool, num_cache_lines);
+}
+
+/**
+ * Free a block allocated with a FPA pool.  Provides required memory
+ * ordering in cases where memory block was modified by core.
+ *
+ * @param ptr    Block to free
+ * @param pool   Pool to put it in
+ * @param num_cache_lines
+ *               Cache lines to invalidate
+ */
+static inline void cvmx_fpa_free(void *ptr, u64 pool, u64 num_cache_lines)
+{
+       if ((octeon_has_feature(OCTEON_FEATURE_FPA3)))
+               cvmx_fpa3_free(ptr, cvmx_fpa1_pool_to_fpa3_aura(pool), num_cache_lines);
+       else
+               cvmx_fpa1_free(ptr, pool, num_cache_lines);
+}
+
+/**
+ * Setup a FPA pool to control a new block of memory.
+ * This can only be called once per pool. Make sure proper
+ * locking enforces this.
+ *
+ * @param pool       Pool to initialize
+ * @param name       Constant character string to name this pool.
+ *                   String is not copied.
+ * @param buffer     Pointer to the block of memory to use. This must be
+ *                   accessible by all processors and external hardware.
+ * @param block_size Size for each block controlled by the FPA
+ * @param num_blocks Number of blocks
+ *
+ * @return the pool number on Success,
+ *         -1 on failure
+ */
+int cvmx_fpa_setup_pool(int pool, const char *name, void *buffer, u64 block_size, u64 num_blocks);
+
+int cvmx_fpa_shutdown_pool(int pool);
+
+/**
+ * Gets the block size of buffer in specified pool
+ * @param pool  Pool to get the block size from
+ * @return       Size of buffer in specified pool
+ */
+unsigned int cvmx_fpa_get_block_size(int pool);
+
+int cvmx_fpa_is_pool_available(int pool_num);
+u64 cvmx_fpa_get_pool_owner(int pool_num);
+int cvmx_fpa_get_max_pools(void);
+int cvmx_fpa_get_current_count(int pool_num);
+int cvmx_fpa_validate_pool(int pool);
+
+#endif /*  __CVM_FPA_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-fpa1.h b/arch/mips/mach-octeon/include/mach/cvmx-fpa1.h
new file mode 100644 (file)
index 0000000..6985083
--- /dev/null
@@ -0,0 +1,196 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Free Pool Allocator on Octeon chips.
+ * These are the legacy models, i.e. prior to CN78XX/CN76XX.
+ */
+
+#ifndef __CVMX_FPA1_HW_H__
+#define __CVMX_FPA1_HW_H__
+
+#include "cvmx-scratch.h"
+#include "cvmx-fpa-defs.h"
+#include "cvmx-fpa3.h"
+
+/* Legacy pool range is 0..7 and 8 on CN68XX */
+typedef int cvmx_fpa1_pool_t;
+
+#define CVMX_FPA1_NUM_POOLS    8
+#define CVMX_FPA1_INVALID_POOL ((cvmx_fpa1_pool_t)-1)
+#define CVMX_FPA1_NAME_SIZE    16
+
+/**
+ * Structure describing the data format used for stores to the FPA.
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 scraddr : 8;
+               u64 len : 8;
+               u64 did : 8;
+               u64 addr : 40;
+       } s;
+} cvmx_fpa1_iobdma_data_t;
+
+/*
+ * Allocate or reserve the specified fpa pool.
+ *
+ * @param pool   FPA pool to allocate/reserve. If -1 it
+ *                finds an empty pool to allocate.
+ * @return        Alloctaed pool number or CVMX_FPA1_POOL_INVALID
+ *                if fails to allocate the pool
+ */
+cvmx_fpa1_pool_t cvmx_fpa1_reserve_pool(cvmx_fpa1_pool_t pool);
+
+/**
+ * Free the specified fpa pool.
+ * @param pool    Pool to free
+ * @return         0 for success -1 failure
+ */
+int cvmx_fpa1_release_pool(cvmx_fpa1_pool_t pool);
+
+static inline void cvmx_fpa1_free(void *ptr, cvmx_fpa1_pool_t pool, u64 num_cache_lines)
+{
+       cvmx_addr_t newptr;
+
+       newptr.u64 = cvmx_ptr_to_phys(ptr);
+       newptr.sfilldidspace.didspace = CVMX_ADDR_DIDSPACE(CVMX_FULL_DID(CVMX_OCT_DID_FPA, pool));
+       /* Make sure that any previous writes to memory go out before we free
+        * this buffer.  This also serves as a barrier to prevent GCC from
+        * reordering operations to after the free.
+        */
+       CVMX_SYNCWS;
+       /* value written is number of cache lines not written back */
+       cvmx_write_io(newptr.u64, num_cache_lines);
+}
+
+static inline void cvmx_fpa1_free_nosync(void *ptr, cvmx_fpa1_pool_t pool,
+                                        unsigned int num_cache_lines)
+{
+       cvmx_addr_t newptr;
+
+       newptr.u64 = cvmx_ptr_to_phys(ptr);
+       newptr.sfilldidspace.didspace = CVMX_ADDR_DIDSPACE(CVMX_FULL_DID(CVMX_OCT_DID_FPA, pool));
+       /* Prevent GCC from reordering around free */
+       asm volatile("" : : : "memory");
+       /* value written is number of cache lines not written back */
+       cvmx_write_io(newptr.u64, num_cache_lines);
+}
+
+/**
+ * Enable the FPA for use. Must be performed after any CSR
+ * configuration but before any other FPA functions.
+ */
+static inline void cvmx_fpa1_enable(void)
+{
+       cvmx_fpa_ctl_status_t status;
+
+       status.u64 = csr_rd(CVMX_FPA_CTL_STATUS);
+       if (status.s.enb) {
+               /*
+                * CN68XXP1 should not reset the FPA (doing so may break
+                * the SSO, so we may end up enabling it more than once.
+                * Just return and don't spew messages.
+                */
+               return;
+       }
+
+       status.u64 = 0;
+       status.s.enb = 1;
+       csr_wr(CVMX_FPA_CTL_STATUS, status.u64);
+}
+
+/**
+ * Reset FPA to disable. Make sure buffers from all FPA pools are freed
+ * before disabling FPA.
+ */
+static inline void cvmx_fpa1_disable(void)
+{
+       cvmx_fpa_ctl_status_t status;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX_PASS1))
+               return;
+
+       status.u64 = csr_rd(CVMX_FPA_CTL_STATUS);
+       status.s.reset = 1;
+       csr_wr(CVMX_FPA_CTL_STATUS, status.u64);
+}
+
+static inline void *cvmx_fpa1_alloc(cvmx_fpa1_pool_t pool)
+{
+       u64 address;
+
+       for (;;) {
+               address = csr_rd(CVMX_ADDR_DID(CVMX_FULL_DID(CVMX_OCT_DID_FPA, pool)));
+               if (cvmx_likely(address)) {
+                       return cvmx_phys_to_ptr(address);
+               } else {
+                       if (csr_rd(CVMX_FPA_QUEX_AVAILABLE(pool)) > 0)
+                               udelay(50);
+                       else
+                               return NULL;
+               }
+       }
+}
+
+/**
+ * Asynchronously get a new block from the FPA
+ * @INTERNAL
+ *
+ * The result of cvmx_fpa_async_alloc() may be retrieved using
+ * cvmx_fpa_async_alloc_finish().
+ *
+ * @param scr_addr Local scratch address to put response in.  This is a byte
+ *                address but must be 8 byte aligned.
+ * @param pool      Pool to get the block from
+ */
+static inline void cvmx_fpa1_async_alloc(u64 scr_addr, cvmx_fpa1_pool_t pool)
+{
+       cvmx_fpa1_iobdma_data_t data;
+
+       /* Hardware only uses 64 bit aligned locations, so convert from byte
+        * address to 64-bit index
+        */
+       data.u64 = 0ull;
+       data.s.scraddr = scr_addr >> 3;
+       data.s.len = 1;
+       data.s.did = CVMX_FULL_DID(CVMX_OCT_DID_FPA, pool);
+       data.s.addr = 0;
+
+       cvmx_scratch_write64(scr_addr, 0ull);
+       CVMX_SYNCW;
+       cvmx_send_single(data.u64);
+}
+
+/**
+ * Retrieve the result of cvmx_fpa_async_alloc
+ * @INTERNAL
+ *
+ * @param scr_addr The Local scratch address.  Must be the same value
+ * passed to cvmx_fpa_async_alloc().
+ *
+ * @param pool Pool the block came from.  Must be the same value
+ * passed to cvmx_fpa_async_alloc.
+ *
+ * @return Pointer to the block or NULL on failure
+ */
+static inline void *cvmx_fpa1_async_alloc_finish(u64 scr_addr, cvmx_fpa1_pool_t pool)
+{
+       u64 address;
+
+       CVMX_SYNCIOBDMA;
+
+       address = cvmx_scratch_read64(scr_addr);
+       if (cvmx_likely(address))
+               return cvmx_phys_to_ptr(address);
+       else
+               return cvmx_fpa1_alloc(pool);
+}
+
+static inline u64 cvmx_fpa1_get_available(cvmx_fpa1_pool_t pool)
+{
+       return csr_rd(CVMX_FPA_QUEX_AVAILABLE(pool));
+}
+
+#endif /* __CVMX_FPA1_HW_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-fpa3.h b/arch/mips/mach-octeon/include/mach/cvmx-fpa3.h
new file mode 100644 (file)
index 0000000..229982b
--- /dev/null
@@ -0,0 +1,566 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the CN78XX Free Pool Allocator, a.k.a. FPA3
+ */
+
+#include "cvmx-address.h"
+#include "cvmx-fpa-defs.h"
+#include "cvmx-scratch.h"
+
+#ifndef __CVMX_FPA3_H__
+#define __CVMX_FPA3_H__
+
+typedef struct {
+       unsigned res0 : 6;
+       unsigned node : 2;
+       unsigned res1 : 2;
+       unsigned lpool : 6;
+       unsigned valid_magic : 16;
+} cvmx_fpa3_pool_t;
+
+typedef struct {
+       unsigned res0 : 6;
+       unsigned node : 2;
+       unsigned res1 : 6;
+       unsigned laura : 10;
+       unsigned valid_magic : 16;
+} cvmx_fpa3_gaura_t;
+
+#define CVMX_FPA3_VALID_MAGIC  0xf9a3
+#define CVMX_FPA3_INVALID_GAURA ((cvmx_fpa3_gaura_t){ 0, 0, 0, 0, 0 })
+#define CVMX_FPA3_INVALID_POOL ((cvmx_fpa3_pool_t){ 0, 0, 0, 0, 0 })
+
+static inline bool __cvmx_fpa3_aura_valid(cvmx_fpa3_gaura_t aura)
+{
+       if (aura.valid_magic != CVMX_FPA3_VALID_MAGIC)
+               return false;
+       return true;
+}
+
+static inline bool __cvmx_fpa3_pool_valid(cvmx_fpa3_pool_t pool)
+{
+       if (pool.valid_magic != CVMX_FPA3_VALID_MAGIC)
+               return false;
+       return true;
+}
+
+static inline cvmx_fpa3_gaura_t __cvmx_fpa3_gaura(int node, int laura)
+{
+       cvmx_fpa3_gaura_t aura;
+
+       if (node < 0)
+               node = cvmx_get_node_num();
+       if (laura < 0)
+               return CVMX_FPA3_INVALID_GAURA;
+
+       aura.node = node;
+       aura.laura = laura;
+       aura.valid_magic = CVMX_FPA3_VALID_MAGIC;
+       return aura;
+}
+
+static inline cvmx_fpa3_pool_t __cvmx_fpa3_pool(int node, int lpool)
+{
+       cvmx_fpa3_pool_t pool;
+
+       if (node < 0)
+               node = cvmx_get_node_num();
+       if (lpool < 0)
+               return CVMX_FPA3_INVALID_POOL;
+
+       pool.node = node;
+       pool.lpool = lpool;
+       pool.valid_magic = CVMX_FPA3_VALID_MAGIC;
+       return pool;
+}
+
+#undef CVMX_FPA3_VALID_MAGIC
+
+/**
+ * Structure describing the data format used for stores to the FPA.
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 scraddr : 8;
+               u64 len : 8;
+               u64 did : 8;
+               u64 addr : 40;
+       } s;
+       struct {
+               u64 scraddr : 8;
+               u64 len : 8;
+               u64 did : 8;
+               u64 node : 4;
+               u64 red : 1;
+               u64 reserved2 : 9;
+               u64 aura : 10;
+               u64 reserved3 : 16;
+       } cn78xx;
+} cvmx_fpa3_iobdma_data_t;
+
+/**
+ * Struct describing load allocate operation addresses for FPA pool.
+ */
+union cvmx_fpa3_load_data {
+       u64 u64;
+       struct {
+               u64 seg : 2;
+               u64 reserved1 : 13;
+               u64 io : 1;
+               u64 did : 8;
+               u64 node : 4;
+               u64 red : 1;
+               u64 reserved2 : 9;
+               u64 aura : 10;
+               u64 reserved3 : 16;
+       };
+};
+
+typedef union cvmx_fpa3_load_data cvmx_fpa3_load_data_t;
+
+/**
+ * Struct describing store free operation addresses from FPA pool.
+ */
+union cvmx_fpa3_store_addr {
+       u64 u64;
+       struct {
+               u64 seg : 2;
+               u64 reserved1 : 13;
+               u64 io : 1;
+               u64 did : 8;
+               u64 node : 4;
+               u64 reserved2 : 10;
+               u64 aura : 10;
+               u64 fabs : 1;
+               u64 reserved3 : 3;
+               u64 dwb_count : 9;
+               u64 reserved4 : 3;
+       };
+};
+
+typedef union cvmx_fpa3_store_addr cvmx_fpa3_store_addr_t;
+
+enum cvmx_fpa3_pool_alignment_e {
+       FPA_NATURAL_ALIGNMENT,
+       FPA_OFFSET_ALIGNMENT,
+       FPA_OPAQUE_ALIGNMENT
+};
+
+#define CVMX_FPA3_AURAX_LIMIT_MAX ((1ull << 40) - 1)
+
+/**
+ * @INTERNAL
+ * Accessor functions to return number of POOLS in an FPA3
+ * depending on SoC model.
+ * The number is per-node for models supporting multi-node configurations.
+ */
+static inline int cvmx_fpa3_num_pools(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 64;
+       if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return 32;
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return 32;
+       printf("ERROR: %s: Unknowm model\n", __func__);
+       return -1;
+}
+
+/**
+ * @INTERNAL
+ * Accessor functions to return number of AURAS in an FPA3
+ * depending on SoC model.
+ * The number is per-node for models supporting multi-node configurations.
+ */
+static inline int cvmx_fpa3_num_auras(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 1024;
+       if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return 512;
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return 512;
+       printf("ERROR: %s: Unknowm model\n", __func__);
+       return -1;
+}
+
+/**
+ * Get the FPA3 POOL underneath FPA3 AURA, containing all its buffers
+ *
+ */
+static inline cvmx_fpa3_pool_t cvmx_fpa3_aura_to_pool(cvmx_fpa3_gaura_t aura)
+{
+       cvmx_fpa3_pool_t pool;
+       cvmx_fpa_aurax_pool_t aurax_pool;
+
+       aurax_pool.u64 = cvmx_read_csr_node(aura.node, CVMX_FPA_AURAX_POOL(aura.laura));
+
+       pool = __cvmx_fpa3_pool(aura.node, aurax_pool.s.pool);
+       return pool;
+}
+
+/**
+ * Get a new block from the FPA pool
+ *
+ * @param aura  - aura number
+ * @return pointer to the block or NULL on failure
+ */
+static inline void *cvmx_fpa3_alloc(cvmx_fpa3_gaura_t aura)
+{
+       u64 address;
+       cvmx_fpa3_load_data_t load_addr;
+
+       load_addr.u64 = 0;
+       load_addr.seg = CVMX_MIPS_SPACE_XKPHYS;
+       load_addr.io = 1;
+       load_addr.did = 0x29; /* Device ID. Indicates FPA. */
+       load_addr.node = aura.node;
+       load_addr.red = 0; /* Perform RED on allocation.
+                                 * FIXME to use config option
+                                 */
+       load_addr.aura = aura.laura;
+
+       address = cvmx_read64_uint64(load_addr.u64);
+       if (!address)
+               return NULL;
+       return cvmx_phys_to_ptr(address);
+}
+
+/**
+ * Asynchronously get a new block from the FPA
+ *
+ * The result of cvmx_fpa_async_alloc() may be retrieved using
+ * cvmx_fpa_async_alloc_finish().
+ *
+ * @param scr_addr Local scratch address to put response in.  This is a byte
+ *                address but must be 8 byte aligned.
+ * @param aura     Global aura to get the block from
+ */
+static inline void cvmx_fpa3_async_alloc(u64 scr_addr, cvmx_fpa3_gaura_t aura)
+{
+       cvmx_fpa3_iobdma_data_t data;
+
+       /* Hardware only uses 64 bit aligned locations, so convert from byte
+        * address to 64-bit index
+        */
+       data.u64 = 0ull;
+       data.cn78xx.scraddr = scr_addr >> 3;
+       data.cn78xx.len = 1;
+       data.cn78xx.did = 0x29;
+       data.cn78xx.node = aura.node;
+       data.cn78xx.aura = aura.laura;
+       cvmx_scratch_write64(scr_addr, 0ull);
+
+       CVMX_SYNCW;
+       cvmx_send_single(data.u64);
+}
+
+/**
+ * Retrieve the result of cvmx_fpa3_async_alloc
+ *
+ * @param scr_addr The Local scratch address.  Must be the same value
+ * passed to cvmx_fpa_async_alloc().
+ *
+ * @param aura Global aura the block came from.  Must be the same value
+ * passed to cvmx_fpa_async_alloc.
+ *
+ * @return Pointer to the block or NULL on failure
+ */
+static inline void *cvmx_fpa3_async_alloc_finish(u64 scr_addr, cvmx_fpa3_gaura_t aura)
+{
+       u64 address;
+
+       CVMX_SYNCIOBDMA;
+
+       address = cvmx_scratch_read64(scr_addr);
+       if (cvmx_likely(address))
+               return cvmx_phys_to_ptr(address);
+       else
+               /* Try regular alloc if async failed */
+               return cvmx_fpa3_alloc(aura);
+}
+
+/**
+ * Free a pointer back to the pool.
+ *
+ * @param aura   global aura number
+ * @param ptr    physical address of block to free.
+ * @param num_cache_lines Cache lines to invalidate
+ */
+static inline void cvmx_fpa3_free(void *ptr, cvmx_fpa3_gaura_t aura, unsigned int num_cache_lines)
+{
+       cvmx_fpa3_store_addr_t newptr;
+       cvmx_addr_t newdata;
+
+       newdata.u64 = cvmx_ptr_to_phys(ptr);
+
+       /* Make sure that any previous writes to memory go out before we free
+          this buffer. This also serves as a barrier to prevent GCC from
+          reordering operations to after the free. */
+       CVMX_SYNCWS;
+
+       newptr.u64 = 0;
+       newptr.seg = CVMX_MIPS_SPACE_XKPHYS;
+       newptr.io = 1;
+       newptr.did = 0x29; /* Device id, indicates FPA */
+       newptr.node = aura.node;
+       newptr.aura = aura.laura;
+       newptr.fabs = 0; /* Free absolute. FIXME to use config option */
+       newptr.dwb_count = num_cache_lines;
+
+       cvmx_write_io(newptr.u64, newdata.u64);
+}
+
+/**
+ * Free a pointer back to the pool without flushing the write buffer.
+ *
+ * @param aura   global aura number
+ * @param ptr    physical address of block to free.
+ * @param num_cache_lines Cache lines to invalidate
+ */
+static inline void cvmx_fpa3_free_nosync(void *ptr, cvmx_fpa3_gaura_t aura,
+                                        unsigned int num_cache_lines)
+{
+       cvmx_fpa3_store_addr_t newptr;
+       cvmx_addr_t newdata;
+
+       newdata.u64 = cvmx_ptr_to_phys(ptr);
+
+       /* Prevent GCC from reordering writes to (*ptr) */
+       asm volatile("" : : : "memory");
+
+       newptr.u64 = 0;
+       newptr.seg = CVMX_MIPS_SPACE_XKPHYS;
+       newptr.io = 1;
+       newptr.did = 0x29; /* Device id, indicates FPA */
+       newptr.node = aura.node;
+       newptr.aura = aura.laura;
+       newptr.fabs = 0; /* Free absolute. FIXME to use config option */
+       newptr.dwb_count = num_cache_lines;
+
+       cvmx_write_io(newptr.u64, newdata.u64);
+}
+
+static inline int cvmx_fpa3_pool_is_enabled(cvmx_fpa3_pool_t pool)
+{
+       cvmx_fpa_poolx_cfg_t pool_cfg;
+
+       if (!__cvmx_fpa3_pool_valid(pool))
+               return -1;
+
+       pool_cfg.u64 = cvmx_read_csr_node(pool.node, CVMX_FPA_POOLX_CFG(pool.lpool));
+       return pool_cfg.cn78xx.ena;
+}
+
+static inline int cvmx_fpa3_config_red_params(unsigned int node, int qos_avg_en, int red_lvl_dly,
+                                             int avg_dly)
+{
+       cvmx_fpa_gen_cfg_t fpa_cfg;
+       cvmx_fpa_red_delay_t red_delay;
+
+       fpa_cfg.u64 = cvmx_read_csr_node(node, CVMX_FPA_GEN_CFG);
+       fpa_cfg.s.avg_en = qos_avg_en;
+       fpa_cfg.s.lvl_dly = red_lvl_dly;
+       cvmx_write_csr_node(node, CVMX_FPA_GEN_CFG, fpa_cfg.u64);
+
+       red_delay.u64 = cvmx_read_csr_node(node, CVMX_FPA_RED_DELAY);
+       red_delay.s.avg_dly = avg_dly;
+       cvmx_write_csr_node(node, CVMX_FPA_RED_DELAY, red_delay.u64);
+       return 0;
+}
+
+/**
+ * Gets the buffer size of the specified pool,
+ *
+ * @param aura Global aura number
+ * @return Returns size of the buffers in the specified pool.
+ */
+static inline int cvmx_fpa3_get_aura_buf_size(cvmx_fpa3_gaura_t aura)
+{
+       cvmx_fpa3_pool_t pool;
+       cvmx_fpa_poolx_cfg_t pool_cfg;
+       int block_size;
+
+       pool = cvmx_fpa3_aura_to_pool(aura);
+
+       pool_cfg.u64 = cvmx_read_csr_node(pool.node, CVMX_FPA_POOLX_CFG(pool.lpool));
+       block_size = pool_cfg.cn78xx.buf_size << 7;
+       return block_size;
+}
+
+/**
+ * Return the number of available buffers in an AURA
+ *
+ * @param aura to receive count for
+ * @return available buffer count
+ */
+static inline long long cvmx_fpa3_get_available(cvmx_fpa3_gaura_t aura)
+{
+       cvmx_fpa3_pool_t pool;
+       cvmx_fpa_poolx_available_t avail_reg;
+       cvmx_fpa_aurax_cnt_t cnt_reg;
+       cvmx_fpa_aurax_cnt_limit_t limit_reg;
+       long long ret;
+
+       pool = cvmx_fpa3_aura_to_pool(aura);
+
+       /* Get POOL available buffer count */
+       avail_reg.u64 = cvmx_read_csr_node(pool.node, CVMX_FPA_POOLX_AVAILABLE(pool.lpool));
+
+       /* Get AURA current available count */
+       cnt_reg.u64 = cvmx_read_csr_node(aura.node, CVMX_FPA_AURAX_CNT(aura.laura));
+       limit_reg.u64 = cvmx_read_csr_node(aura.node, CVMX_FPA_AURAX_CNT_LIMIT(aura.laura));
+
+       if (limit_reg.cn78xx.limit < cnt_reg.cn78xx.cnt)
+               return 0;
+
+       /* Calculate AURA-based buffer allowance */
+       ret = limit_reg.cn78xx.limit - cnt_reg.cn78xx.cnt;
+
+       /* Use POOL real buffer availability when less then allowance */
+       if (ret > (long long)avail_reg.cn78xx.count)
+               ret = avail_reg.cn78xx.count;
+
+       return ret;
+}
+
+/**
+ * Configure the QoS parameters of an FPA3 AURA
+ *
+ * @param aura is the FPA3 AURA handle
+ * @param ena_bp enables backpressure when outstanding count exceeds 'bp_thresh'
+ * @param ena_red enables random early discard when outstanding count exceeds 'pass_thresh'
+ * @param pass_thresh is the maximum count to invoke flow control
+ * @param drop_thresh is the count threshold to begin dropping packets
+ * @param bp_thresh is the back-pressure threshold
+ *
+ */
+static inline void cvmx_fpa3_setup_aura_qos(cvmx_fpa3_gaura_t aura, bool ena_red, u64 pass_thresh,
+                                           u64 drop_thresh, bool ena_bp, u64 bp_thresh)
+{
+       unsigned int shift = 0;
+       u64 shift_thresh;
+       cvmx_fpa_aurax_cnt_limit_t limit_reg;
+       cvmx_fpa_aurax_cnt_levels_t aura_level;
+
+       if (!__cvmx_fpa3_aura_valid(aura))
+               return;
+
+       /* Get AURAX count limit for validation */
+       limit_reg.u64 = cvmx_read_csr_node(aura.node, CVMX_FPA_AURAX_CNT_LIMIT(aura.laura));
+
+       if (pass_thresh < 256)
+               pass_thresh = 255;
+
+       if (drop_thresh <= pass_thresh || drop_thresh > limit_reg.cn78xx.limit)
+               drop_thresh = limit_reg.cn78xx.limit;
+
+       if (bp_thresh < 256 || bp_thresh > limit_reg.cn78xx.limit)
+               bp_thresh = limit_reg.cn78xx.limit >> 1;
+
+       shift_thresh = (bp_thresh > drop_thresh) ? bp_thresh : drop_thresh;
+
+       /* Calculate shift so that the largest threshold fits in 8 bits */
+       for (shift = 0; shift < (1 << 6); shift++) {
+               if (0 == ((shift_thresh >> shift) & ~0xffull))
+                       break;
+       };
+
+       aura_level.u64 = cvmx_read_csr_node(aura.node, CVMX_FPA_AURAX_CNT_LEVELS(aura.laura));
+       aura_level.s.pass = pass_thresh >> shift;
+       aura_level.s.drop = drop_thresh >> shift;
+       aura_level.s.bp = bp_thresh >> shift;
+       aura_level.s.shift = shift;
+       aura_level.s.red_ena = ena_red;
+       aura_level.s.bp_ena = ena_bp;
+       cvmx_write_csr_node(aura.node, CVMX_FPA_AURAX_CNT_LEVELS(aura.laura), aura_level.u64);
+}
+
+cvmx_fpa3_gaura_t cvmx_fpa3_reserve_aura(int node, int desired_aura_num);
+int cvmx_fpa3_release_aura(cvmx_fpa3_gaura_t aura);
+cvmx_fpa3_pool_t cvmx_fpa3_reserve_pool(int node, int desired_pool_num);
+int cvmx_fpa3_release_pool(cvmx_fpa3_pool_t pool);
+int cvmx_fpa3_is_aura_available(int node, int aura_num);
+int cvmx_fpa3_is_pool_available(int node, int pool_num);
+
+cvmx_fpa3_pool_t cvmx_fpa3_setup_fill_pool(int node, int desired_pool, const char *name,
+                                          unsigned int block_size, unsigned int num_blocks,
+                                          void *buffer);
+
+/**
+ * Function to attach an aura to an existing pool
+ *
+ * @param node - configure fpa on this node
+ * @param pool - configured pool to attach aura to
+ * @param desired_aura - pointer to aura to use, set to -1 to allocate
+ * @param name - name to register
+ * @param block_size - size of buffers to use
+ * @param num_blocks - number of blocks to allocate
+ *
+ * @return configured gaura on success, CVMX_FPA3_INVALID_GAURA on failure
+ */
+cvmx_fpa3_gaura_t cvmx_fpa3_set_aura_for_pool(cvmx_fpa3_pool_t pool, int desired_aura,
+                                             const char *name, unsigned int block_size,
+                                             unsigned int num_blocks);
+
+/**
+ * Function to setup and initialize a pool.
+ *
+ * @param node - configure fpa on this node
+ * @param desired_aura - aura to use, -1 for dynamic allocation
+ * @param name - name to register
+ * @param block_size - size of buffers in pool
+ * @param num_blocks - max number of buffers allowed
+ */
+cvmx_fpa3_gaura_t cvmx_fpa3_setup_aura_and_pool(int node, int desired_aura, const char *name,
+                                               void *buffer, unsigned int block_size,
+                                               unsigned int num_blocks);
+
+int cvmx_fpa3_shutdown_aura_and_pool(cvmx_fpa3_gaura_t aura);
+int cvmx_fpa3_shutdown_aura(cvmx_fpa3_gaura_t aura);
+int cvmx_fpa3_shutdown_pool(cvmx_fpa3_pool_t pool);
+const char *cvmx_fpa3_get_pool_name(cvmx_fpa3_pool_t pool);
+int cvmx_fpa3_get_pool_buf_size(cvmx_fpa3_pool_t pool);
+const char *cvmx_fpa3_get_aura_name(cvmx_fpa3_gaura_t aura);
+
+/* FIXME: Need a different macro for stage2 of u-boot */
+
+static inline void cvmx_fpa3_stage2_init(int aura, int pool, u64 stack_paddr, int stacklen,
+                                        int buffer_sz, int buf_cnt)
+{
+       cvmx_fpa_poolx_cfg_t pool_cfg;
+
+       /* Configure pool stack */
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_STACK_BASE(pool), stack_paddr);
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_STACK_ADDR(pool), stack_paddr);
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_STACK_END(pool), stack_paddr + stacklen);
+
+       /* Configure pool with buffer size */
+       pool_cfg.u64 = 0;
+       pool_cfg.cn78xx.nat_align = 1;
+       pool_cfg.cn78xx.buf_size = buffer_sz >> 7;
+       pool_cfg.cn78xx.l_type = 0x2;
+       pool_cfg.cn78xx.ena = 0;
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_CFG(pool), pool_cfg.u64);
+       /* Reset pool before starting */
+       pool_cfg.cn78xx.ena = 1;
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_CFG(pool), pool_cfg.u64);
+
+       cvmx_write_csr_node(0, CVMX_FPA_AURAX_CFG(aura), 0);
+       cvmx_write_csr_node(0, CVMX_FPA_AURAX_CNT_ADD(aura), buf_cnt);
+       cvmx_write_csr_node(0, CVMX_FPA_AURAX_POOL(aura), (u64)pool);
+}
+
+static inline void cvmx_fpa3_stage2_disable(int aura, int pool)
+{
+       cvmx_write_csr_node(0, CVMX_FPA_AURAX_POOL(aura), 0);
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_CFG(pool), 0);
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_STACK_BASE(pool), 0);
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_STACK_ADDR(pool), 0);
+       cvmx_write_csr_node(0, CVMX_FPA_POOLX_STACK_END(pool), 0);
+}
+
+#endif /* __CVMX_FPA3_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-global-resources.h b/arch/mips/mach-octeon/include/mach/cvmx-global-resources.h
new file mode 100644 (file)
index 0000000..28c32dd
--- /dev/null
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef _CVMX_GLOBAL_RESOURCES_T_
+#define _CVMX_GLOBAL_RESOURCES_T_
+
+#define CVMX_GLOBAL_RESOURCES_DATA_NAME "cvmx-global-resources"
+
+/*In macros below abbreviation GR stands for global resources. */
+#define CVMX_GR_TAG_INVALID                                                                        \
+       cvmx_get_gr_tag('i', 'n', 'v', 'a', 'l', 'i', 'd', '.', '.', '.', '.', '.', '.', '.', '.', \
+                       '.')
+/*Tag for pko que table range. */
+#define CVMX_GR_TAG_PKO_QUEUES                                                                     \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'p', 'k', 'o', '_', 'q', 'u', 'e', 'u', 's', '.', '.', \
+                       '.')
+/*Tag for a pko internal ports range */
+#define CVMX_GR_TAG_PKO_IPORTS                                                                     \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'p', 'k', 'o', '_', 'i', 'p', 'o', 'r', 't', '.', '.', \
+                       '.')
+#define CVMX_GR_TAG_FPA                                                                            \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'f', 'p', 'a', '.', '.', '.', '.', '.', '.', '.', '.', \
+                       '.')
+#define CVMX_GR_TAG_FAU                                                                            \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'f', 'a', 'u', '.', '.', '.', '.', '.', '.', '.', '.', \
+                       '.')
+#define CVMX_GR_TAG_SSO_GRP(n)                                                                     \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 's', 's', 'o', '_', '0', (n) + '0', '.', '.', '.',     \
+                       '.', '.', '.');
+#define CVMX_GR_TAG_TIM(n)                                                                         \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 't', 'i', 'm', '_', (n) + '0', '.', '.', '.', '.',     \
+                       '.', '.', '.')
+#define CVMX_GR_TAG_CLUSTERS(x)                                                                    \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', (x + '0'),     \
+                       '.', '.', '.')
+#define CVMX_GR_TAG_CLUSTER_GRP(x)                                                                 \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'l', 'g', 'r', 'p', '_', (x + '0'), '.', '.',     \
+                       '.', '.', '.')
+#define CVMX_GR_TAG_STYLE(x)                                                                       \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 's', 't', 'y', 'l', 'e', '_', (x + '0'), '.', '.',     \
+                       '.', '.', '.')
+#define CVMX_GR_TAG_QPG_ENTRY(x)                                                                   \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'q', 'p', 'g', 'e', 't', '_', (x + '0'), '.', '.',     \
+                       '.', '.', '.')
+#define CVMX_GR_TAG_BPID(x)                                                                        \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'b', 'p', 'i', 'd', 's', '_', (x + '0'), '.', '.',     \
+                       '.', '.', '.')
+#define CVMX_GR_TAG_MTAG_IDX(x)                                                                    \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'm', 't', 'a', 'g', 'x', '_', (x + '0'), '.', '.',     \
+                       '.', '.', '.')
+#define CVMX_GR_TAG_PCAM(x, y, z)                                                                  \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'p', 'c', 'a', 'm', '_', (x + '0'), (y + '0'),         \
+                       (z + '0'), '.', '.', '.', '.')
+
+#define CVMX_GR_TAG_CIU3_IDT(_n)                                                                   \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'i', 'u', '3', '_', ((_n) + '0'), '_', 'i', 'd',  \
+                       't', '.', '.')
+
+/* Allocation of the 512 SW INTSTs (in the  12 bit SW INTSN space) */
+#define CVMX_GR_TAG_CIU3_SWINTSN(_n)                                                               \
+       cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'i', 'u', '3', '_', ((_n) + '0'), '_', 's', 'w',  \
+                       'i', 's', 'n')
+
+#define TAG_INIT_PART(A, B, C, D, E, F, G, H)                                                      \
+       ((((u64)(A) & 0xff) << 56) | (((u64)(B) & 0xff) << 48) | (((u64)(C) & 0xff) << 40) |             \
+        (((u64)(D) & 0xff) << 32) | (((u64)(E) & 0xff) << 24) | (((u64)(F) & 0xff) << 16) |             \
+        (((u64)(G) & 0xff) << 8) | (((u64)(H) & 0xff)))
+
+struct global_resource_tag {
+       u64 lo;
+       u64 hi;
+};
+
+enum cvmx_resource_err { CVMX_RESOURCE_ALLOC_FAILED = -1, CVMX_RESOURCE_ALREADY_RESERVED = -2 };
+
+/*
+ * @INTERNAL
+ * Creates a tag from the specified characters.
+ */
+static inline struct global_resource_tag cvmx_get_gr_tag(char a, char b, char c, char d, char e,
+                                                        char f, char g, char h, char i, char j,
+                                                        char k, char l, char m, char n, char o,
+                                                        char p)
+{
+       struct global_resource_tag tag;
+
+       tag.lo = TAG_INIT_PART(a, b, c, d, e, f, g, h);
+       tag.hi = TAG_INIT_PART(i, j, k, l, m, n, o, p);
+       return tag;
+}
+
+static inline int cvmx_gr_same_tag(struct global_resource_tag gr1, struct global_resource_tag gr2)
+{
+       return (gr1.hi == gr2.hi) && (gr1.lo == gr2.lo);
+}
+
+/*
+ * @INTERNAL
+ * Creates a global resource range that can hold the specified number of
+ * elements
+ * @param tag is the tag of the range. The taga is created using the method
+ * cvmx_get_gr_tag()
+ * @param nelements is the number of elements to be held in the resource range.
+ */
+int cvmx_create_global_resource_range(struct global_resource_tag tag, int nelements);
+
+/*
+ * @INTERNAL
+ * Allocate nelements in the global resource range with the specified tag. It
+ * is assumed that prior
+ * to calling this the global resource range has already been created using
+ * cvmx_create_global_resource_range().
+ * @param tag is the tag of the global resource range.
+ * @param nelements is the number of elements to be allocated.
+ * @param owner is a 64 bit number that identifes the owner of this range.
+ * @aligment specifes the required alignment of the returned base number.
+ * @return returns the base of the allocated range. -1 return value indicates
+ * failure.
+ */
+int cvmx_allocate_global_resource_range(struct global_resource_tag tag, u64 owner, int nelements,
+                                       int alignment);
+
+/*
+ * @INTERNAL
+ * Allocate nelements in the global resource range with the specified tag.
+ * The elements allocated need not be contiguous. It is assumed that prior to
+ * calling this the global resource range has already
+ * been created using cvmx_create_global_resource_range().
+ * @param tag is the tag of the global resource range.
+ * @param nelements is the number of elements to be allocated.
+ * @param owner is a 64 bit number that identifes the owner of the allocated
+ * elements.
+ * @param allocated_elements returns indexs of the allocated entries.
+ * @return returns 0 on success and -1 on failure.
+ */
+int cvmx_resource_alloc_many(struct global_resource_tag tag, u64 owner, int nelements,
+                            int allocated_elements[]);
+int cvmx_resource_alloc_reverse(struct global_resource_tag, u64 owner);
+/*
+ * @INTERNAL
+ * Reserve nelements starting from base in the global resource range with the
+ * specified tag.
+ * It is assumed that prior to calling this the global resource range has
+ * already been created using cvmx_create_global_resource_range().
+ * @param tag is the tag of the global resource range.
+ * @param nelements is the number of elements to be allocated.
+ * @param owner is a 64 bit number that identifes the owner of this range.
+ * @base specifies the base start of nelements.
+ * @return returns the base of the allocated range. -1 return value indicates
+ * failure.
+ */
+int cvmx_reserve_global_resource_range(struct global_resource_tag tag, u64 owner, int base,
+                                      int nelements);
+/*
+ * @INTERNAL
+ * Free nelements starting at base in the global resource range with the
+ * specified tag.
+ * @param tag is the tag of the global resource range.
+ * @param base is the base number
+ * @param nelements is the number of elements that are to be freed.
+ * @return returns 0 if successful and -1 on failure.
+ */
+int cvmx_free_global_resource_range_with_base(struct global_resource_tag tag, int base,
+                                             int nelements);
+
+/*
+ * @INTERNAL
+ * Free nelements with the bases specified in bases[] with the
+ * specified tag.
+ * @param tag is the tag of the global resource range.
+ * @param bases is an array containing the bases to be freed.
+ * @param nelements is the number of elements that are to be freed.
+ * @return returns 0 if successful and -1 on failure.
+ */
+int cvmx_free_global_resource_range_multiple(struct global_resource_tag tag, int bases[],
+                                            int nelements);
+/*
+ * @INTERNAL
+ * Free elements from the specified owner in the global resource range with the
+ * specified tag.
+ * @param tag is the tag of the global resource range.
+ * @param owner is the owner of resources that are to be freed.
+ * @return returns 0 if successful and -1 on failure.
+ */
+int cvmx_free_global_resource_range_with_owner(struct global_resource_tag tag, int owner);
+
+/*
+ * @INTERNAL
+ * Frees all the global resources that have been created.
+ * For use only from the bootloader, when it shutdown and boots up the
+ * application or kernel.
+ */
+int free_global_resources(void);
+
+u64 cvmx_get_global_resource_owner(struct global_resource_tag tag, int base);
+/*
+ * @INTERNAL
+ * Shows the global resource range with the specified tag. Use mainly for debug.
+ */
+void cvmx_show_global_resource_range(struct global_resource_tag tag);
+
+/*
+ * @INTERNAL
+ * Shows all the global resources. Used mainly for debug.
+ */
+void cvmx_global_resources_show(void);
+
+u64 cvmx_allocate_app_id(void);
+u64 cvmx_get_app_id(void);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-gmx.h b/arch/mips/mach-octeon/include/mach/cvmx-gmx.h
new file mode 100644 (file)
index 0000000..2df7da1
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the GMX hardware.
+ */
+
+#ifndef __CVMX_GMX_H__
+#define __CVMX_GMX_H__
+
+/* CSR typedefs have been moved to cvmx-gmx-defs.h */
+
+int cvmx_gmx_set_backpressure_override(u32 interface, u32 port_mask);
+int cvmx_agl_set_backpressure_override(u32 interface, u32 port_mask);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-gmxx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-gmxx-defs.h
new file mode 100644 (file)
index 0000000..8231fef
--- /dev/null
@@ -0,0 +1,6378 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon gmxx.
+ */
+
+#ifndef __CVMX_GMXX_DEFS_H__
+#define __CVMX_GMXX_DEFS_H__
+
+static inline u64 CVMX_GMXX_BAD_REG(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000518ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000518ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000518ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000518ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_BIST(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000400ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000400ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000400ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000400ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_BPID_MAPX(offset, block_id)                                                      \
+       (0x0001180008000680ull + (((offset) & 15) + ((block_id) & 7) * 0x200000ull) * 8)
+#define CVMX_GMXX_BPID_MSK(offset) (0x0001180008000700ull + ((offset) & 7) * 0x1000000ull)
+static inline u64 CVMX_GMXX_CLK_EN(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007F0ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007F0ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007F0ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080007F0ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_EBP_DIS(offset) (0x0001180008000608ull + ((offset) & 7) * 0x1000000ull)
+#define CVMX_GMXX_EBP_MSK(offset) (0x0001180008000600ull + ((offset) & 7) * 0x1000000ull)
+static inline u64 CVMX_GMXX_HG2_CONTROL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000550ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000550ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000550ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000550ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_INF_MODE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007F8ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007F8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007F8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080007F8ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_NXA_ADR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000510ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000510ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000510ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000510ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_PIPE_STATUS(offset) (0x0001180008000760ull + ((offset) & 7) * 0x1000000ull)
+static inline u64 CVMX_GMXX_PRTX_CBFC_CTL(unsigned long __attribute__((unused)) offset,
+                                         unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000580ull + (block_id) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000580ull + (block_id) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000580ull + (block_id) * 0x1000000ull;
+       }
+       return 0x0001180008000580ull + (block_id) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_PRTX_CFG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000010ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000010ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000010ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+#define CVMX_GMXX_QSGMII_CTL(offset) (0x0001180008000760ull + ((offset) & 1) * 0x8000000ull)
+static inline u64 CVMX_GMXX_RXAUI_CTL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000740ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000740ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000740ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM0(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000180ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000180ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000180ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM1(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000188ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000188ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000188ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM2(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000190ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000190ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000190ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM3(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000198ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000198ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000198ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM4(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080001A0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080001A0ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080001A0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM5(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080001A8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080001A8ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080001A8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM_ALL_EN(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000110ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000110ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000110ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000110ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CAM_EN(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000108ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000108ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000108ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_ADR_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000100ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000100ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000100ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_DECISION(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000040ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000040ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000040ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_FRM_CHK(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000020ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000020ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000020ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_FRM_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000018ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000018ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000018ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+#define CVMX_GMXX_RXX_FRM_MAX(offset, block_id)                                                    \
+       (0x0001180008000030ull + (((offset) & 3) + ((block_id) & 1) * 0x10000ull) * 2048)
+#define CVMX_GMXX_RXX_FRM_MIN(offset, block_id)                                                    \
+       (0x0001180008000028ull + (((offset) & 3) + ((block_id) & 1) * 0x10000ull) * 2048)
+static inline u64 CVMX_GMXX_RXX_IFG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000058ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000058ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000058ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_INT_EN(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000008ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000008ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000008ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_INT_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000000ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000000ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000000ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_JABBER(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000038ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000038ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000038ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_PAUSE_DROP_TIME(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000068ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000068ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000068ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000068ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000068ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+#define CVMX_GMXX_RXX_RX_INBND(offset, block_id)                                                   \
+       (0x0001180008000060ull + (((offset) & 3) + ((block_id) & 1) * 0x10000ull) * 2048)
+static inline u64 CVMX_GMXX_RXX_STATS_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000050ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000050ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000050ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_OCTS(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000088ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000088ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000088ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_OCTS_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000098ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000098ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000098ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_OCTS_DMAC(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000A8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000A8ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080000A8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_OCTS_DRP(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000B8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000B8ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080000B8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_PKTS(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000080ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000080ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000080ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_PKTS_BAD(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000C0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000C0ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080000C0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_PKTS_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000090ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000090ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000090ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_PKTS_DMAC(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000A0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000A0ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080000A0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_STATS_PKTS_DRP(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000B0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080000B0ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080000B0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RXX_UDD_SKP(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000048ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000048ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000048ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_RX_BP_DROPX(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000420ull + ((offset) + (block_id) * 0x1000000ull) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000420ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       }
+       return 0x0001180008000420ull + ((offset) + (block_id) * 0x1000000ull) * 8;
+}
+
+static inline u64 CVMX_GMXX_RX_BP_OFFX(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000460ull + ((offset) + (block_id) * 0x1000000ull) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000460ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       }
+       return 0x0001180008000460ull + ((offset) + (block_id) * 0x1000000ull) * 8;
+}
+
+static inline u64 CVMX_GMXX_RX_BP_ONX(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000440ull + ((offset) + (block_id) * 0x1000000ull) * 8;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000440ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       }
+       return 0x0001180008000440ull + ((offset) + (block_id) * 0x1000000ull) * 8;
+}
+
+static inline u64 CVMX_GMXX_RX_HG2_STATUS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000548ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000548ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000548ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000548ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_RX_PASS_EN(offset) (0x00011800080005F8ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_GMXX_RX_PASS_MAPX(offset, block_id)                                                   \
+       (0x0001180008000600ull + (((offset) & 15) + ((block_id) & 1) * 0x1000000ull) * 8)
+static inline u64 CVMX_GMXX_RX_PRTS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000410ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000410ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000410ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000410ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_RX_PRT_INFO(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004E8ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004E8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004E8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080004E8ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_RX_TX_STATUS(offset) (0x00011800080007E8ull)
+static inline u64 CVMX_GMXX_RX_XAUI_BAD_COL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000538ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000538ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000538ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000538ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_RX_XAUI_CTL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000530ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000530ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000530ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000530ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_SMACX(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000230ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000230ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000230ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_SOFT_BIST(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007E8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007E8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007E8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080007E8ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_GMXX_STAT_BP(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000520ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000520ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000520ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000520ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TB_REG(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007E0ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007E0ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080007E0ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080007E0ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TXX_APPEND(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000218ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000218ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000218ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+#define CVMX_GMXX_TXX_BCK_CRDT(offset, block_id)                                                   \
+       (0x0001180008000388ull + (((offset) & 3) + ((block_id) & 1) * 0x10000ull) * 2048)
+static inline u64 CVMX_GMXX_TXX_BURST(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000228ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000228ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000228ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_CBFC_XOFF(unsigned long __attribute__((unused)) offset,
+                                         unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080005A0ull + (block_id) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080005A0ull + (block_id) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080005A0ull + (block_id) * 0x1000000ull;
+       }
+       return 0x00011800080005A0ull + (block_id) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TXX_CBFC_XON(unsigned long __attribute__((unused)) offset,
+                                        unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080005C0ull + (block_id) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080005C0ull + (block_id) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080005C0ull + (block_id) * 0x1000000ull;
+       }
+       return 0x00011800080005C0ull + (block_id) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_TXX_CLK(offset, block_id)                                                        \
+       (0x0001180008000208ull + (((offset) & 3) + ((block_id) & 1) * 0x10000ull) * 2048)
+static inline u64 CVMX_GMXX_TXX_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000270ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000270ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000270ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+#define CVMX_GMXX_TXX_JAM_MODE(offset, block_id)                                                   \
+       (0x0001180008000380ull + (((offset) & 3) + ((block_id) & 1) * 0x10000ull) * 2048)
+static inline u64 CVMX_GMXX_TXX_MIN_PKT(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000240ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000240ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000240ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_PAUSE_PKT_INTERVAL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000248ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000248ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000248ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_PAUSE_PKT_TIME(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000238ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000238ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000238ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_PAUSE_TOGO(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000258ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000258ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000258ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_PAUSE_ZERO(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000260ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000260ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000260ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+#define CVMX_GMXX_TXX_PIPE(offset, block_id)                                                       \
+       (0x0001180008000310ull + (((offset) & 3) + ((block_id) & 7) * 0x2000ull) * 2048)
+static inline u64 CVMX_GMXX_TXX_SGMII_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000300ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000300ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000300ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000300ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_SLOT(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000220ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000220ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000220ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_SOFT_PAUSE(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000250ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000250ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000250ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT0(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000280ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000280ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000280ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT1(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000288ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000288ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000288ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT2(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000290ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000290ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000290ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT3(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000298ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000298ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000298ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT4(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002A0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002A0ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080002A0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT5(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002A8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002A8ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080002A8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT6(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002B0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002B0ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080002B0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT7(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002B8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002B8ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080002B8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT8(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002C0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002C0ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080002C0ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STAT9(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002C8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080002C8ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x00011800080002C8ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_STATS_CTL(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000268ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000268ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000268ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TXX_THRESH(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000210ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000210ull + ((offset) + (block_id) * 0x2000ull) * 2048;
+       }
+       return 0x0001180008000210ull + ((offset) + (block_id) * 0x10000ull) * 2048;
+}
+
+static inline u64 CVMX_GMXX_TX_BP(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004D0ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004D0ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004D0ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080004D0ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_TX_CLK_MSKX(offset, block_id)                                                    \
+       (0x0001180008000780ull + (((offset) & 1) + ((block_id) & 0) * 0x0ull) * 8)
+static inline u64 CVMX_GMXX_TX_COL_ATTEMPT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000498ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000498ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000498ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000498ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_CORRUPT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004D8ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004D8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004D8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080004D8ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_HG2_REG1(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000558ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000558ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000558ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000558ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_HG2_REG2(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000560ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000560ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000560ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000560ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_IFG(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000488ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000488ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000488ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000488ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_INT_EN(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000508ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000508ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000508ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000508ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_INT_REG(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000500ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000500ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000500ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000500ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_JAM(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000490ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000490ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000490ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000490ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_LFSR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004F8ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004F8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004F8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080004F8ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_OVR_BP(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004C8ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004C8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004C8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080004C8ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_PAUSE_PKT_DMAC(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004A0ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004A0ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004A0ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080004A0ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_PAUSE_PKT_TYPE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004A8ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004A8ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800080004A8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800080004A8ull + (offset) * 0x8000000ull;
+}
+
+static inline u64 CVMX_GMXX_TX_PRTS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000480ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000480ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000480ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000480ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_TX_SPI_CTL(offset)   (0x00011800080004C0ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_GMXX_TX_SPI_DRAIN(offset) (0x00011800080004E0ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_GMXX_TX_SPI_MAX(offset)   (0x00011800080004B0ull + ((offset) & 1) * 0x8000000ull)
+#define CVMX_GMXX_TX_SPI_ROUNDX(offset, block_id)                                                  \
+       (0x0001180008000680ull + (((offset) & 31) + ((block_id) & 1) * 0x1000000ull) * 8)
+#define CVMX_GMXX_TX_SPI_THRESH(offset) (0x00011800080004B8ull + ((offset) & 1) * 0x8000000ull)
+static inline u64 CVMX_GMXX_TX_XAUI_CTL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000528ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000528ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000528ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000528ull + (offset) * 0x8000000ull;
+}
+
+#define CVMX_GMXX_WOL_CTL(offset) (0x0001180008000780ull + ((offset) & 1) * 0x8000000ull)
+static inline u64 CVMX_GMXX_XAUI_EXT_LOOPBACK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000540ull + (offset) * 0x8000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000540ull + (offset) * 0x8000000ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180008000540ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180008000540ull + (offset) * 0x8000000ull;
+}
+
+/**
+ * cvmx_gmx#_bad_reg
+ *
+ * GMX_BAD_REG = A collection of things that have gone very, very wrong
+ *
+ *
+ * Notes:
+ * In XAUI mode, only the lsb (corresponding to port0) of INB_NXA, LOSTSTAT, OUT_OVR, are used.
+ *
+ */
+union cvmx_gmxx_bad_reg {
+       u64 u64;
+       struct cvmx_gmxx_bad_reg_s {
+               u64 reserved_31_63 : 33;
+               u64 inb_nxa : 4;
+               u64 statovr : 1;
+               u64 loststat : 4;
+               u64 reserved_18_21 : 4;
+               u64 out_ovr : 16;
+               u64 ncb_ovr : 1;
+               u64 out_col : 1;
+       } s;
+       struct cvmx_gmxx_bad_reg_cn30xx {
+               u64 reserved_31_63 : 33;
+               u64 inb_nxa : 4;
+               u64 statovr : 1;
+               u64 reserved_25_25 : 1;
+               u64 loststat : 3;
+               u64 reserved_5_21 : 17;
+               u64 out_ovr : 3;
+               u64 reserved_0_1 : 2;
+       } cn30xx;
+       struct cvmx_gmxx_bad_reg_cn30xx cn31xx;
+       struct cvmx_gmxx_bad_reg_s cn38xx;
+       struct cvmx_gmxx_bad_reg_s cn38xxp2;
+       struct cvmx_gmxx_bad_reg_cn30xx cn50xx;
+       struct cvmx_gmxx_bad_reg_cn52xx {
+               u64 reserved_31_63 : 33;
+               u64 inb_nxa : 4;
+               u64 statovr : 1;
+               u64 loststat : 4;
+               u64 reserved_6_21 : 16;
+               u64 out_ovr : 4;
+               u64 reserved_0_1 : 2;
+       } cn52xx;
+       struct cvmx_gmxx_bad_reg_cn52xx cn52xxp1;
+       struct cvmx_gmxx_bad_reg_cn52xx cn56xx;
+       struct cvmx_gmxx_bad_reg_cn52xx cn56xxp1;
+       struct cvmx_gmxx_bad_reg_s cn58xx;
+       struct cvmx_gmxx_bad_reg_s cn58xxp1;
+       struct cvmx_gmxx_bad_reg_cn52xx cn61xx;
+       struct cvmx_gmxx_bad_reg_cn52xx cn63xx;
+       struct cvmx_gmxx_bad_reg_cn52xx cn63xxp1;
+       struct cvmx_gmxx_bad_reg_cn52xx cn66xx;
+       struct cvmx_gmxx_bad_reg_cn52xx cn68xx;
+       struct cvmx_gmxx_bad_reg_cn52xx cn68xxp1;
+       struct cvmx_gmxx_bad_reg_cn52xx cn70xx;
+       struct cvmx_gmxx_bad_reg_cn52xx cn70xxp1;
+       struct cvmx_gmxx_bad_reg_cn52xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_bad_reg cvmx_gmxx_bad_reg_t;
+
+/**
+ * cvmx_gmx#_bist
+ *
+ * GMX_BIST = GMX BIST Results
+ *
+ */
+union cvmx_gmxx_bist {
+       u64 u64;
+       struct cvmx_gmxx_bist_s {
+               u64 reserved_25_63 : 39;
+               u64 status : 25;
+       } s;
+       struct cvmx_gmxx_bist_cn30xx {
+               u64 reserved_10_63 : 54;
+               u64 status : 10;
+       } cn30xx;
+       struct cvmx_gmxx_bist_cn30xx cn31xx;
+       struct cvmx_gmxx_bist_cn30xx cn38xx;
+       struct cvmx_gmxx_bist_cn30xx cn38xxp2;
+       struct cvmx_gmxx_bist_cn50xx {
+               u64 reserved_12_63 : 52;
+               u64 status : 12;
+       } cn50xx;
+       struct cvmx_gmxx_bist_cn52xx {
+               u64 reserved_16_63 : 48;
+               u64 status : 16;
+       } cn52xx;
+       struct cvmx_gmxx_bist_cn52xx cn52xxp1;
+       struct cvmx_gmxx_bist_cn52xx cn56xx;
+       struct cvmx_gmxx_bist_cn52xx cn56xxp1;
+       struct cvmx_gmxx_bist_cn58xx {
+               u64 reserved_17_63 : 47;
+               u64 status : 17;
+       } cn58xx;
+       struct cvmx_gmxx_bist_cn58xx cn58xxp1;
+       struct cvmx_gmxx_bist_s cn61xx;
+       struct cvmx_gmxx_bist_s cn63xx;
+       struct cvmx_gmxx_bist_s cn63xxp1;
+       struct cvmx_gmxx_bist_s cn66xx;
+       struct cvmx_gmxx_bist_s cn68xx;
+       struct cvmx_gmxx_bist_s cn68xxp1;
+       struct cvmx_gmxx_bist_s cn70xx;
+       struct cvmx_gmxx_bist_s cn70xxp1;
+       struct cvmx_gmxx_bist_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_bist cvmx_gmxx_bist_t;
+
+/**
+ * cvmx_gmx#_bpid_map#
+ *
+ * Notes:
+ * GMX will build BPID_VECTOR<15:0> using the 16 GMX_BPID_MAP entries and the BPID
+ * state from IPD.  In XAUI/RXAUI mode when PFC/CBFC/HiGig2 is used, the
+ * BPID_VECTOR becomes the logical backpressure.  In XAUI/RXAUI mode when
+ * PFC/CBFC/HiGig2 is not used or when in 4xSGMII mode, the BPID_VECTOR can be used
+ * with the GMX_BPID_MSK register to determine the physical backpressure.
+ *
+ * In XAUI/RXAUI mode, the entire BPID_VECTOR<15:0> is available determining physical
+ * backpressure for the single XAUI/RXAUI interface.
+ *
+ * In SGMII mode, BPID_VECTOR is broken up as follows:
+ *    SGMII interface0 uses BPID_VECTOR<3:0>
+ *    SGMII interface1 uses BPID_VECTOR<7:4>
+ *    SGMII interface2 uses BPID_VECTOR<11:8>
+ *    SGMII interface3 uses BPID_VECTOR<15:12>
+ *
+ * In all SGMII configurations, and in some XAUI/RXAUI configurations, the
+ * interface protocols only support physical backpressure. In these cases, a single
+ * BPID will commonly drive the physical backpressure for the physical
+ * interface. We provide example programmings for these simple cases.
+ *
+ * In XAUI/RXAUI mode where PFC/CBFC/HiGig2 is not used, an example programming
+ * would be as follows:
+ *
+ *    @verbatim
+ *    GMX_BPID_MAP0[VAL]    = 1;
+ *    GMX_BPID_MAP0[BPID]   = xaui_bpid;
+ *    GMX_BPID_MSK[MSK_OR]  = 1;
+ *    GMX_BPID_MSK[MSK_AND] = 0;
+ *    @endverbatim
+ *
+ * In SGMII mode, an example programming would be as follows:
+ *
+ *    @verbatim
+ *    for (i=0; i<4; i++) [
+ *       if (GMX_PRTi_CFG[EN]) [
+ *          GMX_BPID_MAP(i*4)[VAL]    = 1;
+ *          GMX_BPID_MAP(i*4)[BPID]   = sgmii_bpid(i);
+ *          GMX_BPID_MSK[MSK_OR]      = (1 << (i*4)) | GMX_BPID_MSK[MSK_OR];
+ *       ]
+ *    ]
+ *    GMX_BPID_MSK[MSK_AND] = 0;
+ *    @endverbatim
+ */
+union cvmx_gmxx_bpid_mapx {
+       u64 u64;
+       struct cvmx_gmxx_bpid_mapx_s {
+               u64 reserved_17_63 : 47;
+               u64 status : 1;
+               u64 reserved_9_15 : 7;
+               u64 val : 1;
+               u64 reserved_6_7 : 2;
+               u64 bpid : 6;
+       } s;
+       struct cvmx_gmxx_bpid_mapx_s cn68xx;
+       struct cvmx_gmxx_bpid_mapx_s cn68xxp1;
+};
+
+typedef union cvmx_gmxx_bpid_mapx cvmx_gmxx_bpid_mapx_t;
+
+/**
+ * cvmx_gmx#_bpid_msk
+ */
+union cvmx_gmxx_bpid_msk {
+       u64 u64;
+       struct cvmx_gmxx_bpid_msk_s {
+               u64 reserved_48_63 : 16;
+               u64 msk_or : 16;
+               u64 reserved_16_31 : 16;
+               u64 msk_and : 16;
+       } s;
+       struct cvmx_gmxx_bpid_msk_s cn68xx;
+       struct cvmx_gmxx_bpid_msk_s cn68xxp1;
+};
+
+typedef union cvmx_gmxx_bpid_msk cvmx_gmxx_bpid_msk_t;
+
+/**
+ * cvmx_gmx#_clk_en
+ *
+ * DON'T PUT IN HRM*
+ *
+ */
+union cvmx_gmxx_clk_en {
+       u64 u64;
+       struct cvmx_gmxx_clk_en_s {
+               u64 reserved_1_63 : 63;
+               u64 clk_en : 1;
+       } s;
+       struct cvmx_gmxx_clk_en_s cn52xx;
+       struct cvmx_gmxx_clk_en_s cn52xxp1;
+       struct cvmx_gmxx_clk_en_s cn56xx;
+       struct cvmx_gmxx_clk_en_s cn56xxp1;
+       struct cvmx_gmxx_clk_en_s cn61xx;
+       struct cvmx_gmxx_clk_en_s cn63xx;
+       struct cvmx_gmxx_clk_en_s cn63xxp1;
+       struct cvmx_gmxx_clk_en_s cn66xx;
+       struct cvmx_gmxx_clk_en_s cn68xx;
+       struct cvmx_gmxx_clk_en_s cn68xxp1;
+       struct cvmx_gmxx_clk_en_s cn70xx;
+       struct cvmx_gmxx_clk_en_s cn70xxp1;
+       struct cvmx_gmxx_clk_en_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_clk_en cvmx_gmxx_clk_en_t;
+
+/**
+ * cvmx_gmx#_ebp_dis
+ */
+union cvmx_gmxx_ebp_dis {
+       u64 u64;
+       struct cvmx_gmxx_ebp_dis_s {
+               u64 reserved_16_63 : 48;
+               u64 dis : 16;
+       } s;
+       struct cvmx_gmxx_ebp_dis_s cn68xx;
+       struct cvmx_gmxx_ebp_dis_s cn68xxp1;
+};
+
+typedef union cvmx_gmxx_ebp_dis cvmx_gmxx_ebp_dis_t;
+
+/**
+ * cvmx_gmx#_ebp_msk
+ */
+union cvmx_gmxx_ebp_msk {
+       u64 u64;
+       struct cvmx_gmxx_ebp_msk_s {
+               u64 reserved_16_63 : 48;
+               u64 msk : 16;
+       } s;
+       struct cvmx_gmxx_ebp_msk_s cn68xx;
+       struct cvmx_gmxx_ebp_msk_s cn68xxp1;
+};
+
+typedef union cvmx_gmxx_ebp_msk cvmx_gmxx_ebp_msk_t;
+
+/**
+ * cvmx_gmx#_hg2_control
+ *
+ * Notes:
+ * The HiGig2 TX and RX enable would normally be both set together for HiGig2 messaging. However
+ * setting just the TX or RX bit will result in only the HG2 message transmit or the receive
+ * capability.
+ * PHYS_EN and LOGL_EN bits when 1, allow link pause or back pressure to PKO as per received
+ * HiGig2 message. When 0, link pause and back pressure to PKO in response to received messages
+ * are disabled.
+ *
+ * GMX*_TX_XAUI_CTL[HG_EN] must be set to one(to enable HiGig) whenever either HG2TX_EN or HG2RX_EN
+ * are set.
+ *
+ * GMX*_RX0_UDD_SKP[LEN] must be set to 16 (to select HiGig2) whenever either HG2TX_EN or HG2RX_EN
+ * are set.
+ *
+ * GMX*_TX_OVR_BP[EN<0>] must be set to one and GMX*_TX_OVR_BP[BP<0>] must be cleared to zero
+ * (to forcibly disable HW-automatic 802.3 pause packet generation) with the HiGig2 Protocol when
+ * GMX*_HG2_CONTROL[HG2TX_EN]=0. (The HiGig2 protocol is indicated by GMX*_TX_XAUI_CTL[HG_EN]=1
+ * and GMX*_RX0_UDD_SKP[LEN]=16.) The HW can only auto-generate backpressure via HiGig2 messages
+ * (optionally, when HG2TX_EN=1) with the HiGig2 protocol.
+ */
+union cvmx_gmxx_hg2_control {
+       u64 u64;
+       struct cvmx_gmxx_hg2_control_s {
+               u64 reserved_19_63 : 45;
+               u64 hg2tx_en : 1;
+               u64 hg2rx_en : 1;
+               u64 phys_en : 1;
+               u64 logl_en : 16;
+       } s;
+       struct cvmx_gmxx_hg2_control_s cn52xx;
+       struct cvmx_gmxx_hg2_control_s cn52xxp1;
+       struct cvmx_gmxx_hg2_control_s cn56xx;
+       struct cvmx_gmxx_hg2_control_s cn61xx;
+       struct cvmx_gmxx_hg2_control_s cn63xx;
+       struct cvmx_gmxx_hg2_control_s cn63xxp1;
+       struct cvmx_gmxx_hg2_control_s cn66xx;
+       struct cvmx_gmxx_hg2_control_s cn68xx;
+       struct cvmx_gmxx_hg2_control_s cn68xxp1;
+       struct cvmx_gmxx_hg2_control_s cn70xx;
+       struct cvmx_gmxx_hg2_control_s cn70xxp1;
+       struct cvmx_gmxx_hg2_control_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_hg2_control cvmx_gmxx_hg2_control_t;
+
+/**
+ * cvmx_gmx#_inf_mode
+ *
+ * GMX_INF_MODE = Interface Mode
+ *
+ */
+union cvmx_gmxx_inf_mode {
+       u64 u64;
+       struct cvmx_gmxx_inf_mode_s {
+               u64 reserved_20_63 : 44;
+               u64 rate : 4;
+               u64 reserved_12_15 : 4;
+               u64 speed : 4;
+               u64 reserved_7_7 : 1;
+               u64 mode : 3;
+               u64 reserved_3_3 : 1;
+               u64 p0mii : 1;
+               u64 en : 1;
+               u64 type : 1;
+       } s;
+       struct cvmx_gmxx_inf_mode_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 p0mii : 1;
+               u64 en : 1;
+               u64 type : 1;
+       } cn30xx;
+       struct cvmx_gmxx_inf_mode_cn31xx {
+               u64 reserved_2_63 : 62;
+               u64 en : 1;
+               u64 type : 1;
+       } cn31xx;
+       struct cvmx_gmxx_inf_mode_cn31xx cn38xx;
+       struct cvmx_gmxx_inf_mode_cn31xx cn38xxp2;
+       struct cvmx_gmxx_inf_mode_cn30xx cn50xx;
+       struct cvmx_gmxx_inf_mode_cn52xx {
+               u64 reserved_10_63 : 54;
+               u64 speed : 2;
+               u64 reserved_6_7 : 2;
+               u64 mode : 2;
+               u64 reserved_2_3 : 2;
+               u64 en : 1;
+               u64 type : 1;
+       } cn52xx;
+       struct cvmx_gmxx_inf_mode_cn52xx cn52xxp1;
+       struct cvmx_gmxx_inf_mode_cn52xx cn56xx;
+       struct cvmx_gmxx_inf_mode_cn52xx cn56xxp1;
+       struct cvmx_gmxx_inf_mode_cn31xx cn58xx;
+       struct cvmx_gmxx_inf_mode_cn31xx cn58xxp1;
+       struct cvmx_gmxx_inf_mode_cn61xx {
+               u64 reserved_12_63 : 52;
+               u64 speed : 4;
+               u64 reserved_5_7 : 3;
+               u64 mode : 1;
+               u64 reserved_2_3 : 2;
+               u64 en : 1;
+               u64 type : 1;
+       } cn61xx;
+       struct cvmx_gmxx_inf_mode_cn61xx cn63xx;
+       struct cvmx_gmxx_inf_mode_cn61xx cn63xxp1;
+       struct cvmx_gmxx_inf_mode_cn66xx {
+               u64 reserved_20_63 : 44;
+               u64 rate : 4;
+               u64 reserved_12_15 : 4;
+               u64 speed : 4;
+               u64 reserved_5_7 : 3;
+               u64 mode : 1;
+               u64 reserved_2_3 : 2;
+               u64 en : 1;
+               u64 type : 1;
+       } cn66xx;
+       struct cvmx_gmxx_inf_mode_cn68xx {
+               u64 reserved_12_63 : 52;
+               u64 speed : 4;
+               u64 reserved_7_7 : 1;
+               u64 mode : 3;
+               u64 reserved_2_3 : 2;
+               u64 en : 1;
+               u64 type : 1;
+       } cn68xx;
+       struct cvmx_gmxx_inf_mode_cn68xx cn68xxp1;
+       struct cvmx_gmxx_inf_mode_cn70xx {
+               u64 reserved_6_63 : 58;
+               u64 mode : 2;
+               u64 reserved_2_3 : 2;
+               u64 en : 1;
+               u64 reserved_0_0 : 1;
+       } cn70xx;
+       struct cvmx_gmxx_inf_mode_cn70xx cn70xxp1;
+       struct cvmx_gmxx_inf_mode_cn61xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_inf_mode cvmx_gmxx_inf_mode_t;
+
+/**
+ * cvmx_gmx#_nxa_adr
+ *
+ * GMX_NXA_ADR = NXA Port Address
+ *
+ */
+union cvmx_gmxx_nxa_adr {
+       u64 u64;
+       struct cvmx_gmxx_nxa_adr_s {
+               u64 reserved_23_63 : 41;
+               u64 pipe : 7;
+               u64 reserved_6_15 : 10;
+               u64 prt : 6;
+       } s;
+       struct cvmx_gmxx_nxa_adr_cn30xx {
+               u64 reserved_6_63 : 58;
+               u64 prt : 6;
+       } cn30xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn31xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn38xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn38xxp2;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn50xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn52xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn52xxp1;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn56xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn56xxp1;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn58xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn58xxp1;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn61xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn63xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn63xxp1;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn66xx;
+       struct cvmx_gmxx_nxa_adr_s cn68xx;
+       struct cvmx_gmxx_nxa_adr_s cn68xxp1;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn70xx;
+       struct cvmx_gmxx_nxa_adr_cn30xx cn70xxp1;
+       struct cvmx_gmxx_nxa_adr_cn30xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_nxa_adr cvmx_gmxx_nxa_adr_t;
+
+/**
+ * cvmx_gmx#_pipe_status
+ *
+ * DON'T PUT IN HRM*
+ *
+ */
+union cvmx_gmxx_pipe_status {
+       u64 u64;
+       struct cvmx_gmxx_pipe_status_s {
+               u64 reserved_20_63 : 44;
+               u64 ovr : 4;
+               u64 reserved_12_15 : 4;
+               u64 bp : 4;
+               u64 reserved_4_7 : 4;
+               u64 stop : 4;
+       } s;
+       struct cvmx_gmxx_pipe_status_s cn68xx;
+       struct cvmx_gmxx_pipe_status_s cn68xxp1;
+};
+
+typedef union cvmx_gmxx_pipe_status cvmx_gmxx_pipe_status_t;
+
+/**
+ * cvmx_gmx#_prt#_cbfc_ctl
+ *
+ * ** HG2 message CSRs end
+ *
+ */
+union cvmx_gmxx_prtx_cbfc_ctl {
+       u64 u64;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s {
+               u64 phys_en : 16;
+               u64 logl_en : 16;
+               u64 phys_bp : 16;
+               u64 reserved_4_15 : 12;
+               u64 bck_en : 1;
+               u64 drp_en : 1;
+               u64 tx_en : 1;
+               u64 rx_en : 1;
+       } s;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn52xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn56xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn61xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn63xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn63xxp1;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn66xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn68xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn68xxp1;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn70xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn70xxp1;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_prtx_cbfc_ctl cvmx_gmxx_prtx_cbfc_ctl_t;
+
+/**
+ * cvmx_gmx#_prt#_cfg
+ *
+ * GMX_PRT_CFG = Port description
+ *
+ */
+union cvmx_gmxx_prtx_cfg {
+       u64 u64;
+       struct cvmx_gmxx_prtx_cfg_s {
+               u64 reserved_22_63 : 42;
+               u64 pknd : 6;
+               u64 reserved_14_15 : 2;
+               u64 tx_idle : 1;
+               u64 rx_idle : 1;
+               u64 reserved_9_11 : 3;
+               u64 speed_msb : 1;
+               u64 reserved_4_7 : 4;
+               u64 slottime : 1;
+               u64 duplex : 1;
+               u64 speed : 1;
+               u64 en : 1;
+       } s;
+       struct cvmx_gmxx_prtx_cfg_cn30xx {
+               u64 reserved_4_63 : 60;
+               u64 slottime : 1;
+               u64 duplex : 1;
+               u64 speed : 1;
+               u64 en : 1;
+       } cn30xx;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn31xx;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn38xx;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn38xxp2;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn50xx;
+       struct cvmx_gmxx_prtx_cfg_cn52xx {
+               u64 reserved_14_63 : 50;
+               u64 tx_idle : 1;
+               u64 rx_idle : 1;
+               u64 reserved_9_11 : 3;
+               u64 speed_msb : 1;
+               u64 reserved_4_7 : 4;
+               u64 slottime : 1;
+               u64 duplex : 1;
+               u64 speed : 1;
+               u64 en : 1;
+       } cn52xx;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn52xxp1;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn56xx;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn56xxp1;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn58xx;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn58xxp1;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn61xx;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn63xx;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn63xxp1;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn66xx;
+       struct cvmx_gmxx_prtx_cfg_s cn68xx;
+       struct cvmx_gmxx_prtx_cfg_s cn68xxp1;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn70xx;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cn70xxp1;
+       struct cvmx_gmxx_prtx_cfg_cn52xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_prtx_cfg cvmx_gmxx_prtx_cfg_t;
+
+/**
+ * cvmx_gmx#_qsgmii_ctl
+ */
+union cvmx_gmxx_qsgmii_ctl {
+       u64 u64;
+       struct cvmx_gmxx_qsgmii_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 disparity : 1;
+       } s;
+       struct cvmx_gmxx_qsgmii_ctl_s cn70xx;
+       struct cvmx_gmxx_qsgmii_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_gmxx_qsgmii_ctl cvmx_gmxx_qsgmii_ctl_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam0
+ *
+ * GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam0 {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam0_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam0_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam0_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam0 cvmx_gmxx_rxx_adr_cam0_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam1
+ *
+ * GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam1 {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam1_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam1_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam1_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam1 cvmx_gmxx_rxx_adr_cam1_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam2
+ *
+ * GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam2 {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam2_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam2_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam2_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam2 cvmx_gmxx_rxx_adr_cam2_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam3
+ *
+ * GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam3 {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam3_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam3_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam3_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam3 cvmx_gmxx_rxx_adr_cam3_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam4
+ *
+ * GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam4 {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam4_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam4_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam4_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam4 cvmx_gmxx_rxx_adr_cam4_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam5
+ *
+ * GMX_RX_ADR_CAM = Address Filtering Control
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam5 {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam5_s {
+               u64 adr : 64;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam5_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam5_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam5 cvmx_gmxx_rxx_adr_cam5_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam_all_en
+ *
+ * GMX_RX_ADR_CAM_ALL_EN = Address Filtering Control Enable
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam_all_en {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam_all_en_s {
+               u64 reserved_32_63 : 32;
+               u64 en : 32;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam_all_en_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam_all_en_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam_all_en_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam_all_en_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam_all_en_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam_all_en_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam_all_en cvmx_gmxx_rxx_adr_cam_all_en_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_cam_en
+ *
+ * GMX_RX_ADR_CAM_EN = Address Filtering Control Enable
+ *
+ */
+union cvmx_gmxx_rxx_adr_cam_en {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_cam_en_s {
+               u64 reserved_8_63 : 56;
+               u64 en : 8;
+       } s;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_cam_en_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_cam_en cvmx_gmxx_rxx_adr_cam_en_t;
+
+/**
+ * cvmx_gmx#_rx#_adr_ctl
+ *
+ * GMX_RX_ADR_CTL = Address Filtering Control
+ *
+ *
+ * Notes:
+ * * ALGORITHM
+ *   Here is some pseudo code that represents the address filter behavior.
+ *
+ *      @verbatim
+ *      bool dmac_addr_filter(uint8 prt, uint48 dmac) [
+ *        ASSERT(prt >= 0 && prt <= 3);
+ *        if (is_bcst(dmac))                               // broadcast accept
+ *          return (GMX_RX[prt]_ADR_CTL[BCST] ? ACCEPT : REJECT);
+ *        if (is_mcst(dmac) & GMX_RX[prt]_ADR_CTL[MCST] == 1)   // multicast reject
+ *          return REJECT;
+ *        if (is_mcst(dmac) & GMX_RX[prt]_ADR_CTL[MCST] == 2)   // multicast accept
+ *          return ACCEPT;
+ *
+ *        cam_hit = 0;
+ *
+ *        for (i=0; i<32; i++) [
+ *          if (GMX_RX[prt]_ADR_CAM_ALL_EN[EN<i>] == 0)
+ *            continue;
+ *          uint48 unswizzled_mac_adr = 0x0;
+ *          for (j=5; j>=0; j--) [
+ *             unswizzled_mac_adr = (unswizzled_mac_adr << 8) | GMX_RX[i>>3]_ADR_CAM[j][ADR<(i&7)*8+7:(i&7)*8>];
+ *          ]
+ *          if (unswizzled_mac_adr == dmac) [
+ *            cam_hit = 1;
+ *            break;
+ *          ]
+ *        ]
+ *
+ *        if (cam_hit)
+ *          return (GMX_RX[prt]_ADR_CTL[CAM_MODE] ? ACCEPT : REJECT);
+ *        else
+ *          return (GMX_RX[prt]_ADR_CTL[CAM_MODE] ? REJECT : ACCEPT);
+ *      ]
+ *      @endverbatim
+ *
+ * * XAUI Mode
+ *
+ *   In XAUI mode, only GMX_RX0_ADR_CTL is used.  GMX_RX[1,2,3]_ADR_CTL should not be used.
+ */
+union cvmx_gmxx_rxx_adr_ctl {
+       u64 u64;
+       struct cvmx_gmxx_rxx_adr_ctl_s {
+               u64 reserved_4_63 : 60;
+               u64 cam_mode : 1;
+               u64 mcst : 2;
+               u64 bcst : 1;
+       } s;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn30xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn31xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn38xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn38xxp2;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn50xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn52xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn52xxp1;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn56xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn56xxp1;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn58xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn58xxp1;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn61xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn63xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn63xxp1;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn66xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn68xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn68xxp1;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn70xx;
+       struct cvmx_gmxx_rxx_adr_ctl_s cn70xxp1;
+       struct cvmx_gmxx_rxx_adr_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_adr_ctl cvmx_gmxx_rxx_adr_ctl_t;
+
+/**
+ * cvmx_gmx#_rx#_decision
+ *
+ * GMX_RX_DECISION = The byte count to decide when to accept or filter a packet
+ *
+ *
+ * Notes:
+ * As each byte in a packet is received by GMX, the L2 byte count is compared
+ * against the GMX_RX_DECISION[CNT].  The L2 byte count is the number of bytes
+ * from the beginning of the L2 header (DMAC).  In normal operation, the L2
+ * header begins after the PREAMBLE+SFD (GMX_RX_FRM_CTL[PRE_CHK]=1) and any
+ * optional UDD skip data (GMX_RX_UDD_SKP[LEN]).
+ *
+ * When GMX_RX_FRM_CTL[PRE_CHK] is clear, PREAMBLE+SFD are prepended to the
+ * packet and would require UDD skip length to account for them.
+ *
+ *                                                 L2 Size
+ * Port Mode             <GMX_RX_DECISION bytes (default=24)       >=GMX_RX_DECISION bytes (default=24)
+ *
+ * Full Duplex           accept packet                             apply filters
+ *                       no filtering is applied                   accept packet based on DMAC and PAUSE packet filters
+ *
+ * Half Duplex           drop packet                               apply filters
+ *                       packet is unconditionally dropped         accept packet based on DMAC
+ *
+ * where l2_size = MAX(0, total_packet_size - GMX_RX_UDD_SKP[LEN] - ((GMX_RX_FRM_CTL[PRE_CHK]==1)*8)
+ */
+union cvmx_gmxx_rxx_decision {
+       u64 u64;
+       struct cvmx_gmxx_rxx_decision_s {
+               u64 reserved_5_63 : 59;
+               u64 cnt : 5;
+       } s;
+       struct cvmx_gmxx_rxx_decision_s cn30xx;
+       struct cvmx_gmxx_rxx_decision_s cn31xx;
+       struct cvmx_gmxx_rxx_decision_s cn38xx;
+       struct cvmx_gmxx_rxx_decision_s cn38xxp2;
+       struct cvmx_gmxx_rxx_decision_s cn50xx;
+       struct cvmx_gmxx_rxx_decision_s cn52xx;
+       struct cvmx_gmxx_rxx_decision_s cn52xxp1;
+       struct cvmx_gmxx_rxx_decision_s cn56xx;
+       struct cvmx_gmxx_rxx_decision_s cn56xxp1;
+       struct cvmx_gmxx_rxx_decision_s cn58xx;
+       struct cvmx_gmxx_rxx_decision_s cn58xxp1;
+       struct cvmx_gmxx_rxx_decision_s cn61xx;
+       struct cvmx_gmxx_rxx_decision_s cn63xx;
+       struct cvmx_gmxx_rxx_decision_s cn63xxp1;
+       struct cvmx_gmxx_rxx_decision_s cn66xx;
+       struct cvmx_gmxx_rxx_decision_s cn68xx;
+       struct cvmx_gmxx_rxx_decision_s cn68xxp1;
+       struct cvmx_gmxx_rxx_decision_s cn70xx;
+       struct cvmx_gmxx_rxx_decision_s cn70xxp1;
+       struct cvmx_gmxx_rxx_decision_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_decision cvmx_gmxx_rxx_decision_t;
+
+/**
+ * cvmx_gmx#_rx#_frm_chk
+ *
+ * GMX_RX_FRM_CHK = Which frame errors will set the ERR bit of the frame
+ *
+ *
+ * Notes:
+ * If GMX_RX_UDD_SKP[LEN] != 0, then LENERR will be forced to zero in HW.
+ *
+ * In XAUI mode prt0 is used for checking.
+ */
+union cvmx_gmxx_rxx_frm_chk {
+       u64 u64;
+       struct cvmx_gmxx_rxx_frm_chk_s {
+               u64 reserved_10_63 : 54;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_gmxx_rxx_frm_chk_s cn30xx;
+       struct cvmx_gmxx_rxx_frm_chk_s cn31xx;
+       struct cvmx_gmxx_rxx_frm_chk_s cn38xx;
+       struct cvmx_gmxx_rxx_frm_chk_s cn38xxp2;
+       struct cvmx_gmxx_rxx_frm_chk_cn50xx {
+               u64 reserved_10_63 : 54;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_6_6 : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn50xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn52xx {
+               u64 reserved_9_63 : 55;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn52xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn52xx cn52xxp1;
+       struct cvmx_gmxx_rxx_frm_chk_cn52xx cn56xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn52xx cn56xxp1;
+       struct cvmx_gmxx_rxx_frm_chk_s cn58xx;
+       struct cvmx_gmxx_rxx_frm_chk_s cn58xxp1;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx {
+               u64 reserved_9_63 : 55;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn61xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cn63xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cn63xxp1;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cn66xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cn68xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cn68xxp1;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cn70xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cn70xxp1;
+       struct cvmx_gmxx_rxx_frm_chk_cn61xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_frm_chk cvmx_gmxx_rxx_frm_chk_t;
+
+/**
+ * cvmx_gmx#_rx#_frm_ctl
+ *
+ * GMX_RX_FRM_CTL = Frame Control
+ *
+ *
+ * Notes:
+ * * PRE_STRP
+ *   When PRE_CHK is set (indicating that the PREAMBLE will be sent), PRE_STRP
+ *   determines if the PREAMBLE+SFD bytes are thrown away or sent to the Octane
+ *   core as part of the packet.
+ *
+ *   In either mode, the PREAMBLE+SFD bytes are not counted toward the packet
+ *   size when checking against the MIN and MAX bounds.  Furthermore, the bytes
+ *   are skipped when locating the start of the L2 header for DMAC and Control
+ *   frame recognition.
+ *
+ * * CTL_BCK/CTL_DRP
+ *   These bits control how the HW handles incoming PAUSE packets.  Here are
+ *   the most common modes of operation:
+ *     CTL_BCK=1,CTL_DRP=1   - HW does it all
+ *     CTL_BCK=0,CTL_DRP=0   - SW sees all pause frames
+ *     CTL_BCK=0,CTL_DRP=1   - all pause frames are completely ignored
+ *
+ *   These control bits should be set to CTL_BCK=0,CTL_DRP=0 in halfdup mode.
+ *   Since PAUSE packets only apply to fulldup operation, any PAUSE packet
+ *   would constitute an exception which should be handled by the processing
+ *   cores.  PAUSE packets should not be forwarded.
+ */
+union cvmx_gmxx_rxx_frm_ctl {
+       u64 u64;
+       struct cvmx_gmxx_rxx_frm_ctl_s {
+               u64 reserved_13_63 : 51;
+               u64 ptp_mode : 1;
+               u64 reserved_11_11 : 1;
+               u64 null_dis : 1;
+               u64 pre_align : 1;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } s;
+       struct cvmx_gmxx_rxx_frm_ctl_cn30xx {
+               u64 reserved_9_63 : 55;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } cn30xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn31xx {
+               u64 reserved_8_63 : 56;
+               u64 vlan_len : 1;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } cn31xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn30xx cn38xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn31xx cn38xxp2;
+       struct cvmx_gmxx_rxx_frm_ctl_cn50xx {
+               u64 reserved_11_63 : 53;
+               u64 null_dis : 1;
+               u64 pre_align : 1;
+               u64 reserved_7_8 : 2;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } cn50xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn50xx cn52xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn50xx cn52xxp1;
+       struct cvmx_gmxx_rxx_frm_ctl_cn50xx cn56xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn56xxp1 {
+               u64 reserved_10_63 : 54;
+               u64 pre_align : 1;
+               u64 reserved_7_8 : 2;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } cn56xxp1;
+       struct cvmx_gmxx_rxx_frm_ctl_cn58xx {
+               u64 reserved_11_63 : 53;
+               u64 null_dis : 1;
+               u64 pre_align : 1;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } cn58xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn30xx cn58xxp1;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx {
+               u64 reserved_13_63 : 51;
+               u64 ptp_mode : 1;
+               u64 reserved_11_11 : 1;
+               u64 null_dis : 1;
+               u64 pre_align : 1;
+               u64 reserved_7_8 : 2;
+               u64 pre_free : 1;
+               u64 ctl_smac : 1;
+               u64 ctl_mcst : 1;
+               u64 ctl_bck : 1;
+               u64 ctl_drp : 1;
+               u64 pre_strp : 1;
+               u64 pre_chk : 1;
+       } cn61xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cn63xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cn63xxp1;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cn66xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cn68xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cn68xxp1;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cn70xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cn70xxp1;
+       struct cvmx_gmxx_rxx_frm_ctl_cn61xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_frm_ctl cvmx_gmxx_rxx_frm_ctl_t;
+
+/**
+ * cvmx_gmx#_rx#_frm_max
+ *
+ * GMX_RX_FRM_MAX = Frame Max length
+ *
+ *
+ * Notes:
+ * In spi4 mode, all spi4 ports use prt0 for checking.
+ *
+ * When changing the LEN field, be sure that LEN does not exceed
+ * GMX_RX_JABBER[CNT]. Failure to meet this constraint will cause packets that
+ * are within the maximum length parameter to be rejected because they exceed
+ * the GMX_RX_JABBER[CNT] limit.
+ */
+union cvmx_gmxx_rxx_frm_max {
+       u64 u64;
+       struct cvmx_gmxx_rxx_frm_max_s {
+               u64 reserved_16_63 : 48;
+               u64 len : 16;
+       } s;
+       struct cvmx_gmxx_rxx_frm_max_s cn30xx;
+       struct cvmx_gmxx_rxx_frm_max_s cn31xx;
+       struct cvmx_gmxx_rxx_frm_max_s cn38xx;
+       struct cvmx_gmxx_rxx_frm_max_s cn38xxp2;
+       struct cvmx_gmxx_rxx_frm_max_s cn58xx;
+       struct cvmx_gmxx_rxx_frm_max_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_rxx_frm_max cvmx_gmxx_rxx_frm_max_t;
+
+/**
+ * cvmx_gmx#_rx#_frm_min
+ *
+ * GMX_RX_FRM_MIN = Frame Min length
+ *
+ *
+ * Notes:
+ * In spi4 mode, all spi4 ports use prt0 for checking.
+ *
+ */
+union cvmx_gmxx_rxx_frm_min {
+       u64 u64;
+       struct cvmx_gmxx_rxx_frm_min_s {
+               u64 reserved_16_63 : 48;
+               u64 len : 16;
+       } s;
+       struct cvmx_gmxx_rxx_frm_min_s cn30xx;
+       struct cvmx_gmxx_rxx_frm_min_s cn31xx;
+       struct cvmx_gmxx_rxx_frm_min_s cn38xx;
+       struct cvmx_gmxx_rxx_frm_min_s cn38xxp2;
+       struct cvmx_gmxx_rxx_frm_min_s cn58xx;
+       struct cvmx_gmxx_rxx_frm_min_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_rxx_frm_min cvmx_gmxx_rxx_frm_min_t;
+
+/**
+ * cvmx_gmx#_rx#_ifg
+ *
+ * GMX_RX_IFG = RX Min IFG
+ *
+ */
+union cvmx_gmxx_rxx_ifg {
+       u64 u64;
+       struct cvmx_gmxx_rxx_ifg_s {
+               u64 reserved_4_63 : 60;
+               u64 ifg : 4;
+       } s;
+       struct cvmx_gmxx_rxx_ifg_s cn30xx;
+       struct cvmx_gmxx_rxx_ifg_s cn31xx;
+       struct cvmx_gmxx_rxx_ifg_s cn38xx;
+       struct cvmx_gmxx_rxx_ifg_s cn38xxp2;
+       struct cvmx_gmxx_rxx_ifg_s cn50xx;
+       struct cvmx_gmxx_rxx_ifg_s cn52xx;
+       struct cvmx_gmxx_rxx_ifg_s cn52xxp1;
+       struct cvmx_gmxx_rxx_ifg_s cn56xx;
+       struct cvmx_gmxx_rxx_ifg_s cn56xxp1;
+       struct cvmx_gmxx_rxx_ifg_s cn58xx;
+       struct cvmx_gmxx_rxx_ifg_s cn58xxp1;
+       struct cvmx_gmxx_rxx_ifg_s cn61xx;
+       struct cvmx_gmxx_rxx_ifg_s cn63xx;
+       struct cvmx_gmxx_rxx_ifg_s cn63xxp1;
+       struct cvmx_gmxx_rxx_ifg_s cn66xx;
+       struct cvmx_gmxx_rxx_ifg_s cn68xx;
+       struct cvmx_gmxx_rxx_ifg_s cn68xxp1;
+       struct cvmx_gmxx_rxx_ifg_s cn70xx;
+       struct cvmx_gmxx_rxx_ifg_s cn70xxp1;
+       struct cvmx_gmxx_rxx_ifg_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_ifg cvmx_gmxx_rxx_ifg_t;
+
+/**
+ * cvmx_gmx#_rx#_int_en
+ *
+ * GMX_RX_INT_EN = Interrupt Enable
+ *
+ *
+ * Notes:
+ * In XAUI mode prt0 is used for checking.
+ *
+ */
+union cvmx_gmxx_rxx_int_en {
+       u64 u64;
+       struct cvmx_gmxx_rxx_int_en_s {
+               u64 reserved_30_63 : 34;
+               u64 wol : 1;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_gmxx_rxx_int_en_cn30xx {
+               u64 reserved_19_63 : 45;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn30xx;
+       struct cvmx_gmxx_rxx_int_en_cn30xx cn31xx;
+       struct cvmx_gmxx_rxx_int_en_cn30xx cn38xx;
+       struct cvmx_gmxx_rxx_int_en_cn30xx cn38xxp2;
+       struct cvmx_gmxx_rxx_int_en_cn50xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_6_6 : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn50xx;
+       struct cvmx_gmxx_rxx_int_en_cn52xx {
+               u64 reserved_29_63 : 35;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn52xx;
+       struct cvmx_gmxx_rxx_int_en_cn52xx cn52xxp1;
+       struct cvmx_gmxx_rxx_int_en_cn52xx cn56xx;
+       struct cvmx_gmxx_rxx_int_en_cn56xxp1 {
+               u64 reserved_27_63 : 37;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn56xxp1;
+       struct cvmx_gmxx_rxx_int_en_cn58xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn58xx;
+       struct cvmx_gmxx_rxx_int_en_cn58xx cn58xxp1;
+       struct cvmx_gmxx_rxx_int_en_cn61xx {
+               u64 reserved_29_63 : 35;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn61xx;
+       struct cvmx_gmxx_rxx_int_en_cn61xx cn63xx;
+       struct cvmx_gmxx_rxx_int_en_cn61xx cn63xxp1;
+       struct cvmx_gmxx_rxx_int_en_cn61xx cn66xx;
+       struct cvmx_gmxx_rxx_int_en_cn61xx cn68xx;
+       struct cvmx_gmxx_rxx_int_en_cn61xx cn68xxp1;
+       struct cvmx_gmxx_rxx_int_en_cn70xx {
+               u64 reserved_30_63 : 34;
+               u64 wol : 1;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn70xx;
+       struct cvmx_gmxx_rxx_int_en_cn70xx cn70xxp1;
+       struct cvmx_gmxx_rxx_int_en_cn61xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_int_en cvmx_gmxx_rxx_int_en_t;
+
+/**
+ * cvmx_gmx#_rx#_int_reg
+ *
+ * GMX_RX_INT_REG = Interrupt Register
+ *
+ *
+ * Notes:
+ * (1) exceptions will only be raised to the control processor if the
+ *     corresponding bit in the GMX_RX_INT_EN register is set.
+ *
+ * (2) exception conditions 10:0 can also set the rcv/opcode in the received
+ *     packet's workQ entry.  The GMX_RX_FRM_CHK register provides a bit mask
+ *     for configuring which conditions set the error.
+ *
+ * (3) in half duplex operation, the expectation is that collisions will appear
+ *     as either MINERR o r CAREXT errors.
+ *
+ * (4) JABBER - An RX Jabber error indicates that a packet was received which
+ *              is longer than the maximum allowed packet as defined by the
+ *              system.  GMX will truncate the packet at the JABBER count.
+ *              Failure to do so could lead to system instabilty.
+ *
+ * (5) NIBERR - This error is illegal at 1000Mbs speeds
+ *              (GMX_RX_PRT_CFG[SPEED]==0) and will never assert.
+ *
+ * (6) MAXERR - for untagged frames, the total frame DA+SA+TL+DATA+PAD+FCS >
+ *              GMX_RX_FRM_MAX.  For tagged frames, DA+SA+VLAN+TL+DATA+PAD+FCS
+ *              > GMX_RX_FRM_MAX + 4*VLAN_VAL + 4*VLAN_STACKED.
+ *
+ * (7) MINERR - total frame DA+SA+TL+DATA+PAD+FCS < 64
+ *
+ * (8) ALNERR - Indicates that the packet received was not an integer number of
+ *              bytes.  If FCS checking is enabled, ALNERR will only assert if
+ *              the FCS is bad.  If FCS checking is disabled, ALNERR will
+ *              assert in all non-integer frame cases.
+ *
+ * (9) Collisions - Collisions can only occur in half-duplex mode.  A collision
+ *                  is assumed by the receiver when the slottime
+ *                  (GMX_PRT_CFG[SLOTTIME]) is not satisfied.  In 10/100 mode,
+ *                  this will result in a frame < SLOTTIME.  In 1000 mode, it
+ *                  could result either in frame < SLOTTIME or a carrier extend
+ *                  error with the SLOTTIME.  These conditions are visible by...
+ *
+ *                  . transfer ended before slottime - COLDET
+ *                  . carrier extend error           - CAREXT
+ *
+ * (A) LENERR - Length errors occur when the received packet does not match the
+ *              length field.  LENERR is only checked for packets between 64
+ *              and 1500 bytes.  For untagged frames, the length must exact
+ *              match.  For tagged frames the length or length+4 must match.
+ *
+ * (B) PCTERR - checks that the frame begins with a valid PREAMBLE sequence.
+ *              Does not check the number of PREAMBLE cycles.
+ *
+ * (C) OVRERR -
+ *
+ *              OVRERR is an architectural assertion check internal to GMX to
+ *              make sure no assumption was violated.  In a correctly operating
+ *              system, this interrupt can never fire.
+ *
+ *              GMX has an internal arbiter which selects which of 4 ports to
+ *              buffer in the main RX FIFO.  If we normally buffer 8 bytes,
+ *              then each port will typically push a tick every 8 cycles - if
+ *              the packet interface is going as fast as possible.  If there
+ *              are four ports, they push every two cycles.  So that's the
+ *              assumption.  That the inbound module will always be able to
+ *              consume the tick before another is produced.  If that doesn't
+ *              happen - that's when OVRERR will assert.
+ *
+ * (D) In XAUI mode prt0 is used for interrupt logging.
+ */
+union cvmx_gmxx_rxx_int_reg {
+       u64 u64;
+       struct cvmx_gmxx_rxx_int_reg_s {
+               u64 reserved_30_63 : 34;
+               u64 wol : 1;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } s;
+       struct cvmx_gmxx_rxx_int_reg_cn30xx {
+               u64 reserved_19_63 : 45;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn30xx;
+       struct cvmx_gmxx_rxx_int_reg_cn30xx cn31xx;
+       struct cvmx_gmxx_rxx_int_reg_cn30xx cn38xx;
+       struct cvmx_gmxx_rxx_int_reg_cn30xx cn38xxp2;
+       struct cvmx_gmxx_rxx_int_reg_cn50xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_6_6 : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn50xx;
+       struct cvmx_gmxx_rxx_int_reg_cn52xx {
+               u64 reserved_29_63 : 35;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn52xx;
+       struct cvmx_gmxx_rxx_int_reg_cn52xx cn52xxp1;
+       struct cvmx_gmxx_rxx_int_reg_cn52xx cn56xx;
+       struct cvmx_gmxx_rxx_int_reg_cn56xxp1 {
+               u64 reserved_27_63 : 37;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 reserved_0_0 : 1;
+       } cn56xxp1;
+       struct cvmx_gmxx_rxx_int_reg_cn58xx {
+               u64 reserved_20_63 : 44;
+               u64 pause_drp : 1;
+               u64 phy_dupx : 1;
+               u64 phy_spd : 1;
+               u64 phy_link : 1;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 niberr : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 lenerr : 1;
+               u64 alnerr : 1;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 maxerr : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn58xx;
+       struct cvmx_gmxx_rxx_int_reg_cn58xx cn58xxp1;
+       struct cvmx_gmxx_rxx_int_reg_cn61xx {
+               u64 reserved_29_63 : 35;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn61xx;
+       struct cvmx_gmxx_rxx_int_reg_cn61xx cn63xx;
+       struct cvmx_gmxx_rxx_int_reg_cn61xx cn63xxp1;
+       struct cvmx_gmxx_rxx_int_reg_cn61xx cn66xx;
+       struct cvmx_gmxx_rxx_int_reg_cn61xx cn68xx;
+       struct cvmx_gmxx_rxx_int_reg_cn61xx cn68xxp1;
+       struct cvmx_gmxx_rxx_int_reg_cn70xx {
+               u64 reserved_30_63 : 34;
+               u64 wol : 1;
+               u64 hg2cc : 1;
+               u64 hg2fld : 1;
+               u64 undat : 1;
+               u64 uneop : 1;
+               u64 unsop : 1;
+               u64 bad_term : 1;
+               u64 bad_seq : 1;
+               u64 rem_fault : 1;
+               u64 loc_fault : 1;
+               u64 pause_drp : 1;
+               u64 reserved_16_18 : 3;
+               u64 ifgerr : 1;
+               u64 coldet : 1;
+               u64 falerr : 1;
+               u64 rsverr : 1;
+               u64 pcterr : 1;
+               u64 ovrerr : 1;
+               u64 reserved_9_9 : 1;
+               u64 skperr : 1;
+               u64 rcverr : 1;
+               u64 reserved_5_6 : 2;
+               u64 fcserr : 1;
+               u64 jabber : 1;
+               u64 reserved_2_2 : 1;
+               u64 carext : 1;
+               u64 minerr : 1;
+       } cn70xx;
+       struct cvmx_gmxx_rxx_int_reg_cn70xx cn70xxp1;
+       struct cvmx_gmxx_rxx_int_reg_cn61xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_int_reg cvmx_gmxx_rxx_int_reg_t;
+
+/**
+ * cvmx_gmx#_rx#_jabber
+ *
+ * GMX_RX_JABBER = The max size packet after which GMX will truncate
+ *
+ *
+ * Notes:
+ * CNT must be 8-byte aligned such that CNT[2:0] == 0
+ *
+ * The packet that will be sent to the packet input logic will have an
+ * additionl 8 bytes if GMX_RX_FRM_CTL[PRE_CHK] is set and
+ * GMX_RX_FRM_CTL[PRE_STRP] is clear.  The max packet that will be sent is
+ * defined as...
+ *
+ *      max_sized_packet = GMX_RX_JABBER[CNT]+((GMX_RX_FRM_CTL[PRE_CHK] & !GMX_RX_FRM_CTL[PRE_STRP])*8)
+ *
+ * In XAUI mode prt0 is used for checking.
+ */
+union cvmx_gmxx_rxx_jabber {
+       u64 u64;
+       struct cvmx_gmxx_rxx_jabber_s {
+               u64 reserved_16_63 : 48;
+               u64 cnt : 16;
+       } s;
+       struct cvmx_gmxx_rxx_jabber_s cn30xx;
+       struct cvmx_gmxx_rxx_jabber_s cn31xx;
+       struct cvmx_gmxx_rxx_jabber_s cn38xx;
+       struct cvmx_gmxx_rxx_jabber_s cn38xxp2;
+       struct cvmx_gmxx_rxx_jabber_s cn50xx;
+       struct cvmx_gmxx_rxx_jabber_s cn52xx;
+       struct cvmx_gmxx_rxx_jabber_s cn52xxp1;
+       struct cvmx_gmxx_rxx_jabber_s cn56xx;
+       struct cvmx_gmxx_rxx_jabber_s cn56xxp1;
+       struct cvmx_gmxx_rxx_jabber_s cn58xx;
+       struct cvmx_gmxx_rxx_jabber_s cn58xxp1;
+       struct cvmx_gmxx_rxx_jabber_s cn61xx;
+       struct cvmx_gmxx_rxx_jabber_s cn63xx;
+       struct cvmx_gmxx_rxx_jabber_s cn63xxp1;
+       struct cvmx_gmxx_rxx_jabber_s cn66xx;
+       struct cvmx_gmxx_rxx_jabber_s cn68xx;
+       struct cvmx_gmxx_rxx_jabber_s cn68xxp1;
+       struct cvmx_gmxx_rxx_jabber_s cn70xx;
+       struct cvmx_gmxx_rxx_jabber_s cn70xxp1;
+       struct cvmx_gmxx_rxx_jabber_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_jabber cvmx_gmxx_rxx_jabber_t;
+
+/**
+ * cvmx_gmx#_rx#_pause_drop_time
+ *
+ * GMX_RX_PAUSE_DROP_TIME = The TIME field in a PAUSE Packet which was dropped due to GMX RX FIFO full condition
+ *
+ */
+union cvmx_gmxx_rxx_pause_drop_time {
+       u64 u64;
+       struct cvmx_gmxx_rxx_pause_drop_time_s {
+               u64 reserved_16_63 : 48;
+               u64 status : 16;
+       } s;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn50xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn52xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn52xxp1;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn56xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn56xxp1;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn58xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn58xxp1;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn61xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn63xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn63xxp1;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn66xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn68xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn68xxp1;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn70xx;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cn70xxp1;
+       struct cvmx_gmxx_rxx_pause_drop_time_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_pause_drop_time cvmx_gmxx_rxx_pause_drop_time_t;
+
+/**
+ * cvmx_gmx#_rx#_rx_inbnd
+ *
+ * GMX_RX_INBND = RGMII InBand Link Status
+ *
+ *
+ * Notes:
+ * These fields are only valid if the attached PHY is operating in RGMII mode
+ * and supports the optional in-band status (see section 3.4.1 of the RGMII
+ * specification, version 1.3 for more information).
+ */
+union cvmx_gmxx_rxx_rx_inbnd {
+       u64 u64;
+       struct cvmx_gmxx_rxx_rx_inbnd_s {
+               u64 reserved_4_63 : 60;
+               u64 duplex : 1;
+               u64 speed : 2;
+               u64 status : 1;
+       } s;
+       struct cvmx_gmxx_rxx_rx_inbnd_s cn30xx;
+       struct cvmx_gmxx_rxx_rx_inbnd_s cn31xx;
+       struct cvmx_gmxx_rxx_rx_inbnd_s cn38xx;
+       struct cvmx_gmxx_rxx_rx_inbnd_s cn38xxp2;
+       struct cvmx_gmxx_rxx_rx_inbnd_s cn50xx;
+       struct cvmx_gmxx_rxx_rx_inbnd_s cn58xx;
+       struct cvmx_gmxx_rxx_rx_inbnd_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_rxx_rx_inbnd cvmx_gmxx_rxx_rx_inbnd_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_ctl
+ *
+ * GMX_RX_STATS_CTL = RX Stats Control register
+ *
+ */
+union cvmx_gmxx_rxx_stats_ctl {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 rd_clr : 1;
+       } s;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_ctl_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_ctl cvmx_gmxx_rxx_stats_ctl_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_octs
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_rxx_stats_octs {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_octs_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_gmxx_rxx_stats_octs_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_octs_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_octs_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_octs cvmx_gmxx_rxx_stats_octs_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_octs_ctl
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_rxx_stats_octs_ctl {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_octs_ctl cvmx_gmxx_rxx_stats_octs_ctl_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_octs_dmac
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_rxx_stats_octs_dmac {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_octs_dmac cvmx_gmxx_rxx_stats_octs_dmac_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_octs_drp
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_RX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_rxx_stats_octs_drp {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s {
+               u64 reserved_48_63 : 16;
+               u64 cnt : 48;
+       } s;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_octs_drp cvmx_gmxx_rxx_stats_octs_drp_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_pkts
+ *
+ * Count of good received packets - packets that are not recognized as PAUSE
+ * packets, dropped due the DMAC filter, dropped due FIFO full status, or
+ * have any other OPCODE (FCS, Length, etc).
+ */
+union cvmx_gmxx_rxx_stats_pkts {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_pkts_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_pkts_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_pkts cvmx_gmxx_rxx_stats_pkts_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_pkts_bad
+ *
+ * Count of all packets received with some error that were not dropped
+ * either due to the dmac filter or lack of room in the receive FIFO.
+ */
+union cvmx_gmxx_rxx_stats_pkts_bad {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_pkts_bad cvmx_gmxx_rxx_stats_pkts_bad_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_pkts_ctl
+ *
+ * Count of all packets received that were recognized as Flow Control or
+ * PAUSE packets.  PAUSE packets with any kind of error are counted in
+ * GMX_RX_STATS_PKTS_BAD.  Pause packets can be optionally dropped or
+ * forwarded based on the GMX_RX_FRM_CTL[CTL_DRP] bit.  This count
+ * increments regardless of whether the packet is dropped.  Pause packets
+ * will never be counted in GMX_RX_STATS_PKTS.  Packets dropped due the dmac
+ * filter will be counted in GMX_RX_STATS_PKTS_DMAC and not here.
+ */
+union cvmx_gmxx_rxx_stats_pkts_ctl {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_pkts_ctl cvmx_gmxx_rxx_stats_pkts_ctl_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_pkts_dmac
+ *
+ * Count of all packets received that were dropped by the dmac filter.
+ * Packets that match the DMAC will be dropped and counted here regardless
+ * of if they were bad packets.  These packets will never be counted in
+ * GMX_RX_STATS_PKTS.
+ * Some packets that were not able to satisify the DECISION_CNT may not
+ * actually be dropped by Octeon, but they will be counted here as if they
+ * were dropped.
+ */
+union cvmx_gmxx_rxx_stats_pkts_dmac {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_pkts_dmac cvmx_gmxx_rxx_stats_pkts_dmac_t;
+
+/**
+ * cvmx_gmx#_rx#_stats_pkts_drp
+ *
+ * Count of all packets received that were dropped due to a full receive FIFO.
+ * This counts both partial packets in which there was enough space in the RX
+ * FIFO to begin to buffer and the packet and total drops in which no packet was
+ * sent to PKI.  This counts good and bad packets received - all packets dropped
+ * by the FIFO.  It does not count packets dropped by the dmac or pause packet
+ * filters.
+ */
+union cvmx_gmxx_rxx_stats_pkts_drp {
+       u64 u64;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn30xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn31xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn38xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn38xxp2;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn50xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn52xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn52xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn56xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn56xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn58xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn58xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn61xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn63xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn63xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn66xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn68xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn68xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn70xx;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cn70xxp1;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_stats_pkts_drp cvmx_gmxx_rxx_stats_pkts_drp_t;
+
+/**
+ * cvmx_gmx#_rx#_udd_skp
+ *
+ * GMX_RX_UDD_SKP = Amount of User-defined data before the start of the L2 data
+ *
+ *
+ * Notes:
+ * (1) The skip bytes are part of the packet and will be sent down the NCB
+ *     packet interface and will be handled by PKI.
+ *
+ * (2) The system can determine if the UDD bytes are included in the FCS check
+ *     by using the FCSSEL field - if the FCS check is enabled.
+ *
+ * (3) Assume that the preamble/sfd is always at the start of the frame - even
+ *     before UDD bytes.  In most cases, there will be no preamble in these
+ *     cases since it will be packet interface in direct communication to
+ *     another packet interface (MAC to MAC) without a PHY involved.
+ *
+ * (4) We can still do address filtering and control packet filtering is the
+ *     user desires.
+ *
+ * (5) UDD_SKP must be 0 in half-duplex operation unless
+ *     GMX_RX_FRM_CTL[PRE_CHK] is clear.  If GMX_RX_FRM_CTL[PRE_CHK] is clear,
+ *     then UDD_SKP will normally be 8.
+ *
+ * (6) In all cases, the UDD bytes will be sent down the packet interface as
+ *     part of the packet.  The UDD bytes are never stripped from the actual
+ *     packet.
+ *
+ * (7) If LEN != 0, then GMX_RX_FRM_CHK[LENERR] will be disabled and GMX_RX_INT_REG[LENERR] will be zero
+ */
+union cvmx_gmxx_rxx_udd_skp {
+       u64 u64;
+       struct cvmx_gmxx_rxx_udd_skp_s {
+               u64 reserved_9_63 : 55;
+               u64 fcssel : 1;
+               u64 reserved_7_7 : 1;
+               u64 len : 7;
+       } s;
+       struct cvmx_gmxx_rxx_udd_skp_s cn30xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn31xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn38xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn38xxp2;
+       struct cvmx_gmxx_rxx_udd_skp_s cn50xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn52xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn52xxp1;
+       struct cvmx_gmxx_rxx_udd_skp_s cn56xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn56xxp1;
+       struct cvmx_gmxx_rxx_udd_skp_s cn58xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn58xxp1;
+       struct cvmx_gmxx_rxx_udd_skp_s cn61xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn63xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn63xxp1;
+       struct cvmx_gmxx_rxx_udd_skp_s cn66xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn68xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn68xxp1;
+       struct cvmx_gmxx_rxx_udd_skp_s cn70xx;
+       struct cvmx_gmxx_rxx_udd_skp_s cn70xxp1;
+       struct cvmx_gmxx_rxx_udd_skp_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rxx_udd_skp cvmx_gmxx_rxx_udd_skp_t;
+
+/**
+ * cvmx_gmx#_rx_bp_drop#
+ *
+ * GMX_RX_BP_DROP = FIFO mark for packet drop
+ *
+ *
+ * Notes:
+ * The actual watermark is dynamic with respect to the GMX_RX_PRTS
+ * register.  The GMX_RX_PRTS controls the depth of the port's
+ * FIFO so as ports are added or removed, the drop point may change.
+ *
+ * In XAUI mode prt0 is used for checking.
+ */
+union cvmx_gmxx_rx_bp_dropx {
+       u64 u64;
+       struct cvmx_gmxx_rx_bp_dropx_s {
+               u64 reserved_6_63 : 58;
+               u64 mark : 6;
+       } s;
+       struct cvmx_gmxx_rx_bp_dropx_s cn30xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn31xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn38xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn38xxp2;
+       struct cvmx_gmxx_rx_bp_dropx_s cn50xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn52xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn52xxp1;
+       struct cvmx_gmxx_rx_bp_dropx_s cn56xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn56xxp1;
+       struct cvmx_gmxx_rx_bp_dropx_s cn58xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn58xxp1;
+       struct cvmx_gmxx_rx_bp_dropx_s cn61xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn63xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn63xxp1;
+       struct cvmx_gmxx_rx_bp_dropx_s cn66xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn68xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn68xxp1;
+       struct cvmx_gmxx_rx_bp_dropx_s cn70xx;
+       struct cvmx_gmxx_rx_bp_dropx_s cn70xxp1;
+       struct cvmx_gmxx_rx_bp_dropx_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_bp_dropx cvmx_gmxx_rx_bp_dropx_t;
+
+/**
+ * cvmx_gmx#_rx_bp_off#
+ *
+ * GMX_RX_BP_OFF = Lowater mark for packet drop
+ *
+ *
+ * Notes:
+ * In XAUI mode, prt0 is used for checking.
+ *
+ */
+union cvmx_gmxx_rx_bp_offx {
+       u64 u64;
+       struct cvmx_gmxx_rx_bp_offx_s {
+               u64 reserved_6_63 : 58;
+               u64 mark : 6;
+       } s;
+       struct cvmx_gmxx_rx_bp_offx_s cn30xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn31xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn38xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn38xxp2;
+       struct cvmx_gmxx_rx_bp_offx_s cn50xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn52xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn52xxp1;
+       struct cvmx_gmxx_rx_bp_offx_s cn56xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn56xxp1;
+       struct cvmx_gmxx_rx_bp_offx_s cn58xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn58xxp1;
+       struct cvmx_gmxx_rx_bp_offx_s cn61xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn63xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn63xxp1;
+       struct cvmx_gmxx_rx_bp_offx_s cn66xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn68xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn68xxp1;
+       struct cvmx_gmxx_rx_bp_offx_s cn70xx;
+       struct cvmx_gmxx_rx_bp_offx_s cn70xxp1;
+       struct cvmx_gmxx_rx_bp_offx_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_bp_offx cvmx_gmxx_rx_bp_offx_t;
+
+/**
+ * cvmx_gmx#_rx_bp_on#
+ *
+ * GMX_RX_BP_ON = Hiwater mark for port/interface backpressure
+ *
+ *
+ * Notes:
+ * In XAUI mode, prt0 is used for checking.
+ *
+ */
+union cvmx_gmxx_rx_bp_onx {
+       u64 u64;
+       struct cvmx_gmxx_rx_bp_onx_s {
+               u64 reserved_11_63 : 53;
+               u64 mark : 11;
+       } s;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx {
+               u64 reserved_9_63 : 55;
+               u64 mark : 9;
+       } cn30xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn31xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn38xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn38xxp2;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn50xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn52xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn52xxp1;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn56xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn56xxp1;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn58xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn58xxp1;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn61xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn63xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn63xxp1;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn66xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn68xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn68xxp1;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn70xx;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cn70xxp1;
+       struct cvmx_gmxx_rx_bp_onx_cn30xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_bp_onx cvmx_gmxx_rx_bp_onx_t;
+
+/**
+ * cvmx_gmx#_rx_hg2_status
+ *
+ * ** HG2 message CSRs
+ *
+ */
+union cvmx_gmxx_rx_hg2_status {
+       u64 u64;
+       struct cvmx_gmxx_rx_hg2_status_s {
+               u64 reserved_48_63 : 16;
+               u64 phtim2go : 16;
+               u64 xof : 16;
+               u64 lgtim2go : 16;
+       } s;
+       struct cvmx_gmxx_rx_hg2_status_s cn52xx;
+       struct cvmx_gmxx_rx_hg2_status_s cn52xxp1;
+       struct cvmx_gmxx_rx_hg2_status_s cn56xx;
+       struct cvmx_gmxx_rx_hg2_status_s cn61xx;
+       struct cvmx_gmxx_rx_hg2_status_s cn63xx;
+       struct cvmx_gmxx_rx_hg2_status_s cn63xxp1;
+       struct cvmx_gmxx_rx_hg2_status_s cn66xx;
+       struct cvmx_gmxx_rx_hg2_status_s cn68xx;
+       struct cvmx_gmxx_rx_hg2_status_s cn68xxp1;
+       struct cvmx_gmxx_rx_hg2_status_s cn70xx;
+       struct cvmx_gmxx_rx_hg2_status_s cn70xxp1;
+       struct cvmx_gmxx_rx_hg2_status_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_hg2_status cvmx_gmxx_rx_hg2_status_t;
+
+/**
+ * cvmx_gmx#_rx_pass_en
+ *
+ * GMX_RX_PASS_EN = Packet pass through mode enable
+ *
+ * When both Octane ports are running in Spi4 mode, packets can be directly
+ * passed from one SPX interface to the other without being processed by the
+ * core or PP's.  The register has one bit for each port to enable the pass
+ * through feature.
+ *
+ * Notes:
+ * (1) Can only be used in dual Spi4 configs
+ *
+ * (2) The mapped pass through output port cannot be the destination port for
+ *     any Octane core traffic.
+ */
+union cvmx_gmxx_rx_pass_en {
+       u64 u64;
+       struct cvmx_gmxx_rx_pass_en_s {
+               u64 reserved_16_63 : 48;
+               u64 en : 16;
+       } s;
+       struct cvmx_gmxx_rx_pass_en_s cn38xx;
+       struct cvmx_gmxx_rx_pass_en_s cn38xxp2;
+       struct cvmx_gmxx_rx_pass_en_s cn58xx;
+       struct cvmx_gmxx_rx_pass_en_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_rx_pass_en cvmx_gmxx_rx_pass_en_t;
+
+/**
+ * cvmx_gmx#_rx_pass_map#
+ *
+ * GMX_RX_PASS_MAP = Packet pass through port map
+ *
+ */
+union cvmx_gmxx_rx_pass_mapx {
+       u64 u64;
+       struct cvmx_gmxx_rx_pass_mapx_s {
+               u64 reserved_4_63 : 60;
+               u64 dprt : 4;
+       } s;
+       struct cvmx_gmxx_rx_pass_mapx_s cn38xx;
+       struct cvmx_gmxx_rx_pass_mapx_s cn38xxp2;
+       struct cvmx_gmxx_rx_pass_mapx_s cn58xx;
+       struct cvmx_gmxx_rx_pass_mapx_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_rx_pass_mapx cvmx_gmxx_rx_pass_mapx_t;
+
+/**
+ * cvmx_gmx#_rx_prt_info
+ *
+ * GMX_RX_PRT_INFO = Report the RX status for port
+ *
+ *
+ * Notes:
+ * In XAUI mode, only the lsb (corresponding to port0) of DROP and COMMIT are used.
+ *
+ */
+union cvmx_gmxx_rx_prt_info {
+       u64 u64;
+       struct cvmx_gmxx_rx_prt_info_s {
+               u64 reserved_32_63 : 32;
+               u64 drop : 16;
+               u64 commit : 16;
+       } s;
+       struct cvmx_gmxx_rx_prt_info_cn30xx {
+               u64 reserved_19_63 : 45;
+               u64 drop : 3;
+               u64 reserved_3_15 : 13;
+               u64 commit : 3;
+       } cn30xx;
+       struct cvmx_gmxx_rx_prt_info_cn30xx cn31xx;
+       struct cvmx_gmxx_rx_prt_info_s cn38xx;
+       struct cvmx_gmxx_rx_prt_info_cn30xx cn50xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 drop : 4;
+               u64 reserved_4_15 : 12;
+               u64 commit : 4;
+       } cn52xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn52xxp1;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn56xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn56xxp1;
+       struct cvmx_gmxx_rx_prt_info_s cn58xx;
+       struct cvmx_gmxx_rx_prt_info_s cn58xxp1;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn61xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn63xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn63xxp1;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn66xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn68xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn68xxp1;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn70xx;
+       struct cvmx_gmxx_rx_prt_info_cn52xx cn70xxp1;
+       struct cvmx_gmxx_rx_prt_info_cnf71xx {
+               u64 reserved_18_63 : 46;
+               u64 drop : 2;
+               u64 reserved_2_15 : 14;
+               u64 commit : 2;
+       } cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_prt_info cvmx_gmxx_rx_prt_info_t;
+
+/**
+ * cvmx_gmx#_rx_prts
+ *
+ * GMX_RX_PRTS = Number of FIFOs to carve the RX buffer into
+ *
+ *
+ * Notes:
+ * GMX_RX_PRTS[PRTS] must be set to '1' in XAUI mode.
+ *
+ */
+union cvmx_gmxx_rx_prts {
+       u64 u64;
+       struct cvmx_gmxx_rx_prts_s {
+               u64 reserved_3_63 : 61;
+               u64 prts : 3;
+       } s;
+       struct cvmx_gmxx_rx_prts_s cn30xx;
+       struct cvmx_gmxx_rx_prts_s cn31xx;
+       struct cvmx_gmxx_rx_prts_s cn38xx;
+       struct cvmx_gmxx_rx_prts_s cn38xxp2;
+       struct cvmx_gmxx_rx_prts_s cn50xx;
+       struct cvmx_gmxx_rx_prts_s cn52xx;
+       struct cvmx_gmxx_rx_prts_s cn52xxp1;
+       struct cvmx_gmxx_rx_prts_s cn56xx;
+       struct cvmx_gmxx_rx_prts_s cn56xxp1;
+       struct cvmx_gmxx_rx_prts_s cn58xx;
+       struct cvmx_gmxx_rx_prts_s cn58xxp1;
+       struct cvmx_gmxx_rx_prts_s cn61xx;
+       struct cvmx_gmxx_rx_prts_s cn63xx;
+       struct cvmx_gmxx_rx_prts_s cn63xxp1;
+       struct cvmx_gmxx_rx_prts_s cn66xx;
+       struct cvmx_gmxx_rx_prts_s cn68xx;
+       struct cvmx_gmxx_rx_prts_s cn68xxp1;
+       struct cvmx_gmxx_rx_prts_s cn70xx;
+       struct cvmx_gmxx_rx_prts_s cn70xxp1;
+       struct cvmx_gmxx_rx_prts_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_prts cvmx_gmxx_rx_prts_t;
+
+/**
+ * cvmx_gmx#_rx_tx_status
+ *
+ * GMX_RX_TX_STATUS = GMX RX/TX Status
+ *
+ */
+union cvmx_gmxx_rx_tx_status {
+       u64 u64;
+       struct cvmx_gmxx_rx_tx_status_s {
+               u64 reserved_7_63 : 57;
+               u64 tx : 3;
+               u64 reserved_3_3 : 1;
+               u64 rx : 3;
+       } s;
+       struct cvmx_gmxx_rx_tx_status_s cn30xx;
+       struct cvmx_gmxx_rx_tx_status_s cn31xx;
+       struct cvmx_gmxx_rx_tx_status_s cn50xx;
+};
+
+typedef union cvmx_gmxx_rx_tx_status cvmx_gmxx_rx_tx_status_t;
+
+/**
+ * cvmx_gmx#_rx_xaui_bad_col
+ */
+union cvmx_gmxx_rx_xaui_bad_col {
+       u64 u64;
+       struct cvmx_gmxx_rx_xaui_bad_col_s {
+               u64 reserved_40_63 : 24;
+               u64 val : 1;
+               u64 state : 3;
+               u64 lane_rxc : 4;
+               u64 lane_rxd : 32;
+       } s;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn52xx;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn52xxp1;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn56xx;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn56xxp1;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn61xx;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn63xx;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn63xxp1;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn66xx;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn68xx;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn68xxp1;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn70xx;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cn70xxp1;
+       struct cvmx_gmxx_rx_xaui_bad_col_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_xaui_bad_col cvmx_gmxx_rx_xaui_bad_col_t;
+
+/**
+ * cvmx_gmx#_rx_xaui_ctl
+ */
+union cvmx_gmxx_rx_xaui_ctl {
+       u64 u64;
+       struct cvmx_gmxx_rx_xaui_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 status : 2;
+       } s;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn52xx;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn52xxp1;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn56xx;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn56xxp1;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn61xx;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn63xx;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn63xxp1;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn66xx;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn68xx;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn68xxp1;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn70xx;
+       struct cvmx_gmxx_rx_xaui_ctl_s cn70xxp1;
+       struct cvmx_gmxx_rx_xaui_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_rx_xaui_ctl cvmx_gmxx_rx_xaui_ctl_t;
+
+/**
+ * cvmx_gmx#_rxaui_ctl
+ */
+union cvmx_gmxx_rxaui_ctl {
+       u64 u64;
+       struct cvmx_gmxx_rxaui_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 disparity : 1;
+       } s;
+       struct cvmx_gmxx_rxaui_ctl_s cn68xx;
+       struct cvmx_gmxx_rxaui_ctl_s cn68xxp1;
+       struct cvmx_gmxx_rxaui_ctl_s cn70xx;
+       struct cvmx_gmxx_rxaui_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_gmxx_rxaui_ctl cvmx_gmxx_rxaui_ctl_t;
+
+/**
+ * cvmx_gmx#_smac#
+ *
+ * GMX_SMAC = Packet SMAC
+ *
+ */
+union cvmx_gmxx_smacx {
+       u64 u64;
+       struct cvmx_gmxx_smacx_s {
+               u64 reserved_48_63 : 16;
+               u64 smac : 48;
+       } s;
+       struct cvmx_gmxx_smacx_s cn30xx;
+       struct cvmx_gmxx_smacx_s cn31xx;
+       struct cvmx_gmxx_smacx_s cn38xx;
+       struct cvmx_gmxx_smacx_s cn38xxp2;
+       struct cvmx_gmxx_smacx_s cn50xx;
+       struct cvmx_gmxx_smacx_s cn52xx;
+       struct cvmx_gmxx_smacx_s cn52xxp1;
+       struct cvmx_gmxx_smacx_s cn56xx;
+       struct cvmx_gmxx_smacx_s cn56xxp1;
+       struct cvmx_gmxx_smacx_s cn58xx;
+       struct cvmx_gmxx_smacx_s cn58xxp1;
+       struct cvmx_gmxx_smacx_s cn61xx;
+       struct cvmx_gmxx_smacx_s cn63xx;
+       struct cvmx_gmxx_smacx_s cn63xxp1;
+       struct cvmx_gmxx_smacx_s cn66xx;
+       struct cvmx_gmxx_smacx_s cn68xx;
+       struct cvmx_gmxx_smacx_s cn68xxp1;
+       struct cvmx_gmxx_smacx_s cn70xx;
+       struct cvmx_gmxx_smacx_s cn70xxp1;
+       struct cvmx_gmxx_smacx_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_smacx cvmx_gmxx_smacx_t;
+
+/**
+ * cvmx_gmx#_soft_bist
+ *
+ * GMX_SOFT_BIST = Software BIST Control
+ *
+ */
+union cvmx_gmxx_soft_bist {
+       u64 u64;
+       struct cvmx_gmxx_soft_bist_s {
+               u64 reserved_2_63 : 62;
+               u64 start_bist : 1;
+               u64 clear_bist : 1;
+       } s;
+       struct cvmx_gmxx_soft_bist_s cn63xx;
+       struct cvmx_gmxx_soft_bist_s cn63xxp1;
+       struct cvmx_gmxx_soft_bist_s cn66xx;
+       struct cvmx_gmxx_soft_bist_s cn68xx;
+       struct cvmx_gmxx_soft_bist_s cn68xxp1;
+};
+
+typedef union cvmx_gmxx_soft_bist cvmx_gmxx_soft_bist_t;
+
+/**
+ * cvmx_gmx#_stat_bp
+ *
+ * GMX_STAT_BP = Number of cycles that the TX/Stats block has help up operation
+ *
+ *
+ * Notes:
+ * It has no relationship with the TX FIFO per se.  The TX engine sends packets
+ * from PKO and upon completion, sends a command to the TX stats block for an
+ * update based on the packet size.  The stats operation can take a few cycles -
+ * normally not enough to be visible considering the 64B min packet size that is
+ * ethernet convention.
+ *
+ * In the rare case in which SW attempted to schedule really, really, small packets
+ * or the sclk (6xxx) is running ass-slow, then the stats updates may not happen in
+ * real time and can back up the TX engine.
+ *
+ * This counter is the number of cycles in which the TX engine was stalled.  In
+ * normal operation, it should always be zeros.
+ */
+union cvmx_gmxx_stat_bp {
+       u64 u64;
+       struct cvmx_gmxx_stat_bp_s {
+               u64 reserved_17_63 : 47;
+               u64 bp : 1;
+               u64 cnt : 16;
+       } s;
+       struct cvmx_gmxx_stat_bp_s cn30xx;
+       struct cvmx_gmxx_stat_bp_s cn31xx;
+       struct cvmx_gmxx_stat_bp_s cn38xx;
+       struct cvmx_gmxx_stat_bp_s cn38xxp2;
+       struct cvmx_gmxx_stat_bp_s cn50xx;
+       struct cvmx_gmxx_stat_bp_s cn52xx;
+       struct cvmx_gmxx_stat_bp_s cn52xxp1;
+       struct cvmx_gmxx_stat_bp_s cn56xx;
+       struct cvmx_gmxx_stat_bp_s cn56xxp1;
+       struct cvmx_gmxx_stat_bp_s cn58xx;
+       struct cvmx_gmxx_stat_bp_s cn58xxp1;
+       struct cvmx_gmxx_stat_bp_s cn61xx;
+       struct cvmx_gmxx_stat_bp_s cn63xx;
+       struct cvmx_gmxx_stat_bp_s cn63xxp1;
+       struct cvmx_gmxx_stat_bp_s cn66xx;
+       struct cvmx_gmxx_stat_bp_s cn68xx;
+       struct cvmx_gmxx_stat_bp_s cn68xxp1;
+       struct cvmx_gmxx_stat_bp_s cn70xx;
+       struct cvmx_gmxx_stat_bp_s cn70xxp1;
+       struct cvmx_gmxx_stat_bp_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_stat_bp cvmx_gmxx_stat_bp_t;
+
+/**
+ * cvmx_gmx#_tb_reg
+ *
+ * DON'T PUT IN HRM*
+ *
+ */
+union cvmx_gmxx_tb_reg {
+       u64 u64;
+       struct cvmx_gmxx_tb_reg_s {
+               u64 reserved_1_63 : 63;
+               u64 wr_magic : 1;
+       } s;
+       struct cvmx_gmxx_tb_reg_s cn61xx;
+       struct cvmx_gmxx_tb_reg_s cn66xx;
+       struct cvmx_gmxx_tb_reg_s cn68xx;
+       struct cvmx_gmxx_tb_reg_s cn70xx;
+       struct cvmx_gmxx_tb_reg_s cn70xxp1;
+       struct cvmx_gmxx_tb_reg_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tb_reg cvmx_gmxx_tb_reg_t;
+
+/**
+ * cvmx_gmx#_tx#_append
+ *
+ * GMX_TX_APPEND = Packet TX Append Control
+ *
+ */
+union cvmx_gmxx_txx_append {
+       u64 u64;
+       struct cvmx_gmxx_txx_append_s {
+               u64 reserved_4_63 : 60;
+               u64 force_fcs : 1;
+               u64 fcs : 1;
+               u64 pad : 1;
+               u64 preamble : 1;
+       } s;
+       struct cvmx_gmxx_txx_append_s cn30xx;
+       struct cvmx_gmxx_txx_append_s cn31xx;
+       struct cvmx_gmxx_txx_append_s cn38xx;
+       struct cvmx_gmxx_txx_append_s cn38xxp2;
+       struct cvmx_gmxx_txx_append_s cn50xx;
+       struct cvmx_gmxx_txx_append_s cn52xx;
+       struct cvmx_gmxx_txx_append_s cn52xxp1;
+       struct cvmx_gmxx_txx_append_s cn56xx;
+       struct cvmx_gmxx_txx_append_s cn56xxp1;
+       struct cvmx_gmxx_txx_append_s cn58xx;
+       struct cvmx_gmxx_txx_append_s cn58xxp1;
+       struct cvmx_gmxx_txx_append_s cn61xx;
+       struct cvmx_gmxx_txx_append_s cn63xx;
+       struct cvmx_gmxx_txx_append_s cn63xxp1;
+       struct cvmx_gmxx_txx_append_s cn66xx;
+       struct cvmx_gmxx_txx_append_s cn68xx;
+       struct cvmx_gmxx_txx_append_s cn68xxp1;
+       struct cvmx_gmxx_txx_append_s cn70xx;
+       struct cvmx_gmxx_txx_append_s cn70xxp1;
+       struct cvmx_gmxx_txx_append_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_append cvmx_gmxx_txx_append_t;
+
+/**
+ * cvmx_gmx#_tx#_bck_crdt
+ *
+ * gmi_tx_bck to gmi_tx_out credit count register
+ *
+ */
+union cvmx_gmxx_txx_bck_crdt {
+       u64 u64;
+       struct cvmx_gmxx_txx_bck_crdt_s {
+               u64 reserved_4_63 : 60;
+               u64 cnt : 4;
+       } s;
+       struct cvmx_gmxx_txx_bck_crdt_s cn70xx;
+       struct cvmx_gmxx_txx_bck_crdt_s cn70xxp1;
+};
+
+typedef union cvmx_gmxx_txx_bck_crdt cvmx_gmxx_txx_bck_crdt_t;
+
+/**
+ * cvmx_gmx#_tx#_burst
+ *
+ * GMX_TX_BURST = Packet TX Burst Counter
+ *
+ */
+union cvmx_gmxx_txx_burst {
+       u64 u64;
+       struct cvmx_gmxx_txx_burst_s {
+               u64 reserved_16_63 : 48;
+               u64 burst : 16;
+       } s;
+       struct cvmx_gmxx_txx_burst_s cn30xx;
+       struct cvmx_gmxx_txx_burst_s cn31xx;
+       struct cvmx_gmxx_txx_burst_s cn38xx;
+       struct cvmx_gmxx_txx_burst_s cn38xxp2;
+       struct cvmx_gmxx_txx_burst_s cn50xx;
+       struct cvmx_gmxx_txx_burst_s cn52xx;
+       struct cvmx_gmxx_txx_burst_s cn52xxp1;
+       struct cvmx_gmxx_txx_burst_s cn56xx;
+       struct cvmx_gmxx_txx_burst_s cn56xxp1;
+       struct cvmx_gmxx_txx_burst_s cn58xx;
+       struct cvmx_gmxx_txx_burst_s cn58xxp1;
+       struct cvmx_gmxx_txx_burst_s cn61xx;
+       struct cvmx_gmxx_txx_burst_s cn63xx;
+       struct cvmx_gmxx_txx_burst_s cn63xxp1;
+       struct cvmx_gmxx_txx_burst_s cn66xx;
+       struct cvmx_gmxx_txx_burst_s cn68xx;
+       struct cvmx_gmxx_txx_burst_s cn68xxp1;
+       struct cvmx_gmxx_txx_burst_s cn70xx;
+       struct cvmx_gmxx_txx_burst_s cn70xxp1;
+       struct cvmx_gmxx_txx_burst_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_burst cvmx_gmxx_txx_burst_t;
+
+/**
+ * cvmx_gmx#_tx#_cbfc_xoff
+ */
+union cvmx_gmxx_txx_cbfc_xoff {
+       u64 u64;
+       struct cvmx_gmxx_txx_cbfc_xoff_s {
+               u64 reserved_16_63 : 48;
+               u64 xoff : 16;
+       } s;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn52xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn56xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn61xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn63xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn63xxp1;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn66xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn68xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn68xxp1;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn70xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn70xxp1;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_cbfc_xoff cvmx_gmxx_txx_cbfc_xoff_t;
+
+/**
+ * cvmx_gmx#_tx#_cbfc_xon
+ */
+union cvmx_gmxx_txx_cbfc_xon {
+       u64 u64;
+       struct cvmx_gmxx_txx_cbfc_xon_s {
+               u64 reserved_16_63 : 48;
+               u64 xon : 16;
+       } s;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn52xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn56xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn61xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn63xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn63xxp1;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn66xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn68xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn68xxp1;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn70xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn70xxp1;
+       struct cvmx_gmxx_txx_cbfc_xon_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_cbfc_xon cvmx_gmxx_txx_cbfc_xon_t;
+
+/**
+ * cvmx_gmx#_tx#_clk
+ *
+ * Per Port
+ *
+ *
+ * GMX_TX_CLK = RGMII TX Clock Generation Register
+ *
+ * Notes:
+ * Programming Restrictions:
+ *  (1) In RGMII mode, if GMX_PRT_CFG[SPEED]==0, then CLK_CNT must be > 1.
+ *  (2) In MII mode, CLK_CNT == 1
+ *  (3) In RGMII or GMII mode, if CLK_CNT==0, Octeon will not generate a tx clock.
+ *
+ * RGMII Example:
+ *  Given a 125MHz PLL reference clock...
+ *   CLK_CNT ==  1 ==> 125.0MHz TXC clock period (8ns* 1)
+ *   CLK_CNT ==  5 ==>  25.0MHz TXC clock period (8ns* 5)
+ *   CLK_CNT == 50 ==>   2.5MHz TXC clock period (8ns*50)
+ */
+union cvmx_gmxx_txx_clk {
+       u64 u64;
+       struct cvmx_gmxx_txx_clk_s {
+               u64 reserved_6_63 : 58;
+               u64 clk_cnt : 6;
+       } s;
+       struct cvmx_gmxx_txx_clk_s cn30xx;
+       struct cvmx_gmxx_txx_clk_s cn31xx;
+       struct cvmx_gmxx_txx_clk_s cn38xx;
+       struct cvmx_gmxx_txx_clk_s cn38xxp2;
+       struct cvmx_gmxx_txx_clk_s cn50xx;
+       struct cvmx_gmxx_txx_clk_s cn58xx;
+       struct cvmx_gmxx_txx_clk_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_txx_clk cvmx_gmxx_txx_clk_t;
+
+/**
+ * cvmx_gmx#_tx#_ctl
+ *
+ * GMX_TX_CTL = TX Control register
+ *
+ */
+union cvmx_gmxx_txx_ctl {
+       u64 u64;
+       struct cvmx_gmxx_txx_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 xsdef_en : 1;
+               u64 xscol_en : 1;
+       } s;
+       struct cvmx_gmxx_txx_ctl_s cn30xx;
+       struct cvmx_gmxx_txx_ctl_s cn31xx;
+       struct cvmx_gmxx_txx_ctl_s cn38xx;
+       struct cvmx_gmxx_txx_ctl_s cn38xxp2;
+       struct cvmx_gmxx_txx_ctl_s cn50xx;
+       struct cvmx_gmxx_txx_ctl_s cn52xx;
+       struct cvmx_gmxx_txx_ctl_s cn52xxp1;
+       struct cvmx_gmxx_txx_ctl_s cn56xx;
+       struct cvmx_gmxx_txx_ctl_s cn56xxp1;
+       struct cvmx_gmxx_txx_ctl_s cn58xx;
+       struct cvmx_gmxx_txx_ctl_s cn58xxp1;
+       struct cvmx_gmxx_txx_ctl_s cn61xx;
+       struct cvmx_gmxx_txx_ctl_s cn63xx;
+       struct cvmx_gmxx_txx_ctl_s cn63xxp1;
+       struct cvmx_gmxx_txx_ctl_s cn66xx;
+       struct cvmx_gmxx_txx_ctl_s cn68xx;
+       struct cvmx_gmxx_txx_ctl_s cn68xxp1;
+       struct cvmx_gmxx_txx_ctl_s cn70xx;
+       struct cvmx_gmxx_txx_ctl_s cn70xxp1;
+       struct cvmx_gmxx_txx_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_ctl cvmx_gmxx_txx_ctl_t;
+
+/**
+ * cvmx_gmx#_tx#_jam_mode
+ */
+union cvmx_gmxx_txx_jam_mode {
+       u64 u64;
+       struct cvmx_gmxx_txx_jam_mode_s {
+               u64 reserved_1_63 : 63;
+               u64 mode : 1;
+       } s;
+       struct cvmx_gmxx_txx_jam_mode_s cn70xx;
+       struct cvmx_gmxx_txx_jam_mode_s cn70xxp1;
+};
+
+typedef union cvmx_gmxx_txx_jam_mode cvmx_gmxx_txx_jam_mode_t;
+
+/**
+ * cvmx_gmx#_tx#_min_pkt
+ *
+ * GMX_TX_MIN_PKT = Packet TX Min Size Packet (PAD upto min size)
+ *
+ */
+union cvmx_gmxx_txx_min_pkt {
+       u64 u64;
+       struct cvmx_gmxx_txx_min_pkt_s {
+               u64 reserved_8_63 : 56;
+               u64 min_size : 8;
+       } s;
+       struct cvmx_gmxx_txx_min_pkt_s cn30xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn31xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn38xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn38xxp2;
+       struct cvmx_gmxx_txx_min_pkt_s cn50xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn52xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn52xxp1;
+       struct cvmx_gmxx_txx_min_pkt_s cn56xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn56xxp1;
+       struct cvmx_gmxx_txx_min_pkt_s cn58xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn58xxp1;
+       struct cvmx_gmxx_txx_min_pkt_s cn61xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn63xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn63xxp1;
+       struct cvmx_gmxx_txx_min_pkt_s cn66xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn68xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn68xxp1;
+       struct cvmx_gmxx_txx_min_pkt_s cn70xx;
+       struct cvmx_gmxx_txx_min_pkt_s cn70xxp1;
+       struct cvmx_gmxx_txx_min_pkt_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_min_pkt cvmx_gmxx_txx_min_pkt_t;
+
+/**
+ * cvmx_gmx#_tx#_pause_pkt_interval
+ *
+ * GMX_TX_PAUSE_PKT_INTERVAL = Packet TX Pause Packet transmission interval - how often PAUSE packets will be sent
+ *
+ *
+ * Notes:
+ * Choosing proper values of GMX_TX_PAUSE_PKT_TIME[TIME] and
+ * GMX_TX_PAUSE_PKT_INTERVAL[INTERVAL] can be challenging to the system
+ * designer.  It is suggested that TIME be much greater than INTERVAL and
+ * GMX_TX_PAUSE_ZERO[SEND] be set.  This allows a periodic refresh of the PAUSE
+ * count and then when the backpressure condition is lifted, a PAUSE packet
+ * with TIME==0 will be sent indicating that Octane is ready for additional
+ * data.
+ *
+ * If the system chooses to not set GMX_TX_PAUSE_ZERO[SEND], then it is
+ * suggested that TIME and INTERVAL are programmed such that they satisify the
+ * following rule...
+ *
+ *    INTERVAL <= TIME - (largest_pkt_size + IFG + pause_pkt_size)
+ *
+ * where largest_pkt_size is that largest packet that the system can send
+ * (normally 1518B), IFG is the interframe gap and pause_pkt_size is the size
+ * of the PAUSE packet (normally 64B).
+ */
+union cvmx_gmxx_txx_pause_pkt_interval {
+       u64 u64;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s {
+               u64 reserved_16_63 : 48;
+               u64 interval : 16;
+       } s;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn30xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn31xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn38xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn38xxp2;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn50xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn52xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn52xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn56xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn56xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn58xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn58xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn61xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn63xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn63xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn66xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn68xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn68xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn70xx;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cn70xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_pause_pkt_interval cvmx_gmxx_txx_pause_pkt_interval_t;
+
+/**
+ * cvmx_gmx#_tx#_pause_pkt_time
+ *
+ * GMX_TX_PAUSE_PKT_TIME = Packet TX Pause Packet pause_time field
+ *
+ *
+ * Notes:
+ * Choosing proper values of GMX_TX_PAUSE_PKT_TIME[TIME] and
+ * GMX_TX_PAUSE_PKT_INTERVAL[INTERVAL] can be challenging to the system
+ * designer.  It is suggested that TIME be much greater than INTERVAL and
+ * GMX_TX_PAUSE_ZERO[SEND] be set.  This allows a periodic refresh of the PAUSE
+ * count and then when the backpressure condition is lifted, a PAUSE packet
+ * with TIME==0 will be sent indicating that Octane is ready for additional
+ * data.
+ *
+ * If the system chooses to not set GMX_TX_PAUSE_ZERO[SEND], then it is
+ * suggested that TIME and INTERVAL are programmed such that they satisify the
+ * following rule...
+ *
+ *    INTERVAL <= TIME - (largest_pkt_size + IFG + pause_pkt_size)
+ *
+ * where largest_pkt_size is that largest packet that the system can send
+ * (normally 1518B), IFG is the interframe gap and pause_pkt_size is the size
+ * of the PAUSE packet (normally 64B).
+ */
+union cvmx_gmxx_txx_pause_pkt_time {
+       u64 u64;
+       struct cvmx_gmxx_txx_pause_pkt_time_s {
+               u64 reserved_16_63 : 48;
+               u64 time : 16;
+       } s;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn30xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn31xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn38xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn38xxp2;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn50xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn52xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn52xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn56xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn56xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn58xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn58xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn61xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn63xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn63xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn66xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn68xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn68xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn70xx;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cn70xxp1;
+       struct cvmx_gmxx_txx_pause_pkt_time_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_pause_pkt_time cvmx_gmxx_txx_pause_pkt_time_t;
+
+/**
+ * cvmx_gmx#_tx#_pause_togo
+ *
+ * GMX_TX_PAUSE_TOGO = Packet TX Amount of time remaining to backpressure
+ *
+ */
+union cvmx_gmxx_txx_pause_togo {
+       u64 u64;
+       struct cvmx_gmxx_txx_pause_togo_s {
+               u64 reserved_32_63 : 32;
+               u64 msg_time : 16;
+               u64 time : 16;
+       } s;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx {
+               u64 reserved_16_63 : 48;
+               u64 time : 16;
+       } cn30xx;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx cn31xx;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx cn38xx;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx cn38xxp2;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx cn50xx;
+       struct cvmx_gmxx_txx_pause_togo_s cn52xx;
+       struct cvmx_gmxx_txx_pause_togo_s cn52xxp1;
+       struct cvmx_gmxx_txx_pause_togo_s cn56xx;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx cn56xxp1;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx cn58xx;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx cn58xxp1;
+       struct cvmx_gmxx_txx_pause_togo_s cn61xx;
+       struct cvmx_gmxx_txx_pause_togo_s cn63xx;
+       struct cvmx_gmxx_txx_pause_togo_s cn63xxp1;
+       struct cvmx_gmxx_txx_pause_togo_s cn66xx;
+       struct cvmx_gmxx_txx_pause_togo_s cn68xx;
+       struct cvmx_gmxx_txx_pause_togo_s cn68xxp1;
+       struct cvmx_gmxx_txx_pause_togo_s cn70xx;
+       struct cvmx_gmxx_txx_pause_togo_s cn70xxp1;
+       struct cvmx_gmxx_txx_pause_togo_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_pause_togo cvmx_gmxx_txx_pause_togo_t;
+
+/**
+ * cvmx_gmx#_tx#_pause_zero
+ *
+ * GMX_TX_PAUSE_ZERO = Packet TX Amount of time remaining to backpressure
+ *
+ */
+union cvmx_gmxx_txx_pause_zero {
+       u64 u64;
+       struct cvmx_gmxx_txx_pause_zero_s {
+               u64 reserved_1_63 : 63;
+               u64 send : 1;
+       } s;
+       struct cvmx_gmxx_txx_pause_zero_s cn30xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn31xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn38xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn38xxp2;
+       struct cvmx_gmxx_txx_pause_zero_s cn50xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn52xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn52xxp1;
+       struct cvmx_gmxx_txx_pause_zero_s cn56xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn56xxp1;
+       struct cvmx_gmxx_txx_pause_zero_s cn58xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn58xxp1;
+       struct cvmx_gmxx_txx_pause_zero_s cn61xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn63xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn63xxp1;
+       struct cvmx_gmxx_txx_pause_zero_s cn66xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn68xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn68xxp1;
+       struct cvmx_gmxx_txx_pause_zero_s cn70xx;
+       struct cvmx_gmxx_txx_pause_zero_s cn70xxp1;
+       struct cvmx_gmxx_txx_pause_zero_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_pause_zero cvmx_gmxx_txx_pause_zero_t;
+
+/**
+ * cvmx_gmx#_tx#_pipe
+ */
+union cvmx_gmxx_txx_pipe {
+       u64 u64;
+       struct cvmx_gmxx_txx_pipe_s {
+               u64 reserved_33_63 : 31;
+               u64 ign_bp : 1;
+               u64 reserved_21_31 : 11;
+               u64 nump : 5;
+               u64 reserved_7_15 : 9;
+               u64 base : 7;
+       } s;
+       struct cvmx_gmxx_txx_pipe_s cn68xx;
+       struct cvmx_gmxx_txx_pipe_s cn68xxp1;
+};
+
+typedef union cvmx_gmxx_txx_pipe cvmx_gmxx_txx_pipe_t;
+
+/**
+ * cvmx_gmx#_tx#_sgmii_ctl
+ */
+union cvmx_gmxx_txx_sgmii_ctl {
+       u64 u64;
+       struct cvmx_gmxx_txx_sgmii_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 align : 1;
+       } s;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn52xx;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn52xxp1;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn56xx;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn56xxp1;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn61xx;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn63xx;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn63xxp1;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn66xx;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn68xx;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn68xxp1;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn70xx;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cn70xxp1;
+       struct cvmx_gmxx_txx_sgmii_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_sgmii_ctl cvmx_gmxx_txx_sgmii_ctl_t;
+
+/**
+ * cvmx_gmx#_tx#_slot
+ *
+ * GMX_TX_SLOT = Packet TX Slottime Counter
+ *
+ */
+union cvmx_gmxx_txx_slot {
+       u64 u64;
+       struct cvmx_gmxx_txx_slot_s {
+               u64 reserved_10_63 : 54;
+               u64 slot : 10;
+       } s;
+       struct cvmx_gmxx_txx_slot_s cn30xx;
+       struct cvmx_gmxx_txx_slot_s cn31xx;
+       struct cvmx_gmxx_txx_slot_s cn38xx;
+       struct cvmx_gmxx_txx_slot_s cn38xxp2;
+       struct cvmx_gmxx_txx_slot_s cn50xx;
+       struct cvmx_gmxx_txx_slot_s cn52xx;
+       struct cvmx_gmxx_txx_slot_s cn52xxp1;
+       struct cvmx_gmxx_txx_slot_s cn56xx;
+       struct cvmx_gmxx_txx_slot_s cn56xxp1;
+       struct cvmx_gmxx_txx_slot_s cn58xx;
+       struct cvmx_gmxx_txx_slot_s cn58xxp1;
+       struct cvmx_gmxx_txx_slot_s cn61xx;
+       struct cvmx_gmxx_txx_slot_s cn63xx;
+       struct cvmx_gmxx_txx_slot_s cn63xxp1;
+       struct cvmx_gmxx_txx_slot_s cn66xx;
+       struct cvmx_gmxx_txx_slot_s cn68xx;
+       struct cvmx_gmxx_txx_slot_s cn68xxp1;
+       struct cvmx_gmxx_txx_slot_s cn70xx;
+       struct cvmx_gmxx_txx_slot_s cn70xxp1;
+       struct cvmx_gmxx_txx_slot_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_slot cvmx_gmxx_txx_slot_t;
+
+/**
+ * cvmx_gmx#_tx#_soft_pause
+ *
+ * GMX_TX_SOFT_PAUSE = Packet TX Software Pause
+ *
+ */
+union cvmx_gmxx_txx_soft_pause {
+       u64 u64;
+       struct cvmx_gmxx_txx_soft_pause_s {
+               u64 reserved_16_63 : 48;
+               u64 time : 16;
+       } s;
+       struct cvmx_gmxx_txx_soft_pause_s cn30xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn31xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn38xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn38xxp2;
+       struct cvmx_gmxx_txx_soft_pause_s cn50xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn52xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn52xxp1;
+       struct cvmx_gmxx_txx_soft_pause_s cn56xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn56xxp1;
+       struct cvmx_gmxx_txx_soft_pause_s cn58xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn58xxp1;
+       struct cvmx_gmxx_txx_soft_pause_s cn61xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn63xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn63xxp1;
+       struct cvmx_gmxx_txx_soft_pause_s cn66xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn68xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn68xxp1;
+       struct cvmx_gmxx_txx_soft_pause_s cn70xx;
+       struct cvmx_gmxx_txx_soft_pause_s cn70xxp1;
+       struct cvmx_gmxx_txx_soft_pause_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_soft_pause cvmx_gmxx_txx_soft_pause_t;
+
+/**
+ * cvmx_gmx#_tx#_stat0
+ *
+ * GMX_TX_STAT0 = GMX_TX_STATS_XSDEF / GMX_TX_STATS_XSCOL
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat0 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat0_s {
+               u64 xsdef : 32;
+               u64 xscol : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat0_s cn30xx;
+       struct cvmx_gmxx_txx_stat0_s cn31xx;
+       struct cvmx_gmxx_txx_stat0_s cn38xx;
+       struct cvmx_gmxx_txx_stat0_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat0_s cn50xx;
+       struct cvmx_gmxx_txx_stat0_s cn52xx;
+       struct cvmx_gmxx_txx_stat0_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat0_s cn56xx;
+       struct cvmx_gmxx_txx_stat0_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat0_s cn58xx;
+       struct cvmx_gmxx_txx_stat0_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat0_s cn61xx;
+       struct cvmx_gmxx_txx_stat0_s cn63xx;
+       struct cvmx_gmxx_txx_stat0_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat0_s cn66xx;
+       struct cvmx_gmxx_txx_stat0_s cn68xx;
+       struct cvmx_gmxx_txx_stat0_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat0_s cn70xx;
+       struct cvmx_gmxx_txx_stat0_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat0_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat0 cvmx_gmxx_txx_stat0_t;
+
+/**
+ * cvmx_gmx#_tx#_stat1
+ *
+ * GMX_TX_STAT1 = GMX_TX_STATS_SCOL  / GMX_TX_STATS_MCOL
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat1 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat1_s {
+               u64 scol : 32;
+               u64 mcol : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat1_s cn30xx;
+       struct cvmx_gmxx_txx_stat1_s cn31xx;
+       struct cvmx_gmxx_txx_stat1_s cn38xx;
+       struct cvmx_gmxx_txx_stat1_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat1_s cn50xx;
+       struct cvmx_gmxx_txx_stat1_s cn52xx;
+       struct cvmx_gmxx_txx_stat1_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat1_s cn56xx;
+       struct cvmx_gmxx_txx_stat1_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat1_s cn58xx;
+       struct cvmx_gmxx_txx_stat1_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat1_s cn61xx;
+       struct cvmx_gmxx_txx_stat1_s cn63xx;
+       struct cvmx_gmxx_txx_stat1_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat1_s cn66xx;
+       struct cvmx_gmxx_txx_stat1_s cn68xx;
+       struct cvmx_gmxx_txx_stat1_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat1_s cn70xx;
+       struct cvmx_gmxx_txx_stat1_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat1_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat1 cvmx_gmxx_txx_stat1_t;
+
+/**
+ * cvmx_gmx#_tx#_stat2
+ *
+ * GMX_TX_STAT2 = GMX_TX_STATS_OCTS
+ *
+ *
+ * Notes:
+ * - Octect counts are the sum of all data transmitted on the wire including
+ *   packet data, pad bytes, fcs bytes, pause bytes, and jam bytes.  The octect
+ *   counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat2 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat2_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_gmxx_txx_stat2_s cn30xx;
+       struct cvmx_gmxx_txx_stat2_s cn31xx;
+       struct cvmx_gmxx_txx_stat2_s cn38xx;
+       struct cvmx_gmxx_txx_stat2_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat2_s cn50xx;
+       struct cvmx_gmxx_txx_stat2_s cn52xx;
+       struct cvmx_gmxx_txx_stat2_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat2_s cn56xx;
+       struct cvmx_gmxx_txx_stat2_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat2_s cn58xx;
+       struct cvmx_gmxx_txx_stat2_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat2_s cn61xx;
+       struct cvmx_gmxx_txx_stat2_s cn63xx;
+       struct cvmx_gmxx_txx_stat2_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat2_s cn66xx;
+       struct cvmx_gmxx_txx_stat2_s cn68xx;
+       struct cvmx_gmxx_txx_stat2_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat2_s cn70xx;
+       struct cvmx_gmxx_txx_stat2_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat2_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat2 cvmx_gmxx_txx_stat2_t;
+
+/**
+ * cvmx_gmx#_tx#_stat3
+ *
+ * GMX_TX_STAT3 = GMX_TX_STATS_PKTS
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat3 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat3_s {
+               u64 reserved_32_63 : 32;
+               u64 pkts : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat3_s cn30xx;
+       struct cvmx_gmxx_txx_stat3_s cn31xx;
+       struct cvmx_gmxx_txx_stat3_s cn38xx;
+       struct cvmx_gmxx_txx_stat3_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat3_s cn50xx;
+       struct cvmx_gmxx_txx_stat3_s cn52xx;
+       struct cvmx_gmxx_txx_stat3_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat3_s cn56xx;
+       struct cvmx_gmxx_txx_stat3_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat3_s cn58xx;
+       struct cvmx_gmxx_txx_stat3_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat3_s cn61xx;
+       struct cvmx_gmxx_txx_stat3_s cn63xx;
+       struct cvmx_gmxx_txx_stat3_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat3_s cn66xx;
+       struct cvmx_gmxx_txx_stat3_s cn68xx;
+       struct cvmx_gmxx_txx_stat3_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat3_s cn70xx;
+       struct cvmx_gmxx_txx_stat3_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat3_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat3 cvmx_gmxx_txx_stat3_t;
+
+/**
+ * cvmx_gmx#_tx#_stat4
+ *
+ * GMX_TX_STAT4 = GMX_TX_STATS_HIST1 (64) / GMX_TX_STATS_HIST0 (<64)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat4 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat4_s {
+               u64 hist1 : 32;
+               u64 hist0 : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat4_s cn30xx;
+       struct cvmx_gmxx_txx_stat4_s cn31xx;
+       struct cvmx_gmxx_txx_stat4_s cn38xx;
+       struct cvmx_gmxx_txx_stat4_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat4_s cn50xx;
+       struct cvmx_gmxx_txx_stat4_s cn52xx;
+       struct cvmx_gmxx_txx_stat4_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat4_s cn56xx;
+       struct cvmx_gmxx_txx_stat4_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat4_s cn58xx;
+       struct cvmx_gmxx_txx_stat4_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat4_s cn61xx;
+       struct cvmx_gmxx_txx_stat4_s cn63xx;
+       struct cvmx_gmxx_txx_stat4_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat4_s cn66xx;
+       struct cvmx_gmxx_txx_stat4_s cn68xx;
+       struct cvmx_gmxx_txx_stat4_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat4_s cn70xx;
+       struct cvmx_gmxx_txx_stat4_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat4_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat4 cvmx_gmxx_txx_stat4_t;
+
+/**
+ * cvmx_gmx#_tx#_stat5
+ *
+ * GMX_TX_STAT5 = GMX_TX_STATS_HIST3 (128- 255) / GMX_TX_STATS_HIST2 (65- 127)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat5 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat5_s {
+               u64 hist3 : 32;
+               u64 hist2 : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat5_s cn30xx;
+       struct cvmx_gmxx_txx_stat5_s cn31xx;
+       struct cvmx_gmxx_txx_stat5_s cn38xx;
+       struct cvmx_gmxx_txx_stat5_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat5_s cn50xx;
+       struct cvmx_gmxx_txx_stat5_s cn52xx;
+       struct cvmx_gmxx_txx_stat5_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat5_s cn56xx;
+       struct cvmx_gmxx_txx_stat5_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat5_s cn58xx;
+       struct cvmx_gmxx_txx_stat5_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat5_s cn61xx;
+       struct cvmx_gmxx_txx_stat5_s cn63xx;
+       struct cvmx_gmxx_txx_stat5_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat5_s cn66xx;
+       struct cvmx_gmxx_txx_stat5_s cn68xx;
+       struct cvmx_gmxx_txx_stat5_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat5_s cn70xx;
+       struct cvmx_gmxx_txx_stat5_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat5_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat5 cvmx_gmxx_txx_stat5_t;
+
+/**
+ * cvmx_gmx#_tx#_stat6
+ *
+ * GMX_TX_STAT6 = GMX_TX_STATS_HIST5 (512-1023) / GMX_TX_STATS_HIST4 (256-511)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat6 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat6_s {
+               u64 hist5 : 32;
+               u64 hist4 : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat6_s cn30xx;
+       struct cvmx_gmxx_txx_stat6_s cn31xx;
+       struct cvmx_gmxx_txx_stat6_s cn38xx;
+       struct cvmx_gmxx_txx_stat6_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat6_s cn50xx;
+       struct cvmx_gmxx_txx_stat6_s cn52xx;
+       struct cvmx_gmxx_txx_stat6_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat6_s cn56xx;
+       struct cvmx_gmxx_txx_stat6_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat6_s cn58xx;
+       struct cvmx_gmxx_txx_stat6_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat6_s cn61xx;
+       struct cvmx_gmxx_txx_stat6_s cn63xx;
+       struct cvmx_gmxx_txx_stat6_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat6_s cn66xx;
+       struct cvmx_gmxx_txx_stat6_s cn68xx;
+       struct cvmx_gmxx_txx_stat6_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat6_s cn70xx;
+       struct cvmx_gmxx_txx_stat6_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat6_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat6 cvmx_gmxx_txx_stat6_t;
+
+/**
+ * cvmx_gmx#_tx#_stat7
+ *
+ * GMX_TX_STAT7 = GMX_TX_STATS_HIST7 (1024-1518) / GMX_TX_STATS_HIST6 (>1518)
+ *
+ *
+ * Notes:
+ * - Packet length is the sum of all data transmitted on the wire for the given
+ *   packet including packet data, pad bytes, fcs bytes, pause bytes, and jam
+ *   bytes.  The octect counts do not include PREAMBLE byte or EXTEND cycles.
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat7 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat7_s {
+               u64 hist7 : 32;
+               u64 hist6 : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat7_s cn30xx;
+       struct cvmx_gmxx_txx_stat7_s cn31xx;
+       struct cvmx_gmxx_txx_stat7_s cn38xx;
+       struct cvmx_gmxx_txx_stat7_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat7_s cn50xx;
+       struct cvmx_gmxx_txx_stat7_s cn52xx;
+       struct cvmx_gmxx_txx_stat7_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat7_s cn56xx;
+       struct cvmx_gmxx_txx_stat7_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat7_s cn58xx;
+       struct cvmx_gmxx_txx_stat7_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat7_s cn61xx;
+       struct cvmx_gmxx_txx_stat7_s cn63xx;
+       struct cvmx_gmxx_txx_stat7_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat7_s cn66xx;
+       struct cvmx_gmxx_txx_stat7_s cn68xx;
+       struct cvmx_gmxx_txx_stat7_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat7_s cn70xx;
+       struct cvmx_gmxx_txx_stat7_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat7_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat7 cvmx_gmxx_txx_stat7_t;
+
+/**
+ * cvmx_gmx#_tx#_stat8
+ *
+ * GMX_TX_STAT8 = GMX_TX_STATS_MCST  / GMX_TX_STATS_BCST
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ * - Note, GMX determines if the packet is MCST or BCST from the DMAC of the
+ *   packet.  GMX assumes that the DMAC lies in the first 6 bytes of the packet
+ *   as per the 802.3 frame definition.  If the system requires additional data
+ *   before the L2 header, then the MCST and BCST counters may not reflect
+ *   reality and should be ignored by software.
+ */
+union cvmx_gmxx_txx_stat8 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat8_s {
+               u64 mcst : 32;
+               u64 bcst : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat8_s cn30xx;
+       struct cvmx_gmxx_txx_stat8_s cn31xx;
+       struct cvmx_gmxx_txx_stat8_s cn38xx;
+       struct cvmx_gmxx_txx_stat8_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat8_s cn50xx;
+       struct cvmx_gmxx_txx_stat8_s cn52xx;
+       struct cvmx_gmxx_txx_stat8_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat8_s cn56xx;
+       struct cvmx_gmxx_txx_stat8_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat8_s cn58xx;
+       struct cvmx_gmxx_txx_stat8_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat8_s cn61xx;
+       struct cvmx_gmxx_txx_stat8_s cn63xx;
+       struct cvmx_gmxx_txx_stat8_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat8_s cn66xx;
+       struct cvmx_gmxx_txx_stat8_s cn68xx;
+       struct cvmx_gmxx_txx_stat8_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat8_s cn70xx;
+       struct cvmx_gmxx_txx_stat8_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat8_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat8 cvmx_gmxx_txx_stat8_t;
+
+/**
+ * cvmx_gmx#_tx#_stat9
+ *
+ * GMX_TX_STAT9 = GMX_TX_STATS_UNDFLW / GMX_TX_STATS_CTL
+ *
+ *
+ * Notes:
+ * - Cleared either by a write (of any value) or a read when GMX_TX_STATS_CTL[RD_CLR] is set
+ * - Counters will wrap
+ */
+union cvmx_gmxx_txx_stat9 {
+       u64 u64;
+       struct cvmx_gmxx_txx_stat9_s {
+               u64 undflw : 32;
+               u64 ctl : 32;
+       } s;
+       struct cvmx_gmxx_txx_stat9_s cn30xx;
+       struct cvmx_gmxx_txx_stat9_s cn31xx;
+       struct cvmx_gmxx_txx_stat9_s cn38xx;
+       struct cvmx_gmxx_txx_stat9_s cn38xxp2;
+       struct cvmx_gmxx_txx_stat9_s cn50xx;
+       struct cvmx_gmxx_txx_stat9_s cn52xx;
+       struct cvmx_gmxx_txx_stat9_s cn52xxp1;
+       struct cvmx_gmxx_txx_stat9_s cn56xx;
+       struct cvmx_gmxx_txx_stat9_s cn56xxp1;
+       struct cvmx_gmxx_txx_stat9_s cn58xx;
+       struct cvmx_gmxx_txx_stat9_s cn58xxp1;
+       struct cvmx_gmxx_txx_stat9_s cn61xx;
+       struct cvmx_gmxx_txx_stat9_s cn63xx;
+       struct cvmx_gmxx_txx_stat9_s cn63xxp1;
+       struct cvmx_gmxx_txx_stat9_s cn66xx;
+       struct cvmx_gmxx_txx_stat9_s cn68xx;
+       struct cvmx_gmxx_txx_stat9_s cn68xxp1;
+       struct cvmx_gmxx_txx_stat9_s cn70xx;
+       struct cvmx_gmxx_txx_stat9_s cn70xxp1;
+       struct cvmx_gmxx_txx_stat9_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stat9 cvmx_gmxx_txx_stat9_t;
+
+/**
+ * cvmx_gmx#_tx#_stats_ctl
+ *
+ * GMX_TX_STATS_CTL = TX Stats Control register
+ *
+ */
+union cvmx_gmxx_txx_stats_ctl {
+       u64 u64;
+       struct cvmx_gmxx_txx_stats_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 rd_clr : 1;
+       } s;
+       struct cvmx_gmxx_txx_stats_ctl_s cn30xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn31xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn38xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn38xxp2;
+       struct cvmx_gmxx_txx_stats_ctl_s cn50xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn52xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn52xxp1;
+       struct cvmx_gmxx_txx_stats_ctl_s cn56xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn56xxp1;
+       struct cvmx_gmxx_txx_stats_ctl_s cn58xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn58xxp1;
+       struct cvmx_gmxx_txx_stats_ctl_s cn61xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn63xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn63xxp1;
+       struct cvmx_gmxx_txx_stats_ctl_s cn66xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn68xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn68xxp1;
+       struct cvmx_gmxx_txx_stats_ctl_s cn70xx;
+       struct cvmx_gmxx_txx_stats_ctl_s cn70xxp1;
+       struct cvmx_gmxx_txx_stats_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_stats_ctl cvmx_gmxx_txx_stats_ctl_t;
+
+/**
+ * cvmx_gmx#_tx#_thresh
+ *
+ * Per Port
+ * GMX_TX_THRESH = Packet TX Threshold
+ */
+union cvmx_gmxx_txx_thresh {
+       u64 u64;
+       struct cvmx_gmxx_txx_thresh_s {
+               u64 reserved_10_63 : 54;
+               u64 cnt : 10;
+       } s;
+       struct cvmx_gmxx_txx_thresh_cn30xx {
+               u64 reserved_7_63 : 57;
+               u64 cnt : 7;
+       } cn30xx;
+       struct cvmx_gmxx_txx_thresh_cn30xx cn31xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx {
+               u64 reserved_9_63 : 55;
+               u64 cnt : 9;
+       } cn38xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn38xxp2;
+       struct cvmx_gmxx_txx_thresh_cn30xx cn50xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn52xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn52xxp1;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn56xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn56xxp1;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn58xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn58xxp1;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn61xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn63xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn63xxp1;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn66xx;
+       struct cvmx_gmxx_txx_thresh_s cn68xx;
+       struct cvmx_gmxx_txx_thresh_s cn68xxp1;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn70xx;
+       struct cvmx_gmxx_txx_thresh_cn38xx cn70xxp1;
+       struct cvmx_gmxx_txx_thresh_cn38xx cnf71xx;
+};
+
+typedef union cvmx_gmxx_txx_thresh cvmx_gmxx_txx_thresh_t;
+
+/**
+ * cvmx_gmx#_tx_bp
+ *
+ * GMX_TX_BP = Packet Interface TX BackPressure Register
+ *
+ *
+ * Notes:
+ * In XAUI mode, only the lsb (corresponding to port0) of BP is used.
+ *
+ */
+union cvmx_gmxx_tx_bp {
+       u64 u64;
+       struct cvmx_gmxx_tx_bp_s {
+               u64 reserved_4_63 : 60;
+               u64 bp : 4;
+       } s;
+       struct cvmx_gmxx_tx_bp_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 bp : 3;
+       } cn30xx;
+       struct cvmx_gmxx_tx_bp_cn30xx cn31xx;
+       struct cvmx_gmxx_tx_bp_s cn38xx;
+       struct cvmx_gmxx_tx_bp_s cn38xxp2;
+       struct cvmx_gmxx_tx_bp_cn30xx cn50xx;
+       struct cvmx_gmxx_tx_bp_s cn52xx;
+       struct cvmx_gmxx_tx_bp_s cn52xxp1;
+       struct cvmx_gmxx_tx_bp_s cn56xx;
+       struct cvmx_gmxx_tx_bp_s cn56xxp1;
+       struct cvmx_gmxx_tx_bp_s cn58xx;
+       struct cvmx_gmxx_tx_bp_s cn58xxp1;
+       struct cvmx_gmxx_tx_bp_s cn61xx;
+       struct cvmx_gmxx_tx_bp_s cn63xx;
+       struct cvmx_gmxx_tx_bp_s cn63xxp1;
+       struct cvmx_gmxx_tx_bp_s cn66xx;
+       struct cvmx_gmxx_tx_bp_s cn68xx;
+       struct cvmx_gmxx_tx_bp_s cn68xxp1;
+       struct cvmx_gmxx_tx_bp_s cn70xx;
+       struct cvmx_gmxx_tx_bp_s cn70xxp1;
+       struct cvmx_gmxx_tx_bp_cnf71xx {
+               u64 reserved_2_63 : 62;
+               u64 bp : 2;
+       } cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_bp cvmx_gmxx_tx_bp_t;
+
+/**
+ * cvmx_gmx#_tx_clk_msk#
+ *
+ * GMX_TX_CLK_MSK = GMX Clock Select
+ *
+ */
+union cvmx_gmxx_tx_clk_mskx {
+       u64 u64;
+       struct cvmx_gmxx_tx_clk_mskx_s {
+               u64 reserved_1_63 : 63;
+               u64 msk : 1;
+       } s;
+       struct cvmx_gmxx_tx_clk_mskx_s cn30xx;
+       struct cvmx_gmxx_tx_clk_mskx_s cn50xx;
+};
+
+typedef union cvmx_gmxx_tx_clk_mskx cvmx_gmxx_tx_clk_mskx_t;
+
+/**
+ * cvmx_gmx#_tx_col_attempt
+ *
+ * GMX_TX_COL_ATTEMPT = Packet TX collision attempts before dropping frame
+ *
+ */
+union cvmx_gmxx_tx_col_attempt {
+       u64 u64;
+       struct cvmx_gmxx_tx_col_attempt_s {
+               u64 reserved_5_63 : 59;
+               u64 limit : 5;
+       } s;
+       struct cvmx_gmxx_tx_col_attempt_s cn30xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn31xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn38xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn38xxp2;
+       struct cvmx_gmxx_tx_col_attempt_s cn50xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn52xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn52xxp1;
+       struct cvmx_gmxx_tx_col_attempt_s cn56xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn56xxp1;
+       struct cvmx_gmxx_tx_col_attempt_s cn58xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn58xxp1;
+       struct cvmx_gmxx_tx_col_attempt_s cn61xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn63xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn63xxp1;
+       struct cvmx_gmxx_tx_col_attempt_s cn66xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn68xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn68xxp1;
+       struct cvmx_gmxx_tx_col_attempt_s cn70xx;
+       struct cvmx_gmxx_tx_col_attempt_s cn70xxp1;
+       struct cvmx_gmxx_tx_col_attempt_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_col_attempt cvmx_gmxx_tx_col_attempt_t;
+
+/**
+ * cvmx_gmx#_tx_corrupt
+ *
+ * GMX_TX_CORRUPT = TX - Corrupt TX packets with the ERR bit set
+ *
+ *
+ * Notes:
+ * Packets sent from PKO with the ERR wire asserted will be corrupted by
+ * the transmitter if CORRUPT[prt] is set (XAUI uses prt==0).
+ *
+ * Corruption means that GMX will send a bad FCS value.  If GMX_TX_APPEND[FCS]
+ * is clear then no FCS is sent and the GMX cannot corrupt it.  The corrupt FCS
+ * value is 0xeeeeeeee for SGMII/1000Base-X and 4 bytes of the error
+ * propagation code in XAUI mode.
+ */
+union cvmx_gmxx_tx_corrupt {
+       u64 u64;
+       struct cvmx_gmxx_tx_corrupt_s {
+               u64 reserved_4_63 : 60;
+               u64 corrupt : 4;
+       } s;
+       struct cvmx_gmxx_tx_corrupt_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 corrupt : 3;
+       } cn30xx;
+       struct cvmx_gmxx_tx_corrupt_cn30xx cn31xx;
+       struct cvmx_gmxx_tx_corrupt_s cn38xx;
+       struct cvmx_gmxx_tx_corrupt_s cn38xxp2;
+       struct cvmx_gmxx_tx_corrupt_cn30xx cn50xx;
+       struct cvmx_gmxx_tx_corrupt_s cn52xx;
+       struct cvmx_gmxx_tx_corrupt_s cn52xxp1;
+       struct cvmx_gmxx_tx_corrupt_s cn56xx;
+       struct cvmx_gmxx_tx_corrupt_s cn56xxp1;
+       struct cvmx_gmxx_tx_corrupt_s cn58xx;
+       struct cvmx_gmxx_tx_corrupt_s cn58xxp1;
+       struct cvmx_gmxx_tx_corrupt_s cn61xx;
+       struct cvmx_gmxx_tx_corrupt_s cn63xx;
+       struct cvmx_gmxx_tx_corrupt_s cn63xxp1;
+       struct cvmx_gmxx_tx_corrupt_s cn66xx;
+       struct cvmx_gmxx_tx_corrupt_s cn68xx;
+       struct cvmx_gmxx_tx_corrupt_s cn68xxp1;
+       struct cvmx_gmxx_tx_corrupt_s cn70xx;
+       struct cvmx_gmxx_tx_corrupt_s cn70xxp1;
+       struct cvmx_gmxx_tx_corrupt_cnf71xx {
+               u64 reserved_2_63 : 62;
+               u64 corrupt : 2;
+       } cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_corrupt cvmx_gmxx_tx_corrupt_t;
+
+/**
+ * cvmx_gmx#_tx_hg2_reg1
+ *
+ * Notes:
+ * The TX_XOF[15:0] field in GMX(0)_TX_HG2_REG1 and the TX_XON[15:0] field in
+ * GMX(0)_TX_HG2_REG2 register map to the same 16 physical flops. When written with address of
+ * GMX(0)_TX_HG2_REG1, it will exhibit write 1 to set behavior and when written with address of
+ * GMX(0)_TX_HG2_REG2, it will exhibit write 1 to clear behavior.
+ * For reads, either address will return the $GMX(0)_TX_HG2_REG1 values.
+ */
+union cvmx_gmxx_tx_hg2_reg1 {
+       u64 u64;
+       struct cvmx_gmxx_tx_hg2_reg1_s {
+               u64 reserved_16_63 : 48;
+               u64 tx_xof : 16;
+       } s;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn52xx;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn52xxp1;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn56xx;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn61xx;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn63xx;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn63xxp1;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn66xx;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn68xx;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn68xxp1;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn70xx;
+       struct cvmx_gmxx_tx_hg2_reg1_s cn70xxp1;
+       struct cvmx_gmxx_tx_hg2_reg1_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_hg2_reg1 cvmx_gmxx_tx_hg2_reg1_t;
+
+/**
+ * cvmx_gmx#_tx_hg2_reg2
+ *
+ * Notes:
+ * The TX_XOF[15:0] field in GMX(0)_TX_HG2_REG1 and the TX_XON[15:0] field in
+ * GMX(0)_TX_HG2_REG2 register map to the same 16 physical flops. When written with address  of
+ * GMX(0)_TX_HG2_REG1, it will exhibit write 1 to set behavior and when written with address of
+ * GMX(0)_TX_HG2_REG2, it will exhibit write 1 to clear behavior.
+ * For reads, either address will return the $GMX(0)_TX_HG2_REG1 values.
+ */
+union cvmx_gmxx_tx_hg2_reg2 {
+       u64 u64;
+       struct cvmx_gmxx_tx_hg2_reg2_s {
+               u64 reserved_16_63 : 48;
+               u64 tx_xon : 16;
+       } s;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn52xx;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn52xxp1;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn56xx;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn61xx;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn63xx;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn63xxp1;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn66xx;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn68xx;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn68xxp1;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn70xx;
+       struct cvmx_gmxx_tx_hg2_reg2_s cn70xxp1;
+       struct cvmx_gmxx_tx_hg2_reg2_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_hg2_reg2 cvmx_gmxx_tx_hg2_reg2_t;
+
+/**
+ * cvmx_gmx#_tx_ifg
+ *
+ * GMX_TX_IFG = Packet TX Interframe Gap
+ *
+ *
+ * Notes:
+ * * Programming IFG1 and IFG2.
+ *
+ * For 10/100/1000Mbs half-duplex systems that require IEEE 802.3
+ * compatibility, IFG1 must be in the range of 1-8, IFG2 must be in the range
+ * of 4-12, and the IFG1+IFG2 sum must be 12.
+ *
+ * For 10/100/1000Mbs full-duplex systems that require IEEE 802.3
+ * compatibility, IFG1 must be in the range of 1-11, IFG2 must be in the range
+ * of 1-11, and the IFG1+IFG2 sum must be 12.
+ *
+ * For XAUI/10Gbs systems that require IEEE 802.3 compatibility, the
+ * IFG1+IFG2 sum must be 12.  IFG1[1:0] and IFG2[1:0] must be zero.
+ *
+ * For all other systems, IFG1 and IFG2 can be any value in the range of
+ * 1-15.  Allowing for a total possible IFG sum of 2-30.
+ */
+union cvmx_gmxx_tx_ifg {
+       u64 u64;
+       struct cvmx_gmxx_tx_ifg_s {
+               u64 reserved_8_63 : 56;
+               u64 ifg2 : 4;
+               u64 ifg1 : 4;
+       } s;
+       struct cvmx_gmxx_tx_ifg_s cn30xx;
+       struct cvmx_gmxx_tx_ifg_s cn31xx;
+       struct cvmx_gmxx_tx_ifg_s cn38xx;
+       struct cvmx_gmxx_tx_ifg_s cn38xxp2;
+       struct cvmx_gmxx_tx_ifg_s cn50xx;
+       struct cvmx_gmxx_tx_ifg_s cn52xx;
+       struct cvmx_gmxx_tx_ifg_s cn52xxp1;
+       struct cvmx_gmxx_tx_ifg_s cn56xx;
+       struct cvmx_gmxx_tx_ifg_s cn56xxp1;
+       struct cvmx_gmxx_tx_ifg_s cn58xx;
+       struct cvmx_gmxx_tx_ifg_s cn58xxp1;
+       struct cvmx_gmxx_tx_ifg_s cn61xx;
+       struct cvmx_gmxx_tx_ifg_s cn63xx;
+       struct cvmx_gmxx_tx_ifg_s cn63xxp1;
+       struct cvmx_gmxx_tx_ifg_s cn66xx;
+       struct cvmx_gmxx_tx_ifg_s cn68xx;
+       struct cvmx_gmxx_tx_ifg_s cn68xxp1;
+       struct cvmx_gmxx_tx_ifg_s cn70xx;
+       struct cvmx_gmxx_tx_ifg_s cn70xxp1;
+       struct cvmx_gmxx_tx_ifg_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_ifg cvmx_gmxx_tx_ifg_t;
+
+/**
+ * cvmx_gmx#_tx_int_en
+ *
+ * GMX_TX_INT_EN = Interrupt Enable
+ *
+ *
+ * Notes:
+ * In XAUI mode, only the lsb (corresponding to port0) of UNDFLW is used.
+ *
+ */
+union cvmx_gmxx_tx_int_en {
+       u64 u64;
+       struct cvmx_gmxx_tx_int_en_s {
+               u64 reserved_25_63 : 39;
+               u64 xchange : 1;
+               u64 ptp_lost : 4;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } s;
+       struct cvmx_gmxx_tx_int_en_cn30xx {
+               u64 reserved_19_63 : 45;
+               u64 late_col : 3;
+               u64 reserved_15_15 : 1;
+               u64 xsdef : 3;
+               u64 reserved_11_11 : 1;
+               u64 xscol : 3;
+               u64 reserved_5_7 : 3;
+               u64 undflw : 3;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn30xx;
+       struct cvmx_gmxx_tx_int_en_cn31xx {
+               u64 reserved_15_63 : 49;
+               u64 xsdef : 3;
+               u64 reserved_11_11 : 1;
+               u64 xscol : 3;
+               u64 reserved_5_7 : 3;
+               u64 undflw : 3;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn31xx;
+       struct cvmx_gmxx_tx_int_en_cn38xx {
+               u64 reserved_20_63 : 44;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 ncb_nxa : 1;
+               u64 pko_nxa : 1;
+       } cn38xx;
+       struct cvmx_gmxx_tx_int_en_cn38xxp2 {
+               u64 reserved_16_63 : 48;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 ncb_nxa : 1;
+               u64 pko_nxa : 1;
+       } cn38xxp2;
+       struct cvmx_gmxx_tx_int_en_cn30xx cn50xx;
+       struct cvmx_gmxx_tx_int_en_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn52xx;
+       struct cvmx_gmxx_tx_int_en_cn52xx cn52xxp1;
+       struct cvmx_gmxx_tx_int_en_cn52xx cn56xx;
+       struct cvmx_gmxx_tx_int_en_cn52xx cn56xxp1;
+       struct cvmx_gmxx_tx_int_en_cn38xx cn58xx;
+       struct cvmx_gmxx_tx_int_en_cn38xx cn58xxp1;
+       struct cvmx_gmxx_tx_int_en_s cn61xx;
+       struct cvmx_gmxx_tx_int_en_cn63xx {
+               u64 reserved_24_63 : 40;
+               u64 ptp_lost : 4;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn63xx;
+       struct cvmx_gmxx_tx_int_en_cn63xx cn63xxp1;
+       struct cvmx_gmxx_tx_int_en_s cn66xx;
+       struct cvmx_gmxx_tx_int_en_cn68xx {
+               u64 reserved_25_63 : 39;
+               u64 xchange : 1;
+               u64 ptp_lost : 4;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 pko_nxp : 1;
+               u64 pko_nxa : 1;
+       } cn68xx;
+       struct cvmx_gmxx_tx_int_en_cn68xx cn68xxp1;
+       struct cvmx_gmxx_tx_int_en_s cn70xx;
+       struct cvmx_gmxx_tx_int_en_s cn70xxp1;
+       struct cvmx_gmxx_tx_int_en_cnf71xx {
+               u64 reserved_25_63 : 39;
+               u64 xchange : 1;
+               u64 reserved_22_23 : 2;
+               u64 ptp_lost : 2;
+               u64 reserved_18_19 : 2;
+               u64 late_col : 2;
+               u64 reserved_14_15 : 2;
+               u64 xsdef : 2;
+               u64 reserved_10_11 : 2;
+               u64 xscol : 2;
+               u64 reserved_4_7 : 4;
+               u64 undflw : 2;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_int_en cvmx_gmxx_tx_int_en_t;
+
+/**
+ * cvmx_gmx#_tx_int_reg
+ *
+ * GMX_TX_INT_REG = Interrupt Register
+ *
+ *
+ * Notes:
+ * In XAUI mode, only the lsb (corresponding to port0) of UNDFLW is used.
+ *
+ */
+union cvmx_gmxx_tx_int_reg {
+       u64 u64;
+       struct cvmx_gmxx_tx_int_reg_s {
+               u64 reserved_25_63 : 39;
+               u64 xchange : 1;
+               u64 ptp_lost : 4;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } s;
+       struct cvmx_gmxx_tx_int_reg_cn30xx {
+               u64 reserved_19_63 : 45;
+               u64 late_col : 3;
+               u64 reserved_15_15 : 1;
+               u64 xsdef : 3;
+               u64 reserved_11_11 : 1;
+               u64 xscol : 3;
+               u64 reserved_5_7 : 3;
+               u64 undflw : 3;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn30xx;
+       struct cvmx_gmxx_tx_int_reg_cn31xx {
+               u64 reserved_15_63 : 49;
+               u64 xsdef : 3;
+               u64 reserved_11_11 : 1;
+               u64 xscol : 3;
+               u64 reserved_5_7 : 3;
+               u64 undflw : 3;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn31xx;
+       struct cvmx_gmxx_tx_int_reg_cn38xx {
+               u64 reserved_20_63 : 44;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 ncb_nxa : 1;
+               u64 pko_nxa : 1;
+       } cn38xx;
+       struct cvmx_gmxx_tx_int_reg_cn38xxp2 {
+               u64 reserved_16_63 : 48;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 ncb_nxa : 1;
+               u64 pko_nxa : 1;
+       } cn38xxp2;
+       struct cvmx_gmxx_tx_int_reg_cn30xx cn50xx;
+       struct cvmx_gmxx_tx_int_reg_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn52xx;
+       struct cvmx_gmxx_tx_int_reg_cn52xx cn52xxp1;
+       struct cvmx_gmxx_tx_int_reg_cn52xx cn56xx;
+       struct cvmx_gmxx_tx_int_reg_cn52xx cn56xxp1;
+       struct cvmx_gmxx_tx_int_reg_cn38xx cn58xx;
+       struct cvmx_gmxx_tx_int_reg_cn38xx cn58xxp1;
+       struct cvmx_gmxx_tx_int_reg_s cn61xx;
+       struct cvmx_gmxx_tx_int_reg_cn63xx {
+               u64 reserved_24_63 : 40;
+               u64 ptp_lost : 4;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cn63xx;
+       struct cvmx_gmxx_tx_int_reg_cn63xx cn63xxp1;
+       struct cvmx_gmxx_tx_int_reg_s cn66xx;
+       struct cvmx_gmxx_tx_int_reg_cn68xx {
+               u64 reserved_25_63 : 39;
+               u64 xchange : 1;
+               u64 ptp_lost : 4;
+               u64 late_col : 4;
+               u64 xsdef : 4;
+               u64 xscol : 4;
+               u64 reserved_6_7 : 2;
+               u64 undflw : 4;
+               u64 pko_nxp : 1;
+               u64 pko_nxa : 1;
+       } cn68xx;
+       struct cvmx_gmxx_tx_int_reg_cn68xx cn68xxp1;
+       struct cvmx_gmxx_tx_int_reg_s cn70xx;
+       struct cvmx_gmxx_tx_int_reg_s cn70xxp1;
+       struct cvmx_gmxx_tx_int_reg_cnf71xx {
+               u64 reserved_25_63 : 39;
+               u64 xchange : 1;
+               u64 reserved_22_23 : 2;
+               u64 ptp_lost : 2;
+               u64 reserved_18_19 : 2;
+               u64 late_col : 2;
+               u64 reserved_14_15 : 2;
+               u64 xsdef : 2;
+               u64 reserved_10_11 : 2;
+               u64 xscol : 2;
+               u64 reserved_4_7 : 4;
+               u64 undflw : 2;
+               u64 reserved_1_1 : 1;
+               u64 pko_nxa : 1;
+       } cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_int_reg cvmx_gmxx_tx_int_reg_t;
+
+/**
+ * cvmx_gmx#_tx_jam
+ *
+ * GMX_TX_JAM = Packet TX Jam Pattern
+ *
+ */
+union cvmx_gmxx_tx_jam {
+       u64 u64;
+       struct cvmx_gmxx_tx_jam_s {
+               u64 reserved_8_63 : 56;
+               u64 jam : 8;
+       } s;
+       struct cvmx_gmxx_tx_jam_s cn30xx;
+       struct cvmx_gmxx_tx_jam_s cn31xx;
+       struct cvmx_gmxx_tx_jam_s cn38xx;
+       struct cvmx_gmxx_tx_jam_s cn38xxp2;
+       struct cvmx_gmxx_tx_jam_s cn50xx;
+       struct cvmx_gmxx_tx_jam_s cn52xx;
+       struct cvmx_gmxx_tx_jam_s cn52xxp1;
+       struct cvmx_gmxx_tx_jam_s cn56xx;
+       struct cvmx_gmxx_tx_jam_s cn56xxp1;
+       struct cvmx_gmxx_tx_jam_s cn58xx;
+       struct cvmx_gmxx_tx_jam_s cn58xxp1;
+       struct cvmx_gmxx_tx_jam_s cn61xx;
+       struct cvmx_gmxx_tx_jam_s cn63xx;
+       struct cvmx_gmxx_tx_jam_s cn63xxp1;
+       struct cvmx_gmxx_tx_jam_s cn66xx;
+       struct cvmx_gmxx_tx_jam_s cn68xx;
+       struct cvmx_gmxx_tx_jam_s cn68xxp1;
+       struct cvmx_gmxx_tx_jam_s cn70xx;
+       struct cvmx_gmxx_tx_jam_s cn70xxp1;
+       struct cvmx_gmxx_tx_jam_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_jam cvmx_gmxx_tx_jam_t;
+
+/**
+ * cvmx_gmx#_tx_lfsr
+ *
+ * GMX_TX_LFSR = LFSR used to implement truncated binary exponential backoff
+ *
+ */
+union cvmx_gmxx_tx_lfsr {
+       u64 u64;
+       struct cvmx_gmxx_tx_lfsr_s {
+               u64 reserved_16_63 : 48;
+               u64 lfsr : 16;
+       } s;
+       struct cvmx_gmxx_tx_lfsr_s cn30xx;
+       struct cvmx_gmxx_tx_lfsr_s cn31xx;
+       struct cvmx_gmxx_tx_lfsr_s cn38xx;
+       struct cvmx_gmxx_tx_lfsr_s cn38xxp2;
+       struct cvmx_gmxx_tx_lfsr_s cn50xx;
+       struct cvmx_gmxx_tx_lfsr_s cn52xx;
+       struct cvmx_gmxx_tx_lfsr_s cn52xxp1;
+       struct cvmx_gmxx_tx_lfsr_s cn56xx;
+       struct cvmx_gmxx_tx_lfsr_s cn56xxp1;
+       struct cvmx_gmxx_tx_lfsr_s cn58xx;
+       struct cvmx_gmxx_tx_lfsr_s cn58xxp1;
+       struct cvmx_gmxx_tx_lfsr_s cn61xx;
+       struct cvmx_gmxx_tx_lfsr_s cn63xx;
+       struct cvmx_gmxx_tx_lfsr_s cn63xxp1;
+       struct cvmx_gmxx_tx_lfsr_s cn66xx;
+       struct cvmx_gmxx_tx_lfsr_s cn68xx;
+       struct cvmx_gmxx_tx_lfsr_s cn68xxp1;
+       struct cvmx_gmxx_tx_lfsr_s cn70xx;
+       struct cvmx_gmxx_tx_lfsr_s cn70xxp1;
+       struct cvmx_gmxx_tx_lfsr_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_lfsr cvmx_gmxx_tx_lfsr_t;
+
+/**
+ * cvmx_gmx#_tx_ovr_bp
+ *
+ * GMX_TX_OVR_BP = Packet Interface TX Override BackPressure
+ *
+ *
+ * Notes:
+ * In XAUI mode, only the lsb (corresponding to port0) of EN, BP, and IGN_FULL are used.
+ *
+ * GMX*_TX_OVR_BP[EN<0>] must be set to one and GMX*_TX_OVR_BP[BP<0>] must be cleared to zero
+ * (to forcibly disable HW-automatic 802.3 pause packet generation) with the HiGig2 Protocol
+ * when GMX*_HG2_CONTROL[HG2TX_EN]=0. (The HiGig2 protocol is indicated by
+ * GMX*_TX_XAUI_CTL[HG_EN]=1 and GMX*_RX0_UDD_SKP[LEN]=16.) HW can only auto-generate backpressure
+ * through HiGig2 messages (optionally, when GMX*_HG2_CONTROL[HG2TX_EN]=1) with the HiGig2
+ * protocol.
+ */
+union cvmx_gmxx_tx_ovr_bp {
+       u64 u64;
+       struct cvmx_gmxx_tx_ovr_bp_s {
+               u64 reserved_48_63 : 16;
+               u64 tx_prt_bp : 16;
+               u64 reserved_12_31 : 20;
+               u64 en : 4;
+               u64 bp : 4;
+               u64 ign_full : 4;
+       } s;
+       struct cvmx_gmxx_tx_ovr_bp_cn30xx {
+               u64 reserved_11_63 : 53;
+               u64 en : 3;
+               u64 reserved_7_7 : 1;
+               u64 bp : 3;
+               u64 reserved_3_3 : 1;
+               u64 ign_full : 3;
+       } cn30xx;
+       struct cvmx_gmxx_tx_ovr_bp_cn30xx cn31xx;
+       struct cvmx_gmxx_tx_ovr_bp_cn38xx {
+               u64 reserved_12_63 : 52;
+               u64 en : 4;
+               u64 bp : 4;
+               u64 ign_full : 4;
+       } cn38xx;
+       struct cvmx_gmxx_tx_ovr_bp_cn38xx cn38xxp2;
+       struct cvmx_gmxx_tx_ovr_bp_cn30xx cn50xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn52xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn52xxp1;
+       struct cvmx_gmxx_tx_ovr_bp_s cn56xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn56xxp1;
+       struct cvmx_gmxx_tx_ovr_bp_cn38xx cn58xx;
+       struct cvmx_gmxx_tx_ovr_bp_cn38xx cn58xxp1;
+       struct cvmx_gmxx_tx_ovr_bp_s cn61xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn63xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn63xxp1;
+       struct cvmx_gmxx_tx_ovr_bp_s cn66xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn68xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn68xxp1;
+       struct cvmx_gmxx_tx_ovr_bp_s cn70xx;
+       struct cvmx_gmxx_tx_ovr_bp_s cn70xxp1;
+       struct cvmx_gmxx_tx_ovr_bp_cnf71xx {
+               u64 reserved_48_63 : 16;
+               u64 tx_prt_bp : 16;
+               u64 reserved_10_31 : 22;
+               u64 en : 2;
+               u64 reserved_6_7 : 2;
+               u64 bp : 2;
+               u64 reserved_2_3 : 2;
+               u64 ign_full : 2;
+       } cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_ovr_bp cvmx_gmxx_tx_ovr_bp_t;
+
+/**
+ * cvmx_gmx#_tx_pause_pkt_dmac
+ *
+ * GMX_TX_PAUSE_PKT_DMAC = Packet TX Pause Packet DMAC field
+ *
+ */
+union cvmx_gmxx_tx_pause_pkt_dmac {
+       u64 u64;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s {
+               u64 reserved_48_63 : 16;
+               u64 dmac : 48;
+       } s;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn30xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn31xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn38xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn38xxp2;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn50xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn52xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn52xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn56xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn56xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn58xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn58xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn61xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn63xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn63xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn66xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn68xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn68xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn70xx;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cn70xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_pause_pkt_dmac cvmx_gmxx_tx_pause_pkt_dmac_t;
+
+/**
+ * cvmx_gmx#_tx_pause_pkt_type
+ *
+ * GMX_TX_PAUSE_PKT_TYPE = Packet Interface TX Pause Packet TYPE field
+ *
+ */
+union cvmx_gmxx_tx_pause_pkt_type {
+       u64 u64;
+       struct cvmx_gmxx_tx_pause_pkt_type_s {
+               u64 reserved_16_63 : 48;
+               u64 type : 16;
+       } s;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn30xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn31xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn38xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn38xxp2;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn50xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn52xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn52xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn56xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn56xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn58xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn58xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn61xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn63xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn63xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn66xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn68xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn68xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn70xx;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cn70xxp1;
+       struct cvmx_gmxx_tx_pause_pkt_type_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_pause_pkt_type cvmx_gmxx_tx_pause_pkt_type_t;
+
+/**
+ * cvmx_gmx#_tx_prts
+ *
+ * Common
+ * GMX_TX_PRTS = TX Ports
+ */
+union cvmx_gmxx_tx_prts {
+       u64 u64;
+       struct cvmx_gmxx_tx_prts_s {
+               u64 reserved_5_63 : 59;
+               u64 prts : 5;
+       } s;
+       struct cvmx_gmxx_tx_prts_s cn30xx;
+       struct cvmx_gmxx_tx_prts_s cn31xx;
+       struct cvmx_gmxx_tx_prts_s cn38xx;
+       struct cvmx_gmxx_tx_prts_s cn38xxp2;
+       struct cvmx_gmxx_tx_prts_s cn50xx;
+       struct cvmx_gmxx_tx_prts_s cn52xx;
+       struct cvmx_gmxx_tx_prts_s cn52xxp1;
+       struct cvmx_gmxx_tx_prts_s cn56xx;
+       struct cvmx_gmxx_tx_prts_s cn56xxp1;
+       struct cvmx_gmxx_tx_prts_s cn58xx;
+       struct cvmx_gmxx_tx_prts_s cn58xxp1;
+       struct cvmx_gmxx_tx_prts_s cn61xx;
+       struct cvmx_gmxx_tx_prts_s cn63xx;
+       struct cvmx_gmxx_tx_prts_s cn63xxp1;
+       struct cvmx_gmxx_tx_prts_s cn66xx;
+       struct cvmx_gmxx_tx_prts_s cn68xx;
+       struct cvmx_gmxx_tx_prts_s cn68xxp1;
+       struct cvmx_gmxx_tx_prts_s cn70xx;
+       struct cvmx_gmxx_tx_prts_s cn70xxp1;
+       struct cvmx_gmxx_tx_prts_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_prts cvmx_gmxx_tx_prts_t;
+
+/**
+ * cvmx_gmx#_tx_spi_ctl
+ *
+ * GMX_TX_SPI_CTL = Spi4 TX ModesSpi4
+ *
+ */
+union cvmx_gmxx_tx_spi_ctl {
+       u64 u64;
+       struct cvmx_gmxx_tx_spi_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 tpa_clr : 1;
+               u64 cont_pkt : 1;
+       } s;
+       struct cvmx_gmxx_tx_spi_ctl_s cn38xx;
+       struct cvmx_gmxx_tx_spi_ctl_s cn38xxp2;
+       struct cvmx_gmxx_tx_spi_ctl_s cn58xx;
+       struct cvmx_gmxx_tx_spi_ctl_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_tx_spi_ctl cvmx_gmxx_tx_spi_ctl_t;
+
+/**
+ * cvmx_gmx#_tx_spi_drain
+ *
+ * GMX_TX_SPI_DRAIN = Drain out Spi TX FIFO
+ *
+ */
+union cvmx_gmxx_tx_spi_drain {
+       u64 u64;
+       struct cvmx_gmxx_tx_spi_drain_s {
+               u64 reserved_16_63 : 48;
+               u64 drain : 16;
+       } s;
+       struct cvmx_gmxx_tx_spi_drain_s cn38xx;
+       struct cvmx_gmxx_tx_spi_drain_s cn58xx;
+       struct cvmx_gmxx_tx_spi_drain_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_tx_spi_drain cvmx_gmxx_tx_spi_drain_t;
+
+/**
+ * cvmx_gmx#_tx_spi_max
+ *
+ * GMX_TX_SPI_MAX = RGMII TX Spi4 MAX
+ *
+ */
+union cvmx_gmxx_tx_spi_max {
+       u64 u64;
+       struct cvmx_gmxx_tx_spi_max_s {
+               u64 reserved_23_63 : 41;
+               u64 slice : 7;
+               u64 max2 : 8;
+               u64 max1 : 8;
+       } s;
+       struct cvmx_gmxx_tx_spi_max_cn38xx {
+               u64 reserved_16_63 : 48;
+               u64 max2 : 8;
+               u64 max1 : 8;
+       } cn38xx;
+       struct cvmx_gmxx_tx_spi_max_cn38xx cn38xxp2;
+       struct cvmx_gmxx_tx_spi_max_s cn58xx;
+       struct cvmx_gmxx_tx_spi_max_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_tx_spi_max cvmx_gmxx_tx_spi_max_t;
+
+/**
+ * cvmx_gmx#_tx_spi_round#
+ *
+ * GMX_TX_SPI_ROUND = Controls SPI4 TX Arbitration
+ *
+ */
+union cvmx_gmxx_tx_spi_roundx {
+       u64 u64;
+       struct cvmx_gmxx_tx_spi_roundx_s {
+               u64 reserved_16_63 : 48;
+               u64 round : 16;
+       } s;
+       struct cvmx_gmxx_tx_spi_roundx_s cn58xx;
+       struct cvmx_gmxx_tx_spi_roundx_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_tx_spi_roundx cvmx_gmxx_tx_spi_roundx_t;
+
+/**
+ * cvmx_gmx#_tx_spi_thresh
+ *
+ * GMX_TX_SPI_THRESH = RGMII TX Spi4 Transmit Threshold
+ *
+ *
+ * Notes:
+ * Note: zero will map to 0x20
+ *
+ * This will normally creates Spi4 traffic bursts at least THRESH in length.
+ * If dclk > eclk, then this rule may not always hold and Octeon may split
+ * transfers into smaller bursts - some of which could be as short as 16B.
+ * Octeon will never violate the Spi4.2 spec and send a non-EOP burst that is
+ * not a multiple of 16B.
+ */
+union cvmx_gmxx_tx_spi_thresh {
+       u64 u64;
+       struct cvmx_gmxx_tx_spi_thresh_s {
+               u64 reserved_6_63 : 58;
+               u64 thresh : 6;
+       } s;
+       struct cvmx_gmxx_tx_spi_thresh_s cn38xx;
+       struct cvmx_gmxx_tx_spi_thresh_s cn38xxp2;
+       struct cvmx_gmxx_tx_spi_thresh_s cn58xx;
+       struct cvmx_gmxx_tx_spi_thresh_s cn58xxp1;
+};
+
+typedef union cvmx_gmxx_tx_spi_thresh cvmx_gmxx_tx_spi_thresh_t;
+
+/**
+ * cvmx_gmx#_tx_xaui_ctl
+ */
+union cvmx_gmxx_tx_xaui_ctl {
+       u64 u64;
+       struct cvmx_gmxx_tx_xaui_ctl_s {
+               u64 reserved_11_63 : 53;
+               u64 hg_pause_hgi : 2;
+               u64 hg_en : 1;
+               u64 reserved_7_7 : 1;
+               u64 ls_byp : 1;
+               u64 ls : 2;
+               u64 reserved_2_3 : 2;
+               u64 uni_en : 1;
+               u64 dic_en : 1;
+       } s;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn52xx;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn52xxp1;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn56xx;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn56xxp1;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn61xx;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn63xx;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn63xxp1;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn66xx;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn68xx;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn68xxp1;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn70xx;
+       struct cvmx_gmxx_tx_xaui_ctl_s cn70xxp1;
+       struct cvmx_gmxx_tx_xaui_ctl_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_tx_xaui_ctl cvmx_gmxx_tx_xaui_ctl_t;
+
+/**
+ * cvmx_gmx#_wol_ctl
+ */
+union cvmx_gmxx_wol_ctl {
+       u64 u64;
+       struct cvmx_gmxx_wol_ctl_s {
+               u64 reserved_36_63 : 28;
+               u64 magic_en : 4;
+               u64 reserved_20_31 : 12;
+               u64 direct_en : 4;
+               u64 reserved_1_15 : 15;
+               u64 en : 1;
+       } s;
+       struct cvmx_gmxx_wol_ctl_s cn70xx;
+       struct cvmx_gmxx_wol_ctl_s cn70xxp1;
+};
+
+typedef union cvmx_gmxx_wol_ctl cvmx_gmxx_wol_ctl_t;
+
+/**
+ * cvmx_gmx#_xaui_ext_loopback
+ */
+union cvmx_gmxx_xaui_ext_loopback {
+       u64 u64;
+       struct cvmx_gmxx_xaui_ext_loopback_s {
+               u64 reserved_5_63 : 59;
+               u64 en : 1;
+               u64 thresh : 4;
+       } s;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn52xx;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn52xxp1;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn56xx;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn56xxp1;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn61xx;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn63xx;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn63xxp1;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn66xx;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn68xx;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn68xxp1;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn70xx;
+       struct cvmx_gmxx_xaui_ext_loopback_s cn70xxp1;
+       struct cvmx_gmxx_xaui_ext_loopback_s cnf71xx;
+};
+
+typedef union cvmx_gmxx_xaui_ext_loopback cvmx_gmxx_xaui_ext_loopback_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-gserx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-gserx-defs.h
new file mode 100644 (file)
index 0000000..832a592
--- /dev/null
@@ -0,0 +1,2191 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_GSERX_DEFS_H__
+#define __CVMX_GSERX_DEFS_H__
+
+#define CVMX_GSERX_DLMX_TX_AMPLITUDE(offset, block_id) (0x0001180090003008ull)
+#define CVMX_GSERX_DLMX_TX_PREEMPH(offset, block_id)   (0x0001180090003028ull)
+#define CVMX_GSERX_DLMX_MPLL_EN(offset, block_id)      (0x0001180090001020ull)
+#define CVMX_GSERX_DLMX_REF_SSP_EN(offset, block_id)   (0x0001180090001048ull)
+#define CVMX_GSERX_DLMX_TX_RATE(offset, block_id)      (0x0001180090003030ull)
+#define CVMX_GSERX_DLMX_TX_EN(offset, block_id)               (0x0001180090003020ull)
+#define CVMX_GSERX_DLMX_TX_CM_EN(offset, block_id)     (0x0001180090003010ull)
+#define CVMX_GSERX_DLMX_TX_RESET(offset, block_id)     (0x0001180090003038ull)
+#define CVMX_GSERX_DLMX_TX_DATA_EN(offset, block_id)   (0x0001180090003018ull)
+#define CVMX_GSERX_DLMX_RX_RATE(offset, block_id)      (0x0001180090002028ull)
+#define CVMX_GSERX_DLMX_RX_PLL_EN(offset, block_id)    (0x0001180090002020ull)
+#define CVMX_GSERX_DLMX_RX_DATA_EN(offset, block_id)   (0x0001180090002008ull)
+#define CVMX_GSERX_DLMX_RX_RESET(offset, block_id)     (0x0001180090002030ull)
+
+#define CVMX_GSERX_DLMX_TX_STATUS(offset, block_id)                                                \
+       (0x0001180090003000ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_RX_STATUS(offset, block_id)                                                \
+       (0x0001180090002000ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+
+static inline u64 CVMX_GSERX_SATA_STATUS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0001180090100200ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0001180090100900ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001180090100900ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180090100900ull + (offset) * 0x1000000ull;
+}
+
+#define CVMX_GSERX_DLMX_RX_EQ(offset, block_id)                                                    \
+       (0x0001180090002010ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_REF_USE_PAD(offset, block_id)                                              \
+       (0x0001180090001050ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_REFCLK_SEL(offset, block_id)                                               \
+       (0x0001180090000008ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_PHY_RESET(offset, block_id)                                                \
+       (0x0001180090001038ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_TEST_POWERDOWN(offset, block_id)                                           \
+       (0x0001180090001060ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_REF_CLKDIV2(offset, block_id)                                              \
+       (0x0001180090001040ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_MPLL_MULTIPLIER(offset, block_id)                                          \
+       (0x0001180090001030ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+#define CVMX_GSERX_DLMX_MPLL_STATUS(offset, block_id)                                              \
+       (0x0001180090001000ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+
+#define CVMX_GSERX_BR_RXX_CTL(offset, block_id)                                                    \
+       (0x0001180090000400ull + (((offset) & 3) + ((block_id) & 15) * 0x20000ull) * 128)
+#define CVMX_GSERX_BR_RXX_EER(offset, block_id)                                                    \
+       (0x0001180090000418ull + (((offset) & 3) + ((block_id) & 15) * 0x20000ull) * 128)
+
+#define CVMX_GSERX_PCIE_PIPE_PORT_SEL(offset) (0x0001180090080460ull)
+#define CVMX_GSERX_PCIE_PIPE_RST(offset)      (0x0001180090080448ull)
+
+#define CVMX_GSERX_SATA_CFG(offset)       (0x0001180090100208ull)
+#define CVMX_GSERX_SATA_REF_SSP_EN(offset) (0x0001180090100600ull)
+
+static inline u64 CVMX_GSERX_SATA_LANE_RST(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0001180090100210ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0001180090000908ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001180090000908ull + (offset) * 0x1000000ull;
+       }
+       return 0x0001180090000908ull + (offset) * 0x1000000ull;
+}
+
+#define CVMX_GSERX_EQ_WAIT_TIME(offset) (0x00011800904E0000ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_GLBL_MISC_CONFIG_1(offset) (0x0001180090460030ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_GLBL_PLL_CFG_3(offset)     (0x0001180090460018ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_PHYX_OVRD_IN_LO(offset, block_id)                                               \
+       (0x0001180090400088ull + (((offset) & 3) + ((block_id) & 0) * 0x0ull) * 524288)
+
+#define CVMX_GSERX_RX_PWR_CTRL_P1(offset) (0x00011800904600B0ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_RX_PWR_CTRL_P2(offset) (0x00011800904600B8ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_RX_EIE_DETSTS(offset)  (0x0001180090000150ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_LANE_MODE(offset) (0x0001180090000118ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_LANE_VMA_FINE_CTRL_0(offset)                                                    \
+       (0x00011800904E01C8ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_LANEX_LBERT_CFG(offset, block_id)                                               \
+       (0x00011800904C0020ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+
+#define CVMX_GSERX_LANEX_MISC_CFG_0(offset, block_id)                                              \
+       (0x00011800904C0000ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+
+#define CVMX_GSERX_LANE_PX_MODE_0(offset, block_id)                                                \
+       (0x00011800904E0040ull + (((offset) & 15) + ((block_id) & 15) * 0x80000ull) * 32)
+#define CVMX_GSERX_LANE_PX_MODE_1(offset, block_id)                                                \
+       (0x00011800904E0048ull + (((offset) & 15) + ((block_id) & 15) * 0x80000ull) * 32)
+
+#define CVMX_GSERX_LANEX_RX_CFG_0(offset, block_id)                                                \
+       (0x0001180090440000ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_CFG_1(offset, block_id)                                                \
+       (0x0001180090440008ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_CFG_2(offset, block_id)                                                \
+       (0x0001180090440010ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_CFG_3(offset, block_id)                                                \
+       (0x0001180090440018ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_CFG_4(offset, block_id)                                                \
+       (0x0001180090440020ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_CFG_5(offset, block_id)                                                \
+       (0x0001180090440028ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_CTLE_CTRL(offset, block_id)                                            \
+       (0x0001180090440058ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+
+#define CVMX_GSERX_LANEX_RX_LOOP_CTRL(offset, block_id)                                            \
+       (0x0001180090440048ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(offset, block_id)                                        \
+       (0x0001180090440240ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_VALBBD_CTRL_1(offset, block_id)                                        \
+       (0x0001180090440248ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_VALBBD_CTRL_2(offset, block_id)                                        \
+       (0x0001180090440250ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_RX_MISC_OVRRD(offset, block_id)                                           \
+       (0x0001180090440258ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+
+#define CVMX_GSERX_LANEX_TX_CFG_0(offset, block_id)                                                \
+       (0x00011800904400A8ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_TX_CFG_1(offset, block_id)                                                \
+       (0x00011800904400B0ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_TX_CFG_2(offset, block_id)                                                \
+       (0x00011800904400B8ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_TX_CFG_3(offset, block_id)                                                \
+       (0x00011800904400C0ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_TX_PRE_EMPHASIS(offset, block_id)                                         \
+       (0x00011800904400C8ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+
+#define CVMX_GSERX_RX_TXDIR_CTRL_0(offset) (0x00011800904600E8ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_RX_TXDIR_CTRL_1(offset) (0x00011800904600F0ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_RX_TXDIR_CTRL_2(offset) (0x00011800904600F8ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_LANEX_PCS_CTLIFC_0(offset, block_id)                                            \
+       (0x00011800904C0060ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_PCS_CTLIFC_1(offset, block_id)                                            \
+       (0x00011800904C0068ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+#define CVMX_GSERX_LANEX_PCS_CTLIFC_2(offset, block_id)                                            \
+       (0x00011800904C0070ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+
+#define CVMX_GSERX_LANEX_PWR_CTRL(offset, block_id)                                                \
+       (0x00011800904400D8ull + (((offset) & 3) + ((block_id) & 15) * 0x10ull) * 1048576)
+
+#define CVMX_GSERX_LANE_VMA_FINE_CTRL_2(offset)                                                    \
+       (0x00011800904E01D8ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_PLL_STAT(offset) (0x0001180090000010ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_QLM_STAT(offset) (0x00011800900000A0ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_PLL_PX_MODE_0(offset, block_id)                                                 \
+       (0x00011800904E0030ull + (((offset) & 15) + ((block_id) & 15) * 0x80000ull) * 32)
+#define CVMX_GSERX_PLL_PX_MODE_1(offset, block_id)                                                 \
+       (0x00011800904E0038ull + (((offset) & 15) + ((block_id) & 15) * 0x80000ull) * 32)
+
+#define CVMX_GSERX_SLICE_CFG(offset) (0x0001180090460060ull + ((offset) & 15) * 0x1000000ull)
+
+#define CVMX_GSERX_SLICEX_PCIE1_MODE(offset, block_id)                                             \
+       (0x0001180090460228ull + (((offset) & 1) + ((block_id) & 15) * 0x8ull) * 2097152)
+#define CVMX_GSERX_SLICEX_PCIE2_MODE(offset, block_id)                                             \
+       (0x0001180090460230ull + (((offset) & 1) + ((block_id) & 15) * 0x8ull) * 2097152)
+#define CVMX_GSERX_SLICEX_PCIE3_MODE(offset, block_id)                                             \
+       (0x0001180090460238ull + (((offset) & 1) + ((block_id) & 15) * 0x8ull) * 2097152)
+#define CVMX_GSERX_SLICEX_RX_SDLL_CTRL(offset, block_id)                                           \
+       (0x0001180090460220ull + (((offset) & 1) + ((block_id) & 15) * 0x8ull) * 2097152)
+
+#define CVMX_GSERX_REFCLK_SEL(offset) (0x0001180090000008ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_PHY_CTL(offset)    (0x0001180090000000ull + ((offset) & 15) * 0x1000000ull)
+#define CVMX_GSERX_CFG(offset)       (0x0001180090000080ull + ((offset) & 15) * 0x1000000ull)
+
+/**
+ * cvmx_gser#_cfg
+ */
+union cvmx_gserx_cfg {
+       u64 u64;
+       struct cvmx_gserx_cfg_s {
+               u64 reserved_9_63 : 55;
+               u64 rmac_pipe : 1;
+               u64 rmac : 1;
+               u64 srio : 1;
+               u64 sata : 1;
+               u64 bgx_quad : 1;
+               u64 bgx_dual : 1;
+               u64 bgx : 1;
+               u64 ila : 1;
+               u64 pcie : 1;
+       } s;
+       struct cvmx_gserx_cfg_cn73xx {
+               u64 reserved_6_63 : 58;
+               u64 sata : 1;
+               u64 bgx_quad : 1;
+               u64 bgx_dual : 1;
+               u64 bgx : 1;
+               u64 ila : 1;
+               u64 pcie : 1;
+       } cn73xx;
+       struct cvmx_gserx_cfg_cn78xx {
+               u64 reserved_5_63 : 59;
+               u64 bgx_quad : 1;
+               u64 bgx_dual : 1;
+               u64 bgx : 1;
+               u64 ila : 1;
+               u64 pcie : 1;
+       } cn78xx;
+       struct cvmx_gserx_cfg_cn78xx cn78xxp1;
+       struct cvmx_gserx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_gserx_cfg cvmx_gserx_cfg_t;
+
+/**
+ * cvmx_gser#_eq_wait_time
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_eq_wait_time {
+       u64 u64;
+       struct cvmx_gserx_eq_wait_time_s {
+               u64 reserved_8_63 : 56;
+               u64 rxeq_wait_cnt : 4;
+               u64 txeq_wait_cnt : 4;
+       } s;
+       struct cvmx_gserx_eq_wait_time_s cn73xx;
+       struct cvmx_gserx_eq_wait_time_s cn78xx;
+       struct cvmx_gserx_eq_wait_time_s cn78xxp1;
+       struct cvmx_gserx_eq_wait_time_s cnf75xx;
+};
+
+typedef union cvmx_gserx_eq_wait_time cvmx_gserx_eq_wait_time_t;
+
+/**
+ * cvmx_gser#_glbl_misc_config_1
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_glbl_misc_config_1 {
+       u64 u64;
+       struct cvmx_gserx_glbl_misc_config_1_s {
+               u64 reserved_10_63 : 54;
+               u64 pcs_sds_vref_tr : 4;
+               u64 pcs_sds_trim_chp_reg : 2;
+               u64 pcs_sds_vco_reg_tr : 2;
+               u64 pcs_sds_cvbg_en : 1;
+               u64 pcs_sds_extvbg_en : 1;
+       } s;
+       struct cvmx_gserx_glbl_misc_config_1_s cn73xx;
+       struct cvmx_gserx_glbl_misc_config_1_s cn78xx;
+       struct cvmx_gserx_glbl_misc_config_1_s cn78xxp1;
+       struct cvmx_gserx_glbl_misc_config_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_glbl_misc_config_1 cvmx_gserx_glbl_misc_config_1_t;
+
+/**
+ * cvmx_gser#_glbl_pll_cfg_3
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_glbl_pll_cfg_3 {
+       u64 u64;
+       struct cvmx_gserx_glbl_pll_cfg_3_s {
+               u64 reserved_10_63 : 54;
+               u64 pcs_sds_pll_vco_amp : 2;
+               u64 pll_bypass_uq : 1;
+               u64 pll_vctrl_sel_ovrrd_en : 1;
+               u64 pll_vctrl_sel_ovrrd_val : 2;
+               u64 pll_vctrl_sel_lcvco_val : 2;
+               u64 pll_vctrl_sel_rovco_val : 2;
+       } s;
+       struct cvmx_gserx_glbl_pll_cfg_3_s cn73xx;
+       struct cvmx_gserx_glbl_pll_cfg_3_s cn78xx;
+       struct cvmx_gserx_glbl_pll_cfg_3_s cn78xxp1;
+       struct cvmx_gserx_glbl_pll_cfg_3_s cnf75xx;
+};
+
+typedef union cvmx_gserx_glbl_pll_cfg_3 cvmx_gserx_glbl_pll_cfg_3_t;
+
+/**
+ * cvmx_gser#_dlm#_rx_data_en
+ *
+ * DLM Receiver Enable.
+ *
+ */
+union cvmx_gserx_dlmx_rx_data_en {
+       u64 u64;
+       struct cvmx_gserx_dlmx_rx_data_en_s {
+               u64 reserved_9_63 : 55;
+               u64 rx1_data_en : 1;
+               u64 reserved_1_7 : 7;
+               u64 rx0_data_en : 1;
+       } s;
+       struct cvmx_gserx_dlmx_rx_data_en_s cn70xx;
+       struct cvmx_gserx_dlmx_rx_data_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_rx_data_en cvmx_gserx_dlmx_rx_data_en_t;
+
+/**
+ * cvmx_gser#_dlm#_rx_pll_en
+ *
+ * DLM0 DPLL Enable.
+ *
+ */
+union cvmx_gserx_dlmx_rx_pll_en {
+       u64 u64;
+       struct cvmx_gserx_dlmx_rx_pll_en_s {
+               u64 reserved_9_63 : 55;
+               u64 rx1_pll_en : 1;
+               u64 reserved_1_7 : 7;
+               u64 rx0_pll_en : 1;
+       } s;
+       struct cvmx_gserx_dlmx_rx_pll_en_s cn70xx;
+       struct cvmx_gserx_dlmx_rx_pll_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_rx_pll_en cvmx_gserx_dlmx_rx_pll_en_t;
+
+/**
+ * cvmx_gser#_dlm#_rx_rate
+ *
+ * DLM0 Rx Data Rate.
+ *
+ */
+union cvmx_gserx_dlmx_rx_rate {
+       u64 u64;
+       struct cvmx_gserx_dlmx_rx_rate_s {
+               u64 reserved_10_63 : 54;
+               u64 rx1_rate : 2;
+               u64 reserved_2_7 : 6;
+               u64 rx0_rate : 2;
+       } s;
+       struct cvmx_gserx_dlmx_rx_rate_s cn70xx;
+       struct cvmx_gserx_dlmx_rx_rate_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_rx_rate cvmx_gserx_dlmx_rx_rate_t;
+
+/**
+ * cvmx_gser#_dlm#_rx_reset
+ *
+ * DLM0 Receiver Reset.
+ *
+ */
+union cvmx_gserx_dlmx_rx_reset {
+       u64 u64;
+       struct cvmx_gserx_dlmx_rx_reset_s {
+               u64 reserved_9_63 : 55;
+               u64 rx1_reset : 1;
+               u64 reserved_1_7 : 7;
+               u64 rx0_reset : 1;
+       } s;
+       struct cvmx_gserx_dlmx_rx_reset_s cn70xx;
+       struct cvmx_gserx_dlmx_rx_reset_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_rx_reset cvmx_gserx_dlmx_rx_reset_t;
+
+/**
+ * cvmx_gser#_dlm#_test_powerdown
+ *
+ * DLM Test Powerdown.
+ *
+ */
+union cvmx_gserx_dlmx_test_powerdown {
+       u64 u64;
+       struct cvmx_gserx_dlmx_test_powerdown_s {
+               u64 reserved_1_63 : 63;
+               u64 test_powerdown : 1;
+       } s;
+       struct cvmx_gserx_dlmx_test_powerdown_s cn70xx;
+       struct cvmx_gserx_dlmx_test_powerdown_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_test_powerdown cvmx_gserx_dlmx_test_powerdown_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_amplitude
+ *
+ * DLM0 Tx Amplitude (Full Swing Mode).
+ *
+ */
+union cvmx_gserx_dlmx_tx_amplitude {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_amplitude_s {
+               u64 reserved_15_63 : 49;
+               u64 tx1_amplitude : 7;
+               u64 reserved_7_7 : 1;
+               u64 tx0_amplitude : 7;
+       } s;
+       struct cvmx_gserx_dlmx_tx_amplitude_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_amplitude_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_amplitude cvmx_gserx_dlmx_tx_amplitude_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_en
+ *
+ * DLM Transmit Clocking and Data Sampling Enable.
+ *
+ */
+union cvmx_gserx_dlmx_tx_en {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_en_s {
+               u64 reserved_9_63 : 55;
+               u64 tx1_en : 1;
+               u64 reserved_1_7 : 7;
+               u64 tx0_en : 1;
+       } s;
+       struct cvmx_gserx_dlmx_tx_en_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_en cvmx_gserx_dlmx_tx_en_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_preemph
+ *
+ * DLM0 Tx Deemphasis.
+ *
+ */
+union cvmx_gserx_dlmx_tx_preemph {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_preemph_s {
+               u64 reserved_15_63 : 49;
+               u64 tx1_preemph : 7;
+               u64 reserved_7_7 : 1;
+               u64 tx0_preemph : 7;
+       } s;
+       struct cvmx_gserx_dlmx_tx_preemph_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_preemph_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_preemph cvmx_gserx_dlmx_tx_preemph_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_status
+ *
+ * DLM Transmit Common Mode Control Status.
+ *
+ */
+union cvmx_gserx_dlmx_tx_status {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_status_s {
+               u64 reserved_10_63 : 54;
+               u64 tx1_cm_status : 1;
+               u64 tx1_status : 1;
+               u64 reserved_2_7 : 6;
+               u64 tx0_cm_status : 1;
+               u64 tx0_status : 1;
+       } s;
+       struct cvmx_gserx_dlmx_tx_status_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_status_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_status cvmx_gserx_dlmx_tx_status_t;
+
+/**
+ * cvmx_gser#_dlm#_rx_status
+ *
+ * DLM Receive DPLL State Indicator.
+ *
+ */
+union cvmx_gserx_dlmx_rx_status {
+       u64 u64;
+       struct cvmx_gserx_dlmx_rx_status_s {
+               u64 reserved_9_63 : 55;
+               u64 rx1_status : 1;
+               u64 reserved_1_7 : 7;
+               u64 rx0_status : 1;
+       } s;
+       struct cvmx_gserx_dlmx_rx_status_s cn70xx;
+       struct cvmx_gserx_dlmx_rx_status_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_rx_status cvmx_gserx_dlmx_rx_status_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_rate
+ *
+ * DLM0 Tx Data Rate.
+ *
+ */
+union cvmx_gserx_dlmx_tx_rate {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_rate_s {
+               u64 reserved_10_63 : 54;
+               u64 tx1_rate : 2;
+               u64 reserved_2_7 : 6;
+               u64 tx0_rate : 2;
+       } s;
+       struct cvmx_gserx_dlmx_tx_rate_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_rate_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_rate cvmx_gserx_dlmx_tx_rate_t;
+
+/**
+ * cvmx_gser#_sata_status
+ *
+ * SATA PHY Ready Status.
+ *
+ */
+union cvmx_gserx_sata_status {
+       u64 u64;
+       struct cvmx_gserx_sata_status_s {
+               u64 reserved_2_63 : 62;
+               u64 p1_rdy : 1;
+               u64 p0_rdy : 1;
+       } s;
+       struct cvmx_gserx_sata_status_s cn70xx;
+       struct cvmx_gserx_sata_status_s cn70xxp1;
+       struct cvmx_gserx_sata_status_s cn73xx;
+       struct cvmx_gserx_sata_status_s cnf75xx;
+};
+
+typedef union cvmx_gserx_sata_status cvmx_gserx_sata_status_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_data_en
+ *
+ * DLM0 Transmit Driver Enable.
+ *
+ */
+union cvmx_gserx_dlmx_tx_data_en {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_data_en_s {
+               u64 reserved_9_63 : 55;
+               u64 tx1_data_en : 1;
+               u64 reserved_1_7 : 7;
+               u64 tx0_data_en : 1;
+       } s;
+       struct cvmx_gserx_dlmx_tx_data_en_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_data_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_data_en cvmx_gserx_dlmx_tx_data_en_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_cm_en
+ *
+ * DLM0 Transmit Common-Mode Control Enable.
+ *
+ */
+union cvmx_gserx_dlmx_tx_cm_en {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_cm_en_s {
+               u64 reserved_9_63 : 55;
+               u64 tx1_cm_en : 1;
+               u64 reserved_1_7 : 7;
+               u64 tx0_cm_en : 1;
+       } s;
+       struct cvmx_gserx_dlmx_tx_cm_en_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_cm_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_cm_en cvmx_gserx_dlmx_tx_cm_en_t;
+
+/**
+ * cvmx_gser#_dlm#_tx_reset
+ *
+ * DLM0 Tx Reset.
+ *
+ */
+union cvmx_gserx_dlmx_tx_reset {
+       u64 u64;
+       struct cvmx_gserx_dlmx_tx_reset_s {
+               u64 reserved_9_63 : 55;
+               u64 tx1_reset : 1;
+               u64 reserved_1_7 : 7;
+               u64 tx0_reset : 1;
+       } s;
+       struct cvmx_gserx_dlmx_tx_reset_s cn70xx;
+       struct cvmx_gserx_dlmx_tx_reset_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_tx_reset cvmx_gserx_dlmx_tx_reset_t;
+
+/**
+ * cvmx_gser#_dlm#_mpll_status
+ *
+ * DLM PLL Lock Status.
+ *
+ */
+union cvmx_gserx_dlmx_mpll_status {
+       u64 u64;
+       struct cvmx_gserx_dlmx_mpll_status_s {
+               u64 reserved_1_63 : 63;
+               u64 mpll_status : 1;
+       } s;
+       struct cvmx_gserx_dlmx_mpll_status_s cn70xx;
+       struct cvmx_gserx_dlmx_mpll_status_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_mpll_status cvmx_gserx_dlmx_mpll_status_t;
+
+/**
+ * cvmx_gser#_dlm#_phy_reset
+ *
+ * DLM Core and State Machine Reset.
+ *
+ */
+union cvmx_gserx_dlmx_phy_reset {
+       u64 u64;
+       struct cvmx_gserx_dlmx_phy_reset_s {
+               u64 reserved_1_63 : 63;
+               u64 phy_reset : 1;
+       } s;
+       struct cvmx_gserx_dlmx_phy_reset_s cn70xx;
+       struct cvmx_gserx_dlmx_phy_reset_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_phy_reset cvmx_gserx_dlmx_phy_reset_t;
+
+/**
+ * cvmx_gser#_dlm#_ref_clkdiv2
+ *
+ * DLM Input Reference Clock Divider Control.
+ *
+ */
+union cvmx_gserx_dlmx_ref_clkdiv2 {
+       u64 u64;
+       struct cvmx_gserx_dlmx_ref_clkdiv2_s {
+               u64 reserved_1_63 : 63;
+               u64 ref_clkdiv2 : 1;
+       } s;
+       struct cvmx_gserx_dlmx_ref_clkdiv2_s cn70xx;
+       struct cvmx_gserx_dlmx_ref_clkdiv2_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_ref_clkdiv2 cvmx_gserx_dlmx_ref_clkdiv2_t;
+
+/**
+ * cvmx_gser#_dlm#_ref_ssp_en
+ *
+ * DLM0 Reference Clock Enable for the PHY.
+ *
+ */
+union cvmx_gserx_dlmx_ref_ssp_en {
+       u64 u64;
+       struct cvmx_gserx_dlmx_ref_ssp_en_s {
+               u64 reserved_1_63 : 63;
+               u64 ref_ssp_en : 1;
+       } s;
+       struct cvmx_gserx_dlmx_ref_ssp_en_s cn70xx;
+       struct cvmx_gserx_dlmx_ref_ssp_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_ref_ssp_en cvmx_gserx_dlmx_ref_ssp_en_t;
+
+union cvmx_gserx_dlmx_mpll_en {
+       u64 u64;
+       struct cvmx_gserx_dlmx_mpll_en_s {
+               u64 reserved_1_63 : 63;
+               u64 mpll_en : 1;
+       } s;
+       struct cvmx_gserx_dlmx_mpll_en_s cn70xx;
+       struct cvmx_gserx_dlmx_mpll_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_mpll_en cvmx_gserx_dlmx_mpll_en_t;
+
+/**
+ * cvmx_gser#_dlm#_rx_eq
+ *
+ * DLM Receiver Equalization Setting.
+ *
+ */
+union cvmx_gserx_dlmx_rx_eq {
+       u64 u64;
+       struct cvmx_gserx_dlmx_rx_eq_s {
+               u64 reserved_11_63 : 53;
+               u64 rx1_eq : 3;
+               u64 reserved_3_7 : 5;
+               u64 rx0_eq : 3;
+       } s;
+       struct cvmx_gserx_dlmx_rx_eq_s cn70xx;
+       struct cvmx_gserx_dlmx_rx_eq_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_rx_eq cvmx_gserx_dlmx_rx_eq_t;
+
+/**
+ * cvmx_gser#_dlm#_mpll_multiplier
+ *
+ * DLM MPLL Frequency Multiplier Control.
+ *
+ */
+union cvmx_gserx_dlmx_mpll_multiplier {
+       u64 u64;
+       struct cvmx_gserx_dlmx_mpll_multiplier_s {
+               u64 reserved_7_63 : 57;
+               u64 mpll_multiplier : 7;
+       } s;
+       struct cvmx_gserx_dlmx_mpll_multiplier_s cn70xx;
+       struct cvmx_gserx_dlmx_mpll_multiplier_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_dlmx_mpll_multiplier cvmx_gserx_dlmx_mpll_multiplier_t;
+
+/**
+ * cvmx_gser#_br_rx#_ctl
+ */
+union cvmx_gserx_br_rxx_ctl {
+       u64 u64;
+       struct cvmx_gserx_br_rxx_ctl_s {
+               u64 reserved_4_63 : 60;
+               u64 rxt_adtmout_disable : 1;
+               u64 rxt_swm : 1;
+               u64 rxt_preset : 1;
+               u64 rxt_initialize : 1;
+       } s;
+       struct cvmx_gserx_br_rxx_ctl_s cn73xx;
+       struct cvmx_gserx_br_rxx_ctl_s cn78xx;
+       struct cvmx_gserx_br_rxx_ctl_cn78xxp1 {
+               u64 reserved_3_63 : 61;
+               u64 rxt_swm : 1;
+               u64 rxt_preset : 1;
+               u64 rxt_initialize : 1;
+       } cn78xxp1;
+       struct cvmx_gserx_br_rxx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_gserx_br_rxx_ctl cvmx_gserx_br_rxx_ctl_t;
+
+/**
+ * cvmx_gser#_br_rx#_eer
+ *
+ * GSER software BASE-R RX link training equalization evaluation request (EER). A write to
+ * [RXT_EER] initiates a equalization request to the RAW PCS. A read of this register returns the
+ * equalization status message and a valid bit indicating it was updated. These registers are for
+ * diagnostic use only.
+ */
+union cvmx_gserx_br_rxx_eer {
+       u64 u64;
+       struct cvmx_gserx_br_rxx_eer_s {
+               u64 reserved_16_63 : 48;
+               u64 rxt_eer : 1;
+               u64 rxt_esv : 1;
+               u64 rxt_esm : 14;
+       } s;
+       struct cvmx_gserx_br_rxx_eer_s cn73xx;
+       struct cvmx_gserx_br_rxx_eer_s cn78xx;
+       struct cvmx_gserx_br_rxx_eer_s cn78xxp1;
+       struct cvmx_gserx_br_rxx_eer_s cnf75xx;
+};
+
+typedef union cvmx_gserx_br_rxx_eer cvmx_gserx_br_rxx_eer_t;
+
+/**
+ * cvmx_gser#_pcie_pipe_port_sel
+ *
+ * PCIE PIPE Enable Request.
+ *
+ */
+union cvmx_gserx_pcie_pipe_port_sel {
+       u64 u64;
+       struct cvmx_gserx_pcie_pipe_port_sel_s {
+               u64 reserved_3_63 : 61;
+               u64 cfg_pem1_dlm2 : 1;
+               u64 pipe_port_sel : 2;
+       } s;
+       struct cvmx_gserx_pcie_pipe_port_sel_s cn70xx;
+       struct cvmx_gserx_pcie_pipe_port_sel_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_pcie_pipe_port_sel cvmx_gserx_pcie_pipe_port_sel_t;
+
+/**
+ * cvmx_gser#_pcie_pipe_rst
+ *
+ * PCIE PIPE Reset.
+ *
+ */
+union cvmx_gserx_pcie_pipe_rst {
+       u64 u64;
+       struct cvmx_gserx_pcie_pipe_rst_s {
+               u64 reserved_4_63 : 60;
+               u64 pipe3_rst : 1;
+               u64 pipe2_rst : 1;
+               u64 pipe1_rst : 1;
+               u64 pipe0_rst : 1;
+       } s;
+       struct cvmx_gserx_pcie_pipe_rst_s cn70xx;
+       struct cvmx_gserx_pcie_pipe_rst_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_pcie_pipe_rst cvmx_gserx_pcie_pipe_rst_t;
+
+/**
+ * cvmx_gser#_sata_cfg
+ *
+ * SATA Config Enable.
+ *
+ */
+union cvmx_gserx_sata_cfg {
+       u64 u64;
+       struct cvmx_gserx_sata_cfg_s {
+               u64 reserved_1_63 : 63;
+               u64 sata_en : 1;
+       } s;
+       struct cvmx_gserx_sata_cfg_s cn70xx;
+       struct cvmx_gserx_sata_cfg_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_sata_cfg cvmx_gserx_sata_cfg_t;
+
+/**
+ * cvmx_gser#_sata_lane_rst
+ *
+ * Lane Reset Control.
+ *
+ */
+union cvmx_gserx_sata_lane_rst {
+       u64 u64;
+       struct cvmx_gserx_sata_lane_rst_s {
+               u64 reserved_2_63 : 62;
+               u64 l1_rst : 1;
+               u64 l0_rst : 1;
+       } s;
+       struct cvmx_gserx_sata_lane_rst_s cn70xx;
+       struct cvmx_gserx_sata_lane_rst_s cn70xxp1;
+       struct cvmx_gserx_sata_lane_rst_s cn73xx;
+       struct cvmx_gserx_sata_lane_rst_s cnf75xx;
+};
+
+typedef union cvmx_gserx_sata_lane_rst cvmx_gserx_sata_lane_rst_t;
+
+/**
+ * cvmx_gser#_sata_ref_ssp_en
+ *
+ * SATA Reference Clock Enable for the PHY.
+ *
+ */
+union cvmx_gserx_sata_ref_ssp_en {
+       u64 u64;
+       struct cvmx_gserx_sata_ref_ssp_en_s {
+               u64 reserved_1_63 : 63;
+               u64 ref_ssp_en : 1;
+       } s;
+       struct cvmx_gserx_sata_ref_ssp_en_s cn70xx;
+       struct cvmx_gserx_sata_ref_ssp_en_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_sata_ref_ssp_en cvmx_gserx_sata_ref_ssp_en_t;
+
+/**
+ * cvmx_gser#_phy#_ovrd_in_lo
+ *
+ * PHY Override Input Low Register.
+ *
+ */
+union cvmx_gserx_phyx_ovrd_in_lo {
+       u64 u64;
+       struct cvmx_gserx_phyx_ovrd_in_lo_s {
+               u64 reserved_16_63 : 48;
+               u64 res_ack_in_ovrd : 1;
+               u64 res_ack_in : 1;
+               u64 res_req_in_ovrd : 1;
+               u64 res_req_in : 1;
+               u64 rtune_req_ovrd : 1;
+               u64 rtune_req : 1;
+               u64 mpll_multiplier_ovrd : 1;
+               u64 mpll_multiplier : 7;
+               u64 mpll_en_ovrd : 1;
+               u64 mpll_en : 1;
+       } s;
+       struct cvmx_gserx_phyx_ovrd_in_lo_s cn70xx;
+       struct cvmx_gserx_phyx_ovrd_in_lo_s cn70xxp1;
+};
+
+typedef union cvmx_gserx_phyx_ovrd_in_lo cvmx_gserx_phyx_ovrd_in_lo_t;
+
+/**
+ * cvmx_gser#_phy_ctl
+ *
+ * This register contains general PHY/PLL control of the RAW PCS.
+ * These registers are reset by hardware only during chip cold reset. The values of the CSR
+ * fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_phy_ctl {
+       u64 u64;
+       struct cvmx_gserx_phy_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 phy_reset : 1;
+               u64 phy_pd : 1;
+       } s;
+       struct cvmx_gserx_phy_ctl_s cn73xx;
+       struct cvmx_gserx_phy_ctl_s cn78xx;
+       struct cvmx_gserx_phy_ctl_s cn78xxp1;
+       struct cvmx_gserx_phy_ctl_s cnf75xx;
+};
+
+typedef union cvmx_gserx_phy_ctl cvmx_gserx_phy_ctl_t;
+
+/**
+ * cvmx_gser#_rx_pwr_ctrl_p1
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_rx_pwr_ctrl_p1 {
+       u64 u64;
+       struct cvmx_gserx_rx_pwr_ctrl_p1_s {
+               u64 reserved_14_63 : 50;
+               u64 p1_rx_resetn : 1;
+               u64 pq_rx_allow_pll_pd : 1;
+               u64 pq_rx_pcs_reset : 1;
+               u64 p1_rx_agc_en : 1;
+               u64 p1_rx_dfe_en : 1;
+               u64 p1_rx_cdr_en : 1;
+               u64 p1_rx_cdr_coast : 1;
+               u64 p1_rx_cdr_clr : 1;
+               u64 p1_rx_subblk_pd : 5;
+               u64 p1_rx_chpd : 1;
+       } s;
+       struct cvmx_gserx_rx_pwr_ctrl_p1_s cn73xx;
+       struct cvmx_gserx_rx_pwr_ctrl_p1_s cn78xx;
+       struct cvmx_gserx_rx_pwr_ctrl_p1_s cn78xxp1;
+       struct cvmx_gserx_rx_pwr_ctrl_p1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_rx_pwr_ctrl_p1 cvmx_gserx_rx_pwr_ctrl_p1_t;
+
+/**
+ * cvmx_gser#_rx_pwr_ctrl_p2
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_rx_pwr_ctrl_p2 {
+       u64 u64;
+       struct cvmx_gserx_rx_pwr_ctrl_p2_s {
+               u64 reserved_14_63 : 50;
+               u64 p2_rx_resetn : 1;
+               u64 p2_rx_allow_pll_pd : 1;
+               u64 p2_rx_pcs_reset : 1;
+               u64 p2_rx_agc_en : 1;
+               u64 p2_rx_dfe_en : 1;
+               u64 p2_rx_cdr_en : 1;
+               u64 p2_rx_cdr_coast : 1;
+               u64 p2_rx_cdr_clr : 1;
+               u64 p2_rx_subblk_pd : 5;
+               u64 p2_rx_chpd : 1;
+       } s;
+       struct cvmx_gserx_rx_pwr_ctrl_p2_s cn73xx;
+       struct cvmx_gserx_rx_pwr_ctrl_p2_s cn78xx;
+       struct cvmx_gserx_rx_pwr_ctrl_p2_s cn78xxp1;
+       struct cvmx_gserx_rx_pwr_ctrl_p2_s cnf75xx;
+};
+
+typedef union cvmx_gserx_rx_pwr_ctrl_p2 cvmx_gserx_rx_pwr_ctrl_p2_t;
+
+/**
+ * cvmx_gser#_rx_txdir_ctrl_0
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_rx_txdir_ctrl_0 {
+       u64 u64;
+       struct cvmx_gserx_rx_txdir_ctrl_0_s {
+               u64 reserved_13_63 : 51;
+               u64 rx_boost_hi_thrs : 4;
+               u64 rx_boost_lo_thrs : 4;
+               u64 rx_boost_hi_val : 5;
+       } s;
+       struct cvmx_gserx_rx_txdir_ctrl_0_s cn73xx;
+       struct cvmx_gserx_rx_txdir_ctrl_0_s cn78xx;
+       struct cvmx_gserx_rx_txdir_ctrl_0_s cn78xxp1;
+       struct cvmx_gserx_rx_txdir_ctrl_0_s cnf75xx;
+};
+
+typedef union cvmx_gserx_rx_txdir_ctrl_0 cvmx_gserx_rx_txdir_ctrl_0_t;
+
+/**
+ * cvmx_gser#_rx_txdir_ctrl_1
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_rx_txdir_ctrl_1 {
+       u64 u64;
+       struct cvmx_gserx_rx_txdir_ctrl_1_s {
+               u64 reserved_12_63 : 52;
+               u64 rx_precorr_chg_dir : 1;
+               u64 rx_tap1_chg_dir : 1;
+               u64 rx_tap1_hi_thrs : 5;
+               u64 rx_tap1_lo_thrs : 5;
+       } s;
+       struct cvmx_gserx_rx_txdir_ctrl_1_s cn73xx;
+       struct cvmx_gserx_rx_txdir_ctrl_1_s cn78xx;
+       struct cvmx_gserx_rx_txdir_ctrl_1_s cn78xxp1;
+       struct cvmx_gserx_rx_txdir_ctrl_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_rx_txdir_ctrl_1 cvmx_gserx_rx_txdir_ctrl_1_t;
+
+/**
+ * cvmx_gser#_rx_txdir_ctrl_2
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_rx_txdir_ctrl_2 {
+       u64 u64;
+       struct cvmx_gserx_rx_txdir_ctrl_2_s {
+               u64 reserved_16_63 : 48;
+               u64 rx_precorr_hi_thrs : 8;
+               u64 rx_precorr_lo_thrs : 8;
+       } s;
+       struct cvmx_gserx_rx_txdir_ctrl_2_s cn73xx;
+       struct cvmx_gserx_rx_txdir_ctrl_2_s cn78xx;
+       struct cvmx_gserx_rx_txdir_ctrl_2_s cn78xxp1;
+       struct cvmx_gserx_rx_txdir_ctrl_2_s cnf75xx;
+};
+
+typedef union cvmx_gserx_rx_txdir_ctrl_2 cvmx_gserx_rx_txdir_ctrl_2_t;
+
+/**
+ * cvmx_gser#_rx_eie_detsts
+ */
+union cvmx_gserx_rx_eie_detsts {
+       u64 u64;
+       struct cvmx_gserx_rx_eie_detsts_s {
+               u64 reserved_12_63 : 52;
+               u64 cdrlock : 4;
+               u64 eiests : 4;
+               u64 eieltch : 4;
+       } s;
+       struct cvmx_gserx_rx_eie_detsts_s cn73xx;
+       struct cvmx_gserx_rx_eie_detsts_s cn78xx;
+       struct cvmx_gserx_rx_eie_detsts_s cn78xxp1;
+       struct cvmx_gserx_rx_eie_detsts_s cnf75xx;
+};
+
+typedef union cvmx_gserx_rx_eie_detsts cvmx_gserx_rx_eie_detsts_t;
+
+/**
+ * cvmx_gser#_refclk_sel
+ *
+ * This register selects the reference clock.
+ * These registers are reset by hardware only during chip cold reset. The values of the CSR
+ * fields in these registers do not change during chip warm or soft resets.
+ *
+ * Not used with GSER6, GSER7, and GSER8.
+ */
+union cvmx_gserx_refclk_sel {
+       u64 u64;
+       struct cvmx_gserx_refclk_sel_s {
+               u64 reserved_3_63 : 61;
+               u64 pcie_refclk125 : 1;
+               u64 com_clk_sel : 1;
+               u64 use_com1 : 1;
+       } s;
+       struct cvmx_gserx_refclk_sel_s cn73xx;
+       struct cvmx_gserx_refclk_sel_s cn78xx;
+       struct cvmx_gserx_refclk_sel_s cn78xxp1;
+       struct cvmx_gserx_refclk_sel_s cnf75xx;
+};
+
+typedef union cvmx_gserx_refclk_sel cvmx_gserx_refclk_sel_t;
+
+/**
+ * cvmx_gser#_lane#_lbert_cfg
+ *
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_lbert_cfg {
+       u64 u64;
+       struct cvmx_gserx_lanex_lbert_cfg_s {
+               u64 reserved_16_63 : 48;
+               u64 lbert_pg_err_insert : 1;
+               u64 lbert_pm_sync_start : 1;
+               u64 lbert_pg_en : 1;
+               u64 lbert_pg_width : 2;
+               u64 lbert_pg_mode : 4;
+               u64 lbert_pm_en : 1;
+               u64 lbert_pm_width : 2;
+               u64 lbert_pm_mode : 4;
+       } s;
+       struct cvmx_gserx_lanex_lbert_cfg_s cn73xx;
+       struct cvmx_gserx_lanex_lbert_cfg_s cn78xx;
+       struct cvmx_gserx_lanex_lbert_cfg_s cn78xxp1;
+       struct cvmx_gserx_lanex_lbert_cfg_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_lbert_cfg cvmx_gserx_lanex_lbert_cfg_t;
+
+/**
+ * cvmx_gser#_lane#_misc_cfg_0
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_misc_cfg_0 {
+       u64 u64;
+       struct cvmx_gserx_lanex_misc_cfg_0_s {
+               u64 reserved_16_63 : 48;
+               u64 use_pma_polarity : 1;
+               u64 cfg_pcs_loopback : 1;
+               u64 pcs_tx_mode_ovrrd_en : 1;
+               u64 pcs_rx_mode_ovrrd_en : 1;
+               u64 cfg_eie_det_cnt : 4;
+               u64 eie_det_stl_on_time : 3;
+               u64 eie_det_stl_off_time : 3;
+               u64 tx_bit_order : 1;
+               u64 rx_bit_order : 1;
+       } s;
+       struct cvmx_gserx_lanex_misc_cfg_0_s cn73xx;
+       struct cvmx_gserx_lanex_misc_cfg_0_s cn78xx;
+       struct cvmx_gserx_lanex_misc_cfg_0_s cn78xxp1;
+       struct cvmx_gserx_lanex_misc_cfg_0_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_misc_cfg_0 cvmx_gserx_lanex_misc_cfg_0_t;
+
+/**
+ * cvmx_gser#_lane_p#_mode_0
+ *
+ * These are the RAW PCS lane settings mode 0 registers. There is one register per
+ * 4 lanes per GSER per GSER_LMODE_E value (0..11). Only one entry is used at any given time in a
+ * given GSER lane - the one selected by the corresponding GSER()_LANE_MODE[LMODE].
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lane_px_mode_0 {
+       u64 u64;
+       struct cvmx_gserx_lane_px_mode_0_s {
+               u64 reserved_15_63 : 49;
+               u64 ctle : 2;
+               u64 pcie : 1;
+               u64 tx_ldiv : 2;
+               u64 rx_ldiv : 2;
+               u64 srate : 3;
+               u64 reserved_4_4 : 1;
+               u64 tx_mode : 2;
+               u64 rx_mode : 2;
+       } s;
+       struct cvmx_gserx_lane_px_mode_0_s cn73xx;
+       struct cvmx_gserx_lane_px_mode_0_s cn78xx;
+       struct cvmx_gserx_lane_px_mode_0_s cn78xxp1;
+       struct cvmx_gserx_lane_px_mode_0_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lane_px_mode_0 cvmx_gserx_lane_px_mode_0_t;
+
+/**
+ * cvmx_gser#_lane_p#_mode_1
+ *
+ * These are the RAW PCS lane settings mode 1 registers. There is one register per 4 lanes,
+ * (0..3) per GSER per GSER_LMODE_E value (0..11). Only one entry is used at any given time in a
+ * given
+ * GSER lane - the one selected by the corresponding GSER()_LANE_MODE[LMODE].
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lane_px_mode_1 {
+       u64 u64;
+       struct cvmx_gserx_lane_px_mode_1_s {
+               u64 reserved_16_63 : 48;
+               u64 vma_fine_cfg_sel : 1;
+               u64 vma_mm : 1;
+               u64 cdr_fgain : 4;
+               u64 ph_acc_adj : 10;
+       } s;
+       struct cvmx_gserx_lane_px_mode_1_s cn73xx;
+       struct cvmx_gserx_lane_px_mode_1_s cn78xx;
+       struct cvmx_gserx_lane_px_mode_1_s cn78xxp1;
+       struct cvmx_gserx_lane_px_mode_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lane_px_mode_1 cvmx_gserx_lane_px_mode_1_t;
+
+/**
+ * cvmx_gser#_lane#_rx_loop_ctrl
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_loop_ctrl {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_loop_ctrl_s {
+               u64 reserved_12_63 : 52;
+               u64 fast_dll_lock : 1;
+               u64 fast_ofst_cncl : 1;
+               u64 cfg_rx_lctrl : 10;
+       } s;
+       struct cvmx_gserx_lanex_rx_loop_ctrl_s cn73xx;
+       struct cvmx_gserx_lanex_rx_loop_ctrl_s cn78xx;
+       struct cvmx_gserx_lanex_rx_loop_ctrl_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_loop_ctrl_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_loop_ctrl cvmx_gserx_lanex_rx_loop_ctrl_t;
+
+/**
+ * cvmx_gser#_lane#_rx_valbbd_ctrl_0
+ *
+ * These registers are reset by hardware only during chip cold reset. The values of the CSR
+ * fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_valbbd_ctrl_0 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_0_s {
+               u64 reserved_14_63 : 50;
+               u64 agc_gain : 2;
+               u64 dfe_gain : 2;
+               u64 dfe_c5_mval : 4;
+               u64 dfe_c5_msgn : 1;
+               u64 dfe_c4_mval : 4;
+               u64 dfe_c4_msgn : 1;
+       } s;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_0_s cn73xx;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_0_s cn78xx;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_0_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_0_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_valbbd_ctrl_0 cvmx_gserx_lanex_rx_valbbd_ctrl_0_t;
+
+/**
+ * cvmx_gser#_lane#_rx_valbbd_ctrl_1
+ *
+ * These registers are reset by hardware only during chip cold reset. The values of the CSR
+ * fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_valbbd_ctrl_1 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_1_s {
+               u64 reserved_15_63 : 49;
+               u64 dfe_c3_mval : 4;
+               u64 dfe_c3_msgn : 1;
+               u64 dfe_c2_mval : 4;
+               u64 dfe_c2_msgn : 1;
+               u64 dfe_c1_mval : 4;
+               u64 dfe_c1_msgn : 1;
+       } s;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_1_s cn73xx;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_1_s cn78xx;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_1_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_valbbd_ctrl_1 cvmx_gserx_lanex_rx_valbbd_ctrl_1_t;
+
+/**
+ * cvmx_gser#_lane#_rx_valbbd_ctrl_2
+ *
+ * These registers are reset by hardware only during chip cold reset. The values of the CSR
+ * fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_valbbd_ctrl_2 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_2_s {
+               u64 reserved_6_63 : 58;
+               u64 dfe_ovrd_en : 1;
+               u64 dfe_c5_ovrd_val : 1;
+               u64 dfe_c4_ovrd_val : 1;
+               u64 dfe_c3_ovrd_val : 1;
+               u64 dfe_c2_ovrd_val : 1;
+               u64 dfe_c1_ovrd_val : 1;
+       } s;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_2_s cn73xx;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_2_s cn78xx;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_2_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_valbbd_ctrl_2_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_valbbd_ctrl_2 cvmx_gserx_lanex_rx_valbbd_ctrl_2_t;
+
+/**
+ * cvmx_gser#_lane_vma_fine_ctrl_0
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lane_vma_fine_ctrl_0 {
+       u64 u64;
+       struct cvmx_gserx_lane_vma_fine_ctrl_0_s {
+               u64 reserved_16_63 : 48;
+               u64 rx_sdll_iq_max_fine : 4;
+               u64 rx_sdll_iq_min_fine : 4;
+               u64 rx_sdll_iq_step_fine : 2;
+               u64 vma_window_wait_fine : 3;
+               u64 lms_wait_time_fine : 3;
+       } s;
+       struct cvmx_gserx_lane_vma_fine_ctrl_0_s cn73xx;
+       struct cvmx_gserx_lane_vma_fine_ctrl_0_s cn78xx;
+       struct cvmx_gserx_lane_vma_fine_ctrl_0_s cn78xxp1;
+       struct cvmx_gserx_lane_vma_fine_ctrl_0_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lane_vma_fine_ctrl_0 cvmx_gserx_lane_vma_fine_ctrl_0_t;
+
+/**
+ * cvmx_gser#_lane_vma_fine_ctrl_1
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lane_vma_fine_ctrl_1 {
+       u64 u64;
+       struct cvmx_gserx_lane_vma_fine_ctrl_1_s {
+               u64 reserved_10_63 : 54;
+               u64 rx_ctle_peak_max_fine : 4;
+               u64 rx_ctle_peak_min_fine : 4;
+               u64 rx_ctle_peak_step_fine : 2;
+       } s;
+       struct cvmx_gserx_lane_vma_fine_ctrl_1_s cn73xx;
+       struct cvmx_gserx_lane_vma_fine_ctrl_1_s cn78xx;
+       struct cvmx_gserx_lane_vma_fine_ctrl_1_s cn78xxp1;
+       struct cvmx_gserx_lane_vma_fine_ctrl_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lane_vma_fine_ctrl_1 cvmx_gserx_lane_vma_fine_ctrl_1_t;
+
+/**
+ * cvmx_gser#_lane_vma_fine_ctrl_2
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lane_vma_fine_ctrl_2 {
+       u64 u64;
+       struct cvmx_gserx_lane_vma_fine_ctrl_2_s {
+               u64 reserved_10_63 : 54;
+               u64 rx_prectle_gain_max_fine : 4;
+               u64 rx_prectle_gain_min_fine : 4;
+               u64 rx_prectle_gain_step_fine : 2;
+       } s;
+       struct cvmx_gserx_lane_vma_fine_ctrl_2_s cn73xx;
+       struct cvmx_gserx_lane_vma_fine_ctrl_2_s cn78xx;
+       struct cvmx_gserx_lane_vma_fine_ctrl_2_s cn78xxp1;
+       struct cvmx_gserx_lane_vma_fine_ctrl_2_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lane_vma_fine_ctrl_2 cvmx_gserx_lane_vma_fine_ctrl_2_t;
+
+/**
+ * cvmx_gser#_lane#_pwr_ctrl
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_pwr_ctrl {
+       u64 u64;
+       struct cvmx_gserx_lanex_pwr_ctrl_s {
+               u64 reserved_15_63 : 49;
+               u64 tx_sds_fifo_reset_ovrrd_en : 1;
+               u64 tx_sds_fifo_reset_ovrrd_val : 1;
+               u64 tx_pcs_reset_ovrrd_val : 1;
+               u64 rx_pcs_reset_ovrrd_val : 1;
+               u64 reserved_9_10 : 2;
+               u64 rx_resetn_ovrrd_en : 1;
+               u64 rx_resetn_ovrrd_val : 1;
+               u64 rx_lctrl_ovrrd_en : 1;
+               u64 rx_lctrl_ovrrd_val : 1;
+               u64 tx_tristate_en_ovrrd_en : 1;
+               u64 tx_pcs_reset_ovrrd_en : 1;
+               u64 tx_elec_idle_ovrrd_en : 1;
+               u64 tx_pd_ovrrd_en : 1;
+               u64 tx_p2s_resetn_ovrrd_en : 1;
+       } s;
+       struct cvmx_gserx_lanex_pwr_ctrl_cn73xx {
+               u64 reserved_15_63 : 49;
+               u64 tx_sds_fifo_reset_ovrrd_en : 1;
+               u64 tx_sds_fifo_reset_ovrrd_val : 1;
+               u64 tx_pcs_reset_ovrrd_val : 1;
+               u64 rx_pcs_reset_ovrrd_val : 1;
+               u64 reserved_10_9 : 2;
+               u64 rx_resetn_ovrrd_en : 1;
+               u64 rx_resetn_ovrrd_val : 1;
+               u64 rx_lctrl_ovrrd_en : 1;
+               u64 rx_lctrl_ovrrd_val : 1;
+               u64 tx_tristate_en_ovrrd_en : 1;
+               u64 tx_pcs_reset_ovrrd_en : 1;
+               u64 tx_elec_idle_ovrrd_en : 1;
+               u64 tx_pd_ovrrd_en : 1;
+               u64 tx_p2s_resetn_ovrrd_en : 1;
+       } cn73xx;
+       struct cvmx_gserx_lanex_pwr_ctrl_cn73xx cn78xx;
+       struct cvmx_gserx_lanex_pwr_ctrl_s cn78xxp1;
+       struct cvmx_gserx_lanex_pwr_ctrl_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_pwr_ctrl cvmx_gserx_lanex_pwr_ctrl_t;
+
+/**
+ * cvmx_gser#_lane#_rx_cfg_0
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_cfg_0 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_cfg_0_s {
+               u64 reserved_16_63 : 48;
+               u64 rx_datarate_ovrrd_en : 1;
+               u64 reserved_14_14 : 1;
+               u64 rx_resetn_ovrrd_val : 1;
+               u64 pcs_sds_rx_eyemon_en : 1;
+               u64 pcs_sds_rx_pcm_ctrl : 4;
+               u64 rx_datarate_ovrrd_val : 2;
+               u64 cfg_rx_pol_invert : 1;
+               u64 rx_subblk_pd_ovrrd_val : 5;
+       } s;
+       struct cvmx_gserx_lanex_rx_cfg_0_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 rx_datarate_ovrrd_en : 1;
+               u64 pcs_rx_tristate_enable : 1;
+               u64 rx_resetn_ovrrd_val : 1;
+               u64 pcs_sds_rx_eyemon_en : 1;
+               u64 pcs_sds_rx_pcm_ctrl : 4;
+               u64 rx_datarate_ovrrd_val : 2;
+               u64 cfg_rx_pol_invert : 1;
+               u64 rx_subblk_pd_ovrrd_val : 5;
+       } cn73xx;
+       struct cvmx_gserx_lanex_rx_cfg_0_cn78xx {
+               u64 reserved_16_63 : 48;
+               u64 rx_datarate_ovrrd_en : 1;
+               u64 pcs_sds_rx_tristate_enable : 1;
+               u64 rx_resetn_ovrrd_val : 1;
+               u64 pcs_sds_rx_eyemon_en : 1;
+               u64 pcs_sds_rx_pcm_ctrl : 4;
+               u64 rx_datarate_ovrrd_val : 2;
+               u64 cfg_rx_pol_invert : 1;
+               u64 rx_subblk_pd_ovrrd_val : 5;
+       } cn78xx;
+       struct cvmx_gserx_lanex_rx_cfg_0_cn78xx cn78xxp1;
+       struct cvmx_gserx_lanex_rx_cfg_0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_cfg_0 cvmx_gserx_lanex_rx_cfg_0_t;
+
+/**
+ * cvmx_gser#_lane#_rx_cfg_1
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_cfg_1 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_cfg_1_s {
+               u64 reserved_16_63 : 48;
+               u64 rx_chpd_ovrrd_val : 1;
+               u64 pcs_sds_rx_os_men : 1;
+               u64 eie_en_ovrrd_en : 1;
+               u64 eie_en_ovrrd_val : 1;
+               u64 reserved_11_11 : 1;
+               u64 rx_pcie_mode_ovrrd_en : 1;
+               u64 rx_pcie_mode_ovrrd_val : 1;
+               u64 cfg_rx_dll_locken : 1;
+               u64 pcs_sds_rx_cdr_ssc_mode : 8;
+       } s;
+       struct cvmx_gserx_lanex_rx_cfg_1_s cn73xx;
+       struct cvmx_gserx_lanex_rx_cfg_1_s cn78xx;
+       struct cvmx_gserx_lanex_rx_cfg_1_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_cfg_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_cfg_1 cvmx_gserx_lanex_rx_cfg_1_t;
+
+/**
+ * cvmx_gser#_lane#_rx_cfg_2
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_cfg_2 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_cfg_2_s {
+               u64 reserved_15_63 : 49;
+               u64 pcs_sds_rx_terminate_to_vdda : 1;
+               u64 pcs_sds_rx_sampler_boost : 2;
+               u64 pcs_sds_rx_sampler_boost_en : 1;
+               u64 reserved_10_10 : 1;
+               u64 rx_sds_rx_agc_mval : 10;
+       } s;
+       struct cvmx_gserx_lanex_rx_cfg_2_s cn73xx;
+       struct cvmx_gserx_lanex_rx_cfg_2_s cn78xx;
+       struct cvmx_gserx_lanex_rx_cfg_2_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_cfg_2_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_cfg_2 cvmx_gserx_lanex_rx_cfg_2_t;
+
+/**
+ * cvmx_gser#_lane#_rx_cfg_3
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_cfg_3 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_cfg_3_s {
+               u64 reserved_16_63 : 48;
+               u64 cfg_rx_errdet_ctrl : 16;
+       } s;
+       struct cvmx_gserx_lanex_rx_cfg_3_s cn73xx;
+       struct cvmx_gserx_lanex_rx_cfg_3_s cn78xx;
+       struct cvmx_gserx_lanex_rx_cfg_3_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_cfg_3_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_cfg_3 cvmx_gserx_lanex_rx_cfg_3_t;
+
+/**
+ * cvmx_gser#_lane#_rx_cfg_4
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_cfg_4 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_cfg_4_s {
+               u64 reserved_16_63 : 48;
+               u64 cfg_rx_errdet_ctrl : 16;
+       } s;
+       struct cvmx_gserx_lanex_rx_cfg_4_s cn73xx;
+       struct cvmx_gserx_lanex_rx_cfg_4_s cn78xx;
+       struct cvmx_gserx_lanex_rx_cfg_4_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_cfg_4_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_cfg_4 cvmx_gserx_lanex_rx_cfg_4_t;
+
+/**
+ * cvmx_gser#_lane#_rx_cfg_5
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_cfg_5 {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_cfg_5_s {
+               u64 reserved_5_63 : 59;
+               u64 rx_agc_men_ovrrd_en : 1;
+               u64 rx_agc_men_ovrrd_val : 1;
+               u64 rx_widthsel_ovrrd_en : 1;
+               u64 rx_widthsel_ovrrd_val : 2;
+       } s;
+       struct cvmx_gserx_lanex_rx_cfg_5_s cn73xx;
+       struct cvmx_gserx_lanex_rx_cfg_5_s cn78xx;
+       struct cvmx_gserx_lanex_rx_cfg_5_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_cfg_5_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_cfg_5 cvmx_gserx_lanex_rx_cfg_5_t;
+
+/**
+ * cvmx_gser#_lane#_rx_ctle_ctrl
+ *
+ * These are the RAW PCS per-lane RX CTLE control registers.
+ * These registers are reset by hardware only during chip cold reset. The values of the CSR
+ * fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_ctle_ctrl {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_ctle_ctrl_s {
+               u64 reserved_16_63 : 48;
+               u64 pcs_sds_rx_ctle_bias_ctrl : 2;
+               u64 pcs_sds_rx_ctle_zero : 4;
+               u64 rx_ctle_pole_ovrrd_en : 1;
+               u64 rx_ctle_pole_ovrrd_val : 4;
+               u64 pcs_sds_rx_ctle_pole_max : 2;
+               u64 pcs_sds_rx_ctle_pole_min : 2;
+               u64 pcs_sds_rx_ctle_pole_step : 1;
+       } s;
+       struct cvmx_gserx_lanex_rx_ctle_ctrl_s cn73xx;
+       struct cvmx_gserx_lanex_rx_ctle_ctrl_s cn78xx;
+       struct cvmx_gserx_lanex_rx_ctle_ctrl_s cn78xxp1;
+       struct cvmx_gserx_lanex_rx_ctle_ctrl_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_ctle_ctrl cvmx_gserx_lanex_rx_ctle_ctrl_t;
+
+/**
+ * cvmx_gser#_lane#_rx_misc_ovrrd
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_rx_misc_ovrrd {
+       u64 u64;
+       struct cvmx_gserx_lanex_rx_misc_ovrrd_s {
+               u64 reserved_14_63 : 50;
+               u64 cfg_rx_oob_clk_en_ovrrd_val : 1;
+               u64 cfg_rx_oob_clk_en_ovrrd_en : 1;
+               u64 cfg_rx_eie_det_ovrrd_val : 1;
+               u64 cfg_rx_eie_det_ovrrd_en : 1;
+               u64 cfg_rx_cdr_ctrl_ovrrd_en : 1;
+               u64 cfg_rx_eq_eval_ovrrd_val : 1;
+               u64 cfg_rx_eq_eval_ovrrd_en : 1;
+               u64 reserved_6_6 : 1;
+               u64 cfg_rx_dll_locken_ovrrd_en : 1;
+               u64 cfg_rx_errdet_ctrl_ovrrd_en : 1;
+               u64 reserved_1_3 : 3;
+               u64 cfg_rxeq_eval_restore_en : 1;
+       } s;
+       struct cvmx_gserx_lanex_rx_misc_ovrrd_cn73xx {
+               u64 reserved_14_63 : 50;
+               u64 cfg_rx_oob_clk_en_ovrrd_val : 1;
+               u64 cfg_rx_oob_clk_en_ovrrd_en : 1;
+               u64 cfg_rx_eie_det_ovrrd_val : 1;
+               u64 cfg_rx_eie_det_ovrrd_en : 1;
+               u64 cfg_rx_cdr_ctrl_ovrrd_en : 1;
+               u64 cfg_rx_eq_eval_ovrrd_val : 1;
+               u64 cfg_rx_eq_eval_ovrrd_en : 1;
+               u64 reserved_6_6 : 1;
+               u64 cfg_rx_dll_locken_ovrrd_en : 1;
+               u64 cfg_rx_errdet_ctrl_ovrrd_en : 1;
+               u64 reserved_3_1 : 3;
+               u64 cfg_rxeq_eval_restore_en : 1;
+       } cn73xx;
+       struct cvmx_gserx_lanex_rx_misc_ovrrd_cn73xx cn78xx;
+       struct cvmx_gserx_lanex_rx_misc_ovrrd_cn78xxp1 {
+               u64 reserved_14_63 : 50;
+               u64 cfg_rx_oob_clk_en_ovrrd_val : 1;
+               u64 cfg_rx_oob_clk_en_ovrrd_en : 1;
+               u64 cfg_rx_eie_det_ovrrd_val : 1;
+               u64 cfg_rx_eie_det_ovrrd_en : 1;
+               u64 cfg_rx_cdr_ctrl_ovrrd_en : 1;
+               u64 cfg_rx_eq_eval_ovrrd_val : 1;
+               u64 cfg_rx_eq_eval_ovrrd_en : 1;
+               u64 reserved_6_6 : 1;
+               u64 cfg_rx_dll_locken_ovrrd_en : 1;
+               u64 cfg_rx_errdet_ctrl_ovrrd_en : 1;
+               u64 reserved_0_3 : 4;
+       } cn78xxp1;
+       struct cvmx_gserx_lanex_rx_misc_ovrrd_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_rx_misc_ovrrd cvmx_gserx_lanex_rx_misc_ovrrd_t;
+
+/**
+ * cvmx_gser#_lane#_tx_cfg_0
+ *
+ * These registers are reset by hardware only during chip cold reset. The
+ * values of the CSR fields in these registers do not change during chip
+ * warm or soft resets.
+ */
+union cvmx_gserx_lanex_tx_cfg_0 {
+       u64 u64;
+       struct cvmx_gserx_lanex_tx_cfg_0_s {
+               u64 reserved_16_63 : 48;
+               u64 tx_tristate_en_ovrrd_val : 1;
+               u64 tx_chpd_ovrrd_val : 1;
+               u64 reserved_10_13 : 4;
+               u64 tx_resetn_ovrrd_val : 1;
+               u64 tx_cm_mode : 1;
+               u64 cfg_tx_swing : 5;
+               u64 fast_rdet_mode : 1;
+               u64 fast_tristate_mode : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_gserx_lanex_tx_cfg_0_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 tx_tristate_en_ovrrd_val : 1;
+               u64 tx_chpd_ovrrd_val : 1;
+               u64 reserved_13_10 : 4;
+               u64 tx_resetn_ovrrd_val : 1;
+               u64 tx_cm_mode : 1;
+               u64 cfg_tx_swing : 5;
+               u64 fast_rdet_mode : 1;
+               u64 fast_tristate_mode : 1;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_gserx_lanex_tx_cfg_0_cn73xx cn78xx;
+       struct cvmx_gserx_lanex_tx_cfg_0_s cn78xxp1;
+       struct cvmx_gserx_lanex_tx_cfg_0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_tx_cfg_0 cvmx_gserx_lanex_tx_cfg_0_t;
+
+/**
+ * cvmx_gser#_lane#_tx_cfg_1
+ *
+ * These registers are reset by hardware only during chip cold reset. The
+ * values of the CSR fields in these registers do not change during chip
+ * warm or soft resets.
+ */
+union cvmx_gserx_lanex_tx_cfg_1 {
+       u64 u64;
+       struct cvmx_gserx_lanex_tx_cfg_1_s {
+               u64 reserved_15_63 : 49;
+               u64 tx_widthsel_ovrrd_en : 1;
+               u64 tx_widthsel_ovrrd_val : 2;
+               u64 tx_vboost_en_ovrrd_en : 1;
+               u64 tx_turbo_en_ovrrd_en : 1;
+               u64 tx_swing_ovrrd_en : 1;
+               u64 tx_premptap_ovrrd_val : 1;
+               u64 tx_elec_idle_ovrrd_en : 1;
+               u64 smpl_rate_ovrrd_en : 1;
+               u64 smpl_rate_ovrrd_val : 3;
+               u64 tx_datarate_ovrrd_en : 1;
+               u64 tx_datarate_ovrrd_val : 2;
+       } s;
+       struct cvmx_gserx_lanex_tx_cfg_1_s cn73xx;
+       struct cvmx_gserx_lanex_tx_cfg_1_s cn78xx;
+       struct cvmx_gserx_lanex_tx_cfg_1_s cn78xxp1;
+       struct cvmx_gserx_lanex_tx_cfg_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_tx_cfg_1 cvmx_gserx_lanex_tx_cfg_1_t;
+
+/**
+ * cvmx_gser#_lane#_tx_cfg_2
+ *
+ * These registers are for diagnostic use only. These registers are reset by hardware only during
+ * chip cold reset. The values of the CSR fields in these registers do not change during chip
+ * warm or soft resets.
+ */
+union cvmx_gserx_lanex_tx_cfg_2 {
+       u64 u64;
+       struct cvmx_gserx_lanex_tx_cfg_2_s {
+               u64 reserved_16_63 : 48;
+               u64 pcs_sds_tx_dcc_en : 1;
+               u64 reserved_3_14 : 12;
+               u64 rcvr_test_ovrrd_en : 1;
+               u64 rcvr_test_ovrrd_val : 1;
+               u64 tx_rx_detect_dis_ovrrd_val : 1;
+       } s;
+       struct cvmx_gserx_lanex_tx_cfg_2_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 pcs_sds_tx_dcc_en : 1;
+               u64 reserved_14_3 : 12;
+               u64 rcvr_test_ovrrd_en : 1;
+               u64 rcvr_test_ovrrd_val : 1;
+               u64 tx_rx_detect_dis_ovrrd_val : 1;
+       } cn73xx;
+       struct cvmx_gserx_lanex_tx_cfg_2_cn73xx cn78xx;
+       struct cvmx_gserx_lanex_tx_cfg_2_s cn78xxp1;
+       struct cvmx_gserx_lanex_tx_cfg_2_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_tx_cfg_2 cvmx_gserx_lanex_tx_cfg_2_t;
+
+/**
+ * cvmx_gser#_lane#_tx_cfg_3
+ *
+ * These registers are for diagnostic use only. These registers are reset by hardware only during
+ * chip cold reset. The values of the CSR fields in these registers do not change during chip
+ * warm or soft resets.
+ */
+union cvmx_gserx_lanex_tx_cfg_3 {
+       u64 u64;
+       struct cvmx_gserx_lanex_tx_cfg_3_s {
+               u64 reserved_15_63 : 49;
+               u64 cfg_tx_vboost_en : 1;
+               u64 reserved_7_13 : 7;
+               u64 pcs_sds_tx_gain : 3;
+               u64 pcs_sds_tx_srate_sel : 3;
+               u64 cfg_tx_turbo_en : 1;
+       } s;
+       struct cvmx_gserx_lanex_tx_cfg_3_cn73xx {
+               u64 reserved_15_63 : 49;
+               u64 cfg_tx_vboost_en : 1;
+               u64 reserved_13_7 : 7;
+               u64 pcs_sds_tx_gain : 3;
+               u64 pcs_sds_tx_srate_sel : 3;
+               u64 cfg_tx_turbo_en : 1;
+       } cn73xx;
+       struct cvmx_gserx_lanex_tx_cfg_3_cn73xx cn78xx;
+       struct cvmx_gserx_lanex_tx_cfg_3_s cn78xxp1;
+       struct cvmx_gserx_lanex_tx_cfg_3_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_tx_cfg_3 cvmx_gserx_lanex_tx_cfg_3_t;
+
+/**
+ * cvmx_gser#_lane#_tx_pre_emphasis
+ *
+ * These registers are reset by hardware only during chip cold reset. The
+ * values of the CSR fields in these registers do not change during chip
+ * warm or soft resets.
+ */
+union cvmx_gserx_lanex_tx_pre_emphasis {
+       u64 u64;
+       struct cvmx_gserx_lanex_tx_pre_emphasis_s {
+               u64 reserved_9_63 : 55;
+               u64 cfg_tx_premptap : 9;
+       } s;
+       struct cvmx_gserx_lanex_tx_pre_emphasis_s cn73xx;
+       struct cvmx_gserx_lanex_tx_pre_emphasis_s cn78xx;
+       struct cvmx_gserx_lanex_tx_pre_emphasis_s cn78xxp1;
+       struct cvmx_gserx_lanex_tx_pre_emphasis_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_tx_pre_emphasis cvmx_gserx_lanex_tx_pre_emphasis_t;
+
+/**
+ * cvmx_gser#_lane#_pcs_ctlifc_0
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_pcs_ctlifc_0 {
+       u64 u64;
+       struct cvmx_gserx_lanex_pcs_ctlifc_0_s {
+               u64 reserved_14_63 : 50;
+               u64 cfg_tx_vboost_en_ovrrd_val : 1;
+               u64 cfg_tx_coeff_req_ovrrd_val : 1;
+               u64 cfg_rx_cdr_coast_req_ovrrd_val : 1;
+               u64 cfg_tx_detrx_en_req_ovrrd_val : 1;
+               u64 cfg_soft_reset_req_ovrrd_val : 1;
+               u64 cfg_lane_pwr_off_ovrrd_val : 1;
+               u64 cfg_tx_mode_ovrrd_val : 2;
+               u64 cfg_tx_pstate_req_ovrrd_val : 2;
+               u64 cfg_lane_mode_req_ovrrd_val : 4;
+       } s;
+       struct cvmx_gserx_lanex_pcs_ctlifc_0_s cn73xx;
+       struct cvmx_gserx_lanex_pcs_ctlifc_0_s cn78xx;
+       struct cvmx_gserx_lanex_pcs_ctlifc_0_s cn78xxp1;
+       struct cvmx_gserx_lanex_pcs_ctlifc_0_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_pcs_ctlifc_0 cvmx_gserx_lanex_pcs_ctlifc_0_t;
+
+/**
+ * cvmx_gser#_lane#_pcs_ctlifc_1
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_pcs_ctlifc_1 {
+       u64 u64;
+       struct cvmx_gserx_lanex_pcs_ctlifc_1_s {
+               u64 reserved_9_63 : 55;
+               u64 cfg_rx_pstate_req_ovrrd_val : 2;
+               u64 reserved_2_6 : 5;
+               u64 cfg_rx_mode_ovrrd_val : 2;
+       } s;
+       struct cvmx_gserx_lanex_pcs_ctlifc_1_cn73xx {
+               u64 reserved_9_63 : 55;
+               u64 cfg_rx_pstate_req_ovrrd_val : 2;
+               u64 reserved_6_2 : 5;
+               u64 cfg_rx_mode_ovrrd_val : 2;
+       } cn73xx;
+       struct cvmx_gserx_lanex_pcs_ctlifc_1_cn73xx cn78xx;
+       struct cvmx_gserx_lanex_pcs_ctlifc_1_s cn78xxp1;
+       struct cvmx_gserx_lanex_pcs_ctlifc_1_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_pcs_ctlifc_1 cvmx_gserx_lanex_pcs_ctlifc_1_t;
+
+/**
+ * cvmx_gser#_lane#_pcs_ctlifc_2
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lanex_pcs_ctlifc_2 {
+       u64 u64;
+       struct cvmx_gserx_lanex_pcs_ctlifc_2_s {
+               u64 reserved_16_63 : 48;
+               u64 ctlifc_ovrrd_req : 1;
+               u64 reserved_9_14 : 6;
+               u64 cfg_tx_vboost_en_ovrrd_en : 1;
+               u64 cfg_tx_coeff_req_ovrrd_en : 1;
+               u64 cfg_rx_cdr_coast_req_ovrrd_en : 1;
+               u64 cfg_tx_detrx_en_req_ovrrd_en : 1;
+               u64 cfg_soft_reset_req_ovrrd_en : 1;
+               u64 cfg_lane_pwr_off_ovrrd_en : 1;
+               u64 cfg_tx_pstate_req_ovrrd_en : 1;
+               u64 cfg_rx_pstate_req_ovrrd_en : 1;
+               u64 cfg_lane_mode_req_ovrrd_en : 1;
+       } s;
+       struct cvmx_gserx_lanex_pcs_ctlifc_2_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 ctlifc_ovrrd_req : 1;
+               u64 reserved_14_9 : 6;
+               u64 cfg_tx_vboost_en_ovrrd_en : 1;
+               u64 cfg_tx_coeff_req_ovrrd_en : 1;
+               u64 cfg_rx_cdr_coast_req_ovrrd_en : 1;
+               u64 cfg_tx_detrx_en_req_ovrrd_en : 1;
+               u64 cfg_soft_reset_req_ovrrd_en : 1;
+               u64 cfg_lane_pwr_off_ovrrd_en : 1;
+               u64 cfg_tx_pstate_req_ovrrd_en : 1;
+               u64 cfg_rx_pstate_req_ovrrd_en : 1;
+               u64 cfg_lane_mode_req_ovrrd_en : 1;
+       } cn73xx;
+       struct cvmx_gserx_lanex_pcs_ctlifc_2_cn73xx cn78xx;
+       struct cvmx_gserx_lanex_pcs_ctlifc_2_s cn78xxp1;
+       struct cvmx_gserx_lanex_pcs_ctlifc_2_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_lanex_pcs_ctlifc_2 cvmx_gserx_lanex_pcs_ctlifc_2_t;
+
+/**
+ * cvmx_gser#_lane_mode
+ *
+ * These registers are reset by hardware only during chip cold reset. The values of the CSR
+ * fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_lane_mode {
+       u64 u64;
+       struct cvmx_gserx_lane_mode_s {
+               u64 reserved_4_63 : 60;
+               u64 lmode : 4;
+       } s;
+       struct cvmx_gserx_lane_mode_s cn73xx;
+       struct cvmx_gserx_lane_mode_s cn78xx;
+       struct cvmx_gserx_lane_mode_s cn78xxp1;
+       struct cvmx_gserx_lane_mode_s cnf75xx;
+};
+
+typedef union cvmx_gserx_lane_mode cvmx_gserx_lane_mode_t;
+
+/**
+ * cvmx_gser#_pll_p#_mode_0
+ *
+ * These are the RAW PCS PLL global settings mode 0 registers. There is one register per GSER per
+ * GSER_LMODE_E value (0..11). Only one entry is used at any given time in a given GSER - the one
+ * selected by the corresponding GSER()_LANE_MODE[LMODE].
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during subsequent chip warm or
+ * soft resets.
+ */
+union cvmx_gserx_pll_px_mode_0 {
+       u64 u64;
+       struct cvmx_gserx_pll_px_mode_0_s {
+               u64 reserved_16_63 : 48;
+               u64 pll_icp : 4;
+               u64 pll_rloop : 3;
+               u64 pll_pcs_div : 9;
+       } s;
+       struct cvmx_gserx_pll_px_mode_0_s cn73xx;
+       struct cvmx_gserx_pll_px_mode_0_s cn78xx;
+       struct cvmx_gserx_pll_px_mode_0_s cn78xxp1;
+       struct cvmx_gserx_pll_px_mode_0_s cnf75xx;
+};
+
+typedef union cvmx_gserx_pll_px_mode_0 cvmx_gserx_pll_px_mode_0_t;
+
+/**
+ * cvmx_gser#_pll_p#_mode_1
+ *
+ * These are the RAW PCS PLL global settings mode 1 registers. There is one register per GSER per
+ * GSER_LMODE_E value (0..11). Only one entry is used at any given time in a given GSER - the one
+ * selected by the corresponding GSER()_LANE_MODE[LMODE].
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in this register do not change during subsequent chip warm or
+ * soft resets.
+ */
+union cvmx_gserx_pll_px_mode_1 {
+       u64 u64;
+       struct cvmx_gserx_pll_px_mode_1_s {
+               u64 reserved_14_63 : 50;
+               u64 pll_16p5en : 1;
+               u64 pll_cpadj : 2;
+               u64 pll_pcie3en : 1;
+               u64 pll_opr : 1;
+               u64 pll_div : 9;
+       } s;
+       struct cvmx_gserx_pll_px_mode_1_s cn73xx;
+       struct cvmx_gserx_pll_px_mode_1_s cn78xx;
+       struct cvmx_gserx_pll_px_mode_1_s cn78xxp1;
+       struct cvmx_gserx_pll_px_mode_1_s cnf75xx;
+};
+
+typedef union cvmx_gserx_pll_px_mode_1 cvmx_gserx_pll_px_mode_1_t;
+
+/**
+ * cvmx_gser#_pll_stat
+ */
+union cvmx_gserx_pll_stat {
+       u64 u64;
+       struct cvmx_gserx_pll_stat_s {
+               u64 reserved_1_63 : 63;
+               u64 pll_lock : 1;
+       } s;
+       struct cvmx_gserx_pll_stat_s cn73xx;
+       struct cvmx_gserx_pll_stat_s cn78xx;
+       struct cvmx_gserx_pll_stat_s cn78xxp1;
+       struct cvmx_gserx_pll_stat_s cnf75xx;
+};
+
+typedef union cvmx_gserx_pll_stat cvmx_gserx_pll_stat_t;
+
+/**
+ * cvmx_gser#_qlm_stat
+ */
+union cvmx_gserx_qlm_stat {
+       u64 u64;
+       struct cvmx_gserx_qlm_stat_s {
+               u64 reserved_2_63 : 62;
+               u64 rst_rdy : 1;
+               u64 dcok : 1;
+       } s;
+       struct cvmx_gserx_qlm_stat_s cn73xx;
+       struct cvmx_gserx_qlm_stat_s cn78xx;
+       struct cvmx_gserx_qlm_stat_s cn78xxp1;
+       struct cvmx_gserx_qlm_stat_s cnf75xx;
+};
+
+typedef union cvmx_gserx_qlm_stat cvmx_gserx_qlm_stat_t;
+
+/**
+ * cvmx_gser#_slice_cfg
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ */
+union cvmx_gserx_slice_cfg {
+       u64 u64;
+       struct cvmx_gserx_slice_cfg_s {
+               u64 reserved_12_63 : 52;
+               u64 tx_rx_detect_lvl_enc : 4;
+               u64 reserved_6_7 : 2;
+               u64 pcs_sds_rx_pcie_pterm : 2;
+               u64 pcs_sds_rx_pcie_nterm : 2;
+               u64 pcs_sds_tx_stress_eye : 2;
+       } s;
+       struct cvmx_gserx_slice_cfg_cn73xx {
+               u64 reserved_12_63 : 52;
+               u64 tx_rx_detect_lvl_enc : 4;
+               u64 reserved_7_6 : 2;
+               u64 pcs_sds_rx_pcie_pterm : 2;
+               u64 pcs_sds_rx_pcie_nterm : 2;
+               u64 pcs_sds_tx_stress_eye : 2;
+       } cn73xx;
+       struct cvmx_gserx_slice_cfg_cn73xx cn78xx;
+       struct cvmx_gserx_slice_cfg_s cn78xxp1;
+       struct cvmx_gserx_slice_cfg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_slice_cfg cvmx_gserx_slice_cfg_t;
+
+/**
+ * cvmx_gser#_slice#_pcie1_mode
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ *
+ * Slice 1 does not exist on GSER0, GSER1, GSER4, GSER5, GSER6, GSER7, and GSER8.
+ */
+union cvmx_gserx_slicex_pcie1_mode {
+       u64 u64;
+       struct cvmx_gserx_slicex_pcie1_mode_s {
+               u64 reserved_15_63 : 49;
+               u64 slice_spare_1_0 : 2;
+               u64 rx_ldll_isel : 2;
+               u64 rx_sdll_isel : 2;
+               u64 rx_pi_bwsel : 3;
+               u64 rx_ldll_bwsel : 3;
+               u64 rx_sdll_bwsel : 3;
+       } s;
+       struct cvmx_gserx_slicex_pcie1_mode_s cn73xx;
+       struct cvmx_gserx_slicex_pcie1_mode_s cn78xx;
+       struct cvmx_gserx_slicex_pcie1_mode_s cn78xxp1;
+       struct cvmx_gserx_slicex_pcie1_mode_s cnf75xx;
+};
+
+typedef union cvmx_gserx_slicex_pcie1_mode cvmx_gserx_slicex_pcie1_mode_t;
+
+/**
+ * cvmx_gser#_slice#_pcie2_mode
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ *
+ * Slice 1 does not exist on GSER0, GSER1, GSER4, GSER5, GSER6, GSER7, and GSER8.
+ */
+union cvmx_gserx_slicex_pcie2_mode {
+       u64 u64;
+       struct cvmx_gserx_slicex_pcie2_mode_s {
+               u64 reserved_15_63 : 49;
+               u64 slice_spare_1_0 : 2;
+               u64 rx_ldll_isel : 2;
+               u64 rx_sdll_isel : 2;
+               u64 rx_pi_bwsel : 3;
+               u64 rx_ldll_bwsel : 3;
+               u64 rx_sdll_bwsel : 3;
+       } s;
+       struct cvmx_gserx_slicex_pcie2_mode_s cn73xx;
+       struct cvmx_gserx_slicex_pcie2_mode_s cn78xx;
+       struct cvmx_gserx_slicex_pcie2_mode_s cn78xxp1;
+       struct cvmx_gserx_slicex_pcie2_mode_s cnf75xx;
+};
+
+typedef union cvmx_gserx_slicex_pcie2_mode cvmx_gserx_slicex_pcie2_mode_t;
+
+/**
+ * cvmx_gser#_slice#_pcie3_mode
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ *
+ * Slice 1 does not exist on GSER0, GSER1, GSER4, GSER5, GSER6, GSER7, and GSER8.
+ */
+union cvmx_gserx_slicex_pcie3_mode {
+       u64 u64;
+       struct cvmx_gserx_slicex_pcie3_mode_s {
+               u64 reserved_15_63 : 49;
+               u64 slice_spare_1_0 : 2;
+               u64 rx_ldll_isel : 2;
+               u64 rx_sdll_isel : 2;
+               u64 rx_pi_bwsel : 3;
+               u64 rx_ldll_bwsel : 3;
+               u64 rx_sdll_bwsel : 3;
+       } s;
+       struct cvmx_gserx_slicex_pcie3_mode_s cn73xx;
+       struct cvmx_gserx_slicex_pcie3_mode_s cn78xx;
+       struct cvmx_gserx_slicex_pcie3_mode_s cn78xxp1;
+       struct cvmx_gserx_slicex_pcie3_mode_s cnf75xx;
+};
+
+typedef union cvmx_gserx_slicex_pcie3_mode cvmx_gserx_slicex_pcie3_mode_t;
+
+/**
+ * cvmx_gser#_slice#_rx_sdll_ctrl
+ *
+ * These registers are for diagnostic use only.
+ * These registers are reset by hardware only during chip cold reset.
+ * The values of the CSR fields in these registers do not change during chip warm or soft resets.
+ *
+ * Slice 1 does not exist on GSER0, GSER1, GSER4, GSER5, GSER6, GSER7, and GSER8.
+ */
+union cvmx_gserx_slicex_rx_sdll_ctrl {
+       u64 u64;
+       struct cvmx_gserx_slicex_rx_sdll_ctrl_s {
+               u64 reserved_16_63 : 48;
+               u64 pcs_sds_oob_clk_ctrl : 2;
+               u64 reserved_7_13 : 7;
+               u64 pcs_sds_rx_sdll_tune : 3;
+               u64 pcs_sds_rx_sdll_swsel : 4;
+       } s;
+       struct cvmx_gserx_slicex_rx_sdll_ctrl_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 pcs_sds_oob_clk_ctrl : 2;
+               u64 reserved_13_7 : 7;
+               u64 pcs_sds_rx_sdll_tune : 3;
+               u64 pcs_sds_rx_sdll_swsel : 4;
+       } cn73xx;
+       struct cvmx_gserx_slicex_rx_sdll_ctrl_cn73xx cn78xx;
+       struct cvmx_gserx_slicex_rx_sdll_ctrl_s cn78xxp1;
+       struct cvmx_gserx_slicex_rx_sdll_ctrl_cn73xx cnf75xx;
+};
+
+typedef union cvmx_gserx_slicex_rx_sdll_ctrl cvmx_gserx_slicex_rx_sdll_ctrl_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-agl.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-agl.h
new file mode 100644 (file)
index 0000000..7a5e4d8
--- /dev/null
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for AGL (RGMII) initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_AGL_H__
+#define __CVMX_HELPER_AGL_H__
+
+int __cvmx_helper_agl_enumerate(int interface);
+
+int cvmx_helper_agl_get_port(int xiface);
+
+/**
+ * @INTERNAL
+ * Probe a RGMII interface and determine the number of ports
+ * connected to it. The RGMII interface should still be down
+ * after this call.
+ *
+ * @param interface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_agl_probe(int interface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a RGMII interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled.
+ *
+ * @param interface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_agl_enable(int interface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_agl_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_agl_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+#endif /* __CVMX_HELPER_AGL_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-bgx.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-bgx.h
new file mode 100644 (file)
index 0000000..ead6193
--- /dev/null
@@ -0,0 +1,335 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions to configure the BGX MAC.
+ */
+
+#ifndef __CVMX_HELPER_BGX_H__
+#define __CVMX_HELPER_BGX_H__
+
+#define CVMX_BGX_RX_FIFO_SIZE (64 * 1024)
+#define CVMX_BGX_TX_FIFO_SIZE (32 * 1024)
+
+int __cvmx_helper_bgx_enumerate(int xiface);
+
+/**
+ * @INTERNAL
+ * Disable the BGX port
+ *
+ * @param xipd_port IPD port of the BGX interface to disable
+ */
+void cvmx_helper_bgx_disable(int xipd_port);
+
+/**
+ * @INTERNAL
+ * Probe a SGMII interface and determine the number of ports
+ * connected to it. The SGMII/XAUI interface should still be down after
+ * this call. This is used by interfaces using the bgx mac.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_bgx_probe(int xiface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a SGMII interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled. This is used by interfaces using the
+ * bgx mac.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_bgx_sgmii_enable(int xiface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set(). This is used by
+ * interfaces using the bgx mac.
+ *
+ * @param xipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_bgx_sgmii_link_get(int xipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead. This is used by interfaces
+ * using the bgx mac.
+ *
+ * @param xipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_bgx_sgmii_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
+
+/**
+ * @INTERNAL
+ * Configure a port for internal and/or external loopback. Internal loopback
+ * causes packets sent by the port to be received by Octeon. External loopback
+ * causes packets received from the wire to sent out again. This is used by
+ * interfaces using the bgx mac.
+ *
+ * @param xipd_port IPD/PKO port to loopback.
+ * @param enable_internal
+ *                 Non zero if you want internal loopback
+ * @param enable_external
+ *                 Non zero if you want external loopback
+ *
+ * @return Zero on success, negative on failure.
+ */
+int __cvmx_helper_bgx_sgmii_configure_loopback(int xipd_port, int enable_internal,
+                                              int enable_external);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a XAUI interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled. This is used by interfaces using the
+ * bgx mac.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_bgx_xaui_enable(int xiface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set(). This is used by
+ * interfaces using the bgx mac.
+ *
+ * @param xipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_bgx_xaui_link_get(int xipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead. This is used by interfaces
+ * using the bgx mac.
+ *
+ * @param xipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_bgx_xaui_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
+
+/**
+ * @INTERNAL
+ * Configure a port for internal and/or external loopback. Internal loopback
+ * causes packets sent by the port to be received by Octeon. External loopback
+ * causes packets received from the wire to sent out again. This is used by
+ * interfaces using the bgx mac.
+ *
+ * @param xipd_port IPD/PKO port to loopback.
+ * @param enable_internal
+ *                 Non zero if you want internal loopback
+ * @param enable_external
+ *                 Non zero if you want external loopback
+ *
+ * @return Zero on success, negative on failure.
+ */
+int __cvmx_helper_bgx_xaui_configure_loopback(int xipd_port, int enable_internal,
+                                             int enable_external);
+
+int __cvmx_helper_bgx_mixed_enable(int xiface);
+
+cvmx_helper_link_info_t __cvmx_helper_bgx_mixed_link_get(int xipd_port);
+
+int __cvmx_helper_bgx_mixed_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
+
+int __cvmx_helper_bgx_mixed_configure_loopback(int xipd_port, int enable_internal,
+                                              int enable_external);
+
+cvmx_helper_interface_mode_t cvmx_helper_bgx_get_mode(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Configure Priority-Based Flow Control (a.k.a. PFC/CBFC)
+ * on a specific BGX interface/port.
+ */
+void __cvmx_helper_bgx_xaui_config_pfc(unsigned int node, unsigned int interface, unsigned int port,
+                                      bool pfc_enable);
+
+/**
+ * This function control how the hardware handles incoming PAUSE
+ * packets. The most common modes of operation:
+ * ctl_bck = 1, ctl_drp = 1: hardware handles everything
+ * ctl_bck = 0, ctl_drp = 0: software sees all PAUSE frames
+ * ctl_bck = 0, ctl_drp = 1: all PAUSE frames are completely ignored
+ * @param node         node number.
+ * @param interface    interface number
+ * @param port         port number
+ * @param ctl_bck      1: Forward PAUSE information to TX block
+ * @param ctl_drp      1: Drop control PAUSE frames.
+ */
+void cvmx_helper_bgx_rx_pause_ctl(unsigned int node, unsigned int interface, unsigned int port,
+                                 unsigned int ctl_bck, unsigned int ctl_drp);
+
+/**
+ * This function configures the receive action taken for multicast, broadcast
+ * and dmac filter match packets.
+ * @param node         node number.
+ * @param interface    interface number
+ * @param port         port number
+ * @param cam_accept   0: reject packets on dmac filter match
+ *                      1: accept packet on dmac filter match
+ * @param mcast_mode   0x0 = Force reject all multicast packets
+ *                      0x1 = Force accept all multicast packets
+ *                      0x2 = Use the address filter CAM
+ * @param bcast_accept  0 = Reject all broadcast packets
+ *                      1 = Accept all broadcast packets
+ */
+void cvmx_helper_bgx_rx_adr_ctl(unsigned int node, unsigned int interface, unsigned int port,
+                               unsigned int cam_accept, unsigned int mcast_mode,
+                               unsigned int bcast_accept);
+
+/**
+ * Function to control the generation of FCS, padding by the BGX
+ *
+ */
+void cvmx_helper_bgx_tx_options(unsigned int node, unsigned int interface, unsigned int index,
+                               bool fcs_enable, bool pad_enable);
+
+/**
+ * Set mac for the ipd_port
+ *
+ * @param xipd_port ipd_port to set the mac
+ * @param bcst      If set, accept all broadcast packets
+ * @param mcst      Multicast mode
+ *                 0 = Force reject all multicast packets
+ *                 1 = Force accept all multicast packets
+ *                 2 = use the address filter CAM.
+ * @param mac       mac address for the ipd_port
+ */
+void cvmx_helper_bgx_set_mac(int xipd_port, int bcst, int mcst, u64 mac);
+
+int __cvmx_helper_bgx_port_init(int xipd_port, int phy_pres);
+void cvmx_helper_bgx_set_jabber(int xiface, unsigned int index, unsigned int size);
+int cvmx_helper_bgx_shutdown_port(int xiface, int index);
+int cvmx_bgx_set_backpressure_override(int xiface, unsigned int port_mask);
+int __cvmx_helper_bgx_fifo_size(int xiface, unsigned int lmac);
+
+/**
+ * Returns if an interface is RGMII or not
+ *
+ * @param xiface       xinterface to check
+ * @param index                port index (must be 0 for rgmii)
+ *
+ * @return     true if RGMII, false otherwise
+ */
+static inline bool cvmx_helper_bgx_is_rgmii(int xiface, int index)
+{
+       union cvmx_bgxx_cmrx_config cmr_config;
+
+       if (!OCTEON_IS_MODEL(OCTEON_CN73XX) || index != 0)
+               return false;
+       cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, xiface));
+       return cmr_config.s.lmac_type == 5;
+}
+
+/**
+ * Probes the BGX Super Path (SMU/SPU) mode
+ *
+ * @param xiface       global interface number
+ * @param index                interface index
+ *
+ * @return     true, if Super-MAC/PCS mode, false -- otherwise
+ */
+bool cvmx_helper_bgx_is_smu(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Configure parameters of PAUSE packet.
+ *
+ * @param xipd_port            Global IPD port (node + IPD port).
+ * @param smac                 Source MAC address.
+ * @param dmac                 Destination MAC address.
+ * @param type                 PAUSE packet type.
+ * @param time                 Pause time for PAUSE packets (number of 512 bit-times).
+ * @param interval             Interval between PAUSE packets (number of 512 bit-times).
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_bgx_set_pause_pkt_param(int xipd_port, u64 smac, u64 dmac, unsigned int type,
+                                unsigned int time, unsigned int interval);
+
+/**
+ * @INTERNAL
+ * Setup the BGX flow-control mode.
+ *
+ * @param xipd_port            Global IPD port (node + IPD port).
+ * @param type                 Flow-control type/protocol.
+ * @param mode                 Flow-control mode.
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_bgx_set_flowctl_mode(int xipd_port, cvmx_qos_proto_t qos, cvmx_qos_pkt_mode_t mode);
+
+/**
+ * Enables or disables autonegotiation for an interface.
+ *
+ * @param      xiface  interface to set autonegotiation
+ * @param      index   port index
+ * @param      enable  true to enable autonegotiation, false to disable it
+ *
+ * @return     0 for success, -1 on error.
+ */
+int cvmx_helper_set_autonegotiation(int xiface, int index, bool enable);
+
+/**
+ * Enables or disables forward error correction
+ *
+ * @param      xiface  interface
+ * @param      index   port index
+ * @param      enable  set to true to enable FEC, false to disable
+ *
+ * @return     0 for success, -1 on error
+ *
+ * @NOTE:      If autonegotiation is enabled then autonegotiation will be
+ *             restarted for negotiating FEC.
+ */
+int cvmx_helper_set_fec(int xiface, int index, bool enable);
+
+#ifdef CVMX_DUMP_BGX
+/**
+ * Dump BGX configuration for node 0
+ */
+int cvmx_dump_bgx_config(unsigned int bgx);
+/**
+ * Dump BGX status for node 0
+ */
+int cvmx_dump_bgx_status(unsigned int bgx);
+/**
+ * Dump BGX configuration
+ */
+int cvmx_dump_bgx_config_node(unsigned int node, unsigned int bgx);
+/**
+ * Dump BGX status
+ */
+int cvmx_dump_bgx_status_node(unsigned int node, unsigned int bgx);
+
+#endif
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-board.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-board.h
new file mode 100644 (file)
index 0000000..d7a7b7d
--- /dev/null
@@ -0,0 +1,558 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper functions to abstract board specific data about
+ * network ports from the rest of the cvmx-helper files.
+ */
+
+#ifndef __CVMX_HELPER_BOARD_H__
+#define __CVMX_HELPER_BOARD_H__
+
+#define CVMX_VSC7224_NAME_LEN 16
+
+typedef enum {
+       USB_CLOCK_TYPE_REF_12,
+       USB_CLOCK_TYPE_REF_24,
+       USB_CLOCK_TYPE_REF_48,
+       USB_CLOCK_TYPE_CRYSTAL_12,
+} cvmx_helper_board_usb_clock_types_t;
+
+typedef enum cvmx_phy_type {
+       BROADCOM_GENERIC_PHY,
+       MARVELL_GENERIC_PHY,
+       CORTINA_PHY, /** Now Inphi */
+       AQUANTIA_PHY,
+       GENERIC_8023_C22_PHY,
+       GENERIC_8023_C45_PHY,
+       INBAND_PHY,
+       QUALCOMM_S17,        /** Qualcomm QCA833X switch */
+       VITESSE_VSC8490_PHY, /** Vitesse VSC8490 is non-standard for SGMII */
+       FAKE_PHY,            /** Unsupported or no PHY, use GPIOs for LEDs */
+} cvmx_phy_type_t;
+
+/** Used to record the host mode used by the Cortina CS4321 PHY */
+typedef enum {
+       CVMX_PHY_HOST_MODE_UNKNOWN,
+       CVMX_PHY_HOST_MODE_SGMII,
+       CVMX_PHY_HOST_MODE_QSGMII,
+       CVMX_PHY_HOST_MODE_XAUI,
+       CVMX_PHY_HOST_MODE_RXAUI,
+} cvmx_phy_host_mode_t;
+
+typedef enum {
+       set_phy_link_flags_autoneg = 0x1,
+       set_phy_link_flags_flow_control_dont_touch = 0x0 << 1,
+       set_phy_link_flags_flow_control_enable = 0x1 << 1,
+       set_phy_link_flags_flow_control_disable = 0x2 << 1,
+       set_phy_link_flags_flow_control_mask = 0x3 << 1,
+} cvmx_helper_board_set_phy_link_flags_types_t;
+
+/**
+ * The EBB6600 board uses a MDIO mux device to select between the two QLM
+ * modules since both QLM modules share the same PHY addresses.  The
+ * MDIO mux is controlled via GPIO by a GPIO device that is also on
+ * the TWSI bus rather than native OCTEON GPIO libes.
+ *
+ * To further complicate matters, the TWSI GPIO device sits behind
+ * a TWSI mux device as well, making accessing the MDIO devices on
+ * this board a very complex operation involving writing to the TWSI mux,
+ * followed by the MDIO mux device.
+ */
+/** Maximum number of GPIO devices used to control the MDIO mux */
+#define CVMX_PHY_MUX_MAX_GPIO 2
+
+/** Type of MDIO mux device, currently OTHER isn't supported */
+typedef enum {
+       SN74CBTLV3253, /** SN74CBTLV3253 I2C device */
+       OTHER          /** Unknown/other */
+} cvmx_phy_mux_type_t;
+
+/** Type of GPIO line controlling MDIO mux */
+typedef enum {
+       GPIO_OCTEON, /** Native OCTEON */
+       GPIO_PCA8574 /** TWSI mux device */
+} cvmx_phy_gpio_type_t;
+
+/* Forward declarations */
+struct cvmx_fdt_sfp_info; /** Defined in cvmx-helper-fdt.h */
+struct cvmx_vsc7224;
+struct cvmx_fdt_gpio_info;    /** Defined in cvmx-helper-fdt.h */
+struct cvmx_fdt_i2c_bus_info; /** Defined in cvmx-helper-fdt.h */
+struct cvmx_phy_info;
+struct cvmx_fdt_i2c_bus_info;
+struct cvmx_fdt_gpio_info;
+struct cvmx_fdt_gpio_led;
+
+/**
+ * @INTERNAL
+ * This data structure is used when the port LEDs are wired up to Octeon's GPIO
+ * lines instead of to a traditional PHY.
+ */
+struct cvmx_phy_gpio_leds {
+       struct cvmx_phy_gpio_leds *next; /** For when ports are grouped together */
+       u64 last_rx_count;               /** Counters used to check for activity */
+       u64 last_tx_count;               /** Counters used to check for activity */
+       u64 last_activity_poll_time;     /** Last time activity was polled */
+       u64 last_link_poll_time;         /** Last time link was polled */
+       int of_offset;
+       int link_poll_interval_ms;     /** Link polling interval in ms */
+       int activity_poll_interval_ms; /** Activity polling interval in ms */
+       struct cvmx_fdt_gpio_led *link_status;
+       struct cvmx_fdt_gpio_led *error;
+       struct cvmx_fdt_gpio_led *rx_activity;
+       struct cvmx_fdt_gpio_led *tx_activity;
+       struct cvmx_fdt_gpio_led *identify;
+
+       struct cvmx_fdt_gpio_info *link_status_gpio;
+       struct cvmx_fdt_gpio_info *error_gpio;
+       /** Type of GPIO for error LED */
+       /** If GPIO expander, describe the bus to the expander */
+       struct cvmx_fdt_gpio_info *rx_activity_gpio;
+       struct cvmx_fdt_gpio_info *tx_activity_gpio;
+
+       u16 rx_activity_hz; /** RX activity blink time in hz */
+       u16 tx_activity_hz; /** TX activity blink time in hz */
+       /**
+        * Set if activity and/or link is using an Inphi/Cortina CS4343 or
+        * compatible phy that requires software assistance.  NULL if not used.
+        */
+       bool link_status_active_low;  /** True if active link is active low */
+       bool error_status_active_low; /** True if error LED is active low */
+       bool error_active_low;        /** True if error is active low */
+       bool rx_activity_active_low;  /** True if rx activity is active low */
+       bool tx_activity_active_low;  /** True if tx activity is active low */
+       /** Set true if LEDs are shared on an interface by all ports */
+       bool interface_leds;
+       int8_t rx_gpio_timer; /** GPIO clock generator timer [0-3] */
+       int8_t tx_gpio_timer; /** GPIO clock generator timer [0-3] */
+
+       /** True if LOS signal activates error LED */
+       bool los_generate_error;
+       /** True if the error LED is hooked up to a GPIO expander */
+       bool error_gpio_expander;
+       /** True if the link and RX activity LEDs are shared */
+       bool link_and_rx_activity_shared;
+       /** True if the link and TX activity LEDs are shared */
+       bool link_and_tx_activity_shared;
+       /** True if the RX activity and TX activity LEDs are shared */
+       bool rx_and_tx_activity_shared;
+       /** True if link is driven directly by the hardware */
+       bool link_led_hw_link;
+       bool error_lit;     /** True if ERROR LED is lit */
+       bool quad_sfp_mode; /** True if using four SFPs for XLAUI */
+       /** User-defined function to update the link LED */
+       void (*update_link_led)(int xiface, int index, cvmx_helper_link_info_t result);
+       /** User-defined function to update the rx activity LED */
+       void (*update_rx_activity_led)(struct cvmx_phy_gpio_leds *led, int xiface, int index,
+                                      bool check_time);
+};
+
+/** This structure contains the tap values to use for various cable lengths */
+struct cvmx_vsc7224_tap {
+       u16 len;      /** Starting cable length for tap values */
+       u16 main_tap; /** Main tap value to use */
+       u16 pre_tap;  /** Pre-tap value to use */
+       u16 post_tap; /** Post-tap value to use */
+};
+
+/** Data structure for Microsemi VSC7224 channel */
+struct cvmx_vsc7224_chan {
+       struct cvmx_vsc7224_chan *next, *prev; /** Used for linking */
+       int ipd_port;                          /** IPD port this channel belongs to */
+       int xiface;                            /** xinterface of SFP */
+       int index;                             /** Port index of SFP */
+       int lane;                              /** Lane on port */
+       int of_offset;                         /** Offset of channel info in dt */
+       bool is_tx;                            /** True if is transmit channel */
+       bool maintap_disable;                  /** True to disable the main tap */
+       bool pretap_disable;                   /** True to disable pre-tap */
+       bool posttap_disable;                  /** True to disable post-tap */
+       int num_taps;                          /** Number of tap values */
+       /** (Q)SFP attached to this channel */
+       struct cvmx_fdt_sfp_info *sfp_info;
+       struct cvmx_vsc7224 *vsc7224; /** Pointer to parent */
+       /** Tap values for various lengths, must be at the end */
+       struct cvmx_vsc7224_tap taps[0];
+};
+
+/** Data structure for Microsemi VSC7224 reclocking chip */
+struct cvmx_vsc7224 {
+       const char *name; /** Name */
+       /** Pointer to cannel data */
+       struct cvmx_vsc7224_chan *channel[4];
+       /** I2C bus device is connected to */
+       struct cvmx_fdt_i2c_bus_info *i2c_bus;
+       /** Address of VSC7224 on i2c bus */
+       int i2c_addr;
+       struct cvmx_fdt_gpio_info *los_gpio;   /** LoS GPIO pin */
+       struct cvmx_fdt_gpio_info *reset_gpio; /** Reset GPIO pin */
+       int of_offset;                         /** Offset in device tree */
+};
+
+/** Data structure for Avago AVSP5410 gearbox phy */
+struct cvmx_avsp5410 {
+       const char *name; /** Name */
+       /** I2C bus device is connected to */
+       struct cvmx_fdt_i2c_bus_info *i2c_bus;
+       /** Address of AVSP5410 on i2c bus */
+       int i2c_addr;
+       int of_offset;      /** Offset in device tree */
+       int ipd_port;       /** IPD port this phy belongs to */
+       int xiface;         /** xinterface of SFP */
+       int index;          /** Port index of SFP */
+       u64 prev_temp;      /** Previous temparature recorded on Phy Core */
+       u64 prev_temp_mins; /** Mininutes when the prev temp check is done */
+       /** (Q)SFP attached to this phy */
+       struct cvmx_fdt_sfp_info *sfp_info;
+};
+
+struct cvmx_cs4343_info;
+
+/**
+ * @INTERNAL
+ *
+ * Data structure containing Inphi CS4343 slice information
+ */
+struct cvmx_cs4343_slice_info {
+       const char *name;              /** Name of this slice in device tree */
+       struct cvmx_cs4343_info *mphy; /** Pointer to mphy cs4343 */
+       struct cvmx_phy_info *phy_info;
+       int of_offset;                /** Offset in device tree */
+       int slice_no;                 /** Slice number */
+       int reg_offset;               /** Offset for this slice */
+       u16 sr_stx_cmode_res;         /** See Rainier device tree */
+       u16 sr_stx_drv_lower_cm;      /** See Rainier device tree */
+       u16 sr_stx_level;             /** See Rainier device tree */
+       u16 sr_stx_pre_peak;          /** See Rainier device tree */
+       u16 sr_stx_muxsubrate_sel;    /** See Rainier device tree */
+       u16 sr_stx_post_peak;         /** See Rainier device tree */
+       u16 cx_stx_cmode_res;         /** See Rainier device tree */
+       u16 cx_stx_drv_lower_cm;      /** See Rainier device tree */
+       u16 cx_stx_level;             /** See Rainier device tree */
+       u16 cx_stx_pre_peak;          /** See Rainier device tree */
+       u16 cx_stx_muxsubrate_sel;    /** See Rainier device tree */
+       u16 cx_stx_post_peak;         /** See Rainier device tree */
+       u16 basex_stx_cmode_res;      /** See Rainier device tree */
+       u16 basex_stx_drv_lower_cm;   /** See Rainier device tree */
+       u16 basex_stx_level;          /** See Rainier device tree */
+       u16 basex_stx_pre_peak;       /** See Rainier device tree */
+       u16 basex_stx_muxsubrate_sel; /** See Rainier device tree */
+       u16 basex_stx_post_peak;      /** See Rainier device tree */
+       int link_gpio;                /** Link LED gpio pin number, -1 if none */
+       int error_gpio;               /** Error LED GPIO pin or -1 if none */
+       int los_gpio;                 /** LoS input GPIO or -1 if none */
+       bool los_inverted;            /** True if LoS input is inverted */
+       bool link_inverted;           /** True if link output is inverted */
+       bool error_inverted;          /** True if error output is inverted */
+};
+
+/**
+ * @INTERNAL
+ *
+ * Data structure for Cortina/Inphi CS4343 device
+ */
+struct cvmx_cs4343_info {
+       const char *name; /** Name of Inphi/Cortina CS4343 in DT */
+       struct cvmx_phy_info *phy_info;
+       struct cvmx_cs4343_slice_info slice[4]; /** Slice information */
+       int of_offset;
+};
+
+/**
+ * @INTERNAL
+ * This data structure is used to hold PHY information and is subject to change.
+ * Please do  not use this data structure directly.
+ *
+ * NOTE: The U-Boot OCTEON Ethernet drivers depends on this data structure for
+ * the mux support.
+ */
+typedef struct cvmx_phy_info {
+       int phy_addr;     /** MDIO address of PHY */
+       int phy_sub_addr; /** Sub-address (i.e. slice), used by Cortina */
+       int ipd_port;     /** IPD port number for the PHY */
+       /** MDIO bus PHY connected to (even if behind mux) */
+       int mdio_unit;
+       int direct_connect;              /** 1 if PHY is directly connected */
+       int gpio[CVMX_PHY_MUX_MAX_GPIO]; /** GPIOs used to control mux, -1 if not used */
+
+       /** Type of GPIO.  It can be a local OCTEON GPIO or a TWSI GPIO */
+       cvmx_phy_gpio_type_t gpio_type[CVMX_PHY_MUX_MAX_GPIO];
+
+       /** Address of TWSI GPIO */
+       int cvmx_gpio_twsi[CVMX_PHY_MUX_MAX_GPIO];
+
+       /** Value to put into the GPIO lines to select MDIO bus */
+       int gpio_value;
+       int gpio_parent_mux_twsi;       /** -1 if not used, parent TWSI mux for ebb6600 */
+       int gpio_parent_mux_select;     /** selector to use on parent TWSI mux */
+       cvmx_phy_type_t phy_type;       /** Type of PHY */
+       cvmx_phy_mux_type_t mux_type;   /** Type of MDIO mux */
+       int mux_twsi_addr;              /** Address of the MDIO mux */
+       cvmx_phy_host_mode_t host_mode; /** Used by Cortina PHY */
+       void *phydev;                   /** Pointer to parent phy device */
+       int fdt_offset;                 /** Node in flat device tree */
+       int phy_i2c_bus;                /** I2C bus for reclocking chips */
+       int phy_i2c_addr;               /** I2C address of reclocking chip */
+       int num_vsc7224;                /** Number of Microsemi VSC7224 devices */
+       struct cvmx_vsc7224 *vsc7224;   /** Info for VSC7224 devices */
+       /** SFP/QSFP descriptor */
+       struct cvmx_fdt_sfp_info *sfp_info;
+       /** CS4343 slice information for SGMII/XFI.  This is NULL in XLAUI mode */
+       struct cvmx_cs4343_slice_info *cs4343_slice_info;
+       /** CS4343 mphy information for XLAUI */
+       struct cvmx_cs4343_info *cs4343_info;
+       /** Pointer to function to return link information */
+       cvmx_helper_link_info_t (*link_function)(struct cvmx_phy_info *phy_info);
+       /**
+        * If there are LEDs driven by GPIO lines instead of by a PHY device
+        * then they are described here, otherwise gpio_leds should be NULL.
+        */
+       struct cvmx_phy_gpio_leds *gpio_leds;
+} cvmx_phy_info_t;
+
+/* Fake IPD port, the RGMII/MII interface may use different PHY, use this
+   macro to return appropriate MIX address to read the PHY. */
+#define CVMX_HELPER_BOARD_MGMT_IPD_PORT -10
+
+/**
+ * Return the MII PHY address associated with the given IPD
+ * port. A result of -1 means there isn't a MII capable PHY
+ * connected to this port. On chips supporting multiple MII
+ * busses the bus number is encoded in bits <15:8>.
+ *
+ * This function must be modified for every new Octeon board.
+ * Internally it uses switch statements based on the cvmx_sysinfo
+ * data to determine board types and revisions. It relies on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @param ipd_port Octeon IPD port to get the MII address for.
+ *
+ * @return MII PHY address and bus number or -1.
+ */
+int cvmx_helper_board_get_mii_address(int ipd_port);
+
+/**
+ * This function as a board specific method of changing the PHY
+ * speed, duplex, and autonegotiation. This programs the PHY and
+ * not Octeon. This can be used to force Octeon's links to
+ * specific settings.
+ *
+ * @param phy_addr  The address of the PHY to program
+ * @param link_flags
+ *                  Flags to control autonegotiation.  Bit 0 is autonegotiation
+ *                  enable/disable to maintain backward compatibility.
+ * @param link_info Link speed to program. If the speed is zero and autonegotiation
+ *                  is enabled, all possible negotiation speeds are advertised.
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_board_link_set_phy(int phy_addr,
+                                  cvmx_helper_board_set_phy_link_flags_types_t link_flags,
+                                  cvmx_helper_link_info_t link_info);
+
+/**
+ * @INTERNAL
+ * This function is the board specific method of determining an
+ * ethernet ports link speed. Most Octeon boards have Marvell PHYs
+ * and are handled by the fall through case. This function must be
+ * updated for boards that don't have the normal Marvell PHYs.
+ *
+ * This function must be modified for every new Octeon board.
+ * Internally it uses switch statements based on the cvmx_sysinfo
+ * data to determine board types and revisions. It relies on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @param ipd_port IPD input port associated with the port we want to get link
+ *                 status for.
+ *
+ * @return The ports link status. If the link isn't fully resolved, this must
+ *         return zero.
+ */
+cvmx_helper_link_info_t __cvmx_helper_board_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * This function is called by cvmx_helper_interface_probe() after it
+ * determines the number of ports Octeon can support on a specific
+ * interface. This function is the per board location to override
+ * this value. It is called with the number of ports Octeon might
+ * support and should return the number of actual ports on the
+ * board.
+ *
+ * This function must be modified for every new Octeon board.
+ * Internally it uses switch statements based on the cvmx_sysinfo
+ * data to determine board types and revisions. It relies on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @param interface Interface to probe
+ * @param supported_ports
+ *                  Number of ports Octeon supports.
+ *
+ * @return Number of ports the actual board supports. Many times this will
+ *         simple be "support_ports".
+ */
+int __cvmx_helper_board_interface_probe(int interface, int supported_ports);
+
+/**
+ * @INTERNAL
+ * Enable packet input/output from the hardware. This function is
+ * called after by cvmx_helper_packet_hardware_enable() to
+ * perform board specific initialization. For most boards
+ * nothing is needed.
+ *
+ * @param interface Interface to enable
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_board_hardware_enable(int interface);
+
+/**
+ * @INTERNAL
+ * Gets the clock type used for the USB block based on board type.
+ * Used by the USB code for auto configuration of clock type.
+ *
+ * @return USB clock type enumeration
+ */
+cvmx_helper_board_usb_clock_types_t __cvmx_helper_board_usb_get_clock_type(void);
+
+/**
+ * @INTERNAL
+ * Adjusts the number of available USB ports on Octeon based on board
+ * specifics.
+ *
+ * @param supported_ports expected number of ports based on chip type;
+ *
+ *
+ * @return number of available usb ports, based on board specifics.
+ *         Return value is supported_ports if function does not
+ *         override.
+ */
+int __cvmx_helper_board_usb_get_num_ports(int supported_ports);
+
+/**
+ * @INTERNAL
+ * Returns if a port is present on an interface
+ *
+ * @param fdt_addr - address fo flat device tree
+ * @param ipd_port - IPD port number
+ *
+ * @return 1 if port is present, 0 if not present, -1 if error
+ */
+int __cvmx_helper_board_get_port_from_dt(void *fdt_addr, int ipd_port);
+
+/**
+ * Return the host mode for the PHY.  Currently only the Cortina CS4321 PHY
+ * needs this.
+ *
+ * @param ipd_port - ipd port number to get the host mode for
+ *
+ * @return host mode for phy
+ */
+cvmx_phy_host_mode_t cvmx_helper_board_get_phy_host_mode(int ipd_port);
+
+/**
+ * @INTERNAL
+ * This function outputs the cvmx_phy_info_t data structure for the specified
+ * port.
+ *
+ * @param[out] - phy_info - phy info data structure
+ * @param ipd_port - port to get phy info for
+ *
+ * @return 0 for success, -1 if info not available
+ *
+ * NOTE: The phy_info data structure is subject to change.
+ */
+int cvmx_helper_board_get_phy_info(cvmx_phy_info_t *phy_info, int ipd_port);
+
+/**
+ * @INTERNAL
+ * Parse the device tree and set whether a port is valid or not.
+ *
+ * @param fdt_addr     Pointer to device tree
+ *
+ * @return 0 for success, -1 on error.
+ */
+int __cvmx_helper_parse_bgx_dt(const void *fdt_addr);
+
+/**
+ * @INTERNAL
+ * Parse the device tree and set whether a port is valid or not.
+ *
+ * @param fdt_addr     Pointer to device tree
+ *
+ * @return 0 for success, -1 on error.
+ */
+int __cvmx_helper_parse_bgx_rgmii_dt(const void *fdt_addr);
+
+/**
+ * @INTERNAL
+ * Updates any GPIO link LEDs if present
+ *
+ * @param xiface       Interface number
+ * @param index                Port index
+ * @param result       Link status result
+ */
+void cvmx_helper_update_link_led(int xiface, int index, cvmx_helper_link_info_t result);
+/**
+ * Update the RX activity LED for the specified interface and port index
+ *
+ * @param xiface       Interface number
+ * @param index                Port index
+ * @parma check_time   True if we should bail out before the polling interval
+ */
+void cvmx_update_rx_activity_led(int xiface, int index, bool check_time);
+
+/**
+ * @INTERNAL
+ * Figure out which mod_abs changed function to use based on the phy type
+ *
+ * @param      xiface  xinterface number
+ * @param      index   port index on interface
+ *
+ * @return     0 for success, -1 on error
+ *
+ * This function figures out the proper mod_abs_changed function to use and
+ * registers the appropriate function.  This should be called after the device
+ * tree has been fully parsed for the given port as well as after all SFP
+ * slots and any Microsemi VSC7224 devices have been parsed in the device tree.
+ */
+int cvmx_helper_phy_register_mod_abs_changed(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Return loss of signal
+ *
+ * @param      xiface  xinterface number
+ * @param      index   port index on interface
+ *
+ * @return     0 if signal present, 1 if loss of signal.
+ *
+ * @NOTE:      A result of 0 is possible in some cases where the signal is
+ *             not present.
+ *
+ * This is for use with __cvmx_qlm_rx_equilization
+ */
+int __cvmx_helper_get_los(int xiface, int index);
+
+/**
+ * Given the address of the MDIO registers, output the CPU node and MDIO bus
+ *
+ * @param      addr    64-bit address of MDIO registers (from device tree)
+ * @param[out] node    CPU node number (78xx)
+ * @param[out] bus     MDIO bus number
+ */
+void __cvmx_mdio_addr_to_node_bus(u64 addr, int *node, int *bus);
+
+/**
+ * Turn on the error LED
+ *
+ * @param      leds    LEDs belonging to port
+ * @param      error   true to turn on LED, false to turn off
+ */
+void cvmx_helper_leds_show_error(struct cvmx_phy_gpio_leds *leds, bool error);
+
+#endif /* __CVMX_HELPER_BOARD_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-cfg.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-cfg.h
new file mode 100644 (file)
index 0000000..d4bd910
--- /dev/null
@@ -0,0 +1,884 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper Functions for the Configuration Framework
+ *
+ * OCTEON_CN68XX introduces a flexible hw interface configuration
+ * scheme. To cope with this change and the requirements of
+ * configurability for other system resources, e.g., IPD/PIP pknd and
+ * PKO ports and queues, a configuration framework for the SDK is
+ * designed. It has two goals: first to recognize and establish the
+ * default configuration and, second, to allow the user to define key
+ * parameters in a high-level language.
+ *
+ * The helper functions query the QLM setup to help achieving the
+ * first goal.
+ *
+ * The second goal is accomplished by generating
+ * cvmx_helper_cfg_init() from a high-level lanaguage.
+ */
+
+#ifndef __CVMX_HELPER_CFG_H__
+#define __CVMX_HELPER_CFG_H__
+
+#include "cvmx-helper-util.h"
+
+#define CVMX_HELPER_CFG_MAX_PKO_PORT      128
+#define CVMX_HELPER_CFG_MAX_PIP_BPID      64
+#define CVMX_HELPER_CFG_MAX_PIP_PKND      64
+#define CVMX_HELPER_CFG_MAX_PKO_QUEUES    256
+#define CVMX_HELPER_CFG_MAX_PORT_PER_IFACE 256
+
+#define CVMX_HELPER_CFG_INVALID_VALUE -1
+
+#define cvmx_helper_cfg_assert(cond)                                                               \
+       do {                                                                                       \
+               if (!(cond)) {                                                                     \
+                       debug("cvmx_helper_cfg_assert (%s) at %s:%d\n", #cond, __FILE__,           \
+                             __LINE__);                                                           \
+               }                                                                                  \
+       } while (0)
+
+extern int cvmx_npi_max_pknds;
+
+/*
+ * Config Options
+ *
+ * These options have to be set via cvmx_helper_cfg_opt_set() before calling the
+ * routines that set up the hw. These routines process the options and set them
+ * correctly to take effect at runtime.
+ */
+enum cvmx_helper_cfg_option {
+       CVMX_HELPER_CFG_OPT_USE_DWB, /*
+                                        * Global option to control if
+                                        * the SDK configures units (DMA,
+                                        * SSO, and PKO) to send don't
+                                        * write back (DWB) requests for
+                                        * freed buffers. Set to 1/0 to
+                                        * enable/disable DWB.
+                                        *
+                                        * For programs that fit inside
+                                        * L2, sending DWB just causes
+                                        * more L2 operations without
+                                        * benefit.
+                                        */
+
+       CVMX_HELPER_CFG_OPT_MAX
+};
+
+typedef enum cvmx_helper_cfg_option cvmx_helper_cfg_option_t;
+
+struct cvmx_phy_info;
+struct cvmx_fdt_sfp_info;
+struct cvmx_vsc7224_chan;
+struct phy_device;
+
+struct cvmx_srio_port_param {
+       /** True to override SRIO CTLE zero setting */
+       bool srio_rx_ctle_zero_override : 1;
+       /** Equalization peaking control dft: 6 */
+       u8 srio_rx_ctle_zero : 4;
+       /** Set true to override CTLE taps */
+       bool srio_rx_ctle_agc_override : 1;
+       u8 srio_rx_agc_pre_ctle : 4;        /** AGC pre-CTLE gain */
+       u8 srio_rx_agc_post_ctle : 4;       /** AGC post-CTLE gain */
+       bool srio_tx_swing_override : 1;    /** True to override TX Swing */
+       u8 srio_tx_swing : 5;               /** TX Swing */
+       bool srio_tx_gain_override : 1;     /** True to override TX gain */
+       u8 srio_tx_gain : 3;                /** TX gain */
+       bool srio_tx_premptap_override : 1; /** True to override premptap values */
+       u8 srio_tx_premptap_pre : 4;        /** Pre premptap value */
+       u8 srio_tx_premptap_post : 5;       /** Post premptap value */
+       bool srio_tx_vboost_override : 1;   /** True to override TX vboost setting */
+       bool srio_tx_vboost : 1;            /** vboost setting (default 1) */
+};
+
+/*
+ * Per physical port
+ * Note: This struct is passed between linux and SE apps.
+ */
+struct cvmx_cfg_port_param {
+       int port_fdt_node;              /** Node offset in FDT of node */
+       int phy_fdt_node;               /** Node offset in FDT of PHY */
+       struct cvmx_phy_info *phy_info; /** Data structure with PHY information */
+       int8_t ccpp_pknd;
+       int8_t ccpp_bpid;
+       int8_t ccpp_pko_port_base;
+       int8_t ccpp_pko_num_ports;
+       u8 agl_rx_clk_skew;               /** AGL rx clock skew setting (default 0) */
+       u8 rgmii_tx_clk_delay;            /** RGMII TX clock delay value if not bypassed */
+       bool valid : 1;                   /** 1 = port valid, 0 = invalid */
+       bool sgmii_phy_mode : 1;          /** 1 = port in PHY mode, 0 = MAC mode */
+       bool sgmii_1000x_mode : 1;        /** 1 = 1000Base-X mode, 0 = SGMII mode */
+       bool agl_rx_clk_delay_bypass : 1; /** 1 = use rx clock delay bypass for AGL mode */
+       bool force_link_up : 1;           /** Ignore PHY and always report link up */
+       bool disable_an : 1;              /** true to disable autonegotiation */
+       bool link_down_pwr_dn : 1;        /** Power PCS off when link is down */
+       bool phy_present : 1;             /** true if PHY is present */
+       bool tx_clk_delay_bypass : 1;     /** True to bypass the TX clock delay */
+       bool enable_fec : 1;              /** True to enable FEC for 10/40G links */
+       /** Settings for short-run SRIO host */
+       struct cvmx_srio_port_param srio_short;
+       /** Settings for long-run SRIO host */
+       struct cvmx_srio_port_param srio_long;
+       u8 agl_refclk_sel; /** RGMII refclk select to use */
+       /** Set if local (non-PHY) LEDs are used */
+       struct cvmx_phy_gpio_leds *gpio_leds;
+       struct cvmx_fdt_sfp_info *sfp_info; /** SFP+/QSFP info for port */
+       /** Offset of SFP/SFP+/QSFP slot in device tree */
+       int sfp_of_offset;
+       /** Microsemi VSC7224 channel info data structure */
+       struct cvmx_vsc7224_chan *vsc7224_chan;
+       /** Avago AVSP-5410 Phy */
+       struct cvmx_avsp5410 *avsp5410;
+       struct phy_device *phydev;
+};
+
+/*
+ * Per pko_port
+ */
+struct cvmx_cfg_pko_port_param {
+       s16 ccppp_queue_base;
+       s16 ccppp_num_queues;
+};
+
+/*
+ * A map from pko_port to
+ *     interface,
+ *     index, and
+ *     pko engine id
+ */
+struct cvmx_cfg_pko_port_map {
+       s16 ccppl_interface;
+       s16 ccppl_index;
+       s16 ccppl_eid;
+};
+
+/*
+ * This is for looking up pko_base_port and pko_nport for ipd_port
+ */
+struct cvmx_cfg_pko_port_pair {
+       int8_t ccppp_base_port;
+       int8_t ccppp_nports;
+};
+
+typedef union cvmx_user_static_pko_queue_config {
+       struct {
+               struct pko_queues_cfg {
+                       unsigned queues_per_port : 11, qos_enable : 1, pfc_enable : 1;
+               } pko_cfg_iface[6];
+               struct pko_queues_cfg pko_cfg_loop;
+               struct pko_queues_cfg pko_cfg_npi;
+       } pknd;
+       struct {
+               u8 pko_ports_per_interface[5];
+               u8 pko_queues_per_port_interface[5];
+               u8 pko_queues_per_port_loop;
+               u8 pko_queues_per_port_pci;
+               u8 pko_queues_per_port_srio[4];
+       } non_pknd;
+} cvmx_user_static_pko_queue_config_t;
+
+extern cvmx_user_static_pko_queue_config_t __cvmx_pko_queue_static_config[CVMX_MAX_NODES];
+extern struct cvmx_cfg_pko_port_map cvmx_cfg_pko_port_map[CVMX_HELPER_CFG_MAX_PKO_PORT];
+extern struct cvmx_cfg_port_param cvmx_cfg_port[CVMX_MAX_NODES][CVMX_HELPER_MAX_IFACE]
+                                              [CVMX_HELPER_CFG_MAX_PORT_PER_IFACE];
+extern struct cvmx_cfg_pko_port_param cvmx_pko_queue_table[];
+extern int cvmx_enable_helper_flag;
+
+/*
+ * @INTERNAL
+ * Return configured pknd for the port
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ * @return the pknd
+ */
+int __cvmx_helper_cfg_pknd(int interface, int index);
+
+/*
+ * @INTERNAL
+ * Return the configured bpid for the port
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ * @return the bpid
+ */
+int __cvmx_helper_cfg_bpid(int interface, int index);
+
+/**
+ * @INTERNAL
+ * Return the configured pko_port base for the port
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ * @return the pko_port base
+ */
+int __cvmx_helper_cfg_pko_port_base(int interface, int index);
+
+/*
+ * @INTERNAL
+ * Return the configured number of pko_ports for the port
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ * @return the number of pko_ports
+ */
+int __cvmx_helper_cfg_pko_port_num(int interface, int index);
+
+/*
+ * @INTERNAL
+ * Return the configured pko_queue base for the pko_port
+ *
+ * @param pko_port
+ * @return the pko_queue base
+ */
+int __cvmx_helper_cfg_pko_queue_base(int pko_port);
+
+/*
+ * @INTERNAL
+ * Return the configured number of pko_queues for the pko_port
+ *
+ * @param pko_port
+ * @return the number of pko_queues
+ */
+int __cvmx_helper_cfg_pko_queue_num(int pko_port);
+
+/*
+ * @INTERNAL
+ * Return the interface the pko_port is configured for
+ *
+ * @param pko_port
+ * @return the interface for the pko_port
+ */
+int __cvmx_helper_cfg_pko_port_interface(int pko_port);
+
+/*
+ * @INTERNAL
+ * Return the index of the port the pko_port is configured for
+ *
+ * @param pko_port
+ * @return the index of the port
+ */
+int __cvmx_helper_cfg_pko_port_index(int pko_port);
+
+/*
+ * @INTERNAL
+ * Return the pko_eid of the pko_port
+ *
+ * @param pko_port
+ * @return the pko_eid
+ */
+int __cvmx_helper_cfg_pko_port_eid(int pko_port);
+
+/*
+ * @INTERNAL
+ * Return the max# of pko queues allocated.
+ *
+ * @return the max# of pko queues
+ *
+ * Note: there might be holes in the queue space depending on user
+ * configuration. The function returns the highest queue's index in
+ * use.
+ */
+int __cvmx_helper_cfg_pko_max_queue(void);
+
+/*
+ * @INTERNAL
+ * Return the max# of PKO DMA engines allocated.
+ *
+ * @return the max# of DMA engines
+ *
+ * NOTE: the DMA engines are allocated contiguously and starting from
+ * 0.
+ */
+int __cvmx_helper_cfg_pko_max_engine(void);
+
+/*
+ * Get the value set for the config option ``opt''.
+ *
+ * @param opt is the config option.
+ * @return the value set for the option
+ *
+ * LR: only used for DWB in NPI, POW, PKO1
+ */
+u64 cvmx_helper_cfg_opt_get(cvmx_helper_cfg_option_t opt);
+
+/*
+ * Set the value for a config option.
+ *
+ * @param opt is the config option.
+ * @param val is the value to set for the opt.
+ * @return 0 for success and -1 on error
+ *
+ * Note an option here is a config-time parameter and this means that
+ * it has to be set before calling the corresponding setup functions
+ * that actually sets the option in hw.
+ *
+ * LR: Not used.
+ */
+int cvmx_helper_cfg_opt_set(cvmx_helper_cfg_option_t opt, u64 val);
+
+/*
+ * Retrieve the pko_port base given ipd_port.
+ *
+ * @param ipd_port is the IPD eport
+ * @return the corresponding PKO port base for the physical port
+ * represented by the IPD eport or CVMX_HELPER_CFG_INVALID_VALUE.
+ */
+int cvmx_helper_cfg_ipd2pko_port_base(int ipd_port);
+
+/*
+ * Retrieve the number of pko_ports given ipd_port.
+ *
+ * @param ipd_port is the IPD eport
+ * @return the corresponding number of PKO ports for the physical port
+ *  represented by IPD eport or CVMX_HELPER_CFG_INVALID_VALUE.
+ */
+int cvmx_helper_cfg_ipd2pko_port_num(int ipd_port);
+
+/*
+ * @INTERNAL
+ * The init function
+ *
+ * @param node
+ * @return 0 for success.
+ *
+ * Note: this function is meant to be called to set the ``configured
+ * parameters,'' e.g., pknd, bpid, etc. and therefore should be before
+ * any of the corresponding cvmx_helper_cfg_xxxx() functions are
+ * called.
+ */
+int __cvmx_helper_init_port_config_data(int node);
+
+/*
+ * @INTERNAL
+ * The local init function
+ *
+ * @param none
+ * @return 0 for success.
+ *
+ * Note: this function is meant to be called to set the ``configured
+ * parameters locally,'' e.g., pknd, bpid, etc. and therefore should be before
+ * any of the corresponding cvmx_helper_cfg_xxxx() functions are
+ * called.
+ */
+int __cvmx_helper_init_port_config_data_local(void);
+
+/*
+ * Set the frame max size and jabber size to 65535.
+ *
+ */
+void cvmx_helper_cfg_set_jabber_and_frame_max(void);
+
+/*
+ * Enable storing short packets only in the WQE.
+ */
+void cvmx_helper_cfg_store_short_packets_in_wqe(void);
+
+/*
+ * Allocated a block of internal ports and queues for the specified
+ * interface/port
+ *
+ * @param  interface  the interface for which the internal ports and queues
+ *                    are requested
+ * @param  port       the index of the port within in the interface for which
+                     the internal ports and queues are requested.
+ * @param  pot_count  the number of internal ports requested
+ * @param  queue_cnt  the number of queues requested for each of the internal
+ *                    port. This call will allocate a total of
+ *                   (port_cnt * queue_cnt) queues
+ *
+ * @return  0 on success
+ *         -1 on failure
+ *
+ * LR: Called ONLY from comfig-parse!
+ */
+int cvmx_pko_alloc_iport_and_queues(int interface, int port, int port_cnt, int queue_cnt);
+
+/*
+ * Free the queues that are associated with the specified port
+ *
+ * @param  port   the internal port for which the queues are freed.
+ *
+ * @return  0 on success
+ *         -1 on failure
+ */
+int cvmx_pko_queue_free(u64 port);
+
+/*
+ * Initializes the pko queue range data structure.
+ * @return  0 on success
+ *         -1 on failure
+ */
+int init_cvmx_pko_que_range(void);
+
+/*
+ * Frees up all the allocated ques.
+ */
+void cvmx_pko_queue_free_all(void);
+
+/**
+ * Returns if port is valid for a given interface
+ *
+ * @param xiface     interface to check
+ * @param index      port index in the interface
+ *
+ * @return status of the port present or not.
+ */
+int cvmx_helper_is_port_valid(int xiface, int index);
+
+/**
+ * Set whether or not a port is valid
+ *
+ * @param interface interface to set
+ * @param index     port index to set
+ * @param valid     set 0 to make port invalid, 1 for valid
+ */
+void cvmx_helper_set_port_valid(int interface, int index, bool valid);
+
+/**
+ * @INTERNAL
+ * Return if port is in PHY mode
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ *
+ * @return 1 if port is in PHY mode, 0 if port is in MAC mode
+ */
+bool cvmx_helper_get_mac_phy_mode(int interface, int index);
+void cvmx_helper_set_mac_phy_mode(int interface, int index, bool valid);
+
+/**
+ * @INTERNAL
+ * Return if port is in 1000Base X mode
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ *
+ * @return 1 if port is in 1000Base X mode, 0 if port is in SGMII mode
+ */
+bool cvmx_helper_get_1000x_mode(int interface, int index);
+void cvmx_helper_set_1000x_mode(int interface, int index, bool valid);
+
+/**
+ * @INTERNAL
+ * Return if an AGL port should bypass the RX clock delay
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ */
+bool cvmx_helper_get_agl_rx_clock_delay_bypass(int interface, int index);
+void cvmx_helper_set_agl_rx_clock_delay_bypass(int interface, int index, bool valid);
+
+/**
+ * @INTERNAL
+ * Forces a link to always return that it is up ignoring the PHY (if present)
+ *
+ * @param interface the interface number
+ * @param index the port's index
+ */
+bool cvmx_helper_get_port_force_link_up(int interface, int index);
+void cvmx_helper_set_port_force_link_up(int interface, int index, bool value);
+
+/**
+ * @INTERNAL
+ * Return true if PHY is present to the passed xiface
+ *
+ * @param xiface the interface number
+ * @param index the port's index
+ */
+bool cvmx_helper_get_port_phy_present(int xiface, int index);
+void cvmx_helper_set_port_phy_present(int xiface, int index, bool value);
+
+/**
+ * @INTERNAL
+ * Return the AGL port rx clock skew, only used
+ * if agl_rx_clock_delay_bypass is set.
+ *
+ * @param interface the interface number
+ * @param index the port's index number
+ */
+u8 cvmx_helper_get_agl_rx_clock_skew(int interface, int index);
+void cvmx_helper_set_agl_rx_clock_skew(int interface, int index, u8 value);
+u8 cvmx_helper_get_agl_refclk_sel(int interface, int index);
+void cvmx_helper_set_agl_refclk_sel(int interface, int index, u8 value);
+
+/**
+ * @INTERNAL
+ * Store the FDT node offset in the device tree of a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param node_offset  node offset to store
+ */
+void cvmx_helper_set_port_fdt_node_offset(int xiface, int index, int node_offset);
+
+/**
+ * @INTERNAL
+ * Return the FDT node offset in the device tree of a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @return             node offset of port or -1 if invalid
+ */
+int cvmx_helper_get_port_fdt_node_offset(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Store the FDT node offset in the device tree of a phy
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param node_offset  node offset to store
+ */
+void cvmx_helper_set_phy_fdt_node_offset(int xiface, int index, int node_offset);
+
+/**
+ * @INTERNAL
+ * Return the FDT node offset in the device tree of a phy
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @return             node offset of phy or -1 if invalid
+ */
+int cvmx_helper_get_phy_fdt_node_offset(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Override default autonegotiation for a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param enable       true to enable autonegotiation, false to force full
+ *                     duplex, full speed.
+ */
+void cvmx_helper_set_port_autonegotiation(int xiface, int index, bool enable);
+
+/**
+ * @INTERNAL
+ * Returns if autonegotiation is enabled or not.
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return 0 if autonegotiation is disabled, 1 if enabled.
+ */
+bool cvmx_helper_get_port_autonegotiation(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Returns if forward error correction is enabled or not.
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return 0 if fec is disabled, 1 if enabled.
+ */
+bool cvmx_helper_get_port_fec(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Override default forward error correction for a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param enable       true to enable fec, false to disable.
+ */
+void cvmx_helper_set_port_fec(int xiface, int index, bool enable);
+
+/**
+ * @INTERNAL
+ * Configure the SRIO RX interface AGC settings in host mode
+ *
+ * @param xiface       node and interface
+ * @param index                lane
+ * @param long_run     true for long run, false for short run
+ * @param agc_override true to put AGC in manual mode
+ * @param ctle_zero    RX equalizer peaking control (default 0x6)
+ * @param agc_pre_ctle AGC pre-CTLE gain (default 0x5)
+ * @param agc_post_ctle        AGC post-CTLE gain (default 0x4)
+ *
+ * NOTE: This must be called before SRIO is initialized to take effect
+ */
+void cvmx_helper_set_srio_rx(int xiface, int index, bool long_run, bool ctle_zero_override,
+                            u8 ctle_zero, bool agc_override, u8 agc_pre_ctle, u8 agc_post_ctle);
+
+/**
+ * @INTERNAL
+ * Get the SRIO RX interface AGC settings for host mode
+ *
+ * @param xiface       node and interface
+ * @param index                lane
+ * @param long_run     true for long run, false for short run
+ * @param[out] ctle_zero_override true if overridden
+ * @param[out] ctle_zero       RX equalizer peaking control (default 0x6)
+ * @param[out] agc_override    true to put AGC in manual mode
+ * @param[out] agc_pre_ctle    AGC pre-CTLE gain (default 0x5)
+ * @param[out] agc_post_ctle   AGC post-CTLE gain (default 0x4)
+ */
+void cvmx_helper_get_srio_rx(int xiface, int index, bool long_run, bool *ctle_zero_override,
+                            u8 *ctle_zero, bool *agc_override, u8 *agc_pre_ctle,
+                            u8 *agc_post_ctle);
+
+/**
+ * @INTERNAL
+ * Configure the SRIO TX interface for host mode
+ *
+ * @param xiface               node and interface
+ * @param index                        lane
+ * @param long_run     true for long run, false for short run
+ * @param tx_swing             tx swing value to use (default 0x7), -1 to not
+ *                             override.
+ * @param tx_gain              PCS SDS TX gain (default 0x3), -1 to not
+ *                             override
+ * @param tx_premptap_override true to override preemphasis control
+ * @param tx_premptap_pre      preemphasis pre tap value (default 0x0)
+ * @param tx_premptap_post     preemphasis post tap value (default 0xF)
+ * @param tx_vboost            vboost enable (1 = enable, -1 = don't override)
+ *                             hardware default is 1.
+ *
+ * NOTE: This must be called before SRIO is initialized to take effect
+ */
+void cvmx_helper_set_srio_tx(int xiface, int index, bool long_run, int tx_swing, int tx_gain,
+                            bool tx_premptap_override, u8 tx_premptap_pre, u8 tx_premptap_post,
+                            int tx_vboost);
+
+/**
+ * @INTERNAL
+ * Get the SRIO TX interface settings for host mode
+ *
+ * @param xiface                       node and interface
+ * @param index                                lane
+ * @param long_run                     true for long run, false for short run
+ * @param[out] tx_swing_override       true to override pcs_sds_txX_swing
+ * @param[out] tx_swing                        tx swing value to use (default 0x7)
+ * @param[out] tx_gain_override                true to override default gain
+ * @param[out] tx_gain                 PCS SDS TX gain (default 0x3)
+ * @param[out] tx_premptap_override    true to override preemphasis control
+ * @param[out] tx_premptap_pre         preemphasis pre tap value (default 0x0)
+ * @param[out] tx_premptap_post                preemphasis post tap value (default 0xF)
+ * @param[out] tx_vboost_override      override vboost setting
+ * @param[out] tx_vboost               vboost enable (default true)
+ */
+void cvmx_helper_get_srio_tx(int xiface, int index, bool long_run, bool *tx_swing_override,
+                            u8 *tx_swing, bool *tx_gain_override, u8 *tx_gain,
+                            bool *tx_premptap_override, u8 *tx_premptap_pre, u8 *tx_premptap_post,
+                            bool *tx_vboost_override, bool *tx_vboost);
+
+/**
+ * @INTERNAL
+ * Sets the PHY info data structure
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param[in] phy_info phy information data structure pointer
+ */
+void cvmx_helper_set_port_phy_info(int xiface, int index, struct cvmx_phy_info *phy_info);
+/**
+ * @INTERNAL
+ * Returns the PHY information data structure for a port
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return pointer to PHY information data structure or NULL if not set
+ */
+struct cvmx_phy_info *cvmx_helper_get_port_phy_info(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Returns a pointer to the PHY LED configuration (if local GPIOs drive them)
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ *
+ * @return pointer to the PHY LED information data structure or NULL if not
+ *        present
+ */
+struct cvmx_phy_gpio_leds *cvmx_helper_get_port_phy_leds(int xiface, int index);
+
+/**
+ * @INTERNAL
+ * Sets a pointer to the PHY LED configuration (if local GPIOs drive them)
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ * @param leds         pointer to led data structure
+ */
+void cvmx_helper_set_port_phy_leds(int xiface, int index, struct cvmx_phy_gpio_leds *leds);
+
+/**
+ * @INTERNAL
+ * Disables RGMII TX clock bypass and sets delay value
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ * @param bypass       Set true to enable the clock bypass and false
+ *                     to sync clock and data synchronously.
+ *                     Default is false.
+ * @param clk_delay    Delay value to skew TXC from TXD
+ */
+void cvmx_helper_cfg_set_rgmii_tx_clk_delay(int xiface, int index, bool bypass, int clk_delay);
+
+/**
+ * @INTERNAL
+ * Gets RGMII TX clock bypass and delay value
+ *
+ * @param xiface       node and interface
+ * @param index                portindex
+ * @param bypass       Set true to enable the clock bypass and false
+ *                     to sync clock and data synchronously.
+ *                     Default is false.
+ * @param clk_delay    Delay value to skew TXC from TXD, default is 0.
+ */
+void cvmx_helper_cfg_get_rgmii_tx_clk_delay(int xiface, int index, bool *bypass, int *clk_delay);
+
+/**
+ * @INTERNAL
+ * Retrieve node-specific PKO Queue configuration.
+ *
+ * @param node         OCTEON3 node.
+ * @param pkocfg       PKO Queue static configuration.
+ */
+int cvmx_helper_pko_queue_config_get(int node, cvmx_user_static_pko_queue_config_t *cfg);
+
+/**
+ * @INTERNAL
+ * Update node-specific PKO Queue configuration.
+ *
+ * @param node         OCTEON3 node.
+ * @param pkocfg       PKO Queue static configuration.
+ */
+int cvmx_helper_pko_queue_config_set(int node, cvmx_user_static_pko_queue_config_t *cfg);
+
+/**
+ * @INTERNAL
+ * Retrieve the SFP node offset in the device tree
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return offset in device tree or -1 if error or not defined.
+ */
+int cvmx_helper_cfg_get_sfp_fdt_offset(int xiface, int index);
+
+/**
+ * Search for a port based on its FDT node offset
+ *
+ * @param      of_offset       Node offset of port to search for
+ *
+ * @return     ipd_port or -1 if not found
+ */
+int cvmx_helper_cfg_get_ipd_port_by_fdt_node_offset(int of_offset);
+
+/**
+ * @INTERNAL
+ * Sets the SFP node offset
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ * @param sfp_of_offset        Offset of SFP node in device tree
+ */
+void cvmx_helper_cfg_set_sfp_fdt_offset(int xiface, int index, int sfp_of_offset);
+
+/**
+ * Search for a port based on its FDT node offset
+ *
+ * @param      of_offset       Node offset of port to search for
+ * @param[out] xiface          xinterface of match
+ * @param[out] index           port index of match
+ *
+ * @return     0 if found, -1 if not found
+ */
+int cvmx_helper_cfg_get_xiface_index_by_fdt_node_offset(int of_offset, int *xiface, int *index);
+
+/**
+ * Get data structure defining the Microsemi VSC7224 channel info
+ * or NULL if not present
+ *
+ * @param xiface       node and interface
+ * @param index                port index
+ *
+ * @return pointer to vsc7224 data structure or NULL if not present
+ */
+struct cvmx_vsc7224_chan *cvmx_helper_cfg_get_vsc7224_chan_info(int xiface, int index);
+
+/**
+ * Sets the Microsemi VSC7224 channel data structure
+ *
+ * @param      xiface  node and interface
+ * @param      index   port index
+ * @param[in]  vsc7224_info    Microsemi VSC7224 data structure
+ */
+void cvmx_helper_cfg_set_vsc7224_chan_info(int xiface, int index,
+                                          struct cvmx_vsc7224_chan *vsc7224_chan_info);
+
+/**
+ * Get data structure defining the Avago AVSP5410 phy info
+ * or NULL if not present
+ *
+ * @param xiface        node and interface
+ * @param index         port index
+ *
+ * @return pointer to avsp5410 data structure or NULL if not present
+ */
+struct cvmx_avsp5410 *cvmx_helper_cfg_get_avsp5410_info(int xiface, int index);
+
+/**
+ * Sets the Avago AVSP5410 phy info data structure
+ *
+ * @param       xiface  node and interface
+ * @param       index   port index
+ * @param[in]   avsp5410_info   Avago AVSP5410 data structure
+ */
+void cvmx_helper_cfg_set_avsp5410_info(int xiface, int index, struct cvmx_avsp5410 *avsp5410_info);
+
+/**
+ * Gets the SFP data associated with a port
+ *
+ * @param      xiface  node and interface
+ * @param      index   port index
+ *
+ * @return     pointer to SFP data structure or NULL if none
+ */
+struct cvmx_fdt_sfp_info *cvmx_helper_cfg_get_sfp_info(int xiface, int index);
+
+/**
+ * Sets the SFP data associated with a port
+ *
+ * @param      xiface          node and interface
+ * @param      index           port index
+ * @param[in]  sfp_info        port SFP data or NULL for none
+ */
+void cvmx_helper_cfg_set_sfp_info(int xiface, int index, struct cvmx_fdt_sfp_info *sfp_info);
+
+/*
+ * Initializes cvmx with user specified config info.
+ */
+int cvmx_user_static_config(void);
+void cvmx_pko_queue_show(void);
+int cvmx_fpa_pool_init_from_cvmx_config(void);
+int __cvmx_helper_init_port_valid(void);
+
+/**
+ * Returns a pointer to the phy device associated with a port
+ *
+ * @param      xiface          node and interface
+ * @param      index           port index
+ *
+ * return      pointer to phy device or NULL if none
+ */
+struct phy_device *cvmx_helper_cfg_get_phy_device(int xiface, int index);
+
+/**
+ * Sets the phy device associated with a port
+ *
+ * @param      xiface          node and interface
+ * @param      index           port index
+ * @param[in]  phydev          phy device to assiciate
+ */
+void cvmx_helper_cfg_set_phy_device(int xiface, int index, struct phy_device *phydev);
+
+#endif /* __CVMX_HELPER_CFG_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-errata.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-errata.h
new file mode 100644 (file)
index 0000000..9ed13c1
--- /dev/null
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Fixes and workaround for Octeon chip errata. This file
+ * contains functions called by cvmx-helper to workaround known
+ * chip errata. For the most part, code doesn't need to call
+ * these functions directly.
+ */
+
+#ifndef __CVMX_HELPER_ERRATA_H__
+#define __CVMX_HELPER_ERRATA_H__
+
+#include "cvmx-wqe.h"
+
+/**
+ * @INTERNAL
+ * Function to adjust internal IPD pointer alignments
+ *
+ * @return 0 on success
+ *         !0 on failure
+ */
+int __cvmx_helper_errata_fix_ipd_ptr_alignment(void);
+
+/**
+ * This function needs to be called on all Octeon chips with
+ * errata PKI-100.
+ *
+ * The Size field is 8 too large in WQE and next pointers
+ *
+ *  The Size field generated by IPD is 8 larger than it should
+ *  be. The Size field is <55:40> of both:
+ *      - WORD3 in the work queue entry, and
+ *      - the next buffer pointer (which precedes the packet data
+ *        in each buffer).
+ *
+ * @param work   Work queue entry to fix
+ * @return Zero on success. Negative on failure
+ */
+int cvmx_helper_fix_ipd_packet_chain(cvmx_wqe_t *work);
+
+/**
+ * Due to errata G-720, the 2nd order CDR circuit on CN52XX pass
+ * 1 doesn't work properly. The following code disables 2nd order
+ * CDR for the specified QLM.
+ *
+ * @param qlm    QLM to disable 2nd order CDR for.
+ */
+void __cvmx_helper_errata_qlm_disable_2nd_order_cdr(int qlm);
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-fdt.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-fdt.h
new file mode 100644 (file)
index 0000000..d3809ae
--- /dev/null
@@ -0,0 +1,568 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * FDT Helper functions similar to those provided to U-Boot.
+ * If compiled for U-Boot, just provide wrappers to the equivalent U-Boot
+ * functions.
+ */
+
+#ifndef __CVMX_HELPER_FDT_H__
+#define __CVMX_HELPER_FDT_H__
+
+#include <fdt_support.h>
+#include <fdtdec.h>
+#include <time.h>
+#include <asm/global_data.h>
+#include <linux/libfdt.h>
+
+#include <mach/cvmx-helper-sfp.h>
+
+enum cvmx_i2c_bus_type {
+       CVMX_I2C_BUS_OCTEON,
+       CVMX_I2C_MUX_PCA9540,
+       CVMX_I2C_MUX_PCA9542,
+       CVMX_I2C_MUX_PCA9543,
+       CVMX_I2C_MUX_PCA9544,
+       CVMX_I2C_MUX_PCA9545,
+       CVMX_I2C_MUX_PCA9546,
+       CVMX_I2C_MUX_PCA9547,
+       CVMX_I2C_MUX_PCA9548,
+       CVMX_I2C_MUX_OTHER
+};
+
+struct cvmx_sfp_mod_info; /** Defined in cvmx-helper-sfp.h */
+struct cvmx_phy_info;    /** Defined in cvmx-helper-board.h */
+
+/**
+ * This data structure holds information about various I2C muxes and switches
+ * that may be between a device and the Octeon chip.
+ */
+struct cvmx_fdt_i2c_bus_info {
+       /** Parent I2C bus, NULL if root */
+       struct cvmx_fdt_i2c_bus_info *parent;
+       /** Child I2C bus or NULL if last entry in the chain */
+       struct cvmx_fdt_i2c_bus_info *child;
+       /** Offset in device tree */
+       int of_offset;
+       /** Type of i2c bus or mux */
+       enum cvmx_i2c_bus_type type;
+       /** I2C address of mux */
+       u8 i2c_addr;
+       /** Mux channel number */
+       u8 channel;
+       /** For muxes, the bit(s) to set to enable them */
+       u8 enable_bit;
+       /** True if mux, false if switch */
+       bool is_mux;
+};
+
+/**
+ * Data structure containing information about SFP/QSFP slots
+ */
+struct cvmx_fdt_sfp_info {
+       /** Used for a linked list of slots */
+       struct cvmx_fdt_sfp_info *next, *prev;
+       /** Used when multiple SFP ports share the same IPD port */
+       struct cvmx_fdt_sfp_info *next_iface_sfp;
+       /** Name from device tree of slot */
+       const char *name;
+       /** I2C bus for slot EEPROM */
+       struct cvmx_fdt_i2c_bus_info *i2c_bus;
+       /** Data from SFP or QSFP EEPROM */
+       struct cvmx_sfp_mod_info sfp_info;
+       /** Data structure with PHY information */
+       struct cvmx_phy_info *phy_info;
+       /** IPD port(s) slot is connected to */
+       int ipd_port[4];
+       /** Offset in device tree of slot */
+       int of_offset;
+       /** EEPROM address of SFP module (usually 0x50) */
+       u8 i2c_eeprom_addr;
+       /** Diagnostic address of SFP module (usually 0x51) */
+       u8 i2c_diag_addr;
+       /** True if QSFP module */
+       bool is_qsfp;
+       /** True if EEPROM data is valid */
+       bool valid;
+       /** SFP tx_disable GPIO descriptor */
+       struct cvmx_fdt_gpio_info *tx_disable;
+       /** SFP mod_abs/QSFP mod_prs GPIO descriptor */
+       struct cvmx_fdt_gpio_info *mod_abs;
+       /** SFP tx_error GPIO descriptor */
+       struct cvmx_fdt_gpio_info *tx_error;
+       /** SFP rx_los GPIO discriptor */
+       struct cvmx_fdt_gpio_info *rx_los;
+       /** QSFP select GPIO descriptor */
+       struct cvmx_fdt_gpio_info *select;
+       /** QSFP reset GPIO descriptor */
+       struct cvmx_fdt_gpio_info *reset;
+       /** QSFP interrupt GPIO descriptor */
+       struct cvmx_fdt_gpio_info *interrupt;
+       /** QSFP lp_mode GPIO descriptor */
+       struct cvmx_fdt_gpio_info *lp_mode;
+       /** Last mod_abs value */
+       int last_mod_abs;
+       /** Last rx_los value */
+       int last_rx_los;
+       /** Function to call to check mod_abs */
+       int (*check_mod_abs)(struct cvmx_fdt_sfp_info *sfp_info, void *data);
+       /** User-defined data to pass to check_mod_abs */
+       void *mod_abs_data;
+       /** Function to call when mod_abs changes */
+       int (*mod_abs_changed)(struct cvmx_fdt_sfp_info *sfp_info, int val, void *data);
+       /** User-defined data to pass to mod_abs_changed */
+       void *mod_abs_changed_data;
+       /** Function to call when rx_los changes */
+       int (*rx_los_changed)(struct cvmx_fdt_sfp_info *sfp_info, int val, void *data);
+       /** User-defined data to pass to rx_los_changed */
+       void *rx_los_changed_data;
+       /** True if we're connected to a Microsemi VSC7224 reclocking chip */
+       bool is_vsc7224;
+       /** Data structure for first vsc7224 channel we're attached to */
+       struct cvmx_vsc7224_chan *vsc7224_chan;
+       /** True if we're connected to a Avago AVSP5410 phy */
+       bool is_avsp5410;
+       /** Data structure for avsp5410 phy we're attached to */
+       struct cvmx_avsp5410 *avsp5410;
+       /** xinterface we're on */
+       int xiface;
+       /** port index */
+       int index;
+};
+
+/**
+ * Look up a phandle and follow it to its node then return the offset of that
+ * node.
+ *
+ * @param[in]  fdt_addr        pointer to FDT blob
+ * @param      node            node to read phandle from
+ * @param[in]  prop_name       name of property to find
+ * @param[in,out] lenp         Number of phandles, input max number
+ * @param[out] nodes           Array of phandle nodes
+ *
+ * @return     -ve error code on error or 0 for success
+ */
+int cvmx_fdt_lookup_phandles(const void *fdt_addr, int node, const char *prop_name, int *lenp,
+                            int *nodes);
+
+/**
+ * Helper to return the address property
+ *
+ * @param[in] fdt_addr pointer to FDT blob
+ * @param node         node to read address from
+ * @param prop_name    property name to read
+ *
+ * @return address of property or FDT_ADDR_T_NONE if not found
+ */
+static inline fdt_addr_t cvmx_fdt_get_addr(const void *fdt_addr, int node, const char *prop_name)
+{
+       return fdtdec_get_addr(fdt_addr, node, prop_name);
+}
+
+/**
+ * Helper function to return an integer property
+ *
+ * @param[in] fdt_addr pointer to FDT blob
+ * @param node         node to read integer from
+ * @param[in] prop_name        property name to read
+ * @param default_val  default value to return if property doesn't exist
+ *
+ * @return     integer value of property or default_val if it doesn't exist.
+ */
+static inline int cvmx_fdt_get_int(const void *fdt_addr, int node, const char *prop_name,
+                                  int default_val)
+{
+       return fdtdec_get_int(fdt_addr, node, prop_name, default_val);
+}
+
+static inline bool cvmx_fdt_get_bool(const void *fdt_addr, int node, const char *prop_name)
+{
+       return fdtdec_get_bool(fdt_addr, node, prop_name);
+}
+
+static inline u64 cvmx_fdt_get_uint64(const void *fdt_addr, int node, const char *prop_name,
+                                     u64 default_val)
+{
+       return fdtdec_get_uint64(fdt_addr, node, prop_name, default_val);
+}
+
+/**
+ * Look up a phandle and follow it to its node then return the offset of that
+ * node.
+ *
+ * @param[in] fdt_addr pointer to FDT blob
+ * @param node         node to read phandle from
+ * @param[in] prop_name        name of property to find
+ *
+ * @return     node offset if found, -ve error code on error
+ */
+static inline int cvmx_fdt_lookup_phandle(const void *fdt_addr, int node, const char *prop_name)
+{
+       return fdtdec_lookup_phandle(fdt_addr, node, prop_name);
+}
+
+/**
+ * Translate an address from the device tree into a CPU physical address by
+ * walking up the device tree and applying bus mappings along the way.
+ *
+ * This uses #size-cells and #address-cells.
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ * @param      node            node to start translating from
+ * @param[in]  in_addr         Address to translate
+ *                             NOTE: in_addr must be in the native ENDIAN
+ *                             format.
+ *
+ * @return     Translated address or FDT_ADDR_T_NONE if address cannot be
+ *             translated.
+ */
+static inline u64 cvmx_fdt_translate_address(const void *fdt_addr, int node, const u32 *in_addr)
+{
+       return fdt_translate_address((void *)fdt_addr, node, in_addr);
+}
+
+/**
+ * Compare compatibile strings in the flat device tree.
+ *
+ * @param[in] s1       First string to compare
+ * @param[in] sw       Second string to compare
+ *
+ * @return     0 if no match
+ *             1 if only the part number matches and not the manufacturer
+ *             2 if both the part number and manufacturer match
+ */
+int cvmx_fdt_compat_match(const char *s1, const char *s2);
+
+/**
+ * Returns whether a list of strings contains the specified string
+ *
+ * @param[in]  slist   String list
+ * @param      llen    string list total length
+ * @param[in]  str     string to search for
+ *
+ * @return     1 if string list contains string, 0 if it does not.
+ */
+int cvmx_fdt_compat_list_contains(const char *slist, int llen, const char *str);
+
+/**
+ * Check if a node is compatible with the specified compat string
+ *
+ * @param[in]  fdt_addr        FDT address
+ * @param      node            node offset to check
+ * @param[in]  compat          compatible string to check
+ *
+ * @return     0 if compatible, 1 if not compatible, error if negative
+ */
+int cvmx_fdt_node_check_compatible(const void *fdt_addr, int node, const char *compat);
+
+/**
+ * @INTERNAL
+ * Compares a string to a compatible field.
+ *
+ * @param[in]  compat          compatible string
+ * @param[in]  str             string to check
+ *
+ * @return     0 if not compatible, 1 if manufacturer compatible, 2 if
+ *             part is compatible, 3 if both part and manufacturer are
+ *             compatible.
+ */
+int __cvmx_fdt_compat_match(const char *compat, const char *str);
+
+/**
+ * Given a phandle to a GPIO device return the type of GPIO device it is.
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ * @param      phandle         phandle to GPIO
+ * @param[out] size            Number of pins (optional, may be NULL)
+ *
+ * @return     Type of GPIO device or PIN_ERROR if error
+ */
+enum cvmx_gpio_type cvmx_fdt_get_gpio_type(const void *fdt_addr, int phandle, int *size);
+
+/**
+ * Given a phandle to a GPIO node output the i2c bus and address
+ *
+ * @param[in]  fdt_addr        Address of FDT
+ * @param      phandle         phandle of GPIO device
+ * @param[out] bus             TWSI bus number with node in bits 1-3, can be
+ *                             NULL for none.
+ * @param[out] addr            TWSI address number, can be NULL for none
+ *
+ * @return     0 for success, error otherwise
+ */
+int cvmx_fdt_get_twsi_gpio_bus_addr(const void *fdt_addr, int phandle, int *bus, int *addr);
+
+/**
+ * Given a FDT node return the CPU node number
+ *
+ * @param[in]  fdt_addr        Address of FDT
+ * @param      node            FDT node number
+ *
+ * @return     CPU node number or error if negative
+ */
+int cvmx_fdt_get_cpu_node(const void *fdt_addr, int node);
+
+/**
+ * Get the total size of the flat device tree
+ *
+ * @param[in]  fdt_addr        Address of FDT
+ *
+ * @return     Size of flat device tree in bytes or -1 if error.
+ */
+int cvmx_fdt_get_fdt_size(const void *fdt_addr);
+
+/**
+ * Returns if a node is compatible with one of the items in the string list
+ *
+ * @param[in]  fdt_addr        Pointer to flat device tree
+ * @param      node            Node offset to check
+ * @param[in]  strlist         Array of FDT device compatibility strings,
+ *                             must end with NULL or empty string.
+ *
+ * @return     0 if at least one item matches, 1 if no matches
+ */
+int cvmx_fdt_node_check_compatible_list(const void *fdt_addr, int node, const char *const *strlist);
+
+/**
+ * Given a FDT node, return the next compatible node.
+ *
+ * @param[in]  fdt_addr        Pointer to flat device tree
+ * @param      start_offset    Starting node offset or -1 to find the first
+ * @param      strlist         Array of FDT device compatibility strings, must
+ *                             end with NULL or empty string.
+ *
+ * @return     next matching node or -1 if no more matches.
+ */
+int cvmx_fdt_node_offset_by_compatible_list(const void *fdt_addr, int startoffset,
+                                           const char *const *strlist);
+
+/**
+ * Given the parent offset of an i2c device build up a list describing the bus
+ * which can contain i2c muxes and switches.
+ *
+ * @param[in]  fdt_addr        address of device tree
+ * @param      of_offset       Offset of the parent node of a GPIO device in
+ *                             the device tree.
+ *
+ * @return     pointer to list of i2c devices starting from the root which
+ *             can include i2c muxes and switches or NULL if error.  Note that
+ *             all entries are allocated on the heap.
+ *
+ * @see cvmx_fdt_free_i2c_bus()
+ */
+struct cvmx_fdt_i2c_bus_info *cvmx_fdt_get_i2c_bus(const void *fdt_addr, int of_offset);
+
+/**
+ * Return the Octeon bus number for a bus descriptor
+ *
+ * @param[in]  bus     bus descriptor
+ *
+ * @return     Octeon twsi bus number or -1 on error
+ */
+int cvmx_fdt_i2c_get_root_bus(const struct cvmx_fdt_i2c_bus_info *bus);
+
+/**
+ * Frees all entries for an i2c bus descriptor
+ *
+ * @param      bus     bus to free
+ *
+ * @return     0
+ */
+int cvmx_fdt_free_i2c_bus(struct cvmx_fdt_i2c_bus_info *bus);
+
+/**
+ * Given the bus to a device, enable it.
+ *
+ * @param[in]  bus     i2c bus descriptor to enable or disable
+ * @param      enable  set to true to enable, false to disable
+ *
+ * @return     0 for success or -1 for invalid bus
+ *
+ * This enables the entire bus including muxes and switches in the path.
+ */
+int cvmx_fdt_enable_i2c_bus(const struct cvmx_fdt_i2c_bus_info *bus, bool enable);
+
+/**
+ * Return a GPIO handle given a GPIO phandle of the form <&gpio pin flags>
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ * @param      of_offset       node offset for property
+ * @param      prop_name       name of property
+ *
+ * @return     pointer to GPIO handle or NULL if error
+ */
+struct cvmx_fdt_gpio_info *cvmx_fdt_gpio_get_info_phandle(const void *fdt_addr, int of_offset,
+                                                         const char *prop_name);
+
+/**
+ * Sets a GPIO pin given the GPIO descriptor
+ *
+ * @param      pin     GPIO pin descriptor
+ * @param      value   value to set it to, 0 or 1
+ *
+ * @return     0 on success, -1 on error.
+ *
+ * NOTE: If the CVMX_GPIO_ACTIVE_LOW flag is set then the output value will be
+ * inverted.
+ */
+int cvmx_fdt_gpio_set(struct cvmx_fdt_gpio_info *pin, int value);
+
+/**
+ * Given a GPIO pin descriptor, input the value of that pin
+ *
+ * @param      pin     GPIO pin descriptor
+ *
+ * @return     0 if low, 1 if high, -1 on error.  Note that the input will be
+ *             inverted if the CVMX_GPIO_ACTIVE_LOW flag bit is set.
+ */
+int cvmx_fdt_gpio_get(struct cvmx_fdt_gpio_info *pin);
+
+/**
+ * Assigns an IPD port to a SFP slot
+ *
+ * @param      sfp             Handle to SFP data structure
+ * @param      ipd_port        Port to assign it to
+ *
+ * @return     0 for success, -1 on error
+ */
+int cvmx_sfp_set_ipd_port(struct cvmx_fdt_sfp_info *sfp, int ipd_port);
+
+/**
+ * Get the IPD port of a SFP slot
+ *
+ * @param[in]  sfp             Handle to SFP data structure
+ *
+ * @return     IPD port number for SFP slot
+ */
+static inline int cvmx_sfp_get_ipd_port(const struct cvmx_fdt_sfp_info *sfp)
+{
+       return sfp->ipd_port[0];
+}
+
+/**
+ * Get the IPD ports for a QSFP port
+ *
+ * @param[in]  sfp             Handle to SFP data structure
+ * @param[out] ipd_ports       IPD ports for each lane, if running as 40G then
+ *                             only ipd_ports[0] is valid and the others will
+ *                             be set to -1.
+ */
+static inline void cvmx_qsfp_get_ipd_ports(const struct cvmx_fdt_sfp_info *sfp, int ipd_ports[4])
+{
+       int i;
+
+       for (i = 0; i < 4; i++)
+               ipd_ports[i] = sfp->ipd_port[i];
+}
+
+/**
+ * Attaches a PHY to a SFP or QSFP.
+ *
+ * @param      sfp             sfp to attach PHY to
+ * @param      phy_info        phy descriptor to attach or NULL to detach
+ */
+void cvmx_sfp_attach_phy(struct cvmx_fdt_sfp_info *sfp, struct cvmx_phy_info *phy_info);
+
+/**
+ * Returns a phy descriptor for a SFP slot
+ *
+ * @param[in]  sfp     SFP to get phy info from
+ *
+ * @return     phy descriptor or NULL if none.
+ */
+static inline struct cvmx_phy_info *cvmx_sfp_get_phy_info(const struct cvmx_fdt_sfp_info *sfp)
+{
+       return sfp->phy_info;
+}
+
+/**
+ * @INTERNAL
+ * Parses all instances of the Vitesse VSC7224 reclocking chip
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ *
+ * @return     0 for success, error otherwise
+ */
+int __cvmx_fdt_parse_vsc7224(const void *fdt_addr);
+
+/**
+ * @INTERNAL
+ * Parses all instances of the Avago AVSP5410 gearbox phy
+ *
+ * @param[in]   fdt_addr        Address of flat device tree
+ *
+ * @return      0 for success, error otherwise
+ */
+int __cvmx_fdt_parse_avsp5410(const void *fdt_addr);
+
+/**
+ * Parse SFP information from device tree
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ *
+ * @return pointer to sfp info or NULL if error
+ */
+struct cvmx_fdt_sfp_info *cvmx_helper_fdt_parse_sfp_info(const void *fdt_addr, int of_offset);
+
+/**
+ * @INTERNAL
+ * Parses either a CS4343 phy or a slice of the phy from the device tree
+ * @param[in]  fdt_addr        Address of FDT
+ * @param      of_offset       offset of slice or phy in device tree
+ * @param      phy_info        phy_info data structure to fill in
+ *
+ * @return     0 for success, -1 on error
+ */
+int cvmx_fdt_parse_cs4343(const void *fdt_addr, int of_offset, struct cvmx_phy_info *phy_info);
+
+/**
+ * Given an i2c bus and device address, write an 8 bit value
+ *
+ * @param bus  i2c bus number
+ * @param addr i2c device address (7 bits)
+ * @param val  8-bit value to write
+ *
+ * This is just an abstraction to ease support in both U-Boot and SE.
+ */
+void cvmx_fdt_i2c_reg_write(int bus, int addr, u8 val);
+
+/**
+ * Read an 8-bit value from an i2c bus and device address
+ *
+ * @param bus  i2c bus number
+ * @param addr i2c device address (7 bits)
+ *
+ * @return 8-bit value or error if negative
+ */
+int cvmx_fdt_i2c_reg_read(int bus, int addr);
+
+/**
+ * Write an 8-bit value to a register indexed i2c device
+ *
+ * @param bus  i2c bus number to write to
+ * @param addr i2c device address (7 bits)
+ * @param reg  i2c 8-bit register address
+ * @param val  8-bit value to write
+ *
+ * @return 0 for success, otherwise error
+ */
+int cvmx_fdt_i2c_write8(int bus, int addr, int reg, u8 val);
+
+/**
+ * Read an 8-bit value from a register indexed i2c device
+ *
+ * @param bus  i2c bus number to write to
+ * @param addr i2c device address (7 bits)
+ * @param reg  i2c 8-bit register address
+ *
+ * @return value or error if negative
+ */
+int cvmx_fdt_i2c_read8(int bus, int addr, int reg);
+
+int cvmx_sfp_vsc7224_mod_abs_changed(struct cvmx_fdt_sfp_info *sfp_info,
+                                    int val, void *data);
+int cvmx_sfp_avsp5410_mod_abs_changed(struct cvmx_fdt_sfp_info *sfp_info,
+                                     int val, void *data);
+
+#endif /* CVMX_HELPER_FDT_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-fpa.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-fpa.h
new file mode 100644 (file)
index 0000000..8b3a89b
--- /dev/null
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper functions for FPA setup.
+ */
+
+#ifndef __CVMX_HELPER_H_FPA__
+#define __CVMX_HELPER_H_FPA__
+
+/**
+ * Allocate memory and initialize the FPA pools using memory
+ * from cvmx-bootmem. Sizes of each element in the pools is
+ * controlled by the cvmx-config.h header file. Specifying
+ * zero for any parameter will cause that FPA pool to not be
+ * setup. This is useful if you aren't using some of the
+ * hardware and want to save memory.
+ *
+ * @param packet_buffers
+ *               Number of packet buffers to allocate
+ * @param work_queue_entries
+ *               Number of work queue entries
+ * @param pko_buffers
+ *               PKO Command buffers. You should at minimum have two per
+ *               each PKO queue.
+ * @param tim_buffers
+ *               TIM ring buffer command queues. At least two per timer bucket
+ *               is recommended.
+ * @param dfa_buffers
+ *               DFA command buffer. A relatively small (32 for example)
+ *               number should work.
+ * @return Zero on success, non-zero if out of memory
+ */
+int cvmx_helper_initialize_fpa(int packet_buffers, int work_queue_entries, int pko_buffers,
+                              int tim_buffers, int dfa_buffers);
+
+int __cvmx_helper_initialize_fpa_pool(int pool, u64 buffer_size, u64 buffers, const char *name);
+
+int cvmx_helper_shutdown_fpa_pools(int node);
+
+void cvmx_helper_fpa_dump(int node);
+
+#endif /* __CVMX_HELPER_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-gpio.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-gpio.h
new file mode 100644 (file)
index 0000000..787eccf
--- /dev/null
@@ -0,0 +1,427 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Defines some GPIO information used in multiple places
+ */
+
+#ifndef __CVMX_HELPER_GPIO_H__
+#define __CVMX_HELPER_GPIO_H__
+
+#define CVMX_GPIO_NAME_LEN 32 /** Length of name */
+
+enum cvmx_gpio_type {
+       CVMX_GPIO_PIN_OCTEON,  /** GPIO pin is directly connected to OCTEON */
+       CVMX_GPIO_PIN_PCA953X, /** GPIO pin is NXP PCA953X compat chip */
+       CVMX_GPIO_PIN_PCA957X,
+       CVMX_GPIO_PIN_PCF857X, /** GPIO pin is NXP PCF857X compat chip */
+       CVMX_GPIO_PIN_PCA9698, /** GPIO pin is NXP PCA9698 compat chip */
+       CVMX_GPIO_PIN_CS4343,  /** Inphi/Cortina CS4343 GPIO pins */
+       CVMX_GPIO_PIN_OTHER,   /** GPIO pin is something else */
+};
+
+enum cvmx_gpio_operation {
+       CVMX_GPIO_OP_CONFIG,      /** Initial configuration of the GPIO pin */
+       CVMX_GPIO_OP_SET,         /** Set pin */
+       CVMX_GPIO_OP_CLEAR,       /** Clear pin */
+       CVMX_GPIO_OP_READ,        /** Read pin */
+       CVMX_GPIO_OP_TOGGLE,      /** Toggle pin */
+       CVMX_GPIO_OP_BLINK_START, /** Put in blink mode (if supported) */
+       CVMX_GPIO_OP_BLINK_STOP,  /** Takes the pin out of blink mode */
+       CVMX_GPIO_OP_SET_LINK,    /** Put in link monitoring mode */
+       CVMX_GPIO_OP_SET_ACT,     /** Put in RX activity mode */
+};
+
+/**
+ * Inphi CS4343 output source select values for the GPIO_GPIOX output_src_sel.
+ */
+enum cvmx_inphi_cs4343_gpio_gpio_output_src_sel {
+       GPIO_SEL_DRIVE = 0,     /** Value of GPIOX_DRIVE */
+       GPIO_SEL_DELAY = 1,     /** Drive delayed */
+       GPIO_SEL_TOGGLE = 2,    /** Used for blinking */
+       GPIO_SEL_EXT = 3,       /** External function */
+       GPIO_SEL_EXT_DELAY = 4, /** External function delayed */
+};
+
+/** Inphi GPIO_GPIOX configuration register */
+union cvmx_inphi_cs4343_gpio_cfg_reg {
+       u16 u;
+       struct {
+u16: 4;
+               /** Data source for the GPIO output */
+               u16 output_src_sel : 3;
+               /** 1 = GPIO output is inverted before being output */
+               u16 invert_output : 1;
+               /** 1 = GPIO input is inverted before being processed */
+               u16 invert_input : 1;
+               /** 0 = 2.5v/1.8v signalling, 1 = 1.2v signalling */
+               u16 iovddsel_1v2 : 1;
+               /**
+                * 0 = output selected by outen bit
+                * 1 = output controlled by selected GPIO output source
+                */
+               u16 outen_ovr : 1;
+               /** 0 = GPIO is input only, 1 = GPIO output driver enabled */
+               u16 outen : 1;
+u16: 2;
+               u16 pullup_1k;  /** 1 = enable 1K pad pullup */
+               u16 pullup_10k; /** 1 = enable 10K pad pullup */
+       } s;
+};
+
+#define CVMX_INPHI_CS4343_GPIO_CFG_OFFSET 0x0
+
+/**
+ * This selects which port the GPIO gets its signals from when configured
+ * as an output.
+ */
+enum cvmx_inphi_cs4343_gpio_output_cfg_port {
+       PORT_0_HOST_RX = 0, /** Port pair 0 host RX */
+       PORT_0_LINE_RX = 1, /** Port pair 0 line RX */
+       PORT_1_HOST_RX = 2, /** Port pair 1 host RX */
+       PORT_1_LINE_RX = 3, /** Port pair 1 line RX */
+       PORT_3_HOST_RX = 4, /** Port pair 3 host RX */
+       PORT_3_LINE_RX = 5, /** Port pair 3 line RX */
+       PORT_2_HOST_RX = 6, /** Port pair 2 host RX */
+       PORT_2_LINE_RX = 7, /** Port pair 2 line RX */
+       COMMON = 8,         /** Common */
+};
+
+enum cvmx_inphi_cs4343_gpio_output_cfg_function {
+       RX_LOS = 0,        /** Port - 1 = Receive LOS (from DSP) */
+       RX_LOL = 1,        /** Port - 1 = Receive LOL (inverted from MSEQ) */
+       EDC_CONVERGED = 2, /** Port - 1 = EDC converged (from DSP) */
+       /** Port - 1 = PRBS checker in sync (inverted from SDS) */
+       RX_PRBS_SYNC = 3,
+       COMMON_LOGIC_0 = 0,      /** Common - Logic 0 */
+       COMMON_GPIO1_INPUT = 1,  /** Common - GPIO 1 input */
+       COMMON_GPIO2_INPUT = 2,  /** Common - GPIO 2 input */
+       COMMON_GPIO3_INPUT = 3,  /** Common - GPIO 3 input */
+       COMMON_GPIO4_INPUT = 4,  /** Common - GPIO 4 input */
+       COMMON_INTERR_INPUT = 5, /** Common - INTERR input */
+       /** Common - Interrupt output from GLOBAL_INT register */
+       COMMON_GLOBAL_INT = 6,
+       /** Common - Interrupt output from GPIO_INT register */
+       COMMON_GPIO_INT = 7,
+       /** Common - Temp/voltage monitor interrupt */
+       COMMON_MONITOR_INT = 8,
+       /** Common - Selected clock output of global clock monitor */
+       COMMON_GBL_CLKMON_CLK = 9,
+};
+
+union cvmx_inphi_cs4343_gpio_output_cfg {
+       u16 u;
+       struct {
+u16: 8;
+               u16 port : 4;     /** port */
+               u16 function : 4; /** function */
+       } s;
+};
+
+#define CVMX_INPHI_CS4343_GPIO_OUTPUT_CFG_OFFSET 0x1
+
+union cvmx_inphi_cs4343_gpio_drive {
+       u16 u;
+       struct {
+u16: 15;
+               u16 value : 1; /** output value */
+       } s;
+};
+
+#define CVMX_INPHI_CS4343_GPIO_DRIVE_OFFSET 0x2
+
+union cvmx_inphi_cs4343_gpio_value {
+       u16 u;
+       struct {
+u16: 15;
+               u16 value : 1; /** input value (read-only) */
+       } s;
+};
+
+#define CVMX_INPHI_CS4343_GPIO_VALUE_OFFSET 0x3
+
+union cvmx_inphi_cs4343_gpio_toggle {
+       u16 u;
+       struct {
+               /** Toggle rate in ms, multiply by 2 to get period in ms */
+               u16 rate : 16;
+       } s;
+};
+
+#define CVMX_INPHI_CS4343_GPIO_TOGGLE_OFFSET 0x4
+
+union cvmx_inphi_cs4343_gpio_delay {
+       u16 u;
+       struct {
+               /** On delay for GPIO output in ms when enabled */
+               u16 on_delay : 16;
+       } s;
+};
+
+#define CVMX_INPHI_CS4343_GPIO_DELAY_OFFSET 0x5
+
+/**
+ * GPIO flags associated with a GPIO pin (can be combined)
+ */
+enum cvmx_gpio_flags {
+       CVMX_GPIO_ACTIVE_HIGH = 0,    /** Active high (default) */
+       CVMX_GPIO_ACTIVE_LOW = 1,     /** Active low (inverted) */
+       CVMX_GPIO_OPEN_COLLECTOR = 2, /** Output is open-collector */
+};
+
+/** Default timer number to use for outputting a frequency [0..3] */
+#define CVMX_GPIO_DEFAULT_TIMER 3
+
+/** Configuration data for native Octeon GPIO pins */
+struct cvmx_octeon_gpio_data {
+       int cpu_node; /** CPU node for GPIO pin */
+       int timer;    /** Timer number used when in toggle mode, 0-3 */
+};
+
+struct cvmx_pcf857x_gpio_data {
+       unsigned int latch_out;
+};
+
+#define CVMX_INPHI_CS4343_EFUSE_PDF_SKU_REG 0x19f
+#define CVMX_INPHI_CS4343_SKU_CS4223       0x10
+#define CVMX_INPHI_CS4343_SKU_CS4224       0x11
+#define CVMX_INPHI_CS4343_SKU_CS4343       0x12
+#define CVMX_INPHI_CS4343_SKU_CS4221       0x13
+#define CVMX_INPHI_CS4343_SKU_CS4227       0x14
+#define CVMX_INPHI_CS4343_SKU_CS4341       0x16
+
+struct cvmx_cs4343_gpio_data {
+       int reg_offset; /** Base register address for GPIO */
+       enum cvmx_gpio_operation last_op;
+       u8 link_port; /** Link port number for link status */
+       u16 sku;      /** Value from CS4224_EFUSE_PDF_SKU register */
+       u8 out_src_sel;
+       u8 field_func;
+       bool out_en;
+       bool is_cs4343; /** True if dual package */
+       struct phy_device *phydev;
+};
+
+struct cvmx_fdt_gpio_info;
+
+/** Function called for GPIO operations */
+typedef int (*cvmx_fdt_gpio_op_func_t)(struct cvmx_fdt_gpio_info *, enum cvmx_gpio_operation);
+
+/**
+ * GPIO descriptor
+ */
+struct cvmx_fdt_gpio_info {
+       struct cvmx_fdt_gpio_info *next; /** For list of GPIOs */
+       char name[CVMX_GPIO_NAME_LEN];   /** Name of GPIO */
+       int pin;                         /** GPIO pin number */
+       enum cvmx_gpio_type gpio_type;   /** Type of GPIO controller */
+       int of_offset;                   /** Offset in device tree */
+       int phandle;
+       struct cvmx_fdt_i2c_bus_info *i2c_bus; /** I2C bus descriptor */
+       int i2c_addr;                          /** Address on i2c bus */
+       enum cvmx_gpio_flags flags;            /** Flags associated with pin */
+       int num_pins;                          /** Total number of pins */
+       unsigned int latch_out;                /** Latched output for 857x */
+       /** Rate in ms between toggle states */
+       int toggle_rate;
+       /** Pointer to user data for user-defined functions */
+       void *data;
+       /** Function to set, clear, toggle, etc. */
+       cvmx_fdt_gpio_op_func_t op_func;
+       /* Two values are used to detect the initial case where nothing has
+        * been configured.  Initially, all of the following will be false
+        * which will force the initial state to be properly set.
+        */
+       /** True if the GPIO pin is currently set, useful for toggle */
+       bool is_set;
+       /** Set if configured to invert */
+       bool invert_set;
+       /** Set if input is to be inverted */
+       bool invert_input;
+       /** Set if direction is configured as output */
+       bool dir_out;
+       /** Set if direction is configured as input */
+       bool dir_in;
+       /** Pin is set to toggle periodically */
+       bool toggle;
+       /** True if LED is used to indicate link status */
+       bool link_led;
+       /** True if LED is used to indicate rx activity */
+       bool rx_act_led;
+       /** True if LED is used to indicate tx activity */
+       bool tx_act_led;
+       /** True if LED is used to indicate networking errors */
+       bool error_led;
+       /** True if LED can automatically show link */
+       bool hw_link;
+};
+
+/** LED datastructure */
+struct cvmx_fdt_gpio_led {
+       struct cvmx_fdt_gpio_led *next, *prev; /** List of LEDs */
+       char name[CVMX_GPIO_NAME_LEN];         /** Name */
+       struct cvmx_fdt_gpio_info *gpio;       /** GPIO for LED */
+       int of_offset;                         /** Device tree node */
+       /** True if active low, note that GPIO contains this info */
+       bool active_low;
+};
+
+/**
+ * Returns the operation function for the GPIO phandle
+ *
+ * @param[in]  fdt_addr        Pointer to FDT
+ * @param      phandle         phandle of GPIO entry
+ *
+ * @return     Pointer to op function or NULL if not found.
+ */
+cvmx_fdt_gpio_op_func_t cvmx_fdt_gpio_get_op_func(const void *fdt_addr, int phandle);
+
+/**
+ * Given a phandle to a GPIO device return the type of GPIO device it is.
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ * @param      phandle         phandle to GPIO
+ * @param[out] size            Number of pins (optional, may be NULL)
+ *
+ * @return     Type of GPIO device or PIN_ERROR if error
+ */
+enum cvmx_gpio_type cvmx_fdt_get_gpio_type(const void *fdt_addr, int phandle, int *size);
+
+/**
+ * Return a GPIO handle given a GPIO phandle of the form <&gpio pin flags>
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ * @param      of_offset       node offset of GPIO device
+ * @param      prop_name       name of property
+ *
+ * @return     pointer to GPIO handle or NULL if error
+ */
+struct cvmx_fdt_gpio_info *cvmx_fdt_gpio_get_info(const void *fdt_addr, int of_offset,
+                                                 const char *prop_name);
+
+/**
+ * Return a GPIO handle given a GPIO phandle of the form <&gpio pin flags>
+ *
+ * @param[in]  fdt_addr        Address of flat device tree
+ * @param      of_offset       node offset for property
+ * @param      prop_name       name of property
+ *
+ * @return     pointer to GPIO handle or NULL if error
+ */
+struct cvmx_fdt_gpio_info *cvmx_fdt_gpio_get_info_phandle(const void *fdt_addr, int of_offset,
+                                                         const char *prop_name);
+
+/**
+ * Parses a GPIO entry and fills in the gpio info data structure
+ *
+ * @param[in]  fdt_addr        Address of FDT
+ * @param      phandle         phandle for GPIO
+ * @param      pin             pin number
+ * @param      flags           flags set (1 = invert)
+ * @param[out] gpio            GPIO info data structure
+ *
+ * @return     0 for success, -1 on error
+ */
+int cvmx_fdt_parse_gpio(const void *fdt_addr, int phandle, int pin, u32 flags,
+                       struct cvmx_fdt_gpio_info *gpio);
+
+/**
+ * @param      gpio    GPIO descriptor to assign timer to
+ * @param      timer   Octeon hardware timer number [0..3]
+ */
+void cvmx_fdt_gpio_set_timer(struct cvmx_fdt_gpio_info *gpio, int timer);
+
+/**
+ * Given a GPIO pin descriptor, input the value of that pin
+ *
+ * @param      pin     GPIO pin descriptor
+ *
+ * @return     0 if low, 1 if high, -1 on error.  Note that the input will be
+ *             inverted if the CVMX_GPIO_ACTIVE_LOW flag bit is set.
+ */
+int cvmx_fdt_gpio_get(struct cvmx_fdt_gpio_info *pin);
+
+/**
+ * Sets a GPIO pin given the GPIO descriptor
+ *
+ * @param      gpio    GPIO pin descriptor
+ * @param      value   value to set it to, 0 or 1
+ *
+ * @return     0 on success, -1 on error.
+ *
+ * NOTE: If the CVMX_GPIO_ACTIVE_LOW flag is set then the output value will be
+ * inverted.
+ */
+int cvmx_fdt_gpio_set(struct cvmx_fdt_gpio_info *gpio, int value);
+
+/**
+ * Sets the blink frequency for a GPIO pin
+ *
+ * @param gpio GPIO handle
+ * @param freq Frequency in hz [0..500]
+ */
+void cvmx_fdt_gpio_set_freq(struct cvmx_fdt_gpio_info *gpio, int freq);
+
+/**
+ * Enables or disables blinking a GPIO pin
+ *
+ * @param      gpio    GPIO handle
+ * @param      blink   True to start blinking, false to stop
+ *
+ * @return     0 for success, -1 on error
+ * NOTE: Not all GPIO types support blinking.
+ */
+int cvmx_fdt_gpio_set_blink(struct cvmx_fdt_gpio_info *gpio, bool blink);
+
+/**
+ * Alternates between link and blink mode
+ *
+ * @param      gpio    GPIO handle
+ * @param      blink   True to start blinking, false to use link status
+ *
+ * @return     0 for success, -1 on error
+ * NOTE: Not all GPIO types support this.
+ */
+int cvmx_fdt_gpio_set_link_blink(struct cvmx_fdt_gpio_info *gpio, bool blink);
+
+static inline bool cvmx_fdt_gpio_hw_link_supported(const struct cvmx_fdt_gpio_info *gpio)
+{
+       return gpio->hw_link;
+}
+
+/**
+ * Configures a GPIO pin as input or output
+ *
+ * @param      gpio    GPIO pin to configure
+ * @param      output  Set to true to make output, false for input
+ */
+void cvmx_fdt_gpio_set_output(struct cvmx_fdt_gpio_info *gpio, bool output);
+
+/**
+ * Allocates an LED data structure
+ * @param[in]  name            name to assign LED
+ * @param      of_offset       Device tree offset
+ * @param      gpio            GPIO assigned to LED (can be NULL)
+ * @param      last            Previous LED to build a list
+ *
+ * @return     pointer to LED data structure or NULL if out of memory
+ */
+struct cvmx_fdt_gpio_led *cvmx_alloc_led(const char *name, int of_offset,
+                                        struct cvmx_fdt_gpio_info *gpio,
+                                        struct cvmx_fdt_gpio_led *last);
+
+/**
+ * Parses an LED in the device tree
+ *
+ * @param[in]  fdt_addr                Pointer to flat device tree
+ * @param      led_of_offset           Device tree offset of LED
+ * @param      gpio                    GPIO data structure to use (can be NULL)
+ * @param      last                    Previous LED if this is a group of LEDs
+ *
+ * @return     Pointer to LED data structure or NULL if error
+ */
+struct cvmx_fdt_gpio_led *cvmx_fdt_parse_led(const void *fdt_addr, int led_of_offset,
+                                            struct cvmx_fdt_gpio_info *gpio,
+                                            struct cvmx_fdt_gpio_led *last);
+
+#endif /* __CVMX_HELPER_GPIO_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-ilk.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-ilk.h
new file mode 100644 (file)
index 0000000..29af48e
--- /dev/null
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for ILK initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_ILK_H__
+#define __CVMX_HELPER_ILK_H__
+
+int __cvmx_helper_ilk_enumerate(int interface);
+
+/**
+ * @INTERNAL
+ * Clear all calendar entries to the xoff state. This
+ * means no data is sent or received.
+ *
+ * @param interface Interface whose calendar are to be initialized.
+ */
+void __cvmx_ilk_clear_cal(int interface);
+
+/**
+ * @INTERNAL
+ * Setup the channel's tx calendar entry.
+ *
+ * @param interface Interface channel belongs to
+ * @param channel Channel whose calendar entry is to be updated
+ * @param bpid Bpid assigned to the channel
+ */
+void __cvmx_ilk_write_tx_cal_entry(int interface, int channel, unsigned char bpid);
+
+/**
+ * @INTERNAL
+ * Setup the channel's rx calendar entry.
+ *
+ * @param interface Interface channel belongs to
+ * @param channel Channel whose calendar entry is to be updated
+ * @param pipe PKO assigned to the channel
+ */
+void __cvmx_ilk_write_rx_cal_entry(int interface, int channel, unsigned char pipe);
+
+/**
+ * @INTERNAL
+ * Probe a ILK interface and determine the number of ports
+ * connected to it. The ILK interface should still be down after
+ * this call.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_ilk_probe(int xiface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a ILK interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_ilk_enable(int xiface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by ILK link status.
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_ilk_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_ilk_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+void __cvmx_helper_ilk_show_stats(void);
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-ipd.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-ipd.h
new file mode 100644 (file)
index 0000000..025743d
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper functions for IPD
+ */
+
+#ifndef __CVMX_HELPER_IPD_H__
+#define __CVMX_HELPER_IPD_H__
+
+void cvmx_helper_ipd_set_wqe_no_ptr_mode(bool mode);
+void cvmx_helper_ipd_pkt_wqe_le_mode(bool mode);
+int __cvmx_helper_ipd_global_setup(void);
+int __cvmx_helper_ipd_setup_interface(int interface);
+
+#endif /* __CVMX_HELPER_PKI_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-jtag.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-jtag.h
new file mode 100644 (file)
index 0000000..fa379ea
--- /dev/null
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ *  Helper utilities for qlm_jtag.
+ */
+
+#ifndef __CVMX_HELPER_JTAG_H__
+#define __CVMX_HELPER_JTAG_H__
+
+/**
+ * The JTAG chain for CN52XX and CN56XX is 4 * 268 bits long, or 1072.
+ * CN5XXX full chain shift is:
+ *     new data => lane 3 => lane 2 => lane 1 => lane 0 => data out
+ * The JTAG chain for CN63XX is 4 * 300 bits long, or 1200.
+ * The JTAG chain for CN68XX is 4 * 304 bits long, or 1216.
+ * The JTAG chain for CN66XX/CN61XX/CNF71XX is 4 * 304 bits long, or 1216.
+ * CN6XXX full chain shift is:
+ *     new data => lane 0 => lane 1 => lane 2 => lane 3 => data out
+ * Shift LSB first, get LSB out
+ */
+extern const __cvmx_qlm_jtag_field_t __cvmx_qlm_jtag_field_cn63xx[];
+extern const __cvmx_qlm_jtag_field_t __cvmx_qlm_jtag_field_cn66xx[];
+extern const __cvmx_qlm_jtag_field_t __cvmx_qlm_jtag_field_cn68xx[];
+
+#define CVMX_QLM_JTAG_UINT32 40
+
+typedef u32 qlm_jtag_uint32_t[CVMX_QLM_JTAG_UINT32 * 8];
+
+/**
+ * Initialize the internal QLM JTAG logic to allow programming
+ * of the JTAG chain by the cvmx_helper_qlm_jtag_*() functions.
+ * These functions should only be used at the direction of Cavium
+ * Networks. Programming incorrect values into the JTAG chain
+ * can cause chip damage.
+ */
+void cvmx_helper_qlm_jtag_init(void);
+
+/**
+ * Write up to 32bits into the QLM jtag chain. Bits are shifted
+ * into the MSB and out the LSB, so you should shift in the low
+ * order bits followed by the high order bits. The JTAG chain for
+ * CN52XX and CN56XX is 4 * 268 bits long, or 1072. The JTAG chain
+ * for CN63XX is 4 * 300 bits long, or 1200.
+ *
+ * @param qlm    QLM to shift value into
+ * @param bits   Number of bits to shift in (1-32).
+ * @param data   Data to shift in. Bit 0 enters the chain first, followed by
+ *               bit 1, etc.
+ *
+ * @return The low order bits of the JTAG chain that shifted out of the
+ *         circle.
+ */
+u32 cvmx_helper_qlm_jtag_shift(int qlm, int bits, u32 data);
+
+/**
+ * Shift long sequences of zeros into the QLM JTAG chain. It is
+ * common to need to shift more than 32 bits of zeros into the
+ * chain. This function is a convience wrapper around
+ * cvmx_helper_qlm_jtag_shift() to shift more than 32 bits of
+ * zeros at a time.
+ *
+ * @param qlm    QLM to shift zeros into
+ * @param bits
+ */
+void cvmx_helper_qlm_jtag_shift_zeros(int qlm, int bits);
+
+/**
+ * Program the QLM JTAG chain into all lanes of the QLM. You must
+ * have already shifted in the proper number of bits into the
+ * JTAG chain. Updating invalid values can possibly cause chip damage.
+ *
+ * @param qlm    QLM to program
+ */
+void cvmx_helper_qlm_jtag_update(int qlm);
+
+/**
+ * Load the QLM JTAG chain with data from all lanes of the QLM.
+ *
+ * @param qlm    QLM to program
+ */
+void cvmx_helper_qlm_jtag_capture(int qlm);
+
+#endif /* __CVMX_HELPER_JTAG_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-loop.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-loop.h
new file mode 100644 (file)
index 0000000..defd955
--- /dev/null
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for LOOP initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_LOOP_H__
+#define __CVMX_HELPER_LOOP_H__
+
+/**
+ * @INTERNAL
+ * Probe a LOOP interface and determine the number of ports
+ * connected to it. The LOOP interface should still be down after
+ * this call.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_loop_probe(int xiface);
+int __cvmx_helper_loop_enumerate(int xiface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a LOOP interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_loop_enable(int xiface);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-npi.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-npi.h
new file mode 100644 (file)
index 0000000..6a600a0
--- /dev/null
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for NPI initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_NPI_H__
+#define __CVMX_HELPER_NPI_H__
+
+/**
+ * @INTERNAL
+ * Probe a NPI interface and determine the number of ports
+ * connected to it. The NPI interface should still be down after
+ * this call.
+ *
+ * @param interface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_npi_probe(int interface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a NPI interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_npi_enable(int xiface);
+
+/**
+ * Sets the number of pipe used by SLI packet output in the variable,
+ * which then later used for setting it up in HW
+ */
+void cvmx_npi_config_set_num_pipes(int num_pipes);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-pki.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-pki.h
new file mode 100644 (file)
index 0000000..f5933f2
--- /dev/null
@@ -0,0 +1,319 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper functions for PKI
+ */
+
+#ifndef __CVMX_HELPER_PKI_H__
+#define __CVMX_HELPER_PKI_H__
+
+#include "cvmx-pki.h"
+
+/* Modify this if more than 8 ilk channels need to be supported */
+#define CVMX_MAX_PORT_PER_INTERFACE  64
+#define CVMX_MAX_QOS_PRIORITY       64
+#define CVMX_PKI_FIND_AVAILABLE_RSRC (-1)
+
+struct cvmx_pki_qos_schd {
+       cvmx_fpa3_gaura_t _aura;
+       cvmx_fpa3_pool_t _pool;
+       bool pool_per_qos;
+       int pool_num;
+       char *pool_name;
+       u64 pool_buff_size;
+       u64 pool_max_buff;
+       bool aura_per_qos;
+       int aura_num;
+       char *aura_name;
+       u64 aura_buff_cnt;
+       bool sso_grp_per_qos;
+       int sso_grp;
+       u16 port_add;
+       int qpg_base;
+};
+
+struct cvmx_pki_prt_schd {
+       cvmx_fpa3_pool_t _pool;
+       cvmx_fpa3_gaura_t _aura;
+       bool cfg_port;
+       int style;
+       bool pool_per_prt;
+       int pool_num;
+       char *pool_name;
+       u64 pool_buff_size;
+       u64 pool_max_buff;
+       bool aura_per_prt;
+       int aura_num;
+       char *aura_name;
+       u64 aura_buff_cnt;
+       bool sso_grp_per_prt;
+       int sso_grp;
+       enum cvmx_pki_qpg_qos qpg_qos;
+       int qpg_base;
+       struct cvmx_pki_qos_schd qos_s[CVMX_MAX_QOS_PRIORITY];
+};
+
+struct cvmx_pki_intf_schd {
+       cvmx_fpa3_pool_t _pool;
+       cvmx_fpa3_gaura_t _aura;
+       bool style_per_intf;
+       int style;
+       bool pool_per_intf;
+       int pool_num;
+       char *pool_name;
+       u64 pool_buff_size;
+       u64 pool_max_buff;
+       bool aura_per_intf;
+       int aura_num;
+       char *aura_name;
+       u64 aura_buff_cnt;
+       bool sso_grp_per_intf;
+       int sso_grp;
+       bool qos_share_aura;
+       bool qos_share_grp;
+       int qpg_base;
+       struct cvmx_pki_prt_schd prt_s[CVMX_MAX_PORT_PER_INTERFACE];
+};
+
+struct cvmx_pki_global_schd {
+       bool setup_pool;
+       int pool_num;
+       char *pool_name;
+       u64 pool_buff_size;
+       u64 pool_max_buff;
+       bool setup_aura;
+       int aura_num;
+       char *aura_name;
+       u64 aura_buff_cnt;
+       bool setup_sso_grp;
+       int sso_grp;
+       cvmx_fpa3_pool_t _pool;
+       cvmx_fpa3_gaura_t _aura;
+};
+
+struct cvmx_pki_legacy_qos_watcher {
+       bool configured;
+       enum cvmx_pki_term field;
+       u32 data;
+       u32 data_mask;
+       u8 advance;
+       u8 sso_grp;
+};
+
+extern bool cvmx_pki_dflt_init[CVMX_MAX_NODES];
+
+extern struct cvmx_pki_pool_config pki_dflt_pool[CVMX_MAX_NODES];
+extern struct cvmx_pki_aura_config pki_dflt_aura[CVMX_MAX_NODES];
+extern struct cvmx_pki_style_config pki_dflt_style[CVMX_MAX_NODES];
+extern struct cvmx_pki_pkind_config pki_dflt_pkind[CVMX_MAX_NODES];
+extern u64 pkind_style_map[CVMX_MAX_NODES][CVMX_PKI_NUM_PKIND];
+extern struct cvmx_pki_sso_grp_config pki_dflt_sso_grp[CVMX_MAX_NODES];
+extern struct cvmx_pki_legacy_qos_watcher qos_watcher[8];
+
+/**
+ * This function Enabled the PKI hardware to
+ * start accepting/processing packets.
+ * @param node    node number
+ */
+void cvmx_helper_pki_enable(int node);
+
+/**
+ * This function frees up PKI resources consumed by that port.
+ * This function should only be called if port resources
+ * (fpa pools aura, style qpg entry pcam entry etc.) are not shared
+ * @param xipd_port     ipd port number for which resources need to
+ *                      be freed.
+ */
+int cvmx_helper_pki_port_shutdown(int xipd_port);
+
+/**
+ * This function shuts down complete PKI hardware
+ * and software resources.
+ * @param node          node number where PKI needs to shutdown.
+ */
+void cvmx_helper_pki_shutdown(int node);
+
+/**
+ * This function calculates how mant qpf entries will be needed for
+ * a particular QOS.
+ * @param qpg_qos       qos value for which entries need to be calculated.
+ */
+int cvmx_helper_pki_get_num_qpg_entry(enum cvmx_pki_qpg_qos qpg_qos);
+
+/**
+ * This function setups the qos table by allocating qpg entry and writing
+ * the provided parameters to that entry (offset).
+ * @param node          node number.
+ * @param qpg_cfg       pointer to struct containing qpg configuration
+ */
+int cvmx_helper_pki_set_qpg_entry(int node, struct cvmx_pki_qpg_config *qpg_cfg);
+
+/**
+ * This function sets up aura QOS for RED, backpressure and tail-drop.
+ *
+ * @param node       node number.
+ * @param aura       aura to configure.
+ * @param ena_red       enable RED based on [DROP] and [PASS] levels
+ *                     1: enable 0:disable
+ * @param pass_thresh   pass threshold for RED.
+ * @param drop_thresh   drop threshold for RED
+ * @param ena_bp        enable backpressure based on [BP] level.
+ *                     1:enable 0:disable
+ * @param bp_thresh     backpressure threshold.
+ * @param ena_drop      enable tail drop.
+ *                     1:enable 0:disable
+ * @return Zero on success. Negative on failure
+ */
+int cvmx_helper_setup_aura_qos(int node, int aura, bool ena_red, bool ena_drop, u64 pass_thresh,
+                              u64 drop_thresh, bool ena_bp, u64 bp_thresh);
+
+/**
+ * This function maps specified bpid to all the auras from which it can receive bp and
+ * then maps that bpid to all the channels, that bpid can asserrt bp on.
+ *
+ * @param node          node number.
+ * @param aura          aura number which will back pressure specified bpid.
+ * @param bpid          bpid to map.
+ * @param chl_map       array of channels to map to that bpid.
+ * @param chl_cnt      number of channel/ports to map to that bpid.
+ * @return Zero on success. Negative on failure
+ */
+int cvmx_helper_pki_map_aura_chl_bpid(int node, u16 aura, u16 bpid, u16 chl_map[], u16 chl_cnt);
+
+/**
+ * This function sets up the global pool, aura and sso group
+ * resources which application can use between any interfaces
+ * and ports.
+ * @param node          node number
+ * @param gblsch        pointer to struct containing global
+ *                      scheduling parameters.
+ */
+int cvmx_helper_pki_set_gbl_schd(int node, struct cvmx_pki_global_schd *gblsch);
+
+/**
+ * This function sets up scheduling parameters (pool, aura, sso group etc)
+ * of an ipd port.
+ * @param xipd_port     ipd port number
+ * @param prtsch        pointer to struct containing port's
+ *                      scheduling parameters.
+ */
+int cvmx_helper_pki_init_port(int xipd_port, struct cvmx_pki_prt_schd *prtsch);
+
+/**
+ * This function sets up scheduling parameters (pool, aura, sso group etc)
+ * of an interface (all ports/channels on that interface).
+ * @param xiface        interface number with node.
+ * @param intfsch      pointer to struct containing interface
+ *                      scheduling parameters.
+ * @param gblsch       pointer to struct containing global scheduling parameters
+ *                      (can be NULL if not used)
+ */
+int cvmx_helper_pki_init_interface(const int xiface, struct cvmx_pki_intf_schd *intfsch,
+                                  struct cvmx_pki_global_schd *gblsch);
+/**
+ * This function gets all the PKI parameters related to that
+ * particular port from hardware.
+ * @param xipd_port     ipd port number to get parameter of
+ * @param port_cfg      pointer to structure where to store read parameters
+ */
+void cvmx_pki_get_port_config(int xipd_port, struct cvmx_pki_port_config *port_cfg);
+
+/**
+ * This function sets all the PKI parameters related to that
+ * particular port in hardware.
+ * @param xipd_port     ipd port number to get parameter of
+ * @param port_cfg      pointer to structure containing port parameters
+ */
+void cvmx_pki_set_port_config(int xipd_port, struct cvmx_pki_port_config *port_cfg);
+
+/**
+ * This function displays all the PKI parameters related to that
+ * particular port.
+ * @param xipd_port      ipd port number to display parameter of
+ */
+void cvmx_pki_show_port_config(int xipd_port);
+
+/**
+ * Modifies maximum frame length to check.
+ * It modifies the global frame length set used by this port, any other
+ * port using the same set will get affected too.
+ * @param xipd_port    ipd port for which to modify max len.
+ * @param max_size     maximum frame length
+ */
+void cvmx_pki_set_max_frm_len(int xipd_port, u32 max_size);
+
+/**
+ * This function sets up all the ports of particular interface
+ * for chosen fcs mode. (only use for backward compatibility).
+ * New application can control it via init_interface calls.
+ * @param node          node number.
+ * @param interface     interface number.
+ * @param nports        number of ports
+ * @param has_fcs       1 -- enable fcs check and fcs strip.
+ *                      0 -- disable fcs check.
+ */
+void cvmx_helper_pki_set_fcs_op(int node, int interface, int nports, int has_fcs);
+
+/**
+ * This function sets the wqe buffer mode of all ports. First packet data buffer can reside
+ * either in same buffer as wqe OR it can go in separate buffer. If used the later mode,
+ * make sure software allocate enough buffers to now have wqe separate from packet data.
+ * @param node                 node number.
+ * @param pkt_outside_wqe      0 = The packet link pointer will be at word [FIRST_SKIP]
+ *                                 immediately followed by packet data, in the same buffer
+ *                                 as the work queue entry.
+ *                             1 = The packet link pointer will be at word [FIRST_SKIP] in a new
+ *                                 buffer separate from the work queue entry. Words following the
+ *                                 WQE in the same cache line will be zeroed, other lines in the
+ *                                 buffer will not be modified and will retain stale data (from the
+ *                                 buffer’s previous use). This setting may decrease the peak PKI
+ *                                 performance by up to half on small packets.
+ */
+void cvmx_helper_pki_set_wqe_mode(int node, bool pkt_outside_wqe);
+
+/**
+ * This function sets the Packet mode of all ports and styles to little-endian.
+ * It Changes write operations of packet data to L2C to
+ * be in little-endian. Does not change the WQE header format, which is
+ * properly endian neutral.
+ * @param node                 node number.
+ */
+void cvmx_helper_pki_set_little_endian(int node);
+
+void cvmx_helper_pki_set_dflt_pool(int node, int pool, int buffer_size, int buffer_count);
+void cvmx_helper_pki_set_dflt_aura(int node, int aura, int pool, int buffer_count);
+void cvmx_helper_pki_set_dflt_pool_buffer(int node, int buffer_count);
+
+void cvmx_helper_pki_set_dflt_aura_buffer(int node, int buffer_count);
+
+void cvmx_helper_pki_set_dflt_pkind_map(int node, int pkind, int style);
+
+void cvmx_helper_pki_get_dflt_style(int node, struct cvmx_pki_style_config *style_cfg);
+void cvmx_helper_pki_set_dflt_style(int node, struct cvmx_pki_style_config *style_cfg);
+
+void cvmx_helper_pki_get_dflt_qpg(int node, struct cvmx_pki_qpg_config *qpg_cfg);
+void cvmx_helper_pki_set_dflt_qpg(int node, struct cvmx_pki_qpg_config *qpg_cfg);
+
+void cvmx_helper_pki_no_dflt_init(int node);
+
+void cvmx_helper_pki_set_dflt_bp_en(int node, bool bp_en);
+
+void cvmx_pki_dump_wqe(const cvmx_wqe_78xx_t *wqp);
+
+int __cvmx_helper_pki_port_setup(int node, int xipd_port);
+
+int __cvmx_helper_pki_global_setup(int node);
+void cvmx_helper_pki_show_port_config(int xipd_port);
+
+int __cvmx_helper_pki_install_dflt_vlan(int node);
+void __cvmx_helper_pki_set_dflt_ltype_map(int node);
+int cvmx_helper_pki_route_dmac(int node, int style, u64 mac_addr, u64 mac_addr_mask,
+                              int final_style);
+int cvmx_pki_clone_style(int node, int style, u64 cluster_mask);
+void cvmx_helper_pki_modify_prtgrp(int xipd_port, int grp_ok, int grp_bad);
+int cvmx_helper_pki_route_prt_dmac(int xipd_port, u64 mac_addr, u64 mac_addr_mask, int grp);
+
+void cvmx_helper_pki_errata(int node);
+
+#endif /* __CVMX_HELPER_PKI_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-pko.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-pko.h
new file mode 100644 (file)
index 0000000..806102d
--- /dev/null
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * PKO helper, configuration API
+ */
+
+#ifndef __CVMX_HELPER_PKO_H__
+#define __CVMX_HELPER_PKO_H__
+
+/* CSR typedefs have been moved to cvmx-pko-defs.h */
+
+/**
+ * cvmx_override_pko_queue_priority(int ipd_port, u64
+ * priorities[16]) is a function pointer. It is meant to allow
+ * customization of the PKO queue priorities based on the port
+ * number. Users should set this pointer to a function before
+ * calling any cvmx-helper operations.
+ */
+void (*cvmx_override_pko_queue_priority)(int ipd_port, u8 *priorities);
+
+/**
+ * Gets the fpa pool number of pko pool
+ */
+s64 cvmx_fpa_get_pko_pool(void);
+
+/**
+ * Gets the buffer size of pko pool
+ */
+u64 cvmx_fpa_get_pko_pool_block_size(void);
+
+/**
+ * Gets the buffer size  of pko pool
+ */
+u64 cvmx_fpa_get_pko_pool_buffer_count(void);
+
+int cvmx_helper_pko_init(void);
+
+/*
+ * This function is a no-op
+ * included here for backwards compatibility only.
+ */
+static inline int cvmx_pko_initialize_local(void)
+{
+       return 0;
+}
+
+int __cvmx_helper_pko_drain(void);
+int __cvmx_helper_interface_setup_pko(int interface);
+
+#endif /* __CVMX_HELPER_PKO_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-pko3.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-pko3.h
new file mode 100644 (file)
index 0000000..ca8d848
--- /dev/null
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_HELPER_PKO3_H__
+#define __CVMX_HELPER_PKO3_H__
+
+/*
+ * Initialize PKO3 unit on the current node.
+ *
+ * Covers the common hardware, memory and global configuration.
+ * Per-interface initialization is performed separately.
+ *
+ * @return 0 on success.
+ *
+ */
+int cvmx_helper_pko3_init_global(unsigned int node);
+int __cvmx_helper_pko3_init_global(unsigned int node, u16 gaura);
+
+/**
+ * Initialize a simple interface with a a given number of
+ * fair or prioritized queues.
+ * This function will assign one channel per sub-interface.
+ */
+int __cvmx_pko3_config_gen_interface(int xiface, u8 subif, u8 num_queues, bool prioritized);
+
+/*
+ * Configure and initialize PKO3 for an interface
+ *
+ * @param interface is the interface number to configure
+ * @return 0 on success.
+ *
+ */
+int cvmx_helper_pko3_init_interface(int xiface);
+int __cvmx_pko3_helper_dqs_activate(int xiface, int index, bool min_pad);
+
+/**
+ * Uninitialize PKO3 interface
+ *
+ * Release all resources held by PKO for an interface.
+ * The shutdown code is the same for all supported interfaces.
+ */
+int cvmx_helper_pko3_shut_interface(int xiface);
+
+/**
+ * Shutdown PKO3
+ *
+ * Should be called after all interfaces have been shut down on the PKO3.
+ *
+ * Disables the PKO, frees all its buffers.
+ */
+int cvmx_helper_pko3_shutdown(unsigned int node);
+
+/**
+ * Show integrated PKO configuration.
+ *
+ * @param node    node number
+ */
+int cvmx_helper_pko3_config_dump(unsigned int node);
+
+/**
+ * Show integrated PKO statistics.
+ *
+ * @param node    node number
+ */
+int cvmx_helper_pko3_stats_dump(unsigned int node);
+
+/**
+ * Clear PKO statistics.
+ *
+ * @param node    node number
+ */
+void cvmx_helper_pko3_stats_clear(unsigned int node);
+
+#endif /* __CVMX_HELPER_PKO3_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-rgmii.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-rgmii.h
new file mode 100644 (file)
index 0000000..2a206a8
--- /dev/null
@@ -0,0 +1,99 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for RGMII/GMII/MII initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_RGMII_H__
+#define __CVMX_HELPER_RGMII_H__
+
+/**
+ * @INTERNAL
+ * Probe RGMII ports and determine the number present
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Number of RGMII/GMII/MII ports (0-4).
+ */
+int __cvmx_helper_rgmii_probe(int xiface);
+
+/**
+ * Put an RGMII interface in loopback mode. Internal packets sent
+ * out will be received back again on the same port. Externally
+ * received packets will echo back out.
+ *
+ * @param port   IPD port number to loop.
+ */
+void cvmx_helper_rgmii_internal_loopback(int port);
+
+/**
+ * @INTERNAL
+ * Configure all of the ASX, GMX, and PKO regsiters required
+ * to get RGMII to function on the supplied interface.
+ *
+ * @param xiface PKO Interface to configure (0 or 1)
+ *
+ * @return Zero on success
+ */
+int __cvmx_helper_rgmii_enable(int xiface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_gmii_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_rgmii_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_rgmii_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+/**
+ * @INTERNAL
+ * Configure a port for internal and/or external loopback. Internal loopback
+ * causes packets sent by the port to be received by Octeon. External loopback
+ * causes packets received from the wire to sent out again.
+ *
+ * @param ipd_port IPD/PKO port to loopback.
+ * @param enable_internal
+ *                 Non zero if you want internal loopback
+ * @param enable_external
+ *                 Non zero if you want external loopback
+ *
+ * @return Zero on success, negative on failure.
+ */
+int __cvmx_helper_rgmii_configure_loopback(int ipd_port, int enable_internal, int enable_external);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-sfp.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-sfp.h
new file mode 100644 (file)
index 0000000..6fe5509
--- /dev/null
@@ -0,0 +1,437 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper functions to abstract SFP and QSFP connectors
+ */
+
+#ifndef __CVMX_HELPER_SFP_H__
+#define __CVMX_HELPER_SFP_H__
+
+/**
+ * Maximum size for the SFP EEPROM.  Currently only 96 bytes are used.
+ */
+#define CVMX_SFP_MAX_EEPROM_SIZE 0x100
+
+/**
+ * Default address of sfp EEPROM
+ */
+#define CVMX_SFP_DEFAULT_I2C_ADDR 0x50
+
+/**
+ * Default address of SFP diagnostics chip
+ */
+#define CVMX_SFP_DEFAULT_DIAG_I2C_ADDR 0x51
+
+struct cvmx_fdt_sfp_info;
+struct cvmx_fdt_gpio_info;
+/**
+ * Connector type for module, usually we only see SFP and QSFPP
+ */
+enum cvmx_phy_sfp_conn_type {
+       CVMX_SFP_CONN_GBIC = 0x01,       /** GBIC */
+       CVMX_SFP_CONN_SFP = 0x03,        /** SFP/SFP+/SFP28 */
+       CVMX_SFP_CONN_QSFP = 0x0C,       /** 1G QSFP (obsolete) */
+       CVMX_SFP_CONN_QSFPP = 0x0D,      /** QSFP+ or later */
+       CVMX_SFP_CONN_QSFP28 = 0x11,     /** QSFP28 (100Gbps) */
+       CVMX_SFP_CONN_MICRO_QSFP = 0x17, /** Micro QSFP */
+       CVMX_SFP_CONN_QSFP_DD = 0x18,    /** QSFP-DD Double Density 8X */
+       CVMX_SFP_CONN_SFP_DD = 0x1A,     /** SFP-DD Double Density 2X */
+};
+
+/**
+ * module type plugged into a SFP/SFP+/QSFP+ port
+ */
+enum cvmx_phy_sfp_mod_type {
+       CVMX_SFP_MOD_UNKNOWN = 0, /** Unknown or unspecified */
+       /** Fiber optic module (LC connector) */
+       CVMX_SFP_MOD_OPTICAL_LC = 0x7,
+       /** Multiple optical */
+       CVMX_SFP_MOD_MULTIPLE_OPTICAL = 0x9,
+       /** Fiber optic module (pigtail, no connector) */
+       CVMX_SFP_MOD_OPTICAL_PIGTAIL = 0xB,
+       CVMX_SFP_MOD_COPPER_PIGTAIL = 0x21, /** copper module */
+       CVMX_SFP_MOD_RJ45 = 0x22,           /** RJ45 (i.e. 10GBase-T) */
+       /** No separable connector (SFP28/copper) */
+       CVMX_SFP_MOD_NO_SEP_CONN = 0x23,
+       /** MXC 2X16 */
+       CVMX_SFP_MOD_MXC_2X16 = 0x24,
+       /** CS optical connector */
+       CVMX_SFP_MOD_CS_OPTICAL = 0x25,
+       /** Mini CS optical connector */
+       CVMX_SFP_MOD_MINI_CS_OPTICAL = 0x26,
+       /** Unknown/other module type */
+       CVMX_SFP_MOD_OTHER
+};
+
+/** Peak rate supported by SFP cable */
+enum cvmx_phy_sfp_rate {
+       CVMX_SFP_RATE_UNKNOWN, /** Unknown rate */
+       CVMX_SFP_RATE_1G,      /** 1Gbps */
+       CVMX_SFP_RATE_10G,     /** 10Gbps */
+       CVMX_SFP_RATE_25G,     /** 25Gbps */
+       CVMX_SFP_RATE_40G,     /** 40Gbps */
+       CVMX_SFP_RATE_100G     /** 100Gbps */
+};
+
+/**
+ * Cable compliance specification
+ * See table 4-4 from SFF-8024 for the extended specification compliance codes
+ */
+enum cvmx_phy_sfp_cable_ext_compliance {
+       CVMX_SFP_CABLE_UNSPEC = 0,
+       CVMX_SFP_CABLE_100G_25GAUI_C2M_AOC_HIGH_BER = 0x01, /** Active optical cable */
+       CVMX_SFP_CABLE_100G_SR4_25G_SR = 0x2,
+       CVMX_SFP_CABLE_100G_LR4_25G_LR = 0x3,
+       CVMX_SFP_CABLE_100G_ER4_25G_ER = 0x4,
+       CVMX_SFP_CABLE_100G_SR10 = 0x5,
+       CVMX_SFP_CABLE_100G_CWDM4_MSA = 0x6,
+       CVMX_SFP_CABLE_100G_PSM4 = 0x7,
+       CVMX_SFP_CABLE_100G_25GAUI_C2M_ACC_HIGH_BER = 0x8,
+       CVMX_SFP_CABLE_100G_CWDM4 = 0x9,
+       CVMX_SFP_CABLE_100G_CR4_25G_CR_CA_L = 0xB,
+       CVMX_SFP_CABLE_25G_CR_CA_S = 0xC,
+       CVMX_SFP_CABLE_25G_CR_CA_N = 0xD,
+       CVMX_SFP_CABLE_40G_ER4 = 0x10,
+       CVMX_SFP_CABLE_4X10G_SR = 0x11,
+       CVMX_SFP_CABLE_40G_PSM4 = 0x12,
+       CVMX_SFP_CABLE_G959_1_P1I1_2D1 = 0x13,
+       CVMX_SFP_CABLE_G959_1_P1S1_2D2 = 0x14,
+       CVMX_SFP_CABLE_G959_1_P1L1_2D2 = 0x15,
+       CVMX_SFP_CABLE_10GBASE_T = 0x16,
+       CVMX_SFP_CABLE_100G_CLR4 = 0x17,
+       CVMX_SFP_CABLE_100G_25GAUI_C2M_AOC_LOW_BER = 0x18,
+       CVMX_SFP_CABLE_100G_25GAUI_C2M_ACC_LOW_BER = 0x19,
+       CVMX_SFP_CABLE_100G_2_LAMBDA_DWDM = 0x1a,
+       CVMX_SFP_CABLE_100G_1550NM_WDM = 0x1b,
+       CVMX_SFP_CABLE_10GBASE_T_SR = 0x1c,
+       CVMX_SFP_CABLE_5GBASE_T = 0x1d,
+       CVMX_SFP_CABLE_2_5GBASE_T = 0x1e,
+       CVMX_SFP_CABLE_40G_SWDM4 = 0x1f,
+       CVMX_SFP_CABLE_100G_SWDM4 = 0x20,
+       CVMX_SFP_CABLE_100G_PAM4_BIDI = 0x21,
+       CVMX_SFP_CABLE_100G_4WDM_10_FEC_HOST = 0x22,
+       CVMX_SFP_CABLE_100G_4WDM_20_FEC_HOST = 0x23,
+       CVMX_SFP_CABLE_100G_4WDM_40_FEC_HOST = 0x24,
+       CVMX_SFP_CABLE_100GBASE_DR_CAUI4_NO_FEC = 0x25,
+       CVMX_SFP_CABLE_100G_FR_CAUI4_NO_FEC = 0x26,
+       CVMX_SFP_CABLE_100G_LR_CAUI4_NO_FEC = 0x27,
+       CVMX_SFP_CABLE_ACTIVE_COPPER_50_100_200GAUI_LOW_BER = 0x30,
+       CVMX_SFP_CABLE_ACTIVE_OPTICAL_50_100_200GAUI_LOW_BER = 0x31,
+       CVMX_SFP_CABLE_ACTIVE_COPPER_50_100_200GAUI_HI_BER = 0x32,
+       CVMX_SFP_CABLE_ACTIVE_OPTICAL_50_100_200GAUI_HI_BER = 0x33,
+       CVMX_SFP_CABLE_50_100_200G_CR = 0x40,
+       CVMX_SFP_CABLE_50_100_200G_SR = 0x41,
+       CVMX_SFP_CABLE_50GBASE_FR_200GBASE_DR4 = 0x42,
+       CVMX_SFP_CABLE_200GBASE_FR4 = 0x43,
+       CVMX_SFP_CABLE_200G_1550NM_PSM4 = 0x44,
+       CVMX_SFP_CABLE_50GBASE_LR = 0x45,
+       CVMX_SFP_CABLE_200GBASE_LR4 = 0x46,
+       CVMX_SFP_CABLE_64GFC_EA = 0x50,
+       CVMX_SFP_CABLE_64GFC_SW = 0x51,
+       CVMX_SFP_CABLE_64GFC_LW = 0x52,
+       CVMX_SFP_CABLE_128GFC_EA = 0x53,
+       CVMX_SFP_CABLE_128GFC_SW = 0x54,
+       CVMX_SFP_CABLE_128GFC_LW = 0x55,
+
+};
+
+/** Optical modes module is compliant with */
+enum cvmx_phy_sfp_10g_eth_compliance {
+       CVMX_SFP_CABLE_10GBASE_ER = 0x80,  /** 10G ER */
+       CVMX_SFP_CABLE_10GBASE_LRM = 0x40, /** 10G LRM */
+       CVMX_SFP_CABLE_10GBASE_LR = 0x20,  /** 10G LR */
+       CVMX_SFP_CABLE_10GBASE_SR = 0x10   /** 10G SR */
+};
+
+/** Diagnostic ASIC compatibility */
+enum cvmx_phy_sfp_sff_8472_diag_rev {
+       CVMX_SFP_SFF_8472_NO_DIAG = 0x00,
+       CVMX_SFP_SFF_8472_REV_9_3 = 0x01,
+       CVMX_SFP_SFF_8472_REV_9_5 = 0x02,
+       CVMX_SFP_SFF_8472_REV_10_2 = 0x03,
+       CVMX_SFP_SFF_8472_REV_10_4 = 0x04,
+       CVMX_SFP_SFF_8472_REV_11_0 = 0x05,
+       CVMX_SFP_SFF_8472_REV_11_3 = 0x06,
+       CVMX_SFP_SFF_8472_REV_11_4 = 0x07,
+       CVMX_SFP_SFF_8472_REV_12_0 = 0x08,
+       CVMX_SFP_SFF_8472_REV_UNALLOCATED = 0xff
+};
+
+/**
+ * Data structure describing the current SFP or QSFP EEPROM
+ */
+struct cvmx_sfp_mod_info {
+       enum cvmx_phy_sfp_conn_type conn_type; /** Connector type */
+       enum cvmx_phy_sfp_mod_type mod_type;   /** Module type */
+       enum cvmx_phy_sfp_rate rate;           /** Rate of module */
+       /** 10G Ethernet Compliance codes (logical OR) */
+       enum cvmx_phy_sfp_10g_eth_compliance eth_comp;
+       /** Extended Cable compliance */
+       enum cvmx_phy_sfp_cable_ext_compliance cable_comp;
+       u8 vendor_name[17]; /** Module vendor name */
+       u8 vendor_oui[3];   /** vendor OUI */
+       u8 vendor_pn[17];   /** Vendor part number */
+       u8 vendor_rev[5];   /** Vendor revision */
+       u8 vendor_sn[17];   /** Vendor serial number */
+       u8 date_code[9];    /** Date code */
+       bool valid;         /** True if module is valid */
+       bool active_cable;  /** False for passive copper */
+       bool copper_cable;  /** True if cable is copper */
+       /** True if module is limiting (i.e. not passive copper) */
+       bool limiting;
+       /** Maximum length of copper cable in meters */
+       int max_copper_cable_len;
+       /** Max single mode cable length in meters */
+       int max_single_mode_cable_length;
+       /** Max 50um OM2 cable length */
+       int max_50um_om2_cable_length;
+       /** Max 62.5um OM1 cable length */
+       int max_62_5um_om1_cable_length;
+       /** Max 50um OM4 cable length */
+       int max_50um_om4_cable_length;
+       /** Max 50um OM3 cable length */
+       int max_50um_om3_cable_length;
+       /** Minimum bitrate in Mbps */
+       int bitrate_min;
+       /** Maximum bitrate in Mbps */
+       int bitrate_max;
+       /**
+        * Set to true if forward error correction is required,
+        * for example, a 25GBase-CR CA-S cable.
+        *
+        * FEC should only be disabled at 25G with CA-N cables.  FEC is required
+        * with 5M and longer cables.
+        */
+       bool fec_required;
+       /** True if RX output is linear */
+       bool linear_rx_output;
+       /** Power level, can be 1, 2 or 3 */
+       int power_level;
+       /** False if conventional cooling is used, true for active cooling */
+       bool cooled_laser;
+       /** True if internal retimer or clock and data recovery circuit */
+       bool internal_cdr;
+       /** True if LoS is implemented */
+       bool los_implemented;
+       /** True if LoS is inverted from the standard */
+       bool los_inverted;
+       /** True if TX_FAULT is implemented */
+       bool tx_fault_implemented;
+       /** True if TX_DISABLE is implemented */
+       bool tx_disable_implemented;
+       /** True if RATE_SELECT is implemented */
+       bool rate_select_implemented;
+       /** True if tuneable transmitter technology is used */
+       bool tuneable_transmitter;
+       /** True if receiver decision threshold is implemented */
+       bool rx_decision_threshold_implemented;
+       /** True if diagnostic monitoring present */
+       bool diag_monitoring;
+       /** True if diagnostic address 0x7f is used for selecting the page */
+       bool diag_paging;
+       /** Diagnostic feature revision */
+       enum cvmx_phy_sfp_sff_8472_diag_rev diag_rev;
+       /** True if an address change sequence is required for diagnostics */
+       bool diag_addr_change_required;
+       /** True if RX power is averaged, false if OMA */
+       bool diag_rx_power_averaged;
+       /** True if diagnostics are externally calibrated */
+       bool diag_externally_calibrated;
+       /** True if diagnostics are internally calibrated */
+       bool diag_internally_calibrated;
+       /** True of soft rate select control implemented per SFF-8431 */
+       bool diag_soft_rate_select_control;
+       /** True if application select control implemented per SFF-8079 */
+       bool diag_app_select_control;
+       /** True if soft RATE_SELECT control and moonitoring implemented */
+       bool diag_soft_rate_select_implemented;
+       /** True if soft RX_LOS monitoring implemented */
+       bool diag_soft_rx_los_implemented;
+       /** True if soft TX_FAULT monitoring implemented */
+       bool diag_soft_tx_fault_implemented;
+       /** True if soft TX_DISABLE control and monitoring implemented */
+       bool diag_soft_tx_disable_implemented;
+       /** True if alarm/warning flags implemented */
+       bool diag_alarm_warning_flags_implemented;
+};
+
+/**
+ * Reads the SFP EEPROM using the i2c bus
+ *
+ * @param[out] buffer          Buffer to store SFP EEPROM data in
+ *                             The buffer should be SFP_MAX_EEPROM_SIZE bytes.
+ * @param      i2c_bus         i2c bus number to read from for SFP port
+ * @param      i2c_addr        i2c address to use, 0 for default
+ *
+ * @return     -1 if invalid bus or i2c read error, 0 for success
+ */
+int cvmx_phy_sfp_read_i2c_eeprom(u8 *buffer, int i2c_bus, int i2c_addr);
+
+/**
+ * Reads the SFP/SFP+/QSFP EEPROM and outputs the type of module or cable
+ * plugged in
+ *
+ * @param[out] sfp_info        Info about SFP module
+ * @param[in]  buffer          SFP EEPROM buffer to parse
+ *
+ * @return     0 on success, -1 if error reading EEPROM or if EEPROM corrupt
+ */
+int cvmx_phy_sfp_parse_eeprom(struct cvmx_sfp_mod_info *sfp_info, const u8 *buffer);
+
+/**
+ * Prints out information about a SFP/QSFP device
+ *
+ * @param[in]  sfp_info        data structure to print
+ */
+void cvmx_phy_sfp_print_info(const struct cvmx_sfp_mod_info *sfp_info);
+
+/**
+ * Reads and parses SFP/QSFP EEPROM
+ *
+ * @param      sfp     sfp handle to read
+ *
+ * @return     0 for success, -1 on error.
+ */
+int cvmx_sfp_read_i2c_eeprom(struct cvmx_fdt_sfp_info *sfp);
+
+/**
+ * Returns the information about a SFP/QSFP device
+ *
+ * @param       sfp             sfp handle
+ *
+ * @return      sfp_info        Pointer sfp mod info data structure
+ */
+const struct cvmx_sfp_mod_info *cvmx_phy_get_sfp_mod_info(const struct cvmx_fdt_sfp_info *sfp);
+
+/**
+ * Function called to check and return the status of the mod_abs pin or
+ * mod_pres pin for QSFPs.
+ *
+ * @param      sfp     Handle to SFP information.
+ * @param      data    User-defined data passed to the function
+ *
+ * @return     0 if absent, 1 if present, -1 on error
+ */
+int cvmx_sfp_check_mod_abs(struct cvmx_fdt_sfp_info *sfp, void *data);
+
+/**
+ * Registers a function to be called to check mod_abs/mod_pres for a SFP/QSFP
+ * slot.
+ *
+ * @param      sfp             Handle to SFP data structure
+ * @param      check_mod_abs   Function to be called or NULL to remove
+ * @param      mod_abs_data    User-defined data to be passed to check_mod_abs
+ *
+ * @return     0 for success
+ */
+int cvmx_sfp_register_check_mod_abs(struct cvmx_fdt_sfp_info *sfp,
+                                   int (*check_mod_abs)(struct cvmx_fdt_sfp_info *sfp, void *data),
+                                   void *mod_abs_data);
+
+/**
+ * Registers a function to be called whenever the mod_abs/mod_pres signal
+ * changes.
+ *
+ * @param      sfp             Handle to SFP data structure
+ * @param      mod_abs_changed Function called whenever mod_abs is changed
+ *                             or NULL to remove.
+ * @param      mod_abs_changed_data    User-defined data passed to
+ *                                     mod_abs_changed
+ *
+ * @return     0 for success
+ */
+int cvmx_sfp_register_mod_abs_changed(struct cvmx_fdt_sfp_info *sfp,
+                                     int (*mod_abs_changed)(struct cvmx_fdt_sfp_info *sfp, int val,
+                                                            void *data),
+                                     void *mod_abs_changed_data);
+
+/**
+ * Function called to check and return the status of the tx_fault pin
+ *
+ * @param      sfp     Handle to SFP information.
+ * @param      data    User-defined data passed to the function
+ *
+ * @return     0 if signal present, 1 if signal absent, -1 on error
+ */
+int cvmx_sfp_check_tx_fault(struct cvmx_fdt_sfp_info *sfp, void *data);
+
+/**
+ * Function called to check and return the status of the rx_los pin
+ *
+ * @param      sfp     Handle to SFP information.
+ * @param      data    User-defined data passed to the function
+ *
+ * @return     0 if signal present, 1 if signal absent, -1 on error
+ */
+int cvmx_sfp_check_rx_los(struct cvmx_fdt_sfp_info *sfp, void *data);
+
+/**
+ * Registers a function to be called whenever rx_los changes
+ *
+ * @param      sfp             Handle to SFP data structure
+ * @param      rx_los_changed  Function to be called when rx_los changes
+ *                             or NULL to remove the function
+ * @param      rx_los_changed_data     User-defined data passed to
+ *                                     rx_los_changed
+ *
+ * @return     0 for success
+ */
+int cvmx_sfp_register_rx_los_changed(struct cvmx_fdt_sfp_info *sfp,
+                                    int (*rx_los_changed)(struct cvmx_fdt_sfp_info *sfp, int val,
+                                                          void *data),
+                                    void *rx_los_changed_data);
+
+/**
+ * Parses the device tree for SFP and QSFP slots
+ *
+ * @param      fdt_addr        Address of flat device-tree
+ *
+ * @return     0 for success, -1 on error
+ */
+int cvmx_sfp_parse_device_tree(const void *fdt_addr);
+
+/**
+ * Given an IPD port number find the corresponding SFP or QSFP slot
+ *
+ * @param      ipd_port        IPD port number to search for
+ *
+ * @return     pointer to SFP data structure or NULL if not found
+ */
+struct cvmx_fdt_sfp_info *cvmx_sfp_find_slot_by_port(int ipd_port);
+
+/**
+ * Given a fdt node offset find the corresponding SFP or QSFP slot
+ *
+ * @param      of_offset       flat device tree node offset
+ *
+ * @return     pointer to SFP data structure or NULL if not found
+ */
+struct cvmx_fdt_sfp_info *cvmx_sfp_find_slot_by_fdt_node(int of_offset);
+
+/**
+ * Reads the EEPROMs of all SFP modules.
+ *
+ * @return 0 for success
+ */
+int cvmx_sfp_read_all_modules(void);
+
+/**
+ * Validates if the module is correct for the specified port
+ *
+ * @param[in]  sfp     SFP port to check
+ * @param      mode    interface mode
+ *
+ * @return     true if module is valid, false if invalid
+ * NOTE: This will also toggle the error LED, if present
+ */
+bool cvmx_sfp_validate_module(struct cvmx_fdt_sfp_info *sfp, int mode);
+
+/**
+ * Prints information about the SFP module
+ *
+ * @param[in]  sfp     sfp data structure
+ */
+void cvmx_sfp_print_info(const struct cvmx_fdt_sfp_info *sfp);
+
+#endif /* __CVMX_HELPER_SFP_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-sgmii.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-sgmii.h
new file mode 100644 (file)
index 0000000..c5110c9
--- /dev/null
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for SGMII initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_SGMII_H__
+#define __CVMX_HELPER_SGMII_H__
+
+/**
+ * @INTERNAL
+ * Probe a SGMII interface and determine the number of ports
+ * connected to it. The SGMII interface should still be down after
+ * this call.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_sgmii_probe(int xiface);
+int __cvmx_helper_sgmii_enumerate(int xiface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a SGMII interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_sgmii_enable(int xiface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_sgmii_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_sgmii_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+/**
+ * @INTERNAL
+ * Configure a port for internal and/or external loopback. Internal loopback
+ * causes packets sent by the port to be received by Octeon. External loopback
+ * causes packets received from the wire to sent out again.
+ *
+ * @param ipd_port IPD/PKO port to loopback.
+ * @param enable_internal
+ *                 Non zero if you want internal loopback
+ * @param enable_external
+ *                 Non zero if you want external loopback
+ *
+ * @return Zero on success, negative on failure.
+ */
+int __cvmx_helper_sgmii_configure_loopback(int ipd_port, int enable_internal, int enable_external);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-spi.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-spi.h
new file mode 100644 (file)
index 0000000..cae72f2
--- /dev/null
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for SPI initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_SPI_H__
+#define __CVMX_HELPER_SPI_H__
+
+#include "cvmx-helper.h"
+
+/**
+ * @INTERNAL
+ * Probe a SPI interface and determine the number of ports
+ * connected to it. The SPI interface should still be down after
+ * this call.
+ *
+ * @param interface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_spi_probe(int interface);
+int __cvmx_helper_spi_enumerate(int interface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a SPI interface. After this call packet I/O
+ * should be fully functional. This is called with IPD enabled but
+ * PKO disabled.
+ *
+ * @param interface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_spi_enable(int interface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_spi_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_spi_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+/**
+ * Sets the spi timeout in config data
+ * @param timeout value
+ */
+void cvmx_spi_config_set_timeout(int timeout);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-srio.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-srio.h
new file mode 100644 (file)
index 0000000..2b7571d
--- /dev/null
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for SRIO initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_SRIO_H__
+#define __CVMX_HELPER_SRIO_H__
+
+/**
+ * @INTERNAL
+ * Convert interface number to sRIO link number
+ * per SoC model.
+ *
+ * @param xiface Interface to convert
+ *
+ * @return Srio link number
+ */
+int __cvmx_helper_srio_port(int xiface);
+
+/**
+ * @INTERNAL
+ * Probe a SRIO interface and determine the number of ports
+ * connected to it. The SRIO interface should still be down after
+ * this call.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_srio_probe(int xiface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a SRIO interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_srio_enable(int xiface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by SRIO link status.
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_srio_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_srio_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-util.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-util.h
new file mode 100644 (file)
index 0000000..cf98eae
--- /dev/null
@@ -0,0 +1,412 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_HELPER_UTIL_H__
+#define __CVMX_HELPER_UTIL_H__
+
+#include "cvmx-mio-defs.h"
+#include "cvmx-helper.h"
+#include "cvmx-fpa.h"
+
+typedef char cvmx_pknd_t;
+typedef char cvmx_bpid_t;
+
+#define CVMX_INVALID_PKND ((cvmx_pknd_t)-1)
+#define CVMX_INVALID_BPID ((cvmx_bpid_t)-1)
+#define CVMX_MAX_PKND    ((cvmx_pknd_t)64)
+#define CVMX_MAX_BPID    ((cvmx_bpid_t)64)
+
+#define CVMX_HELPER_MAX_IFACE 11
+#define CVMX_HELPER_MAX_PORTS 16
+
+/* Maximum range for normalized (a.k.a. IPD) port numbers (12-bit field) */
+#define CVMX_PKO3_IPD_NUM_MAX 0x1000 //FIXME- take it from someplace else ?
+#define CVMX_PKO3_DQ_NUM_MAX  0x400  // 78xx has 1024 queues
+
+#define CVMX_PKO3_IPD_PORT_NULL (CVMX_PKO3_IPD_NUM_MAX - 1)
+#define CVMX_PKO3_IPD_PORT_LOOP 0
+
+struct cvmx_xport {
+       int node;
+       int port;
+};
+
+typedef struct cvmx_xport cvmx_xport_t;
+
+static inline struct cvmx_xport cvmx_helper_ipd_port_to_xport(int ipd_port)
+{
+       struct cvmx_xport r;
+
+       r.port = ipd_port & (CVMX_PKO3_IPD_NUM_MAX - 1);
+       r.node = (ipd_port >> 12) & CVMX_NODE_MASK;
+       return r;
+}
+
+static inline int cvmx_helper_node_to_ipd_port(int node, int index)
+{
+       return (node << 12) + index;
+}
+
+struct cvmx_xdq {
+       int node;
+       int queue;
+};
+
+typedef struct cvmx_xdq cvmx_xdq_t;
+
+static inline struct cvmx_xdq cvmx_helper_queue_to_xdq(int queue)
+{
+       struct cvmx_xdq r;
+
+       r.queue = queue & (CVMX_PKO3_DQ_NUM_MAX - 1);
+       r.node = (queue >> 10) & CVMX_NODE_MASK;
+       return r;
+}
+
+static inline int cvmx_helper_node_to_dq(int node, int queue)
+{
+       return (node << 10) + queue;
+}
+
+struct cvmx_xiface {
+       int node;
+       int interface;
+};
+
+typedef struct cvmx_xiface cvmx_xiface_t;
+
+/**
+ * Return node and interface number from XIFACE.
+ *
+ * @param xiface interface with node information
+ *
+ * @return struct that contains node and interface number.
+ */
+static inline struct cvmx_xiface cvmx_helper_xiface_to_node_interface(int xiface)
+{
+       cvmx_xiface_t interface_node;
+
+       /*
+        * If the majic number 0xde0000 is not present in the
+        * interface, then assume it is node 0.
+        */
+
+       if (((xiface >> 0x8) & 0xff) == 0xde) {
+               interface_node.node = (xiface >> 16) & CVMX_NODE_MASK;
+               interface_node.interface = xiface & 0xff;
+       } else {
+               interface_node.node = cvmx_get_node_num();
+               interface_node.interface = xiface & 0xff;
+       }
+       return interface_node;
+}
+
+/* Used internally only*/
+static inline bool __cvmx_helper_xiface_is_null(int xiface)
+{
+       return (xiface & 0xff) == 0xff;
+}
+
+#define __CVMX_XIFACE_NULL 0xff
+
+/**
+ * Return interface with majic number and node information (XIFACE)
+ *
+ * @param node       node of the interface referred to
+ * @param interface  interface to use.
+ *
+ * @return
+ */
+static inline int cvmx_helper_node_interface_to_xiface(int node, int interface)
+{
+       return ((node & CVMX_NODE_MASK) << 16) | (0xde << 8) | (interface & 0xff);
+}
+
+/**
+ * Free the pip packet buffers contained in a work queue entry.
+ * The work queue entry is not freed.
+ *
+ * @param work   Work queue entry with packet to free
+ */
+static inline void cvmx_helper_free_pip_pkt_data(cvmx_wqe_t *work)
+{
+       u64 number_buffers;
+       cvmx_buf_ptr_t buffer_ptr;
+       cvmx_buf_ptr_t next_buffer_ptr;
+       u64 start_of_buffer;
+
+       number_buffers = work->word2.s.bufs;
+       if (number_buffers == 0)
+               return;
+
+       buffer_ptr = work->packet_ptr;
+
+       /* Since the number of buffers is not zero, we know this is not a dynamic
+          short packet. We need to check if it is a packet received with
+          IPD_CTL_STATUS[NO_WPTR]. If this is true, we need to free all buffers
+          except for the first one. The caller doesn't expect their WQE pointer
+          to be freed */
+       start_of_buffer = ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
+       if (cvmx_ptr_to_phys(work) == start_of_buffer) {
+               next_buffer_ptr = *(cvmx_buf_ptr_t *)cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
+               buffer_ptr = next_buffer_ptr;
+               number_buffers--;
+       }
+
+       while (number_buffers--) {
+               /* Remember the back pointer is in cache lines, not 64bit words */
+               start_of_buffer = ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
+               /* Read pointer to next buffer before we free the current buffer. */
+               next_buffer_ptr = *(cvmx_buf_ptr_t *)cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
+               cvmx_fpa_free(cvmx_phys_to_ptr(start_of_buffer), buffer_ptr.s.pool, 0);
+               buffer_ptr = next_buffer_ptr;
+       }
+}
+
+/**
+ * Free the pki packet buffers contained in a work queue entry.
+ * If first packet buffer contains wqe, wqe gets freed too so do not access
+ * wqe after calling this function.
+ * This function asssumes that buffers to be freed are from
+ * Naturally aligned pool/aura.
+ * It does not use don't write back.
+ * @param work   Work queue entry with packet to free
+ */
+static inline void cvmx_helper_free_pki_pkt_data(cvmx_wqe_t *work)
+{
+       u64 number_buffers;
+       u64 start_of_buffer;
+       cvmx_buf_ptr_pki_t next_buffer_ptr;
+       cvmx_buf_ptr_pki_t buffer_ptr;
+       cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               return;
+       }
+       /* Make sure errata pki-20776 has been applied*/
+       cvmx_wqe_pki_errata_20776(work);
+       buffer_ptr = wqe->packet_ptr;
+       number_buffers = cvmx_wqe_get_bufs(work);
+
+       while (number_buffers--) {
+               /* FIXME: change WQE function prototype */
+               unsigned int x = cvmx_wqe_get_aura(work);
+               cvmx_fpa3_gaura_t aura = __cvmx_fpa3_gaura(x >> 10, x & 0x3ff);
+               /* XXX- assumes the buffer is cache-line aligned and naturally aligned mode*/
+               start_of_buffer = (buffer_ptr.addr >> 7) << 7;
+               /* Read pointer to next buffer before we free the current buffer. */
+               next_buffer_ptr = *(cvmx_buf_ptr_pki_t *)cvmx_phys_to_ptr(buffer_ptr.addr - 8);
+               /* FPA AURA comes from WQE, includes node */
+               cvmx_fpa3_free(cvmx_phys_to_ptr(start_of_buffer), aura, 0);
+               buffer_ptr = next_buffer_ptr;
+       }
+}
+
+/**
+ * Free the pki wqe entry buffer.
+ * If wqe buffers contains first packet buffer, wqe does not get freed here.
+ * This function asssumes that buffers to be freed are from
+ * Naturally aligned pool/aura.
+ * It does not use don't write back.
+ * @param work   Work queue entry to free
+ */
+static inline void cvmx_wqe_pki_free(cvmx_wqe_t *work)
+{
+       cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+       unsigned int x;
+       cvmx_fpa3_gaura_t aura;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               return;
+       }
+       /* Do nothing if the first packet buffer shares WQE buffer */
+       if (!wqe->packet_ptr.packet_outside_wqe)
+               return;
+
+       /* FIXME change WQE function prototype */
+       x = cvmx_wqe_get_aura(work);
+       aura = __cvmx_fpa3_gaura(x >> 10, x & 0x3ff);
+
+       cvmx_fpa3_free(work, aura, 0);
+}
+
+/**
+ * Convert a interface mode into a human readable string
+ *
+ * @param mode   Mode to convert
+ *
+ * @return String
+ */
+const char *cvmx_helper_interface_mode_to_string(cvmx_helper_interface_mode_t mode);
+
+/**
+ * Debug routine to dump the packet structure to the console
+ *
+ * @param work   Work queue entry containing the packet to dump
+ * @return
+ */
+int cvmx_helper_dump_packet(cvmx_wqe_t *work);
+
+/**
+ * Get the version of the CVMX libraries.
+ *
+ * @return Version string. Note this buffer is allocated statically
+ *         and will be shared by all callers.
+ */
+const char *cvmx_helper_get_version(void);
+
+/**
+ * @INTERNAL
+ * Setup the common GMX settings that determine the number of
+ * ports. These setting apply to almost all configurations of all
+ * chips.
+ *
+ * @param xiface Interface to configure
+ * @param num_ports Number of ports on the interface
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_setup_gmx(int xiface, int num_ports);
+
+/**
+ * @INTERNAL
+ * Get the number of pko_ports on an interface.
+ *
+ * @param interface
+ *
+ * @return the number of pko_ports on the interface.
+ */
+int __cvmx_helper_get_num_pko_ports(int interface);
+
+/**
+ * Returns the IPD port number for a port on the given
+ * interface.
+ *
+ * @param interface Interface to use
+ * @param port      Port on the interface
+ *
+ * @return IPD port number
+ */
+int cvmx_helper_get_ipd_port(int interface, int port);
+
+/**
+ * Returns the PKO port number for a port on the given interface,
+ * This is the base pko_port for o68 and ipd_port for older models.
+ *
+ * @param interface Interface to use
+ * @param port      Port on the interface
+ *
+ * @return PKO port number and -1 on error.
+ */
+int cvmx_helper_get_pko_port(int interface, int port);
+
+/**
+ * Returns the IPD/PKO port number for the first port on the given
+ * interface.
+ *
+ * @param interface Interface to use
+ *
+ * @return IPD/PKO port number
+ */
+static inline int cvmx_helper_get_first_ipd_port(int interface)
+{
+       return cvmx_helper_get_ipd_port(interface, 0);
+}
+
+int cvmx_helper_ports_on_interface(int interface);
+
+/**
+ * Returns the IPD/PKO port number for the last port on the given
+ * interface.
+ *
+ * @param interface Interface to use
+ *
+ * @return IPD/PKO port number
+ *
+ * Note: for o68, the last ipd port on an interface does not always equal to
+ * the first plus the number of ports as the ipd ports are not contiguous in
+ * some cases, e.g., SGMII.
+ *
+ * Note: code that makes the assumption of contiguous ipd port numbers needs to
+ * be aware of this.
+ */
+static inline int cvmx_helper_get_last_ipd_port(int interface)
+{
+       return cvmx_helper_get_ipd_port(interface, cvmx_helper_ports_on_interface(interface) - 1);
+}
+
+/**
+ * Free the packet buffers contained in a work queue entry.
+ * The work queue entry is not freed.
+ * Note that this function will not free the work queue entry
+ * even if it contains a non-redundant data packet, and hence
+ * it is not really comparable to how the PKO would free a packet
+ * buffers if requested.
+ *
+ * @param work   Work queue entry with packet to free
+ */
+void cvmx_helper_free_packet_data(cvmx_wqe_t *work);
+
+/**
+ * Returns the interface number for an IPD/PKO port number.
+ *
+ * @param ipd_port IPD/PKO port number
+ *
+ * @return Interface number
+ */
+int cvmx_helper_get_interface_num(int ipd_port);
+
+/**
+ * Returns the interface index number for an IPD/PKO port
+ * number.
+ *
+ * @param ipd_port IPD/PKO port number
+ *
+ * @return Interface index number
+ */
+int cvmx_helper_get_interface_index_num(int ipd_port);
+
+/**
+ * Get port kind for a given port in an interface.
+ *
+ * @param xiface  Interface
+ * @param index   index of the port in the interface
+ *
+ * @return port kind on sucicess  and -1 on failure
+ */
+int cvmx_helper_get_pknd(int xiface, int index);
+
+/**
+ * Get bpid for a given port in an interface.
+ *
+ * @param interface  Interface
+ * @param port       index of the port in the interface
+ *
+ * @return port kind on sucicess  and -1 on failure
+ */
+int cvmx_helper_get_bpid(int interface, int port);
+
+/**
+ * Internal functions.
+ */
+int __cvmx_helper_post_init_interfaces(void);
+int cvmx_helper_setup_red(int pass_thresh, int drop_thresh);
+void cvmx_helper_show_stats(int port);
+
+/*
+ * Return number of array alements
+ */
+#define NUM_ELEMENTS(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+/**
+ * Prints out a buffer with the address, hex bytes, and ASCII
+ *
+ * @param      addr    Start address to print on the left
+ * @param[in]  buffer  array of bytes to print
+ * @param      count   Number of bytes to print
+ */
+void cvmx_print_buffer_u8(unsigned int addr, const u8 *buffer, size_t count);
+
+#endif /* __CVMX_HELPER_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper-xaui.h b/arch/mips/mach-octeon/include/mach/cvmx-helper-xaui.h
new file mode 100644 (file)
index 0000000..6ff4576
--- /dev/null
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Functions for XAUI initialization, configuration,
+ * and monitoring.
+ */
+
+#ifndef __CVMX_HELPER_XAUI_H__
+#define __CVMX_HELPER_XAUI_H__
+
+/**
+ * @INTERNAL
+ * Probe a XAUI interface and determine the number of ports
+ * connected to it. The XAUI interface should still be down
+ * after this call.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_xaui_probe(int xiface);
+int __cvmx_helper_xaui_enumerate(int xiface);
+
+/**
+ * @INTERNAL
+ * Bringup and enable a XAUI interface. After this call packet
+ * I/O should be fully functional. This is called with IPD
+ * enabled but PKO disabled.
+ *
+ * @param xiface Interface to bring up
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_xaui_enable(int xiface);
+
+/**
+ * Retrain XAUI interface.
+ *
+ * GMX is disabled as part of retraining.
+ * While GMX is disabled, new received packets are dropped.
+ * If GMX was in the middle of recieving a packet when disabled,
+ * that packet will be received before GMX idles.
+ * Transmitted packets are buffered normally, but not sent.
+ * If GMX was in the middle of transmitting a packet when disabled,
+ * that packet will be transmitted before GMX idles.
+ *
+ * @param interface Interface to retrain
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_xaui_link_retrain(int interface);
+
+/**
+ * Reinitialize XAUI interface.  Does a probe without changing the hardware
+ * state.
+ *
+ * @param interface    Interface to reinitialize
+ *
+ * @return     0 on success, negative on failure
+ */
+int cvmx_helper_xaui_link_reinit(int interface);
+
+/**
+ * @INTERNAL
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_xaui_link_get(int ipd_port);
+
+/**
+ * @INTERNAL
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_xaui_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+/**
+ * @INTERNAL
+ * Configure a port for internal and/or external loopback. Internal loopback
+ * causes packets sent by the port to be received by Octeon. External loopback
+ * causes packets received from the wire to sent out again.
+ *
+ * @param ipd_port IPD/PKO port to loopback.
+ * @param enable_internal
+ *                 Non zero if you want internal loopback
+ * @param enable_external
+ *                 Non zero if you want external loopback
+ *
+ * @return Zero on success, negative on failure.
+ */
+int __cvmx_helper_xaui_configure_loopback(int ipd_port, int enable_internal, int enable_external);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-helper.h b/arch/mips/mach-octeon/include/mach/cvmx-helper.h
new file mode 100644 (file)
index 0000000..b82e201
--- /dev/null
@@ -0,0 +1,565 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Helper functions for common, but complicated tasks.
+ */
+
+#ifndef __CVMX_HELPER_H__
+#define __CVMX_HELPER_H__
+
+#include "cvmx-wqe.h"
+
+/* Max number of GMXX */
+#define CVMX_HELPER_MAX_GMX                                                                        \
+       (OCTEON_IS_MODEL(OCTEON_CN78XX) ?                                                          \
+                      6 :                                                                               \
+                      (OCTEON_IS_MODEL(OCTEON_CN68XX) ?                                                 \
+                               5 :                                                                      \
+                               (OCTEON_IS_MODEL(OCTEON_CN73XX) ?                                        \
+                                        3 :                                                             \
+                                        (OCTEON_IS_MODEL(OCTEON_CNF75XX) ? 1 : 2))))
+
+#define CVMX_HELPER_CSR_INIT0                                                                      \
+       0 /* Do not change as
+                                                  CVMX_HELPER_WRITE_CSR()
+                                                  assumes it */
+#define CVMX_HELPER_CSR_INIT_READ -1
+
+/*
+ * CVMX_HELPER_WRITE_CSR--set a field in a CSR with a value.
+ *
+ * @param chcsr_init    initial value of the csr (CVMX_HELPER_CSR_INIT_READ
+ *                      means to use the existing csr value as the
+ *                      initial value.)
+ * @param chcsr_csr     the name of the csr
+ * @param chcsr_type    the type of the csr (see the -defs.h)
+ * @param chcsr_chip    the chip for the csr/field
+ * @param chcsr_fld     the field in the csr
+ * @param chcsr_val     the value for field
+ */
+#define CVMX_HELPER_WRITE_CSR(chcsr_init, chcsr_csr, chcsr_type, chcsr_chip, chcsr_fld, chcsr_val) \
+       do {                                                                                       \
+               chcsr_type csr;                                                                    \
+               if ((chcsr_init) == CVMX_HELPER_CSR_INIT_READ)                                     \
+                       csr.u64 = cvmx_read_csr(chcsr_csr);                                        \
+               else                                                                               \
+                       csr.u64 = (chcsr_init);                                                    \
+               csr.chcsr_chip.chcsr_fld = (chcsr_val);                                            \
+               cvmx_write_csr((chcsr_csr), csr.u64);                                              \
+       } while (0)
+
+/*
+ * CVMX_HELPER_WRITE_CSR0--set a field in a CSR with the initial value of 0
+ */
+#define CVMX_HELPER_WRITE_CSR0(chcsr_csr, chcsr_type, chcsr_chip, chcsr_fld, chcsr_val)            \
+       CVMX_HELPER_WRITE_CSR(CVMX_HELPER_CSR_INIT0, chcsr_csr, chcsr_type, chcsr_chip, chcsr_fld, \
+                             chcsr_val)
+
+/*
+ * CVMX_HELPER_WRITE_CSR1--set a field in a CSR with the initial value of
+ *                      the CSR's current value.
+ */
+#define CVMX_HELPER_WRITE_CSR1(chcsr_csr, chcsr_type, chcsr_chip, chcsr_fld, chcsr_val)            \
+       CVMX_HELPER_WRITE_CSR(CVMX_HELPER_CSR_INIT_READ, chcsr_csr, chcsr_type, chcsr_chip,        \
+                             chcsr_fld, chcsr_val)
+
+/* These flags are passed to __cvmx_helper_packet_hardware_enable */
+
+typedef enum {
+       CVMX_HELPER_INTERFACE_MODE_DISABLED,
+       CVMX_HELPER_INTERFACE_MODE_RGMII,
+       CVMX_HELPER_INTERFACE_MODE_GMII,
+       CVMX_HELPER_INTERFACE_MODE_SPI,
+       CVMX_HELPER_INTERFACE_MODE_PCIE,
+       CVMX_HELPER_INTERFACE_MODE_XAUI,
+       CVMX_HELPER_INTERFACE_MODE_SGMII,
+       CVMX_HELPER_INTERFACE_MODE_PICMG,
+       CVMX_HELPER_INTERFACE_MODE_NPI,
+       CVMX_HELPER_INTERFACE_MODE_LOOP,
+       CVMX_HELPER_INTERFACE_MODE_SRIO,
+       CVMX_HELPER_INTERFACE_MODE_ILK,
+       CVMX_HELPER_INTERFACE_MODE_RXAUI,
+       CVMX_HELPER_INTERFACE_MODE_QSGMII,
+       CVMX_HELPER_INTERFACE_MODE_AGL,
+       CVMX_HELPER_INTERFACE_MODE_XLAUI,
+       CVMX_HELPER_INTERFACE_MODE_XFI,
+       CVMX_HELPER_INTERFACE_MODE_10G_KR,
+       CVMX_HELPER_INTERFACE_MODE_40G_KR4,
+       CVMX_HELPER_INTERFACE_MODE_MIXED,
+} cvmx_helper_interface_mode_t;
+
+typedef union cvmx_helper_link_info {
+       u64 u64;
+       struct {
+               u64 reserved_20_63 : 43;
+               u64 init_success : 1;
+               u64 link_up : 1;
+               u64 full_duplex : 1;
+               u64 speed : 18;
+       } s;
+} cvmx_helper_link_info_t;
+
+/**
+ * Sets the back pressure configuration in internal data structure.
+ * @param backpressure_dis disable/enable backpressure
+ */
+void cvmx_rgmii_set_back_pressure(u64 backpressure_dis);
+
+#include "cvmx-helper-fpa.h"
+
+#include "cvmx-helper-agl.h"
+#include "cvmx-helper-errata.h"
+#include "cvmx-helper-ilk.h"
+#include "cvmx-helper-loop.h"
+#include "cvmx-helper-npi.h"
+#include "cvmx-helper-rgmii.h"
+#include "cvmx-helper-sgmii.h"
+#include "cvmx-helper-spi.h"
+#include "cvmx-helper-srio.h"
+#include "cvmx-helper-util.h"
+#include "cvmx-helper-xaui.h"
+
+#include "cvmx-fpa3.h"
+
+enum cvmx_pko_padding {
+       CVMX_PKO_PADDING_NONE = 0,
+       CVMX_PKO_PADDING_60 = 1,
+};
+
+/**
+ * This function enables the IPD and also enables the packet interfaces.
+ * The packet interfaces (RGMII and SPI) must be enabled after the
+ * IPD.  This should be called by the user program after any additional
+ * IPD configuration changes are made if CVMX_HELPER_ENABLE_IPD
+ * is not set in the executive-config.h file.
+ *
+ * @return 0 on success
+ *         -1 on failure
+ */
+int cvmx_helper_ipd_and_packet_input_enable_node(int node);
+int cvmx_helper_ipd_and_packet_input_enable(void);
+
+/**
+ * Initialize and allocate memory for the SSO.
+ *
+ * @param wqe_entries The maximum number of work queue entries to be
+ * supported.
+ *
+ * @return Zero on success, non-zero on failure.
+ */
+int cvmx_helper_initialize_sso(int wqe_entries);
+
+/**
+ * Initialize and allocate memory for the SSO on a specific node.
+ *
+ * @param node Node SSO to initialize
+ * @param wqe_entries The maximum number of work queue entries to be
+ * supported.
+ *
+ * @return Zero on success, non-zero on failure.
+ */
+int cvmx_helper_initialize_sso_node(unsigned int node, int wqe_entries);
+
+/**
+ * Undo the effect of cvmx_helper_initialize_sso().
+ *
+ * @return Zero on success, non-zero on failure.
+ */
+int cvmx_helper_uninitialize_sso(void);
+
+/**
+ * Undo the effect of cvmx_helper_initialize_sso_node().
+ *
+ * @param node Node SSO to initialize
+ *
+ * @return Zero on success, non-zero on failure.
+ */
+int cvmx_helper_uninitialize_sso_node(unsigned int node);
+
+/**
+ * Initialize the PIP, IPD, and PKO hardware to support
+ * simple priority based queues for the ethernet ports. Each
+ * port is configured with a number of priority queues based
+ * on CVMX_PKO_QUEUES_PER_PORT_* where each queue is lower
+ * priority than the previous.
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_global(void);
+/**
+ * Initialize the PIP, IPD, and PKO hardware to support
+ * simple priority based queues for the ethernet ports. Each
+ * port is configured with a number of priority queues based
+ * on CVMX_PKO_QUEUES_PER_PORT_* where each queue is lower
+ * priority than the previous.
+ *
+ * @param node Node on which to initialize packet io hardware
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_node(unsigned int node);
+
+/**
+ * Does core local initialization for packet io
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_local(void);
+
+/**
+ * Undo the initialization performed in
+ * cvmx_helper_initialize_packet_io_global(). After calling this routine and the
+ * local version on each core, packet IO for Octeon will be disabled and placed
+ * in the initial reset state. It will then be safe to call the initialize
+ * later on. Note that this routine does not empty the FPA pools. It frees all
+ * buffers used by the packet IO hardware to the FPA so a function emptying the
+ * FPA after shutdown should find all packet buffers in the FPA.
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_helper_shutdown_packet_io_global(void);
+
+/**
+ * Helper function for 78xx global packet IO shutdown
+ */
+int cvmx_helper_shutdown_packet_io_global_cn78xx(int node);
+
+/**
+ * Does core local shutdown of packet io
+ *
+ * @return Zero on success, non-zero on failure
+ */
+int cvmx_helper_shutdown_packet_io_local(void);
+
+/**
+ * Returns the number of ports on the given interface.
+ * The interface must be initialized before the port count
+ * can be returned.
+ *
+ * @param interface Which interface to return port count for.
+ *
+ * @return Port count for interface
+ *         -1 for uninitialized interface
+ */
+int cvmx_helper_ports_on_interface(int interface);
+
+/**
+ * Return the number of interfaces the chip has. Each interface
+ * may have multiple ports. Most chips support two interfaces,
+ * but the CNX0XX and CNX1XX are exceptions. These only support
+ * one interface.
+ *
+ * @return Number of interfaces on chip
+ */
+int cvmx_helper_get_number_of_interfaces(void);
+
+/**
+ * Get the operating mode of an interface. Depending on the Octeon
+ * chip and configuration, this function returns an enumeration
+ * of the type of packet I/O supported by an interface.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Mode of the interface. Unknown or unsupported interfaces return
+ *         DISABLED.
+ */
+cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int xiface);
+
+/**
+ * Auto configure an IPD/PKO port link state and speed. This
+ * function basically does the equivalent of:
+ * cvmx_helper_link_set(ipd_port, cvmx_helper_link_get(ipd_port));
+ *
+ * @param ipd_port IPD/PKO port to auto configure
+ *
+ * @return Link state after configure
+ */
+cvmx_helper_link_info_t cvmx_helper_link_autoconf(int ipd_port);
+
+/**
+ * Return the link state of an IPD/PKO port as returned by
+ * auto negotiation. The result of this function may not match
+ * Octeon's link config if auto negotiation has changed since
+ * the last call to cvmx_helper_link_set().
+ *
+ * @param ipd_port IPD/PKO port to query
+ *
+ * @return Link state
+ */
+cvmx_helper_link_info_t cvmx_helper_link_get(int ipd_port);
+
+/**
+ * Configure an IPD/PKO port for the specified link state. This
+ * function does not influence auto negotiation at the PHY level.
+ * The passed link state must always match the link state returned
+ * by cvmx_helper_link_get(). It is normally best to use
+ * cvmx_helper_link_autoconf() instead.
+ *
+ * @param ipd_port  IPD/PKO port to configure
+ * @param link_info The new link state
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_link_set(int ipd_port, cvmx_helper_link_info_t link_info);
+
+/**
+ * This function probes an interface to determine the actual number of
+ * hardware ports connected to it. It does some setup the ports but
+ * doesn't enable them. The main goal here is to set the global
+ * interface_port_count[interface] correctly. Final hardware setup of
+ * the ports will be performed later.
+ *
+ * @param xiface Interface to probe
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_interface_probe(int xiface);
+
+/**
+ * Determine the actual number of hardware ports connected to an
+ * interface. It doesn't setup the ports or enable them.
+ *
+ * @param xiface Interface to enumerate
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_helper_interface_enumerate(int xiface);
+
+/**
+ * Configure a port for internal and/or external loopback. Internal loopback
+ * causes packets sent by the port to be received by Octeon. External loopback
+ * causes packets received from the wire to sent out again.
+ *
+ * @param ipd_port IPD/PKO port to loopback.
+ * @param enable_internal
+ *                 Non zero if you want internal loopback
+ * @param enable_external
+ *                 Non zero if you want external loopback
+ *
+ * @return Zero on success, negative on failure.
+ */
+int cvmx_helper_configure_loopback(int ipd_port, int enable_internal, int enable_external);
+
+/**
+ * Returns the number of ports on the given interface.
+ *
+ * @param interface Which interface to return port count for.
+ *
+ * @return Port count for interface
+ *         -1 for uninitialized interface
+ */
+int __cvmx_helper_early_ports_on_interface(int interface);
+
+void cvmx_helper_setup_simulator_io_buffer_counts(int node, int num_packet_buffers,
+                                                 int pko_buffers);
+
+void cvmx_helper_set_wqe_no_ptr_mode(bool mode);
+void cvmx_helper_set_pkt_wqe_le_mode(bool mode);
+int cvmx_helper_shutdown_fpa_pools(int node);
+
+/**
+ * Convert Ethernet QoS/PCP value to system-level priority
+ *
+ * In OCTEON, highest priority is 0, in Ethernet 802.1p PCP field
+ * the highest priority is 7, lowest is 1. Here is the full conversion
+ * table between QoS (PCP) and OCTEON priority values, per IEEE 802.1Q-2005:
+ *
+ * PCP Priority        Acronym Traffic Types
+ * 1   7 (lowest)      BK      Background
+ * 0   6       BE      Best Effort
+ * 2   5       EE      Excellent Effort
+ * 3   4       CA      Critical Applications
+ * 4   3       VI      Video, < 100 ms latency and jitter
+ * 5   2       VO      Voice, < 10 ms latency and jitter
+ * 6   1       IC      Internetwork Control
+ * 7   0 (highest)     NC      Network Control
+ */
+static inline u8 cvmx_helper_qos2prio(u8 qos)
+{
+       static const unsigned int pcp_map = 6 << (4 * 0) | 7 << (4 * 1) | 5 << (4 * 2) |
+                                           4 << (4 * 3) | 3 << (4 * 4) | 2 << (4 * 5) |
+                                           1 << (4 * 6) | 0 << (4 * 7);
+
+       return (pcp_map >> ((qos & 0x7) << 2)) & 0x7;
+}
+
+/**
+ * Convert system-level priority to Ethernet QoS/PCP value
+ *
+ * Calculate the reverse of cvmx_helper_qos2prio() per IEEE 802.1Q-2005.
+ */
+static inline u8 cvmx_helper_prio2qos(u8 prio)
+{
+       static const unsigned int prio_map = 7 << (4 * 0) | 6 << (4 * 1) | 5 << (4 * 2) |
+                                            4 << (4 * 3) | 3 << (4 * 4) | 2 << (4 * 5) |
+                                            0 << (4 * 6) | 1 << (4 * 7);
+
+       return (prio_map >> ((prio & 0x7) << 2)) & 0x7;
+}
+
+/**
+ * @INTERNAL
+ * Get the number of ipd_ports on an interface.
+ *
+ * @param xiface
+ *
+ * @return the number of ipd_ports on the interface and -1 for error.
+ */
+int __cvmx_helper_get_num_ipd_ports(int xiface);
+
+enum cvmx_pko_padding __cvmx_helper_get_pko_padding(int xiface);
+
+/**
+ * @INTERNAL
+ *
+ * @param xiface
+ * @param num_ipd_ports is the number of ipd_ports on the interface
+ * @param has_fcs indicates if PKO does FCS for the ports on this
+ * @param pad The padding that PKO should apply.
+ * interface.
+ *
+ * @return 0 for success and -1 for failure
+ */
+int __cvmx_helper_init_interface(int xiface, int num_ipd_ports, int has_fcs,
+                                enum cvmx_pko_padding pad);
+
+void __cvmx_helper_shutdown_interfaces(void);
+
+/*
+ * @INTERNAL
+ * Enable packet input/output from the hardware. This function is
+ * called after all internal setup is complete and IPD is enabled.
+ * After this function completes, packets will be accepted from the
+ * hardware ports. PKO should still be disabled to make sure packets
+ * aren't sent out partially setup hardware.
+ *
+ * @return Zero on success, negative on failure
+ */
+int __cvmx_helper_packet_hardware_enable(int xiface);
+
+/*
+ * @INTERNAL
+ *
+ * @return 0 for success and -1 for failure
+ */
+int __cvmx_helper_set_link_info(int xiface, int index, cvmx_helper_link_info_t link_info);
+
+/**
+ * @INTERNAL
+ *
+ * @param xiface
+ * @param port
+ *
+ * @return valid link_info on success or -1 on failure
+ */
+cvmx_helper_link_info_t __cvmx_helper_get_link_info(int xiface, int port);
+
+/**
+ * @INTERNAL
+ *
+ * @param xiface
+ *
+ * @return 0 if PKO does not do FCS and 1 otherwise.
+ */
+int __cvmx_helper_get_has_fcs(int xiface);
+
+void *cvmx_helper_mem_alloc(int node, u64 alloc_size, u64 align);
+void cvmx_helper_mem_free(void *buffer, u64 size);
+
+#define CVMX_QOS_NUM 8 /* Number of QoS priority classes */
+
+typedef enum {
+       CVMX_QOS_PROTO_NONE,  /* Disable QOS */
+       CVMX_QOS_PROTO_PAUSE, /* IEEE 802.3 PAUSE */
+       CVMX_QOS_PROTO_PFC    /* IEEE 802.1Qbb-2011 PFC/CBFC */
+} cvmx_qos_proto_t;
+
+typedef enum {
+       CVMX_QOS_PKT_MODE_HWONLY, /* PAUSE packets processed in Hardware only. */
+       CVMX_QOS_PKT_MODE_SWONLY, /* PAUSE packets processed in Software only. */
+       CVMX_QOS_PKT_MODE_HWSW,   /* PAUSE packets processed in both HW and SW. */
+       CVMX_QOS_PKT_MODE_DROP    /* Ignore PAUSE packets. */
+} cvmx_qos_pkt_mode_t;
+
+typedef enum {
+       CVMX_QOS_POOL_PER_PORT, /* Pool per Physical Port */
+       CVMX_QOS_POOL_PER_CLASS /* Pool per Priority Class */
+} cvmx_qos_pool_mode_t;
+
+typedef struct cvmx_qos_config {
+       cvmx_qos_proto_t qos_proto;     /* QoS protocol.*/
+       cvmx_qos_pkt_mode_t pkt_mode;   /* PAUSE processing mode.*/
+       cvmx_qos_pool_mode_t pool_mode; /* FPA Pool mode.*/
+       int pktbuf_size;                /* Packet buffer size */
+       int aura_size;                  /* Number of buffers */
+       int drop_thresh[CVMX_QOS_NUM];  /* DROP threashold in % */
+       int red_thresh[CVMX_QOS_NUM];   /* RED threashold in % */
+       int bp_thresh[CVMX_QOS_NUM];    /* BP threashold in % */
+       int groups[CVMX_QOS_NUM];       /* Base SSO group for QOS group set. */
+       int group_prio[CVMX_QOS_NUM];   /* SSO group priorities.*/
+       int pko_pfc_en;                 /* Enable PKO PFC layout. */
+       int vlan_num;                   /* VLAN number: 0 = 1st or 1 = 2nd. */
+       int p_time;                     /* PAUSE packets send time (in number of 512 bit-times).*/
+       int p_interval; /* PAUSE packet send interval (in number of 512 bit-times).*/
+       /* Internal parameters (should not be used by application developer): */
+       cvmx_fpa3_pool_t gpools[CVMX_QOS_NUM];  /* Pool to use.*/
+       cvmx_fpa3_gaura_t gauras[CVMX_QOS_NUM]; /* Global auras -- one per priority class. */
+       int bpids[CVMX_QOS_NUM];                /* PKI BPID.*/
+       int qpg_base;                           /* QPG Table base index.*/
+} cvmx_qos_config_t;
+
+/**
+ * Initialize QoS configuraiton with the SDK defaults.
+ *
+ * @param qos_cfg   User QOS configuration parameters.
+ * @return Zero on success, negative number otherwise.
+ */
+int cvmx_helper_qos_config_init(cvmx_qos_proto_t qos_proto, cvmx_qos_config_t *qos_cfg);
+
+/**
+ * Update the user static processor configuration.
+ * It should be done before any initialization of the DP units is performed.
+ *
+ * @param xipdport  Global IPD port
+ * @param qos_cfg   User QOS configuration parameters.
+ * @return Zero on success, negative number otherwise.
+ */
+int cvmx_helper_qos_port_config_update(int xipdport, cvmx_qos_config_t *qos_cfg);
+
+/**
+ * Configure the Data Path components for QOS function.
+ * This function is called after the global processor initialization is
+ * performed.
+ *
+ * @param xipdport  Global IPD port
+ * @param qos_cfg   User QOS configuration parameters.
+ * @return Zero on success, negative number otherwise.
+ */
+int cvmx_helper_qos_port_setup(int xipdport, cvmx_qos_config_t *qos_cfg);
+
+/**
+ * Configure the SSO for QOS function.
+ * This function is called after the global processor initialization is
+ * performed.
+ *
+ * @param node      OCTEON3 node number.
+ * @param qos_cfg   User QOS configuration parameters.
+ * @return Zero on success, negative number otherwise.
+ */
+int cvmx_helper_qos_sso_setup(int node, cvmx_qos_config_t *qos_cfg);
+
+/**
+ * Return PKI_CHAN_E channel name based on the provided index.
+ * @param chan     Channel index.
+ * @param namebuf  Name buffer (output).
+ * @param buflen   Name maximum length.
+ * @return Length of name (in bytes) on success, negative number otherwise.
+ */
+int cvmx_helper_get_chan_e_name(int chan, char *namebuf, int buflen);
+
+#ifdef CVMX_DUMP_DIAGNOSTICS
+void cvmx_helper_dump_for_diagnostics(int node);
+#endif
+
+#endif /* __CVMX_HELPER_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-hwfau.h b/arch/mips/mach-octeon/include/mach/cvmx-hwfau.h
new file mode 100644 (file)
index 0000000..5977219
--- /dev/null
@@ -0,0 +1,606 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Fetch and Add Unit.
+ */
+
+/**
+ * @file
+ *
+ * Interface to the hardware Fetch and Add Unit.
+ *
+ */
+
+#ifndef __CVMX_HWFAU_H__
+#define __CVMX_HWFAU_H__
+
+typedef int cvmx_fau_reg64_t;
+typedef int cvmx_fau_reg32_t;
+typedef int cvmx_fau_reg16_t;
+typedef int cvmx_fau_reg8_t;
+
+#define CVMX_FAU_REG_ANY -1
+
+/*
+ * Octeon Fetch and Add Unit (FAU)
+ */
+
+#define CVMX_FAU_LOAD_IO_ADDRESS cvmx_build_io_address(0x1e, 0)
+#define CVMX_FAU_BITS_SCRADDR   63, 56
+#define CVMX_FAU_BITS_LEN       55, 48
+#define CVMX_FAU_BITS_INEVAL    35, 14
+#define CVMX_FAU_BITS_TAGWAIT   13, 13
+#define CVMX_FAU_BITS_NOADD     13, 13
+#define CVMX_FAU_BITS_SIZE      12, 11
+#define CVMX_FAU_BITS_REGISTER  10, 0
+
+#define CVMX_FAU_MAX_REGISTERS_8 (2048)
+
+typedef enum {
+       CVMX_FAU_OP_SIZE_8 = 0,
+       CVMX_FAU_OP_SIZE_16 = 1,
+       CVMX_FAU_OP_SIZE_32 = 2,
+       CVMX_FAU_OP_SIZE_64 = 3
+} cvmx_fau_op_size_t;
+
+/**
+ * Tagwait return definition. If a timeout occurs, the error
+ * bit will be set. Otherwise the value of the register before
+ * the update will be returned.
+ */
+typedef struct {
+       u64 error : 1;
+       s64 value : 63;
+} cvmx_fau_tagwait64_t;
+
+/**
+ * Tagwait return definition. If a timeout occurs, the error
+ * bit will be set. Otherwise the value of the register before
+ * the update will be returned.
+ */
+typedef struct {
+       u64 error : 1;
+       s32 value : 31;
+} cvmx_fau_tagwait32_t;
+
+/**
+ * Tagwait return definition. If a timeout occurs, the error
+ * bit will be set. Otherwise the value of the register before
+ * the update will be returned.
+ */
+typedef struct {
+       u64 error : 1;
+       s16 value : 15;
+} cvmx_fau_tagwait16_t;
+
+/**
+ * Tagwait return definition. If a timeout occurs, the error
+ * bit will be set. Otherwise the value of the register before
+ * the update will be returned.
+ */
+typedef struct {
+       u64 error : 1;
+       int8_t value : 7;
+} cvmx_fau_tagwait8_t;
+
+/**
+ * Asynchronous tagwait return definition. If a timeout occurs,
+ * the error bit will be set. Otherwise the value of the
+ * register before the update will be returned.
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 invalid : 1;
+               u64 data : 63; /* unpredictable if invalid is set */
+       } s;
+} cvmx_fau_async_tagwait_result_t;
+
+#define SWIZZLE_8  0
+#define SWIZZLE_16 0
+#define SWIZZLE_32 0
+
+/**
+ * @INTERNAL
+ * Builds a store I/O address for writing to the FAU
+ *
+ * @param noadd  0 = Store value is atomically added to the current value
+ *               1 = Store value is atomically written over the current value
+ * @param reg    FAU atomic register to access. 0 <= reg < 2048.
+ *               - Step by 2 for 16 bit access.
+ *               - Step by 4 for 32 bit access.
+ *               - Step by 8 for 64 bit access.
+ * @return Address to store for atomic update
+ */
+static inline u64 __cvmx_hwfau_store_address(u64 noadd, u64 reg)
+{
+       return (CVMX_ADD_IO_SEG(CVMX_FAU_LOAD_IO_ADDRESS) |
+               cvmx_build_bits(CVMX_FAU_BITS_NOADD, noadd) |
+               cvmx_build_bits(CVMX_FAU_BITS_REGISTER, reg));
+}
+
+/**
+ * @INTERNAL
+ * Builds a I/O address for accessing the FAU
+ *
+ * @param tagwait Should the atomic add wait for the current tag switch
+ *                operation to complete.
+ *                - 0 = Don't wait
+ *                - 1 = Wait for tag switch to complete
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ *                - Step by 4 for 32 bit access.
+ *                - Step by 8 for 64 bit access.
+ * @param value   Signed value to add.
+ *                Note: When performing 32 and 64 bit access, only the low
+ *                22 bits are available.
+ * @return Address to read from for atomic update
+ */
+static inline u64 __cvmx_hwfau_atomic_address(u64 tagwait, u64 reg, s64 value)
+{
+       return (CVMX_ADD_IO_SEG(CVMX_FAU_LOAD_IO_ADDRESS) |
+               cvmx_build_bits(CVMX_FAU_BITS_INEVAL, value) |
+               cvmx_build_bits(CVMX_FAU_BITS_TAGWAIT, tagwait) |
+               cvmx_build_bits(CVMX_FAU_BITS_REGISTER, reg));
+}
+
+/**
+ * Perform an atomic 64 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @param value   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * @return Value of the register before the update
+ */
+static inline s64 cvmx_hwfau_fetch_and_add64(cvmx_fau_reg64_t reg, s64 value)
+{
+       return cvmx_read64_int64(__cvmx_hwfau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 32 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @param value   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * @return Value of the register before the update
+ */
+static inline s32 cvmx_hwfau_fetch_and_add32(cvmx_fau_reg32_t reg, s32 value)
+{
+       reg ^= SWIZZLE_32;
+       return cvmx_read64_int32(__cvmx_hwfau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 16 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @param value   Signed value to add.
+ * @return Value of the register before the update
+ */
+static inline s16 cvmx_hwfau_fetch_and_add16(cvmx_fau_reg16_t reg, s16 value)
+{
+       reg ^= SWIZZLE_16;
+       return cvmx_read64_int16(__cvmx_hwfau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 8 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ * @param value   Signed value to add.
+ * @return Value of the register before the update
+ */
+static inline int8_t cvmx_hwfau_fetch_and_add8(cvmx_fau_reg8_t reg, int8_t value)
+{
+       reg ^= SWIZZLE_8;
+       return cvmx_read64_int8(__cvmx_hwfau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 64 bit add after the current tag switch
+ * completes
+ *
+ * @param reg    FAU atomic register to access. 0 <= reg < 2048.
+ *               - Step by 8 for 64 bit access.
+ * @param value  Signed value to add.
+ *               Note: Only the low 22 bits are available.
+ * @return If a timeout occurs, the error bit will be set. Otherwise
+ *         the value of the register before the update will be
+ *         returned
+ */
+static inline cvmx_fau_tagwait64_t cvmx_hwfau_tagwait_fetch_and_add64(cvmx_fau_reg64_t reg,
+                                                                     s64 value)
+{
+       union {
+               u64 i64;
+               cvmx_fau_tagwait64_t t;
+       } result;
+       result.i64 = cvmx_read64_int64(__cvmx_hwfau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * Perform an atomic 32 bit add after the current tag switch
+ * completes
+ *
+ * @param reg    FAU atomic register to access. 0 <= reg < 2048.
+ *               - Step by 4 for 32 bit access.
+ * @param value  Signed value to add.
+ *               Note: Only the low 22 bits are available.
+ * @return If a timeout occurs, the error bit will be set. Otherwise
+ *         the value of the register before the update will be
+ *         returned
+ */
+static inline cvmx_fau_tagwait32_t cvmx_hwfau_tagwait_fetch_and_add32(cvmx_fau_reg32_t reg,
+                                                                     s32 value)
+{
+       union {
+               u64 i32;
+               cvmx_fau_tagwait32_t t;
+       } result;
+       reg ^= SWIZZLE_32;
+       result.i32 = cvmx_read64_int32(__cvmx_hwfau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * Perform an atomic 16 bit add after the current tag switch
+ * completes
+ *
+ * @param reg    FAU atomic register to access. 0 <= reg < 2048.
+ *               - Step by 2 for 16 bit access.
+ * @param value  Signed value to add.
+ * @return If a timeout occurs, the error bit will be set. Otherwise
+ *         the value of the register before the update will be
+ *         returned
+ */
+static inline cvmx_fau_tagwait16_t cvmx_hwfau_tagwait_fetch_and_add16(cvmx_fau_reg16_t reg,
+                                                                     s16 value)
+{
+       union {
+               u64 i16;
+               cvmx_fau_tagwait16_t t;
+       } result;
+       reg ^= SWIZZLE_16;
+       result.i16 = cvmx_read64_int16(__cvmx_hwfau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * Perform an atomic 8 bit add after the current tag switch
+ * completes
+ *
+ * @param reg    FAU atomic register to access. 0 <= reg < 2048.
+ * @param value  Signed value to add.
+ * @return If a timeout occurs, the error bit will be set. Otherwise
+ *         the value of the register before the update will be
+ *         returned
+ */
+static inline cvmx_fau_tagwait8_t cvmx_hwfau_tagwait_fetch_and_add8(cvmx_fau_reg8_t reg,
+                                                                   int8_t value)
+{
+       union {
+               u64 i8;
+               cvmx_fau_tagwait8_t t;
+       } result;
+       reg ^= SWIZZLE_8;
+       result.i8 = cvmx_read64_int8(__cvmx_hwfau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * @INTERNAL
+ * Builds I/O data for async operations
+ *
+ * @param scraddr Scratch pad byte address to write to.  Must be 8 byte aligned
+ * @param value   Signed value to add.
+ *                Note: When performing 32 and 64 bit access, only the low
+ *                22 bits are available.
+ * @param tagwait Should the atomic add wait for the current tag switch
+ *                operation to complete.
+ *                - 0 = Don't wait
+ *                - 1 = Wait for tag switch to complete
+ * @param size    The size of the operation:
+ *                - CVMX_FAU_OP_SIZE_8  (0) = 8 bits
+ *                - CVMX_FAU_OP_SIZE_16 (1) = 16 bits
+ *                - CVMX_FAU_OP_SIZE_32 (2) = 32 bits
+ *                - CVMX_FAU_OP_SIZE_64 (3) = 64 bits
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ *                - Step by 4 for 32 bit access.
+ *                - Step by 8 for 64 bit access.
+ * @return Data to write using cvmx_send_single
+ */
+static inline u64 __cvmx_fau_iobdma_data(u64 scraddr, s64 value, u64 tagwait,
+                                        cvmx_fau_op_size_t size, u64 reg)
+{
+       return (CVMX_FAU_LOAD_IO_ADDRESS | cvmx_build_bits(CVMX_FAU_BITS_SCRADDR, scraddr >> 3) |
+               cvmx_build_bits(CVMX_FAU_BITS_LEN, 1) |
+               cvmx_build_bits(CVMX_FAU_BITS_INEVAL, value) |
+               cvmx_build_bits(CVMX_FAU_BITS_TAGWAIT, tagwait) |
+               cvmx_build_bits(CVMX_FAU_BITS_SIZE, size) |
+               cvmx_build_bits(CVMX_FAU_BITS_REGISTER, reg));
+}
+
+/**
+ * Perform an async atomic 64 bit add. The old value is
+ * placed in the scratch memory at byte address scraddr.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @param value   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_fetch_and_add64(u64 scraddr, cvmx_fau_reg64_t reg, s64 value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 0, CVMX_FAU_OP_SIZE_64, reg));
+}
+
+/**
+ * Perform an async atomic 32 bit add. The old value is
+ * placed in the scratch memory at byte address scraddr.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @param value   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_fetch_and_add32(u64 scraddr, cvmx_fau_reg32_t reg, s32 value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 0, CVMX_FAU_OP_SIZE_32, reg));
+}
+
+/**
+ * Perform an async atomic 16 bit add. The old value is
+ * placed in the scratch memory at byte address scraddr.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @param value   Signed value to add.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_fetch_and_add16(u64 scraddr, cvmx_fau_reg16_t reg, s16 value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 0, CVMX_FAU_OP_SIZE_16, reg));
+}
+
+/**
+ * Perform an async atomic 8 bit add. The old value is
+ * placed in the scratch memory at byte address scraddr.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ * @param value   Signed value to add.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_fetch_and_add8(u64 scraddr, cvmx_fau_reg8_t reg, int8_t value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 0, CVMX_FAU_OP_SIZE_8, reg));
+}
+
+/**
+ * Perform an async atomic 64 bit add after the current tag
+ * switch completes.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ *                If a timeout occurs, the error bit (63) will be set. Otherwise
+ *                the value of the register before the update will be
+ *                returned
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @param value   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_tagwait_fetch_and_add64(u64 scraddr, cvmx_fau_reg64_t reg,
+                                                           s64 value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 1, CVMX_FAU_OP_SIZE_64, reg));
+}
+
+/**
+ * Perform an async atomic 32 bit add after the current tag
+ * switch completes.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ *                If a timeout occurs, the error bit (63) will be set. Otherwise
+ *                the value of the register before the update will be
+ *                returned
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @param value   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_tagwait_fetch_and_add32(u64 scraddr, cvmx_fau_reg32_t reg,
+                                                           s32 value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 1, CVMX_FAU_OP_SIZE_32, reg));
+}
+
+/**
+ * Perform an async atomic 16 bit add after the current tag
+ * switch completes.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ *                If a timeout occurs, the error bit (63) will be set. Otherwise
+ *                the value of the register before the update will be
+ *                returned
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @param value   Signed value to add.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_tagwait_fetch_and_add16(u64 scraddr, cvmx_fau_reg16_t reg,
+                                                           s16 value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 1, CVMX_FAU_OP_SIZE_16, reg));
+}
+
+/**
+ * Perform an async atomic 8 bit add after the current tag
+ * switch completes.
+ *
+ * @param scraddr Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ *                If a timeout occurs, the error bit (63) will be set. Otherwise
+ *                the value of the register before the update will be
+ *                returned
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ * @param value   Signed value to add.
+ * @return Placed in the scratch pad register
+ */
+static inline void cvmx_hwfau_async_tagwait_fetch_and_add8(u64 scraddr, cvmx_fau_reg8_t reg,
+                                                          int8_t value)
+{
+       cvmx_send_single(__cvmx_fau_iobdma_data(scraddr, value, 1, CVMX_FAU_OP_SIZE_8, reg));
+}
+
+/**
+ * Perform an atomic 64 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @param value   Signed value to add.
+ */
+static inline void cvmx_hwfau_atomic_add64(cvmx_fau_reg64_t reg, s64 value)
+{
+       cvmx_write64_int64(__cvmx_hwfau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 32 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @param value   Signed value to add.
+ */
+static inline void cvmx_hwfau_atomic_add32(cvmx_fau_reg32_t reg, s32 value)
+{
+       reg ^= SWIZZLE_32;
+       cvmx_write64_int32(__cvmx_hwfau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 16 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @param value   Signed value to add.
+ */
+static inline void cvmx_hwfau_atomic_add16(cvmx_fau_reg16_t reg, s16 value)
+{
+       reg ^= SWIZZLE_16;
+       cvmx_write64_int16(__cvmx_hwfau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 8 bit add
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ * @param value   Signed value to add.
+ */
+static inline void cvmx_hwfau_atomic_add8(cvmx_fau_reg8_t reg, int8_t value)
+{
+       reg ^= SWIZZLE_8;
+       cvmx_write64_int8(__cvmx_hwfau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 64 bit write
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @param value   Signed value to write.
+ */
+static inline void cvmx_hwfau_atomic_write64(cvmx_fau_reg64_t reg, s64 value)
+{
+       cvmx_write64_int64(__cvmx_hwfau_store_address(1, reg), value);
+}
+
+/**
+ * Perform an atomic 32 bit write
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @param value   Signed value to write.
+ */
+static inline void cvmx_hwfau_atomic_write32(cvmx_fau_reg32_t reg, s32 value)
+{
+       reg ^= SWIZZLE_32;
+       cvmx_write64_int32(__cvmx_hwfau_store_address(1, reg), value);
+}
+
+/**
+ * Perform an atomic 16 bit write
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @param value   Signed value to write.
+ */
+static inline void cvmx_hwfau_atomic_write16(cvmx_fau_reg16_t reg, s16 value)
+{
+       reg ^= SWIZZLE_16;
+       cvmx_write64_int16(__cvmx_hwfau_store_address(1, reg), value);
+}
+
+/**
+ * Perform an atomic 8 bit write
+ *
+ * @param reg     FAU atomic register to access. 0 <= reg < 2048.
+ * @param value   Signed value to write.
+ */
+static inline void cvmx_hwfau_atomic_write8(cvmx_fau_reg8_t reg, int8_t value)
+{
+       reg ^= SWIZZLE_8;
+       cvmx_write64_int8(__cvmx_hwfau_store_address(1, reg), value);
+}
+
+/** Allocates 64bit FAU register.
+ *  @return value is the base address of allocated FAU register
+ */
+int cvmx_fau64_alloc(int reserve);
+
+/** Allocates 32bit FAU register.
+ *  @return value is the base address of allocated FAU register
+ */
+int cvmx_fau32_alloc(int reserve);
+
+/** Allocates 16bit FAU register.
+ *  @return value is the base address of allocated FAU register
+ */
+int cvmx_fau16_alloc(int reserve);
+
+/** Allocates 8bit FAU register.
+ *  @return value is the base address of allocated FAU register
+ */
+int cvmx_fau8_alloc(int reserve);
+
+/** Frees the specified FAU register.
+ *  @param address Base address of register to release.
+ *  @return 0 on success; -1 on failure
+ */
+int cvmx_fau_free(int address);
+
+/** Display the fau registers array
+ */
+void cvmx_fau_show(void);
+
+#endif /* __CVMX_HWFAU_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-hwpko.h b/arch/mips/mach-octeon/include/mach/cvmx-hwpko.h
new file mode 100644 (file)
index 0000000..459c19b
--- /dev/null
@@ -0,0 +1,570 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Packet Output unit.
+ *
+ * Starting with SDK 1.7.0, the PKO output functions now support
+ * two types of locking. CVMX_PKO_LOCK_ATOMIC_TAG continues to
+ * function similarly to previous SDKs by using POW atomic tags
+ * to preserve ordering and exclusivity. As a new option, you
+ * can now pass CVMX_PKO_LOCK_CMD_QUEUE which uses a ll/sc
+ * memory based locking instead. This locking has the advantage
+ * of not affecting the tag state but doesn't preserve packet
+ * ordering. CVMX_PKO_LOCK_CMD_QUEUE is appropriate in most
+ * generic code while CVMX_PKO_LOCK_CMD_QUEUE should be used
+ * with hand tuned fast path code.
+ *
+ * Some of other SDK differences visible to the command command
+ * queuing:
+ * - PKO indexes are no longer stored in the FAU. A large
+ *   percentage of the FAU register block used to be tied up
+ *   maintaining PKO queue pointers. These are now stored in a
+ *   global named block.
+ * - The PKO <b>use_locking</b> parameter can now have a global
+ *   effect. Since all application use the same named block,
+ *   queue locking correctly applies across all operating
+ *   systems when using CVMX_PKO_LOCK_CMD_QUEUE.
+ * - PKO 3 word commands are now supported. Use
+ *   cvmx_pko_send_packet_finish3().
+ */
+
+#ifndef __CVMX_HWPKO_H__
+#define __CVMX_HWPKO_H__
+
+#include "cvmx-hwfau.h"
+#include "cvmx-fpa.h"
+#include "cvmx-pow.h"
+#include "cvmx-cmd-queue.h"
+#include "cvmx-helper.h"
+#include "cvmx-helper-util.h"
+#include "cvmx-helper-cfg.h"
+
+/* Adjust the command buffer size by 1 word so that in the case of using only
+** two word PKO commands no command words stradle buffers.  The useful values
+** for this are 0 and 1. */
+#define CVMX_PKO_COMMAND_BUFFER_SIZE_ADJUST (1)
+
+#define CVMX_PKO_MAX_OUTPUT_QUEUES_STATIC 256
+#define CVMX_PKO_MAX_OUTPUT_QUEUES                                                                 \
+       ((OCTEON_IS_OCTEON2() || OCTEON_IS_MODEL(OCTEON_CN70XX)) ? 256 : 128)
+#define CVMX_PKO_NUM_OUTPUT_PORTS                                                                  \
+       ((OCTEON_IS_MODEL(OCTEON_CN63XX)) ? 44 : (OCTEON_IS_MODEL(OCTEON_CN66XX) ? 48 : 40))
+#define CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID 63
+#define CVMX_PKO_QUEUE_STATIC_PRIORITY     9
+#define CVMX_PKO_ILLEGAL_QUEUE             0xFFFF
+#define CVMX_PKO_MAX_QUEUE_DEPTH           0
+
+typedef enum {
+       CVMX_PKO_SUCCESS,
+       CVMX_PKO_INVALID_PORT,
+       CVMX_PKO_INVALID_QUEUE,
+       CVMX_PKO_INVALID_PRIORITY,
+       CVMX_PKO_NO_MEMORY,
+       CVMX_PKO_PORT_ALREADY_SETUP,
+       CVMX_PKO_CMD_QUEUE_INIT_ERROR
+} cvmx_pko_return_value_t;
+
+/**
+ * This enumeration represents the differnet locking modes supported by PKO.
+ */
+typedef enum {
+       CVMX_PKO_LOCK_NONE = 0,
+       CVMX_PKO_LOCK_ATOMIC_TAG = 1,
+       CVMX_PKO_LOCK_CMD_QUEUE = 2,
+} cvmx_pko_lock_t;
+
+typedef struct cvmx_pko_port_status {
+       u32 packets;
+       u64 octets;
+       u64 doorbell;
+} cvmx_pko_port_status_t;
+
+/**
+ * This structure defines the address to use on a packet enqueue
+ */
+typedef union {
+       u64 u64;
+       struct {
+               cvmx_mips_space_t mem_space : 2;
+               u64 reserved : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved2 : 4;
+               u64 reserved3 : 15;
+               u64 port : 9;
+               u64 queue : 9;
+               u64 reserved4 : 3;
+       } s;
+} cvmx_pko_doorbell_address_t;
+
+/**
+ * Structure of the first packet output command word.
+ */
+typedef union {
+       u64 u64;
+       struct {
+               cvmx_fau_op_size_t size1 : 2;
+               cvmx_fau_op_size_t size0 : 2;
+               u64 subone1 : 1;
+               u64 reg1 : 11;
+               u64 subone0 : 1;
+               u64 reg0 : 11;
+               u64 le : 1;
+               u64 n2 : 1;
+               u64 wqp : 1;
+               u64 rsp : 1;
+               u64 gather : 1;
+               u64 ipoffp1 : 7;
+               u64 ignore_i : 1;
+               u64 dontfree : 1;
+               u64 segs : 6;
+               u64 total_bytes : 16;
+       } s;
+} cvmx_pko_command_word0_t;
+
+/**
+ * Call before any other calls to initialize the packet
+ * output system.
+ */
+
+void cvmx_pko_hw_init(u8 pool, unsigned int bufsize);
+
+/**
+ * Enables the packet output hardware. It must already be
+ * configured.
+ */
+void cvmx_pko_enable(void);
+
+/**
+ * Disables the packet output. Does not affect any configuration.
+ */
+void cvmx_pko_disable(void);
+
+/**
+ * Shutdown and free resources required by packet output.
+ */
+
+void cvmx_pko_shutdown(void);
+
+/**
+ * Configure a output port and the associated queues for use.
+ *
+ * @param port       Port to configure.
+ * @param base_queue First queue number to associate with this port.
+ * @param num_queues Number of queues t oassociate with this port
+ * @param priority   Array of priority levels for each queue. Values are
+ *                   allowed to be 1-8. A value of 8 get 8 times the traffic
+ *                   of a value of 1. There must be num_queues elements in the
+ *                   array.
+ */
+cvmx_pko_return_value_t cvmx_pko_config_port(int port, int base_queue, int num_queues,
+                                            const u8 priority[]);
+
+/**
+ * Ring the packet output doorbell. This tells the packet
+ * output hardware that "len" command words have been added
+ * to its pending list.  This command includes the required
+ * CVMX_SYNCWS before the doorbell ring.
+ *
+ * WARNING: This function may have to look up the proper PKO port in
+ * the IPD port to PKO port map, and is thus slower than calling
+ * cvmx_pko_doorbell_pkoid() directly if the PKO port identifier is
+ * known.
+ *
+ * @param ipd_port   The IPD port corresponding the to pko port the packet is for
+ * @param queue  Queue the packet is for
+ * @param len    Length of the command in 64 bit words
+ */
+static inline void cvmx_pko_doorbell(u64 ipd_port, u64 queue, u64 len)
+{
+       cvmx_pko_doorbell_address_t ptr;
+       u64 pko_port;
+
+       pko_port = ipd_port;
+       if (octeon_has_feature(OCTEON_FEATURE_PKND))
+               pko_port = cvmx_helper_cfg_ipd2pko_port_base(ipd_port);
+
+       ptr.u64 = 0;
+       ptr.s.mem_space = CVMX_IO_SEG;
+       ptr.s.did = CVMX_OCT_DID_PKT_SEND;
+       ptr.s.is_io = 1;
+       ptr.s.port = pko_port;
+       ptr.s.queue = queue;
+       /* Need to make sure output queue data is in DRAM before doorbell write */
+       CVMX_SYNCWS;
+       cvmx_write_io(ptr.u64, len);
+}
+
+/**
+ * Prepare to send a packet.  This may initiate a tag switch to
+ * get exclusive access to the output queue structure, and
+ * performs other prep work for the packet send operation.
+ *
+ * cvmx_pko_send_packet_finish() MUST be called after this function is called,
+ * and must be called with the same port/queue/use_locking arguments.
+ *
+ * The use_locking parameter allows the caller to use three
+ * possible locking modes.
+ * - CVMX_PKO_LOCK_NONE
+ *      - PKO doesn't do any locking. It is the responsibility
+ *          of the application to make sure that no other core
+ *          is accessing the same queue at the same time.
+ * - CVMX_PKO_LOCK_ATOMIC_TAG
+ *      - PKO performs an atomic tagswitch to insure exclusive
+ *          access to the output queue. This will maintain
+ *          packet ordering on output.
+ * - CVMX_PKO_LOCK_CMD_QUEUE
+ *      - PKO uses the common command queue locks to insure
+ *          exclusive access to the output queue. This is a
+ *          memory based ll/sc. This is the most portable
+ *          locking mechanism.
+ *
+ * NOTE: If atomic locking is used, the POW entry CANNOT be
+ * descheduled, as it does not contain a valid WQE pointer.
+ *
+ * @param port   Port to send it on, this can be either IPD port or PKO
+ *              port.
+ * @param queue  Queue to use
+ * @param use_locking
+ *               CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or CVMX_PKO_LOCK_CMD_QUEUE
+ */
+static inline void cvmx_pko_send_packet_prepare(u64 port __attribute__((unused)), u64 queue,
+                                               cvmx_pko_lock_t use_locking)
+{
+       if (use_locking == CVMX_PKO_LOCK_ATOMIC_TAG) {
+               /*
+                * Must do a full switch here to handle all cases.  We use a
+                * fake WQE pointer, as the POW does not access this memory.
+                * The WQE pointer and group are only used if this work is
+                * descheduled, which is not supported by the
+                * cvmx_pko_send_packet_prepare/cvmx_pko_send_packet_finish
+                * combination. Note that this is a special case in which these
+                * fake values can be used - this is not a general technique.
+                */
+               u32 tag = CVMX_TAG_SW_BITS_INTERNAL << CVMX_TAG_SW_SHIFT |
+                         CVMX_TAG_SUBGROUP_PKO << CVMX_TAG_SUBGROUP_SHIFT |
+                         (CVMX_TAG_SUBGROUP_MASK & queue);
+               cvmx_pow_tag_sw_full((cvmx_wqe_t *)cvmx_phys_to_ptr(0x80), tag,
+                                    CVMX_POW_TAG_TYPE_ATOMIC, 0);
+       }
+}
+
+#define cvmx_pko_send_packet_prepare_pkoid cvmx_pko_send_packet_prepare
+
+/**
+ * Complete packet output. cvmx_pko_send_packet_prepare() must be called exactly once before this,
+ * and the same parameters must be passed to both cvmx_pko_send_packet_prepare() and
+ * cvmx_pko_send_packet_finish().
+ *
+ * WARNING: This function may have to look up the proper PKO port in
+ * the IPD port to PKO port map, and is thus slower than calling
+ * cvmx_pko_send_packet_finish_pkoid() directly if the PKO port
+ * identifier is known.
+ *
+ * @param ipd_port   The IPD port corresponding the to pko port the packet is for
+ * @param queue  Queue to use
+ * @param pko_command
+ *               PKO HW command word
+ * @param packet Packet to send
+ * @param use_locking
+ *               CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or CVMX_PKO_LOCK_CMD_QUEUE
+ *
+ * @return returns CVMX_PKO_SUCCESS on success, or error code on failure of output
+ */
+static inline cvmx_pko_return_value_t
+cvmx_hwpko_send_packet_finish(u64 ipd_port, u64 queue, cvmx_pko_command_word0_t pko_command,
+                             cvmx_buf_ptr_t packet, cvmx_pko_lock_t use_locking)
+{
+       cvmx_cmd_queue_result_t result;
+
+       if (use_locking == CVMX_PKO_LOCK_ATOMIC_TAG)
+               cvmx_pow_tag_sw_wait();
+
+       result = cvmx_cmd_queue_write2(CVMX_CMD_QUEUE_PKO(queue),
+                                      (use_locking == CVMX_PKO_LOCK_CMD_QUEUE), pko_command.u64,
+                                      packet.u64);
+       if (cvmx_likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
+               cvmx_pko_doorbell(ipd_port, queue, 2);
+               return CVMX_PKO_SUCCESS;
+       } else if ((result == CVMX_CMD_QUEUE_NO_MEMORY) || (result == CVMX_CMD_QUEUE_FULL)) {
+               return CVMX_PKO_NO_MEMORY;
+       } else {
+               return CVMX_PKO_INVALID_QUEUE;
+       }
+}
+
+/**
+ * Complete packet output. cvmx_pko_send_packet_prepare() must be called exactly once before this,
+ * and the same parameters must be passed to both cvmx_pko_send_packet_prepare() and
+ * cvmx_pko_send_packet_finish().
+ *
+ * WARNING: This function may have to look up the proper PKO port in
+ * the IPD port to PKO port map, and is thus slower than calling
+ * cvmx_pko_send_packet_finish3_pkoid() directly if the PKO port
+ * identifier is known.
+ *
+ * @param ipd_port   The IPD port corresponding the to pko port the packet is for
+ * @param queue  Queue to use
+ * @param pko_command
+ *               PKO HW command word
+ * @param packet Packet to send
+ * @param addr   Plysical address of a work queue entry or physical address to zero on complete.
+ * @param use_locking
+ *               CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or CVMX_PKO_LOCK_CMD_QUEUE
+ *
+ * @return returns CVMX_PKO_SUCCESS on success, or error code on failure of output
+ */
+static inline cvmx_pko_return_value_t
+cvmx_hwpko_send_packet_finish3(u64 ipd_port, u64 queue, cvmx_pko_command_word0_t pko_command,
+                              cvmx_buf_ptr_t packet, u64 addr, cvmx_pko_lock_t use_locking)
+{
+       cvmx_cmd_queue_result_t result;
+
+       if (use_locking == CVMX_PKO_LOCK_ATOMIC_TAG)
+               cvmx_pow_tag_sw_wait();
+
+       result = cvmx_cmd_queue_write3(CVMX_CMD_QUEUE_PKO(queue),
+                                      (use_locking == CVMX_PKO_LOCK_CMD_QUEUE), pko_command.u64,
+                                      packet.u64, addr);
+       if (cvmx_likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
+               cvmx_pko_doorbell(ipd_port, queue, 3);
+               return CVMX_PKO_SUCCESS;
+       } else if ((result == CVMX_CMD_QUEUE_NO_MEMORY) || (result == CVMX_CMD_QUEUE_FULL)) {
+               return CVMX_PKO_NO_MEMORY;
+       } else {
+               return CVMX_PKO_INVALID_QUEUE;
+       }
+}
+
+/**
+ * Get the first pko_port for the (interface, index)
+ *
+ * @param interface
+ * @param index
+ */
+int cvmx_pko_get_base_pko_port(int interface, int index);
+
+/**
+ * Get the number of pko_ports for the (interface, index)
+ *
+ * @param interface
+ * @param index
+ */
+int cvmx_pko_get_num_pko_ports(int interface, int index);
+
+/**
+ * For a given port number, return the base pko output queue
+ * for the port.
+ *
+ * @param port   IPD port number
+ * @return Base output queue
+ */
+int cvmx_pko_get_base_queue(int port);
+
+/**
+ * For a given port number, return the number of pko output queues.
+ *
+ * @param port   IPD port number
+ * @return Number of output queues
+ */
+int cvmx_pko_get_num_queues(int port);
+
+/**
+ * Sets the internal FPA pool data structure for PKO comamnd queue.
+ * @param pool fpa pool number yo use
+ * @param buffer_size  buffer size of pool
+ * @param buffer_count number of buufers to allocate to pool
+ *
+ * @note the caller is responsable for setting up the pool with
+ * an appropriate buffer size and sufficient buffer count.
+ */
+void cvmx_pko_set_cmd_que_pool_config(s64 pool, u64 buffer_size, u64 buffer_count);
+
+/**
+ * Get the status counters for a port.
+ *
+ * @param ipd_port Port number (ipd_port) to get statistics for.
+ * @param clear    Set to 1 to clear the counters after they are read
+ * @param status   Where to put the results.
+ *
+ * Note:
+ *     - Only the doorbell for the base queue of the ipd_port is
+ *       collected.
+ *     - Retrieving the stats involves writing the index through
+ *       CVMX_PKO_REG_READ_IDX and reading the stat CSRs, in that
+ *       order. It is not MP-safe and caller should guarantee
+ *       atomicity.
+ */
+void cvmx_pko_get_port_status(u64 ipd_port, u64 clear, cvmx_pko_port_status_t *status);
+
+/**
+ * Rate limit a PKO port to a max packets/sec. This function is only
+ * supported on CN57XX, CN56XX, CN55XX, and CN54XX.
+ *
+ * @param port      Port to rate limit
+ * @param packets_s Maximum packet/sec
+ * @param burst     Maximum number of packets to burst in a row before rate
+ *                  limiting cuts in.
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_pko_rate_limit_packets(int port, int packets_s, int burst);
+
+/**
+ * Rate limit a PKO port to a max bits/sec. This function is only
+ * supported on CN57XX, CN56XX, CN55XX, and CN54XX.
+ *
+ * @param port   Port to rate limit
+ * @param bits_s PKO rate limit in bits/sec
+ * @param burst  Maximum number of bits to burst before rate
+ *               limiting cuts in.
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_pko_rate_limit_bits(int port, u64 bits_s, int burst);
+
+/**
+ * @INTERNAL
+ *
+ * Retrieve the PKO pipe number for a port
+ *
+ * @param interface
+ * @param index
+ *
+ * @return negative on error.
+ *
+ * This applies only to the non-loopback interfaces.
+ *
+ */
+int __cvmx_pko_get_pipe(int interface, int index);
+
+/**
+ * For a given PKO port number, return the base output queue
+ * for the port.
+ *
+ * @param pko_port   PKO port number
+ * @return           Base output queue
+ */
+int cvmx_pko_get_base_queue_pkoid(int pko_port);
+
+/**
+ * For a given PKO port number, return the number of output queues
+ * for the port.
+ *
+ * @param pko_port     PKO port number
+ * @return             the number of output queues
+ */
+int cvmx_pko_get_num_queues_pkoid(int pko_port);
+
+/**
+ * Ring the packet output doorbell. This tells the packet
+ * output hardware that "len" command words have been added
+ * to its pending list.  This command includes the required
+ * CVMX_SYNCWS before the doorbell ring.
+ *
+ * @param pko_port   Port the packet is for
+ * @param queue  Queue the packet is for
+ * @param len    Length of the command in 64 bit words
+ */
+static inline void cvmx_pko_doorbell_pkoid(u64 pko_port, u64 queue, u64 len)
+{
+       cvmx_pko_doorbell_address_t ptr;
+
+       ptr.u64 = 0;
+       ptr.s.mem_space = CVMX_IO_SEG;
+       ptr.s.did = CVMX_OCT_DID_PKT_SEND;
+       ptr.s.is_io = 1;
+       ptr.s.port = pko_port;
+       ptr.s.queue = queue;
+       /* Need to make sure output queue data is in DRAM before doorbell write */
+       CVMX_SYNCWS;
+       cvmx_write_io(ptr.u64, len);
+}
+
+/**
+ * Complete packet output. cvmx_pko_send_packet_prepare() must be called exactly once before this,
+ * and the same parameters must be passed to both cvmx_pko_send_packet_prepare() and
+ * cvmx_pko_send_packet_finish_pkoid().
+ *
+ * @param pko_port   Port to send it on
+ * @param queue  Queue to use
+ * @param pko_command
+ *               PKO HW command word
+ * @param packet Packet to send
+ * @param use_locking
+ *               CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or CVMX_PKO_LOCK_CMD_QUEUE
+ *
+ * @return returns CVMX_PKO_SUCCESS on success, or error code on failure of output
+ */
+static inline cvmx_pko_return_value_t
+cvmx_hwpko_send_packet_finish_pkoid(int pko_port, u64 queue, cvmx_pko_command_word0_t pko_command,
+                                   cvmx_buf_ptr_t packet, cvmx_pko_lock_t use_locking)
+{
+       cvmx_cmd_queue_result_t result;
+
+       if (use_locking == CVMX_PKO_LOCK_ATOMIC_TAG)
+               cvmx_pow_tag_sw_wait();
+
+       result = cvmx_cmd_queue_write2(CVMX_CMD_QUEUE_PKO(queue),
+                                      (use_locking == CVMX_PKO_LOCK_CMD_QUEUE), pko_command.u64,
+                                      packet.u64);
+       if (cvmx_likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
+               cvmx_pko_doorbell_pkoid(pko_port, queue, 2);
+               return CVMX_PKO_SUCCESS;
+       } else if ((result == CVMX_CMD_QUEUE_NO_MEMORY) || (result == CVMX_CMD_QUEUE_FULL)) {
+               return CVMX_PKO_NO_MEMORY;
+       } else {
+               return CVMX_PKO_INVALID_QUEUE;
+       }
+}
+
+/**
+ * Complete packet output. cvmx_pko_send_packet_prepare() must be called exactly once before this,
+ * and the same parameters must be passed to both cvmx_pko_send_packet_prepare() and
+ * cvmx_pko_send_packet_finish_pkoid().
+ *
+ * @param pko_port   The PKO port the packet is for
+ * @param queue  Queue to use
+ * @param pko_command
+ *               PKO HW command word
+ * @param packet Packet to send
+ * @param addr   Plysical address of a work queue entry or physical address to zero on complete.
+ * @param use_locking
+ *               CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or CVMX_PKO_LOCK_CMD_QUEUE
+ *
+ * @return returns CVMX_PKO_SUCCESS on success, or error code on failure of output
+ */
+static inline cvmx_pko_return_value_t
+cvmx_hwpko_send_packet_finish3_pkoid(u64 pko_port, u64 queue, cvmx_pko_command_word0_t pko_command,
+                                    cvmx_buf_ptr_t packet, u64 addr, cvmx_pko_lock_t use_locking)
+{
+       cvmx_cmd_queue_result_t result;
+
+       if (use_locking == CVMX_PKO_LOCK_ATOMIC_TAG)
+               cvmx_pow_tag_sw_wait();
+
+       result = cvmx_cmd_queue_write3(CVMX_CMD_QUEUE_PKO(queue),
+                                      (use_locking == CVMX_PKO_LOCK_CMD_QUEUE), pko_command.u64,
+                                      packet.u64, addr);
+       if (cvmx_likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
+               cvmx_pko_doorbell_pkoid(pko_port, queue, 3);
+               return CVMX_PKO_SUCCESS;
+       } else if ((result == CVMX_CMD_QUEUE_NO_MEMORY) || (result == CVMX_CMD_QUEUE_FULL)) {
+               return CVMX_PKO_NO_MEMORY;
+       } else {
+               return CVMX_PKO_INVALID_QUEUE;
+       }
+}
+
+/*
+ * Obtain the number of PKO commands pending in a queue
+ *
+ * @param queue is the queue identifier to be queried
+ * @return the number of commands pending transmission or -1 on error
+ */
+int cvmx_pko_queue_pend_count(cvmx_cmd_queue_id_t queue);
+
+void cvmx_pko_set_cmd_queue_pool_buffer_count(u64 buffer_count);
+
+#endif /* __CVMX_HWPKO_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-ilk.h b/arch/mips/mach-octeon/include/mach/cvmx-ilk.h
new file mode 100644 (file)
index 0000000..7272983
--- /dev/null
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * This file contains defines for the ILK interface
+ */
+
+#ifndef __CVMX_ILK_H__
+#define __CVMX_ILK_H__
+
+/* CSR typedefs have been moved to cvmx-ilk-defs.h */
+
+/*
+ * Note: this macro must match the first ilk port in the ipd_port_map_68xx[]
+ * and ipd_port_map_78xx[] arrays.
+ */
+static inline int CVMX_ILK_GBL_BASE(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               return 5;
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 6;
+       return -1;
+}
+
+static inline int CVMX_ILK_QLM_BASE(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               return 1;
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 4;
+       return -1;
+}
+
+typedef struct {
+       int intf_en : 1;
+       int la_mode : 1;
+       int reserved : 14; /* unused */
+       int lane_speed : 16;
+       /* add more here */
+} cvmx_ilk_intf_t;
+
+#define CVMX_NUM_ILK_INTF 2
+static inline int CVMX_ILK_MAX_LANES(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               return 8;
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 16;
+       return -1;
+}
+
+extern unsigned short cvmx_ilk_lane_mask[CVMX_MAX_NODES][CVMX_NUM_ILK_INTF];
+
+typedef struct {
+       unsigned int pipe;
+       unsigned int chan;
+} cvmx_ilk_pipe_chan_t;
+
+#define CVMX_ILK_MAX_PIPES 45
+/* Max number of channels allowed */
+#define CVMX_ILK_MAX_CHANS 256
+
+extern int cvmx_ilk_chans[CVMX_MAX_NODES][CVMX_NUM_ILK_INTF];
+
+typedef struct {
+       unsigned int chan;
+       unsigned int pknd;
+} cvmx_ilk_chan_pknd_t;
+
+#define CVMX_ILK_MAX_PKNDS 16 /* must be <45 */
+
+typedef struct {
+       int *chan_list; /* for discrete channels. or, must be null */
+       unsigned int num_chans;
+
+       unsigned int chan_start; /* for continuous channels */
+       unsigned int chan_end;
+       unsigned int chan_step;
+
+       unsigned int clr_on_rd;
+} cvmx_ilk_stats_ctrl_t;
+
+#define CVMX_ILK_MAX_CAL      288
+#define CVMX_ILK_MAX_CAL_IDX  (CVMX_ILK_MAX_CAL / 8)
+#define CVMX_ILK_TX_MIN_CAL   1
+#define CVMX_ILK_RX_MIN_CAL   1
+#define CVMX_ILK_CAL_GRP_SZ   8
+#define CVMX_ILK_PIPE_BPID_SZ 7
+#define CVMX_ILK_ENT_CTRL_SZ  2
+#define CVMX_ILK_RX_FIFO_WM   0x200
+
+typedef enum { PIPE_BPID = 0, LINK, XOFF, XON } cvmx_ilk_cal_ent_ctrl_t;
+
+typedef struct {
+       unsigned char pipe_bpid;
+       cvmx_ilk_cal_ent_ctrl_t ent_ctrl;
+} cvmx_ilk_cal_entry_t;
+
+typedef enum { CVMX_ILK_LPBK_DISA = 0, CVMX_ILK_LPBK_ENA } cvmx_ilk_lpbk_ena_t;
+
+typedef enum { CVMX_ILK_LPBK_INT = 0, CVMX_ILK_LPBK_EXT } cvmx_ilk_lpbk_mode_t;
+
+/**
+ * This header is placed in front of all received ILK look-aside mode packets
+ */
+typedef union {
+       u64 u64;
+
+       struct {
+               u32 reserved_63_57 : 7;   /* bits 63...57 */
+               u32 nsp_cmd : 5;          /* bits 56...52 */
+               u32 nsp_flags : 4;        /* bits 51...48 */
+               u32 nsp_grp_id_upper : 6; /* bits 47...42 */
+               u32 reserved_41_40 : 2;   /* bits 41...40 */
+               /* Protocol type, 1 for LA mode packet */
+               u32 la_mode : 1;          /* bit  39      */
+               u32 nsp_grp_id_lower : 2; /* bits 38...37 */
+               u32 nsp_xid_upper : 4;    /* bits 36...33 */
+               /* ILK channel number, 0 or 1 */
+               u32 ilk_channel : 1;   /* bit  32      */
+               u32 nsp_xid_lower : 8; /* bits 31...24 */
+               /* Unpredictable, may be any value */
+               u32 reserved_23_0 : 24; /* bits 23...0  */
+       } s;
+} cvmx_ilk_la_nsp_compact_hdr_t;
+
+typedef struct cvmx_ilk_LA_mode_struct {
+       int ilk_LA_mode;
+       int ilk_LA_mode_cal_ena;
+} cvmx_ilk_LA_mode_t;
+
+extern cvmx_ilk_LA_mode_t cvmx_ilk_LA_mode[CVMX_NUM_ILK_INTF];
+
+int cvmx_ilk_use_la_mode(int interface, int channel);
+int cvmx_ilk_start_interface(int interface, unsigned short num_lanes);
+int cvmx_ilk_start_interface_la(int interface, unsigned char num_lanes);
+int cvmx_ilk_set_pipe(int interface, int pipe_base, unsigned int pipe_len);
+int cvmx_ilk_tx_set_channel(int interface, cvmx_ilk_pipe_chan_t *pch, unsigned int num_chs);
+int cvmx_ilk_rx_set_pknd(int interface, cvmx_ilk_chan_pknd_t *chpknd, unsigned int num_pknd);
+int cvmx_ilk_enable(int interface);
+int cvmx_ilk_disable(int interface);
+int cvmx_ilk_get_intf_ena(int interface);
+int cvmx_ilk_get_chan_info(int interface, unsigned char **chans, unsigned char *num_chan);
+cvmx_ilk_la_nsp_compact_hdr_t cvmx_ilk_enable_la_header(int ipd_port, int mode);
+void cvmx_ilk_show_stats(int interface, cvmx_ilk_stats_ctrl_t *pstats);
+int cvmx_ilk_cal_setup_rx(int interface, int cal_depth, cvmx_ilk_cal_entry_t *pent, int hi_wm,
+                         unsigned char cal_ena);
+int cvmx_ilk_cal_setup_tx(int interface, int cal_depth, cvmx_ilk_cal_entry_t *pent,
+                         unsigned char cal_ena);
+int cvmx_ilk_lpbk(int interface, cvmx_ilk_lpbk_ena_t enable, cvmx_ilk_lpbk_mode_t mode);
+int cvmx_ilk_la_mode_enable_rx_calendar(int interface);
+
+#endif /* __CVMX_ILK_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-ipd-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-ipd-defs.h
new file mode 100644 (file)
index 0000000..ad860fc
--- /dev/null
@@ -0,0 +1,1925 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon ipd.
+ */
+
+#ifndef __CVMX_IPD_DEFS_H__
+#define __CVMX_IPD_DEFS_H__
+
+#define CVMX_IPD_1ST_MBUFF_SKIP                    (0x00014F0000000000ull)
+#define CVMX_IPD_1st_NEXT_PTR_BACK         (0x00014F0000000150ull)
+#define CVMX_IPD_2nd_NEXT_PTR_BACK         (0x00014F0000000158ull)
+#define CVMX_IPD_BIST_STATUS               (0x00014F00000007F8ull)
+#define CVMX_IPD_BPIDX_MBUF_TH(offset)     (0x00014F0000002000ull + ((offset) & 63) * 8)
+#define CVMX_IPD_BPID_BP_COUNTERX(offset)   (0x00014F0000003000ull + ((offset) & 63) * 8)
+#define CVMX_IPD_BP_PRT_RED_END                    (0x00014F0000000328ull)
+#define CVMX_IPD_CLK_COUNT                 (0x00014F0000000338ull)
+#define CVMX_IPD_CREDITS                   (0x00014F0000004410ull)
+#define CVMX_IPD_CTL_STATUS                (0x00014F0000000018ull)
+#define CVMX_IPD_ECC_CTL                   (0x00014F0000004408ull)
+#define CVMX_IPD_FREE_PTR_FIFO_CTL         (0x00014F0000000780ull)
+#define CVMX_IPD_FREE_PTR_VALUE                    (0x00014F0000000788ull)
+#define CVMX_IPD_HOLD_PTR_FIFO_CTL         (0x00014F0000000790ull)
+#define CVMX_IPD_INT_ENB                   (0x00014F0000000160ull)
+#define CVMX_IPD_INT_SUM                   (0x00014F0000000168ull)
+#define CVMX_IPD_NEXT_PKT_PTR              (0x00014F00000007A0ull)
+#define CVMX_IPD_NEXT_WQE_PTR              (0x00014F00000007A8ull)
+#define CVMX_IPD_NOT_1ST_MBUFF_SKIP        (0x00014F0000000008ull)
+#define CVMX_IPD_ON_BP_DROP_PKTX(offset)    (0x00014F0000004100ull)
+#define CVMX_IPD_PACKET_MBUFF_SIZE         (0x00014F0000000010ull)
+#define CVMX_IPD_PKT_ERR                   (0x00014F00000003F0ull)
+#define CVMX_IPD_PKT_PTR_VALID             (0x00014F0000000358ull)
+#define CVMX_IPD_PORTX_BP_PAGE_CNT(offset)  (0x00014F0000000028ull + ((offset) & 63) * 8)
+#define CVMX_IPD_PORTX_BP_PAGE_CNT2(offset) (0x00014F0000000368ull + ((offset) & 63) * 8 - 8 * 36)
+#define CVMX_IPD_PORTX_BP_PAGE_CNT3(offset) (0x00014F00000003D0ull + ((offset) & 63) * 8 - 8 * 40)
+#define CVMX_IPD_PORT_BP_COUNTERS2_PAIRX(offset)                                                   \
+       (0x00014F0000000388ull + ((offset) & 63) * 8 - 8 * 36)
+#define CVMX_IPD_PORT_BP_COUNTERS3_PAIRX(offset)                                                   \
+       (0x00014F00000003B0ull + ((offset) & 63) * 8 - 8 * 40)
+#define CVMX_IPD_PORT_BP_COUNTERS4_PAIRX(offset)                                                   \
+       (0x00014F0000000410ull + ((offset) & 63) * 8 - 8 * 44)
+#define CVMX_IPD_PORT_BP_COUNTERS_PAIRX(offset) (0x00014F00000001B8ull + ((offset) & 63) * 8)
+#define CVMX_IPD_PORT_PTR_FIFO_CTL             (0x00014F0000000798ull)
+#define CVMX_IPD_PORT_QOS_INTX(offset)         (0x00014F0000000808ull + ((offset) & 7) * 8)
+#define CVMX_IPD_PORT_QOS_INT_ENBX(offset)     (0x00014F0000000848ull + ((offset) & 7) * 8)
+#define CVMX_IPD_PORT_QOS_X_CNT(offset)                (0x00014F0000000888ull + ((offset) & 511) * 8)
+#define CVMX_IPD_PORT_SOPX(offset)             (0x00014F0000004400ull)
+#define CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL         (0x00014F0000000348ull)
+#define CVMX_IPD_PRC_PORT_PTR_FIFO_CTL         (0x00014F0000000350ull)
+#define CVMX_IPD_PTR_COUNT                     (0x00014F0000000320ull)
+#define CVMX_IPD_PWP_PTR_FIFO_CTL              (0x00014F0000000340ull)
+#define CVMX_IPD_QOS0_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(0)
+#define CVMX_IPD_QOS1_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(1)
+#define CVMX_IPD_QOS2_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(2)
+#define CVMX_IPD_QOS3_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(3)
+#define CVMX_IPD_QOS4_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(4)
+#define CVMX_IPD_QOS5_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(5)
+#define CVMX_IPD_QOS6_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(6)
+#define CVMX_IPD_QOS7_RED_MARKS                        CVMX_IPD_QOSX_RED_MARKS(7)
+#define CVMX_IPD_QOSX_RED_MARKS(offset)                (0x00014F0000000178ull + ((offset) & 7) * 8)
+#define CVMX_IPD_QUE0_FREE_PAGE_CNT            (0x00014F0000000330ull)
+#define CVMX_IPD_RED_BPID_ENABLEX(offset)      (0x00014F0000004200ull)
+#define CVMX_IPD_RED_DELAY                     (0x00014F0000004300ull)
+#define CVMX_IPD_RED_PORT_ENABLE               (0x00014F00000002D8ull)
+#define CVMX_IPD_RED_PORT_ENABLE2              (0x00014F00000003A8ull)
+#define CVMX_IPD_RED_QUE0_PARAM                        CVMX_IPD_RED_QUEX_PARAM(0)
+#define CVMX_IPD_RED_QUE1_PARAM                        CVMX_IPD_RED_QUEX_PARAM(1)
+#define CVMX_IPD_RED_QUE2_PARAM                        CVMX_IPD_RED_QUEX_PARAM(2)
+#define CVMX_IPD_RED_QUE3_PARAM                        CVMX_IPD_RED_QUEX_PARAM(3)
+#define CVMX_IPD_RED_QUE4_PARAM                        CVMX_IPD_RED_QUEX_PARAM(4)
+#define CVMX_IPD_RED_QUE5_PARAM                        CVMX_IPD_RED_QUEX_PARAM(5)
+#define CVMX_IPD_RED_QUE6_PARAM                        CVMX_IPD_RED_QUEX_PARAM(6)
+#define CVMX_IPD_RED_QUE7_PARAM                        CVMX_IPD_RED_QUEX_PARAM(7)
+#define CVMX_IPD_RED_QUEX_PARAM(offset)                (0x00014F00000002E0ull + ((offset) & 7) * 8)
+#define CVMX_IPD_REQ_WGT                       (0x00014F0000004418ull)
+#define CVMX_IPD_SUB_PORT_BP_PAGE_CNT          (0x00014F0000000148ull)
+#define CVMX_IPD_SUB_PORT_FCS                  (0x00014F0000000170ull)
+#define CVMX_IPD_SUB_PORT_QOS_CNT              (0x00014F0000000800ull)
+#define CVMX_IPD_WQE_FPA_QUEUE                 (0x00014F0000000020ull)
+#define CVMX_IPD_WQE_PTR_VALID                 (0x00014F0000000360ull)
+
+/**
+ * cvmx_ipd_1st_mbuff_skip
+ *
+ * The number of words that the IPD will skip when writing the first MBUFF.
+ *
+ */
+union cvmx_ipd_1st_mbuff_skip {
+       u64 u64;
+       struct cvmx_ipd_1st_mbuff_skip_s {
+               u64 reserved_6_63 : 58;
+               u64 skip_sz : 6;
+       } s;
+       struct cvmx_ipd_1st_mbuff_skip_s cn30xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn31xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn38xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn38xxp2;
+       struct cvmx_ipd_1st_mbuff_skip_s cn50xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn52xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn52xxp1;
+       struct cvmx_ipd_1st_mbuff_skip_s cn56xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn56xxp1;
+       struct cvmx_ipd_1st_mbuff_skip_s cn58xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn58xxp1;
+       struct cvmx_ipd_1st_mbuff_skip_s cn61xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn63xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn63xxp1;
+       struct cvmx_ipd_1st_mbuff_skip_s cn66xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn68xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn68xxp1;
+       struct cvmx_ipd_1st_mbuff_skip_s cn70xx;
+       struct cvmx_ipd_1st_mbuff_skip_s cn70xxp1;
+       struct cvmx_ipd_1st_mbuff_skip_s cnf71xx;
+};
+
+typedef union cvmx_ipd_1st_mbuff_skip cvmx_ipd_1st_mbuff_skip_t;
+
+/**
+ * cvmx_ipd_1st_next_ptr_back
+ *
+ * IPD_1st_NEXT_PTR_BACK = IPD First Next Pointer Back Values
+ * Contains the Back Field for use in creating the Next Pointer Header for the First MBUF
+ */
+union cvmx_ipd_1st_next_ptr_back {
+       u64 u64;
+       struct cvmx_ipd_1st_next_ptr_back_s {
+               u64 reserved_4_63 : 60;
+               u64 back : 4;
+       } s;
+       struct cvmx_ipd_1st_next_ptr_back_s cn30xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn31xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn38xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn38xxp2;
+       struct cvmx_ipd_1st_next_ptr_back_s cn50xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn52xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn52xxp1;
+       struct cvmx_ipd_1st_next_ptr_back_s cn56xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn56xxp1;
+       struct cvmx_ipd_1st_next_ptr_back_s cn58xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn58xxp1;
+       struct cvmx_ipd_1st_next_ptr_back_s cn61xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn63xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn63xxp1;
+       struct cvmx_ipd_1st_next_ptr_back_s cn66xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn68xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn68xxp1;
+       struct cvmx_ipd_1st_next_ptr_back_s cn70xx;
+       struct cvmx_ipd_1st_next_ptr_back_s cn70xxp1;
+       struct cvmx_ipd_1st_next_ptr_back_s cnf71xx;
+};
+
+typedef union cvmx_ipd_1st_next_ptr_back cvmx_ipd_1st_next_ptr_back_t;
+
+/**
+ * cvmx_ipd_2nd_next_ptr_back
+ *
+ * Contains the Back Field for use in creating the Next Pointer Header for the First MBUF
+ *
+ */
+union cvmx_ipd_2nd_next_ptr_back {
+       u64 u64;
+       struct cvmx_ipd_2nd_next_ptr_back_s {
+               u64 reserved_4_63 : 60;
+               u64 back : 4;
+       } s;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn30xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn31xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn38xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn38xxp2;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn50xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn52xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn52xxp1;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn56xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn56xxp1;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn58xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn58xxp1;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn61xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn63xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn63xxp1;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn66xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn68xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn68xxp1;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn70xx;
+       struct cvmx_ipd_2nd_next_ptr_back_s cn70xxp1;
+       struct cvmx_ipd_2nd_next_ptr_back_s cnf71xx;
+};
+
+typedef union cvmx_ipd_2nd_next_ptr_back cvmx_ipd_2nd_next_ptr_back_t;
+
+/**
+ * cvmx_ipd_bist_status
+ *
+ * BIST Status for IPD's Memories.
+ *
+ */
+union cvmx_ipd_bist_status {
+       u64 u64;
+       struct cvmx_ipd_bist_status_s {
+               u64 reserved_23_63 : 41;
+               u64 iiwo1 : 1;
+               u64 iiwo0 : 1;
+               u64 iio1 : 1;
+               u64 iio0 : 1;
+               u64 pbm4 : 1;
+               u64 csr_mem : 1;
+               u64 csr_ncmd : 1;
+               u64 pwq_wqed : 1;
+               u64 pwq_wp1 : 1;
+               u64 pwq_pow : 1;
+               u64 ipq_pbe1 : 1;
+               u64 ipq_pbe0 : 1;
+               u64 pbm3 : 1;
+               u64 pbm2 : 1;
+               u64 pbm1 : 1;
+               u64 pbm0 : 1;
+               u64 pbm_word : 1;
+               u64 pwq1 : 1;
+               u64 pwq0 : 1;
+               u64 prc_off : 1;
+               u64 ipd_old : 1;
+               u64 ipd_new : 1;
+               u64 pwp : 1;
+       } s;
+       struct cvmx_ipd_bist_status_cn30xx {
+               u64 reserved_16_63 : 48;
+               u64 pwq_wqed : 1;
+               u64 pwq_wp1 : 1;
+               u64 pwq_pow : 1;
+               u64 ipq_pbe1 : 1;
+               u64 ipq_pbe0 : 1;
+               u64 pbm3 : 1;
+               u64 pbm2 : 1;
+               u64 pbm1 : 1;
+               u64 pbm0 : 1;
+               u64 pbm_word : 1;
+               u64 pwq1 : 1;
+               u64 pwq0 : 1;
+               u64 prc_off : 1;
+               u64 ipd_old : 1;
+               u64 ipd_new : 1;
+               u64 pwp : 1;
+       } cn30xx;
+       struct cvmx_ipd_bist_status_cn30xx cn31xx;
+       struct cvmx_ipd_bist_status_cn30xx cn38xx;
+       struct cvmx_ipd_bist_status_cn30xx cn38xxp2;
+       struct cvmx_ipd_bist_status_cn30xx cn50xx;
+       struct cvmx_ipd_bist_status_cn52xx {
+               u64 reserved_18_63 : 46;
+               u64 csr_mem : 1;
+               u64 csr_ncmd : 1;
+               u64 pwq_wqed : 1;
+               u64 pwq_wp1 : 1;
+               u64 pwq_pow : 1;
+               u64 ipq_pbe1 : 1;
+               u64 ipq_pbe0 : 1;
+               u64 pbm3 : 1;
+               u64 pbm2 : 1;
+               u64 pbm1 : 1;
+               u64 pbm0 : 1;
+               u64 pbm_word : 1;
+               u64 pwq1 : 1;
+               u64 pwq0 : 1;
+               u64 prc_off : 1;
+               u64 ipd_old : 1;
+               u64 ipd_new : 1;
+               u64 pwp : 1;
+       } cn52xx;
+       struct cvmx_ipd_bist_status_cn52xx cn52xxp1;
+       struct cvmx_ipd_bist_status_cn52xx cn56xx;
+       struct cvmx_ipd_bist_status_cn52xx cn56xxp1;
+       struct cvmx_ipd_bist_status_cn30xx cn58xx;
+       struct cvmx_ipd_bist_status_cn30xx cn58xxp1;
+       struct cvmx_ipd_bist_status_cn52xx cn61xx;
+       struct cvmx_ipd_bist_status_cn52xx cn63xx;
+       struct cvmx_ipd_bist_status_cn52xx cn63xxp1;
+       struct cvmx_ipd_bist_status_cn52xx cn66xx;
+       struct cvmx_ipd_bist_status_s cn68xx;
+       struct cvmx_ipd_bist_status_s cn68xxp1;
+       struct cvmx_ipd_bist_status_cn52xx cn70xx;
+       struct cvmx_ipd_bist_status_cn52xx cn70xxp1;
+       struct cvmx_ipd_bist_status_cn52xx cnf71xx;
+};
+
+typedef union cvmx_ipd_bist_status cvmx_ipd_bist_status_t;
+
+/**
+ * cvmx_ipd_bp_prt_red_end
+ *
+ * When IPD applies backpressure to a PORT and the corresponding bit in this register is set,
+ * the RED Unit will drop packets for that port.
+ */
+union cvmx_ipd_bp_prt_red_end {
+       u64 u64;
+       struct cvmx_ipd_bp_prt_red_end_s {
+               u64 reserved_48_63 : 16;
+               u64 prt_enb : 48;
+       } s;
+       struct cvmx_ipd_bp_prt_red_end_cn30xx {
+               u64 reserved_36_63 : 28;
+               u64 prt_enb : 36;
+       } cn30xx;
+       struct cvmx_ipd_bp_prt_red_end_cn30xx cn31xx;
+       struct cvmx_ipd_bp_prt_red_end_cn30xx cn38xx;
+       struct cvmx_ipd_bp_prt_red_end_cn30xx cn38xxp2;
+       struct cvmx_ipd_bp_prt_red_end_cn30xx cn50xx;
+       struct cvmx_ipd_bp_prt_red_end_cn52xx {
+               u64 reserved_40_63 : 24;
+               u64 prt_enb : 40;
+       } cn52xx;
+       struct cvmx_ipd_bp_prt_red_end_cn52xx cn52xxp1;
+       struct cvmx_ipd_bp_prt_red_end_cn52xx cn56xx;
+       struct cvmx_ipd_bp_prt_red_end_cn52xx cn56xxp1;
+       struct cvmx_ipd_bp_prt_red_end_cn30xx cn58xx;
+       struct cvmx_ipd_bp_prt_red_end_cn30xx cn58xxp1;
+       struct cvmx_ipd_bp_prt_red_end_s cn61xx;
+       struct cvmx_ipd_bp_prt_red_end_cn63xx {
+               u64 reserved_44_63 : 20;
+               u64 prt_enb : 44;
+       } cn63xx;
+       struct cvmx_ipd_bp_prt_red_end_cn63xx cn63xxp1;
+       struct cvmx_ipd_bp_prt_red_end_s cn66xx;
+       struct cvmx_ipd_bp_prt_red_end_s cn70xx;
+       struct cvmx_ipd_bp_prt_red_end_s cn70xxp1;
+       struct cvmx_ipd_bp_prt_red_end_s cnf71xx;
+};
+
+typedef union cvmx_ipd_bp_prt_red_end cvmx_ipd_bp_prt_red_end_t;
+
+/**
+ * cvmx_ipd_bpid#_mbuf_th
+ *
+ * 0x2000 2FFF
+ *
+ *                  IPD_BPIDX_MBUF_TH = IPD BPID  MBUFF Threshold
+ *
+ * The number of MBUFFs in use by the BPID, that when exceeded, backpressure will be applied to the BPID.
+ */
+union cvmx_ipd_bpidx_mbuf_th {
+       u64 u64;
+       struct cvmx_ipd_bpidx_mbuf_th_s {
+               u64 reserved_18_63 : 46;
+               u64 bp_enb : 1;
+               u64 page_cnt : 17;
+       } s;
+       struct cvmx_ipd_bpidx_mbuf_th_s cn68xx;
+       struct cvmx_ipd_bpidx_mbuf_th_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_bpidx_mbuf_th cvmx_ipd_bpidx_mbuf_th_t;
+
+/**
+ * cvmx_ipd_bpid_bp_counter#
+ *
+ * RESERVE SPACE UPTO 0x2FFF
+ *
+ * 0x3000 0x3ffff
+ *
+ * IPD_BPID_BP_COUNTERX = MBUF BPID Counters used to generate Back Pressure Per BPID.
+ */
+union cvmx_ipd_bpid_bp_counterx {
+       u64 u64;
+       struct cvmx_ipd_bpid_bp_counterx_s {
+               u64 reserved_25_63 : 39;
+               u64 cnt_val : 25;
+       } s;
+       struct cvmx_ipd_bpid_bp_counterx_s cn68xx;
+       struct cvmx_ipd_bpid_bp_counterx_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_bpid_bp_counterx cvmx_ipd_bpid_bp_counterx_t;
+
+/**
+ * cvmx_ipd_clk_count
+ *
+ * Counts the number of core clocks periods since the de-asserition of reset.
+ *
+ */
+union cvmx_ipd_clk_count {
+       u64 u64;
+       struct cvmx_ipd_clk_count_s {
+               u64 clk_cnt : 64;
+       } s;
+       struct cvmx_ipd_clk_count_s cn30xx;
+       struct cvmx_ipd_clk_count_s cn31xx;
+       struct cvmx_ipd_clk_count_s cn38xx;
+       struct cvmx_ipd_clk_count_s cn38xxp2;
+       struct cvmx_ipd_clk_count_s cn50xx;
+       struct cvmx_ipd_clk_count_s cn52xx;
+       struct cvmx_ipd_clk_count_s cn52xxp1;
+       struct cvmx_ipd_clk_count_s cn56xx;
+       struct cvmx_ipd_clk_count_s cn56xxp1;
+       struct cvmx_ipd_clk_count_s cn58xx;
+       struct cvmx_ipd_clk_count_s cn58xxp1;
+       struct cvmx_ipd_clk_count_s cn61xx;
+       struct cvmx_ipd_clk_count_s cn63xx;
+       struct cvmx_ipd_clk_count_s cn63xxp1;
+       struct cvmx_ipd_clk_count_s cn66xx;
+       struct cvmx_ipd_clk_count_s cn68xx;
+       struct cvmx_ipd_clk_count_s cn68xxp1;
+       struct cvmx_ipd_clk_count_s cn70xx;
+       struct cvmx_ipd_clk_count_s cn70xxp1;
+       struct cvmx_ipd_clk_count_s cnf71xx;
+};
+
+typedef union cvmx_ipd_clk_count cvmx_ipd_clk_count_t;
+
+/**
+ * cvmx_ipd_credits
+ *
+ * IPD_CREDITS = IPD Credits
+ *
+ * The credits allowed for IPD.
+ */
+union cvmx_ipd_credits {
+       u64 u64;
+       struct cvmx_ipd_credits_s {
+               u64 reserved_16_63 : 48;
+               u64 iob_wrc : 8;
+               u64 iob_wr : 8;
+       } s;
+       struct cvmx_ipd_credits_s cn68xx;
+       struct cvmx_ipd_credits_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_credits cvmx_ipd_credits_t;
+
+/**
+ * cvmx_ipd_ctl_status
+ *
+ * The number of words in a MBUFF used for packet data store.
+ *
+ */
+union cvmx_ipd_ctl_status {
+       u64 u64;
+       struct cvmx_ipd_ctl_status_s {
+               u64 reserved_18_63 : 46;
+               u64 use_sop : 1;
+               u64 rst_done : 1;
+               u64 clken : 1;
+               u64 no_wptr : 1;
+               u64 pq_apkt : 1;
+               u64 pq_nabuf : 1;
+               u64 ipd_full : 1;
+               u64 pkt_off : 1;
+               u64 len_m8 : 1;
+               u64 reset : 1;
+               u64 addpkt : 1;
+               u64 naddbuf : 1;
+               u64 pkt_lend : 1;
+               u64 wqe_lend : 1;
+               u64 pbp_en : 1;
+               cvmx_ipd_mode_t opc_mode : 2;
+               u64 ipd_en : 1;
+       } s;
+       struct cvmx_ipd_ctl_status_cn30xx {
+               u64 reserved_10_63 : 54;
+               u64 len_m8 : 1;
+               u64 reset : 1;
+               u64 addpkt : 1;
+               u64 naddbuf : 1;
+               u64 pkt_lend : 1;
+               u64 wqe_lend : 1;
+               u64 pbp_en : 1;
+               cvmx_ipd_mode_t opc_mode : 2;
+               u64 ipd_en : 1;
+       } cn30xx;
+       struct cvmx_ipd_ctl_status_cn30xx cn31xx;
+       struct cvmx_ipd_ctl_status_cn30xx cn38xx;
+       struct cvmx_ipd_ctl_status_cn38xxp2 {
+               u64 reserved_9_63 : 55;
+               u64 reset : 1;
+               u64 addpkt : 1;
+               u64 naddbuf : 1;
+               u64 pkt_lend : 1;
+               u64 wqe_lend : 1;
+               u64 pbp_en : 1;
+               cvmx_ipd_mode_t opc_mode : 2;
+               u64 ipd_en : 1;
+       } cn38xxp2;
+       struct cvmx_ipd_ctl_status_cn50xx {
+               u64 reserved_15_63 : 49;
+               u64 no_wptr : 1;
+               u64 pq_apkt : 1;
+               u64 pq_nabuf : 1;
+               u64 ipd_full : 1;
+               u64 pkt_off : 1;
+               u64 len_m8 : 1;
+               u64 reset : 1;
+               u64 addpkt : 1;
+               u64 naddbuf : 1;
+               u64 pkt_lend : 1;
+               u64 wqe_lend : 1;
+               u64 pbp_en : 1;
+               cvmx_ipd_mode_t opc_mode : 2;
+               u64 ipd_en : 1;
+       } cn50xx;
+       struct cvmx_ipd_ctl_status_cn50xx cn52xx;
+       struct cvmx_ipd_ctl_status_cn50xx cn52xxp1;
+       struct cvmx_ipd_ctl_status_cn50xx cn56xx;
+       struct cvmx_ipd_ctl_status_cn50xx cn56xxp1;
+       struct cvmx_ipd_ctl_status_cn58xx {
+               u64 reserved_12_63 : 52;
+               u64 ipd_full : 1;
+               u64 pkt_off : 1;
+               u64 len_m8 : 1;
+               u64 reset : 1;
+               u64 addpkt : 1;
+               u64 naddbuf : 1;
+               u64 pkt_lend : 1;
+               u64 wqe_lend : 1;
+               u64 pbp_en : 1;
+               cvmx_ipd_mode_t opc_mode : 2;
+               u64 ipd_en : 1;
+       } cn58xx;
+       struct cvmx_ipd_ctl_status_cn58xx cn58xxp1;
+       struct cvmx_ipd_ctl_status_s cn61xx;
+       struct cvmx_ipd_ctl_status_s cn63xx;
+       struct cvmx_ipd_ctl_status_cn63xxp1 {
+               u64 reserved_16_63 : 48;
+               u64 clken : 1;
+               u64 no_wptr : 1;
+               u64 pq_apkt : 1;
+               u64 pq_nabuf : 1;
+               u64 ipd_full : 1;
+               u64 pkt_off : 1;
+               u64 len_m8 : 1;
+               u64 reset : 1;
+               u64 addpkt : 1;
+               u64 naddbuf : 1;
+               u64 pkt_lend : 1;
+               u64 wqe_lend : 1;
+               u64 pbp_en : 1;
+               cvmx_ipd_mode_t opc_mode : 2;
+               u64 ipd_en : 1;
+       } cn63xxp1;
+       struct cvmx_ipd_ctl_status_s cn66xx;
+       struct cvmx_ipd_ctl_status_s cn68xx;
+       struct cvmx_ipd_ctl_status_s cn68xxp1;
+       struct cvmx_ipd_ctl_status_s cn70xx;
+       struct cvmx_ipd_ctl_status_s cn70xxp1;
+       struct cvmx_ipd_ctl_status_s cnf71xx;
+};
+
+typedef union cvmx_ipd_ctl_status cvmx_ipd_ctl_status_t;
+
+/**
+ * cvmx_ipd_ecc_ctl
+ *
+ * IPD_ECC_CTL = IPD ECC Control
+ *
+ * Allows inserting ECC errors for testing.
+ */
+union cvmx_ipd_ecc_ctl {
+       u64 u64;
+       struct cvmx_ipd_ecc_ctl_s {
+               u64 reserved_8_63 : 56;
+               u64 pm3_syn : 2;
+               u64 pm2_syn : 2;
+               u64 pm1_syn : 2;
+               u64 pm0_syn : 2;
+       } s;
+       struct cvmx_ipd_ecc_ctl_s cn68xx;
+       struct cvmx_ipd_ecc_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_ecc_ctl cvmx_ipd_ecc_ctl_t;
+
+/**
+ * cvmx_ipd_free_ptr_fifo_ctl
+ *
+ * IPD_FREE_PTR_FIFO_CTL = IPD's FREE Pointer FIFO Control
+ *
+ * Allows reading of the Page-Pointers stored in the IPD's FREE Fifo.
+ * See also the IPD_FREE_PTR_VALUE
+ */
+union cvmx_ipd_free_ptr_fifo_ctl {
+       u64 u64;
+       struct cvmx_ipd_free_ptr_fifo_ctl_s {
+               u64 reserved_32_63 : 32;
+               u64 max_cnts : 7;
+               u64 wraddr : 8;
+               u64 praddr : 8;
+               u64 cena : 1;
+               u64 raddr : 8;
+       } s;
+       struct cvmx_ipd_free_ptr_fifo_ctl_s cn68xx;
+       struct cvmx_ipd_free_ptr_fifo_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_free_ptr_fifo_ctl cvmx_ipd_free_ptr_fifo_ctl_t;
+
+/**
+ * cvmx_ipd_free_ptr_value
+ *
+ * IPD_FREE_PTR_VALUE = IPD's FREE Pointer Value
+ *
+ * The value of the pointer selected through the IPD_FREE_PTR_FIFO_CTL
+ */
+union cvmx_ipd_free_ptr_value {
+       u64 u64;
+       struct cvmx_ipd_free_ptr_value_s {
+               u64 reserved_33_63 : 31;
+               u64 ptr : 33;
+       } s;
+       struct cvmx_ipd_free_ptr_value_s cn68xx;
+       struct cvmx_ipd_free_ptr_value_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_free_ptr_value cvmx_ipd_free_ptr_value_t;
+
+/**
+ * cvmx_ipd_hold_ptr_fifo_ctl
+ *
+ * IPD_HOLD_PTR_FIFO_CTL = IPD's Holding Pointer FIFO Control
+ *
+ * Allows reading of the Page-Pointers stored in the IPD's Holding Fifo.
+ */
+union cvmx_ipd_hold_ptr_fifo_ctl {
+       u64 u64;
+       struct cvmx_ipd_hold_ptr_fifo_ctl_s {
+               u64 reserved_43_63 : 21;
+               u64 ptr : 33;
+               u64 max_pkt : 3;
+               u64 praddr : 3;
+               u64 cena : 1;
+               u64 raddr : 3;
+       } s;
+       struct cvmx_ipd_hold_ptr_fifo_ctl_s cn68xx;
+       struct cvmx_ipd_hold_ptr_fifo_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_hold_ptr_fifo_ctl cvmx_ipd_hold_ptr_fifo_ctl_t;
+
+/**
+ * cvmx_ipd_int_enb
+ *
+ * IPD_INTERRUPT_ENB = IPD Interrupt Enable Register
+ * Used to enable the various interrupting conditions of IPD
+ */
+union cvmx_ipd_int_enb {
+       u64 u64;
+       struct cvmx_ipd_int_enb_s {
+               u64 reserved_23_63 : 41;
+               u64 pw3_dbe : 1;
+               u64 pw3_sbe : 1;
+               u64 pw2_dbe : 1;
+               u64 pw2_sbe : 1;
+               u64 pw1_dbe : 1;
+               u64 pw1_sbe : 1;
+               u64 pw0_dbe : 1;
+               u64 pw0_sbe : 1;
+               u64 dat : 1;
+               u64 eop : 1;
+               u64 sop : 1;
+               u64 pq_sub : 1;
+               u64 pq_add : 1;
+               u64 bc_ovr : 1;
+               u64 d_coll : 1;
+               u64 c_coll : 1;
+               u64 cc_ovr : 1;
+               u64 dc_ovr : 1;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } s;
+       struct cvmx_ipd_int_enb_cn30xx {
+               u64 reserved_5_63 : 59;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } cn30xx;
+       struct cvmx_ipd_int_enb_cn30xx cn31xx;
+       struct cvmx_ipd_int_enb_cn38xx {
+               u64 reserved_10_63 : 54;
+               u64 bc_ovr : 1;
+               u64 d_coll : 1;
+               u64 c_coll : 1;
+               u64 cc_ovr : 1;
+               u64 dc_ovr : 1;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } cn38xx;
+       struct cvmx_ipd_int_enb_cn30xx cn38xxp2;
+       struct cvmx_ipd_int_enb_cn38xx cn50xx;
+       struct cvmx_ipd_int_enb_cn52xx {
+               u64 reserved_12_63 : 52;
+               u64 pq_sub : 1;
+               u64 pq_add : 1;
+               u64 bc_ovr : 1;
+               u64 d_coll : 1;
+               u64 c_coll : 1;
+               u64 cc_ovr : 1;
+               u64 dc_ovr : 1;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } cn52xx;
+       struct cvmx_ipd_int_enb_cn52xx cn52xxp1;
+       struct cvmx_ipd_int_enb_cn52xx cn56xx;
+       struct cvmx_ipd_int_enb_cn52xx cn56xxp1;
+       struct cvmx_ipd_int_enb_cn38xx cn58xx;
+       struct cvmx_ipd_int_enb_cn38xx cn58xxp1;
+       struct cvmx_ipd_int_enb_cn52xx cn61xx;
+       struct cvmx_ipd_int_enb_cn52xx cn63xx;
+       struct cvmx_ipd_int_enb_cn52xx cn63xxp1;
+       struct cvmx_ipd_int_enb_cn52xx cn66xx;
+       struct cvmx_ipd_int_enb_s cn68xx;
+       struct cvmx_ipd_int_enb_s cn68xxp1;
+       struct cvmx_ipd_int_enb_cn52xx cn70xx;
+       struct cvmx_ipd_int_enb_cn52xx cn70xxp1;
+       struct cvmx_ipd_int_enb_cn52xx cnf71xx;
+};
+
+typedef union cvmx_ipd_int_enb cvmx_ipd_int_enb_t;
+
+/**
+ * cvmx_ipd_int_sum
+ *
+ * IPD_INTERRUPT_SUM = IPD Interrupt Summary Register
+ * Set when an interrupt condition occurs, write '1' to clear.
+ */
+union cvmx_ipd_int_sum {
+       u64 u64;
+       struct cvmx_ipd_int_sum_s {
+               u64 reserved_23_63 : 41;
+               u64 pw3_dbe : 1;
+               u64 pw3_sbe : 1;
+               u64 pw2_dbe : 1;
+               u64 pw2_sbe : 1;
+               u64 pw1_dbe : 1;
+               u64 pw1_sbe : 1;
+               u64 pw0_dbe : 1;
+               u64 pw0_sbe : 1;
+               u64 dat : 1;
+               u64 eop : 1;
+               u64 sop : 1;
+               u64 pq_sub : 1;
+               u64 pq_add : 1;
+               u64 bc_ovr : 1;
+               u64 d_coll : 1;
+               u64 c_coll : 1;
+               u64 cc_ovr : 1;
+               u64 dc_ovr : 1;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } s;
+       struct cvmx_ipd_int_sum_cn30xx {
+               u64 reserved_5_63 : 59;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } cn30xx;
+       struct cvmx_ipd_int_sum_cn30xx cn31xx;
+       struct cvmx_ipd_int_sum_cn38xx {
+               u64 reserved_10_63 : 54;
+               u64 bc_ovr : 1;
+               u64 d_coll : 1;
+               u64 c_coll : 1;
+               u64 cc_ovr : 1;
+               u64 dc_ovr : 1;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } cn38xx;
+       struct cvmx_ipd_int_sum_cn30xx cn38xxp2;
+       struct cvmx_ipd_int_sum_cn38xx cn50xx;
+       struct cvmx_ipd_int_sum_cn52xx {
+               u64 reserved_12_63 : 52;
+               u64 pq_sub : 1;
+               u64 pq_add : 1;
+               u64 bc_ovr : 1;
+               u64 d_coll : 1;
+               u64 c_coll : 1;
+               u64 cc_ovr : 1;
+               u64 dc_ovr : 1;
+               u64 bp_sub : 1;
+               u64 prc_par3 : 1;
+               u64 prc_par2 : 1;
+               u64 prc_par1 : 1;
+               u64 prc_par0 : 1;
+       } cn52xx;
+       struct cvmx_ipd_int_sum_cn52xx cn52xxp1;
+       struct cvmx_ipd_int_sum_cn52xx cn56xx;
+       struct cvmx_ipd_int_sum_cn52xx cn56xxp1;
+       struct cvmx_ipd_int_sum_cn38xx cn58xx;
+       struct cvmx_ipd_int_sum_cn38xx cn58xxp1;
+       struct cvmx_ipd_int_sum_cn52xx cn61xx;
+       struct cvmx_ipd_int_sum_cn52xx cn63xx;
+       struct cvmx_ipd_int_sum_cn52xx cn63xxp1;
+       struct cvmx_ipd_int_sum_cn52xx cn66xx;
+       struct cvmx_ipd_int_sum_s cn68xx;
+       struct cvmx_ipd_int_sum_s cn68xxp1;
+       struct cvmx_ipd_int_sum_cn52xx cn70xx;
+       struct cvmx_ipd_int_sum_cn52xx cn70xxp1;
+       struct cvmx_ipd_int_sum_cn52xx cnf71xx;
+};
+
+typedef union cvmx_ipd_int_sum cvmx_ipd_int_sum_t;
+
+/**
+ * cvmx_ipd_next_pkt_ptr
+ *
+ * IPD_NEXT_PKT_PTR = IPD's Next Packet Pointer
+ *
+ * The value of the packet-pointer fetched and in the valid register.
+ */
+union cvmx_ipd_next_pkt_ptr {
+       u64 u64;
+       struct cvmx_ipd_next_pkt_ptr_s {
+               u64 reserved_33_63 : 31;
+               u64 ptr : 33;
+       } s;
+       struct cvmx_ipd_next_pkt_ptr_s cn68xx;
+       struct cvmx_ipd_next_pkt_ptr_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_next_pkt_ptr cvmx_ipd_next_pkt_ptr_t;
+
+/**
+ * cvmx_ipd_next_wqe_ptr
+ *
+ * IPD_NEXT_WQE_PTR = IPD's NEXT_WQE Pointer
+ *
+ * The value of the WQE-pointer fetched and in the valid register.
+ */
+union cvmx_ipd_next_wqe_ptr {
+       u64 u64;
+       struct cvmx_ipd_next_wqe_ptr_s {
+               u64 reserved_33_63 : 31;
+               u64 ptr : 33;
+       } s;
+       struct cvmx_ipd_next_wqe_ptr_s cn68xx;
+       struct cvmx_ipd_next_wqe_ptr_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_next_wqe_ptr cvmx_ipd_next_wqe_ptr_t;
+
+/**
+ * cvmx_ipd_not_1st_mbuff_skip
+ *
+ * The number of words that the IPD will skip when writing any MBUFF that is not the first.
+ *
+ */
+union cvmx_ipd_not_1st_mbuff_skip {
+       u64 u64;
+       struct cvmx_ipd_not_1st_mbuff_skip_s {
+               u64 reserved_6_63 : 58;
+               u64 skip_sz : 6;
+       } s;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn30xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn31xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn38xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn38xxp2;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn50xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn52xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn52xxp1;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn56xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn56xxp1;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn58xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn58xxp1;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn61xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn63xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn63xxp1;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn66xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn68xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn68xxp1;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn70xx;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cn70xxp1;
+       struct cvmx_ipd_not_1st_mbuff_skip_s cnf71xx;
+};
+
+typedef union cvmx_ipd_not_1st_mbuff_skip cvmx_ipd_not_1st_mbuff_skip_t;
+
+/**
+ * cvmx_ipd_on_bp_drop_pkt#
+ *
+ * RESERVE SPACE UPTO 0x3FFF
+ *
+ *
+ * RESERVED FOR FORMER IPD_SUB_PKIND_FCS - MOVED TO PIP
+ *
+ * RESERVE 4008 - 40FF
+ *
+ *
+ *                  IPD_ON_BP_DROP_PKT = IPD On Backpressure Drop Packet
+ *
+ * When IPD applies backpressure to a BPID and the corresponding bit in this register is set,
+ * then previously received packets will be dropped when processed.
+ */
+union cvmx_ipd_on_bp_drop_pktx {
+       u64 u64;
+       struct cvmx_ipd_on_bp_drop_pktx_s {
+               u64 prt_enb : 64;
+       } s;
+       struct cvmx_ipd_on_bp_drop_pktx_s cn68xx;
+       struct cvmx_ipd_on_bp_drop_pktx_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_on_bp_drop_pktx cvmx_ipd_on_bp_drop_pktx_t;
+
+/**
+ * cvmx_ipd_packet_mbuff_size
+ *
+ * The number of words in a MBUFF used for packet data store.
+ *
+ */
+union cvmx_ipd_packet_mbuff_size {
+       u64 u64;
+       struct cvmx_ipd_packet_mbuff_size_s {
+               u64 reserved_12_63 : 52;
+               u64 mb_size : 12;
+       } s;
+       struct cvmx_ipd_packet_mbuff_size_s cn30xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn31xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn38xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn38xxp2;
+       struct cvmx_ipd_packet_mbuff_size_s cn50xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn52xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn52xxp1;
+       struct cvmx_ipd_packet_mbuff_size_s cn56xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn56xxp1;
+       struct cvmx_ipd_packet_mbuff_size_s cn58xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn58xxp1;
+       struct cvmx_ipd_packet_mbuff_size_s cn61xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn63xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn63xxp1;
+       struct cvmx_ipd_packet_mbuff_size_s cn66xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn68xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn68xxp1;
+       struct cvmx_ipd_packet_mbuff_size_s cn70xx;
+       struct cvmx_ipd_packet_mbuff_size_s cn70xxp1;
+       struct cvmx_ipd_packet_mbuff_size_s cnf71xx;
+};
+
+typedef union cvmx_ipd_packet_mbuff_size cvmx_ipd_packet_mbuff_size_t;
+
+/**
+ * cvmx_ipd_pkt_err
+ *
+ * IPD_PKT_ERR = IPD Packet Error Register
+ *
+ * Provides status about the failing packet recevie error.
+ */
+union cvmx_ipd_pkt_err {
+       u64 u64;
+       struct cvmx_ipd_pkt_err_s {
+               u64 reserved_6_63 : 58;
+               u64 reasm : 6;
+       } s;
+       struct cvmx_ipd_pkt_err_s cn68xx;
+       struct cvmx_ipd_pkt_err_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_pkt_err cvmx_ipd_pkt_err_t;
+
+/**
+ * cvmx_ipd_pkt_ptr_valid
+ *
+ * The value of the packet-pointer fetched and in the valid register.
+ *
+ */
+union cvmx_ipd_pkt_ptr_valid {
+       u64 u64;
+       struct cvmx_ipd_pkt_ptr_valid_s {
+               u64 reserved_29_63 : 35;
+               u64 ptr : 29;
+       } s;
+       struct cvmx_ipd_pkt_ptr_valid_s cn30xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn31xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn38xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn50xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn52xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn52xxp1;
+       struct cvmx_ipd_pkt_ptr_valid_s cn56xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn56xxp1;
+       struct cvmx_ipd_pkt_ptr_valid_s cn58xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn58xxp1;
+       struct cvmx_ipd_pkt_ptr_valid_s cn61xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn63xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn63xxp1;
+       struct cvmx_ipd_pkt_ptr_valid_s cn66xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn70xx;
+       struct cvmx_ipd_pkt_ptr_valid_s cn70xxp1;
+       struct cvmx_ipd_pkt_ptr_valid_s cnf71xx;
+};
+
+typedef union cvmx_ipd_pkt_ptr_valid cvmx_ipd_pkt_ptr_valid_t;
+
+/**
+ * cvmx_ipd_port#_bp_page_cnt
+ *
+ * IPD_PORTX_BP_PAGE_CNT = IPD Port Backpressure Page Count
+ * The number of pages in use by the port that when exceeded, backpressure will be applied to the
+ * port.
+ * See also IPD_PORTX_BP_PAGE_CNT2
+ * See also IPD_PORTX_BP_PAGE_CNT3
+ */
+union cvmx_ipd_portx_bp_page_cnt {
+       u64 u64;
+       struct cvmx_ipd_portx_bp_page_cnt_s {
+               u64 reserved_18_63 : 46;
+               u64 bp_enb : 1;
+               u64 page_cnt : 17;
+       } s;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn30xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn31xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn38xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn38xxp2;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn50xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn52xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn52xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn56xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn56xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn58xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn58xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn61xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn63xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn63xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn66xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn70xx;
+       struct cvmx_ipd_portx_bp_page_cnt_s cn70xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt_s cnf71xx;
+};
+
+typedef union cvmx_ipd_portx_bp_page_cnt cvmx_ipd_portx_bp_page_cnt_t;
+
+/**
+ * cvmx_ipd_port#_bp_page_cnt2
+ *
+ * IPD_PORTX_BP_PAGE_CNT2 = IPD Port Backpressure Page Count
+ * The number of pages in use by the port that when exceeded, backpressure will be applied to the
+ * port.
+ * See also IPD_PORTX_BP_PAGE_CNT
+ * See also IPD_PORTX_BP_PAGE_CNT3
+ * 0x368-0x380
+ */
+union cvmx_ipd_portx_bp_page_cnt2 {
+       u64 u64;
+       struct cvmx_ipd_portx_bp_page_cnt2_s {
+               u64 reserved_18_63 : 46;
+               u64 bp_enb : 1;
+               u64 page_cnt : 17;
+       } s;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn52xx;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn52xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn56xx;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn56xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn61xx;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn63xx;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn63xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn66xx;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn70xx;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cn70xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt2_s cnf71xx;
+};
+
+typedef union cvmx_ipd_portx_bp_page_cnt2 cvmx_ipd_portx_bp_page_cnt2_t;
+
+/**
+ * cvmx_ipd_port#_bp_page_cnt3
+ *
+ * IPD_PORTX_BP_PAGE_CNT3 = IPD Port Backpressure Page Count
+ * The number of pages in use by the port that when exceeded, backpressure will be applied to the
+ * port.
+ * See also IPD_PORTX_BP_PAGE_CNT
+ * See also IPD_PORTX_BP_PAGE_CNT2
+ * 0x3d0-408
+ */
+union cvmx_ipd_portx_bp_page_cnt3 {
+       u64 u64;
+       struct cvmx_ipd_portx_bp_page_cnt3_s {
+               u64 reserved_18_63 : 46;
+               u64 bp_enb : 1;
+               u64 page_cnt : 17;
+       } s;
+       struct cvmx_ipd_portx_bp_page_cnt3_s cn61xx;
+       struct cvmx_ipd_portx_bp_page_cnt3_s cn63xx;
+       struct cvmx_ipd_portx_bp_page_cnt3_s cn63xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt3_s cn66xx;
+       struct cvmx_ipd_portx_bp_page_cnt3_s cn70xx;
+       struct cvmx_ipd_portx_bp_page_cnt3_s cn70xxp1;
+       struct cvmx_ipd_portx_bp_page_cnt3_s cnf71xx;
+};
+
+typedef union cvmx_ipd_portx_bp_page_cnt3 cvmx_ipd_portx_bp_page_cnt3_t;
+
+/**
+ * cvmx_ipd_port_bp_counters2_pair#
+ *
+ * See also IPD_PORT_BP_COUNTERS_PAIRX
+ * See also IPD_PORT_BP_COUNTERS3_PAIRX
+ * 0x388-0x3a0
+ */
+union cvmx_ipd_port_bp_counters2_pairx {
+       u64 u64;
+       struct cvmx_ipd_port_bp_counters2_pairx_s {
+               u64 reserved_25_63 : 39;
+               u64 cnt_val : 25;
+       } s;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn52xx;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn52xxp1;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn56xx;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn56xxp1;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn61xx;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn63xx;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn63xxp1;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn66xx;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn70xx;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cn70xxp1;
+       struct cvmx_ipd_port_bp_counters2_pairx_s cnf71xx;
+};
+
+typedef union cvmx_ipd_port_bp_counters2_pairx cvmx_ipd_port_bp_counters2_pairx_t;
+
+/**
+ * cvmx_ipd_port_bp_counters3_pair#
+ *
+ * See also IPD_PORT_BP_COUNTERS_PAIRX
+ * See also IPD_PORT_BP_COUNTERS2_PAIRX
+ * 0x3b0-0x3c8
+ */
+union cvmx_ipd_port_bp_counters3_pairx {
+       u64 u64;
+       struct cvmx_ipd_port_bp_counters3_pairx_s {
+               u64 reserved_25_63 : 39;
+               u64 cnt_val : 25;
+       } s;
+       struct cvmx_ipd_port_bp_counters3_pairx_s cn61xx;
+       struct cvmx_ipd_port_bp_counters3_pairx_s cn63xx;
+       struct cvmx_ipd_port_bp_counters3_pairx_s cn63xxp1;
+       struct cvmx_ipd_port_bp_counters3_pairx_s cn66xx;
+       struct cvmx_ipd_port_bp_counters3_pairx_s cn70xx;
+       struct cvmx_ipd_port_bp_counters3_pairx_s cn70xxp1;
+       struct cvmx_ipd_port_bp_counters3_pairx_s cnf71xx;
+};
+
+typedef union cvmx_ipd_port_bp_counters3_pairx cvmx_ipd_port_bp_counters3_pairx_t;
+
+/**
+ * cvmx_ipd_port_bp_counters4_pair#
+ *
+ * See also IPD_PORT_BP_COUNTERS_PAIRX
+ * See also IPD_PORT_BP_COUNTERS2_PAIRX
+ * 0x410-0x3c8
+ */
+union cvmx_ipd_port_bp_counters4_pairx {
+       u64 u64;
+       struct cvmx_ipd_port_bp_counters4_pairx_s {
+               u64 reserved_25_63 : 39;
+               u64 cnt_val : 25;
+       } s;
+       struct cvmx_ipd_port_bp_counters4_pairx_s cn61xx;
+       struct cvmx_ipd_port_bp_counters4_pairx_s cn66xx;
+       struct cvmx_ipd_port_bp_counters4_pairx_s cn70xx;
+       struct cvmx_ipd_port_bp_counters4_pairx_s cn70xxp1;
+       struct cvmx_ipd_port_bp_counters4_pairx_s cnf71xx;
+};
+
+typedef union cvmx_ipd_port_bp_counters4_pairx cvmx_ipd_port_bp_counters4_pairx_t;
+
+/**
+ * cvmx_ipd_port_bp_counters_pair#
+ *
+ * See also IPD_PORT_BP_COUNTERS2_PAIRX
+ * See also IPD_PORT_BP_COUNTERS3_PAIRX
+ * 0x1b8-0x2d0
+ */
+union cvmx_ipd_port_bp_counters_pairx {
+       u64 u64;
+       struct cvmx_ipd_port_bp_counters_pairx_s {
+               u64 reserved_25_63 : 39;
+               u64 cnt_val : 25;
+       } s;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn30xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn31xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn38xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn38xxp2;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn50xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn52xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn52xxp1;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn56xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn56xxp1;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn58xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn58xxp1;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn61xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn63xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn63xxp1;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn66xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn70xx;
+       struct cvmx_ipd_port_bp_counters_pairx_s cn70xxp1;
+       struct cvmx_ipd_port_bp_counters_pairx_s cnf71xx;
+};
+
+typedef union cvmx_ipd_port_bp_counters_pairx cvmx_ipd_port_bp_counters_pairx_t;
+
+/**
+ * cvmx_ipd_port_ptr_fifo_ctl
+ *
+ * IPD_PORT_PTR_FIFO_CTL = IPD's Reasm-Id Pointer FIFO Control
+ *
+ * Allows reading of the Page-Pointers stored in the IPD's Reasm-Id Fifo.
+ */
+union cvmx_ipd_port_ptr_fifo_ctl {
+       u64 u64;
+       struct cvmx_ipd_port_ptr_fifo_ctl_s {
+               u64 reserved_48_63 : 16;
+               u64 ptr : 33;
+               u64 max_pkt : 7;
+               u64 cena : 1;
+               u64 raddr : 7;
+       } s;
+       struct cvmx_ipd_port_ptr_fifo_ctl_s cn68xx;
+       struct cvmx_ipd_port_ptr_fifo_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_port_ptr_fifo_ctl cvmx_ipd_port_ptr_fifo_ctl_t;
+
+/**
+ * cvmx_ipd_port_qos_#_cnt
+ *
+ * IPD_PORT_QOS_X_CNT = IPD PortX QOS-0 Count
+ * A counter per port/qos. Counter are originzed in sequence where the first 8 counter (0-7)
+ * belong to Port-0
+ * QOS 0-7 respectively followed by port 1 at (8-15), etc
+ * Ports 0-3, 32-43
+ */
+union cvmx_ipd_port_qos_x_cnt {
+       u64 u64;
+       struct cvmx_ipd_port_qos_x_cnt_s {
+               u64 wmark : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_ipd_port_qos_x_cnt_s cn52xx;
+       struct cvmx_ipd_port_qos_x_cnt_s cn52xxp1;
+       struct cvmx_ipd_port_qos_x_cnt_s cn56xx;
+       struct cvmx_ipd_port_qos_x_cnt_s cn56xxp1;
+       struct cvmx_ipd_port_qos_x_cnt_s cn61xx;
+       struct cvmx_ipd_port_qos_x_cnt_s cn63xx;
+       struct cvmx_ipd_port_qos_x_cnt_s cn63xxp1;
+       struct cvmx_ipd_port_qos_x_cnt_s cn66xx;
+       struct cvmx_ipd_port_qos_x_cnt_s cn68xx;
+       struct cvmx_ipd_port_qos_x_cnt_s cn68xxp1;
+       struct cvmx_ipd_port_qos_x_cnt_s cn70xx;
+       struct cvmx_ipd_port_qos_x_cnt_s cn70xxp1;
+       struct cvmx_ipd_port_qos_x_cnt_s cnf71xx;
+};
+
+typedef union cvmx_ipd_port_qos_x_cnt cvmx_ipd_port_qos_x_cnt_t;
+
+/**
+ * cvmx_ipd_port_qos_int#
+ *
+ * See the description for IPD_PORT_QOS_X_CNT
+ * 0=P0-7; 1=P8-15; 2=P16-23; 3=P24-31; 4=P32-39; 5=P40-47; 6=P48-55; 7=P56-63
+ * Only ports used are: P0-3, p16-19, P24, P32-39. Therefore only IPD_PORT_QOS_INT0 ([63:32] ==
+ * Reserved), IPD_PORT_QOS_INT2 ([63:32] == Reserved), IPD_PORT_QOS_INT3 ([63:8] == Reserved),
+ * IPD_PORT_QOS_INT4
+ */
+union cvmx_ipd_port_qos_intx {
+       u64 u64;
+       struct cvmx_ipd_port_qos_intx_s {
+               u64 intr : 64;
+       } s;
+       struct cvmx_ipd_port_qos_intx_s cn52xx;
+       struct cvmx_ipd_port_qos_intx_s cn52xxp1;
+       struct cvmx_ipd_port_qos_intx_s cn56xx;
+       struct cvmx_ipd_port_qos_intx_s cn56xxp1;
+       struct cvmx_ipd_port_qos_intx_s cn61xx;
+       struct cvmx_ipd_port_qos_intx_s cn63xx;
+       struct cvmx_ipd_port_qos_intx_s cn63xxp1;
+       struct cvmx_ipd_port_qos_intx_s cn66xx;
+       struct cvmx_ipd_port_qos_intx_s cn68xx;
+       struct cvmx_ipd_port_qos_intx_s cn68xxp1;
+       struct cvmx_ipd_port_qos_intx_s cn70xx;
+       struct cvmx_ipd_port_qos_intx_s cn70xxp1;
+       struct cvmx_ipd_port_qos_intx_s cnf71xx;
+};
+
+typedef union cvmx_ipd_port_qos_intx cvmx_ipd_port_qos_intx_t;
+
+/**
+ * cvmx_ipd_port_qos_int_enb#
+ *
+ * "When the IPD_PORT_QOS_INTX[\#] is '1' and IPD_PORT_QOS_INT_ENBX[\#] is '1' a interrupt will be
+ * generated."
+ */
+union cvmx_ipd_port_qos_int_enbx {
+       u64 u64;
+       struct cvmx_ipd_port_qos_int_enbx_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_ipd_port_qos_int_enbx_s cn52xx;
+       struct cvmx_ipd_port_qos_int_enbx_s cn52xxp1;
+       struct cvmx_ipd_port_qos_int_enbx_s cn56xx;
+       struct cvmx_ipd_port_qos_int_enbx_s cn56xxp1;
+       struct cvmx_ipd_port_qos_int_enbx_s cn61xx;
+       struct cvmx_ipd_port_qos_int_enbx_s cn63xx;
+       struct cvmx_ipd_port_qos_int_enbx_s cn63xxp1;
+       struct cvmx_ipd_port_qos_int_enbx_s cn66xx;
+       struct cvmx_ipd_port_qos_int_enbx_s cn68xx;
+       struct cvmx_ipd_port_qos_int_enbx_s cn68xxp1;
+       struct cvmx_ipd_port_qos_int_enbx_s cn70xx;
+       struct cvmx_ipd_port_qos_int_enbx_s cn70xxp1;
+       struct cvmx_ipd_port_qos_int_enbx_s cnf71xx;
+};
+
+typedef union cvmx_ipd_port_qos_int_enbx cvmx_ipd_port_qos_int_enbx_t;
+
+/**
+ * cvmx_ipd_port_sop#
+ *
+ * IPD_PORT_SOP = IPD Reasm-Id SOP
+ *
+ * Set when a SOP is detected on a reasm-num. Where the reasm-num value set the bit vector of this register.
+ */
+union cvmx_ipd_port_sopx {
+       u64 u64;
+       struct cvmx_ipd_port_sopx_s {
+               u64 sop : 64;
+       } s;
+       struct cvmx_ipd_port_sopx_s cn68xx;
+       struct cvmx_ipd_port_sopx_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_port_sopx cvmx_ipd_port_sopx_t;
+
+/**
+ * cvmx_ipd_prc_hold_ptr_fifo_ctl
+ *
+ * Allows reading of the Page-Pointers stored in the IPD's PRC Holding Fifo.
+ *
+ */
+union cvmx_ipd_prc_hold_ptr_fifo_ctl {
+       u64 u64;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s {
+               u64 reserved_39_63 : 25;
+               u64 max_pkt : 3;
+               u64 praddr : 3;
+               u64 ptr : 29;
+               u64 cena : 1;
+               u64 raddr : 3;
+       } s;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn30xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn31xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn38xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn50xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn52xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn52xxp1;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn56xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn56xxp1;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn58xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn58xxp1;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn61xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn63xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn63xxp1;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn66xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn70xx;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cn70xxp1;
+       struct cvmx_ipd_prc_hold_ptr_fifo_ctl_s cnf71xx;
+};
+
+typedef union cvmx_ipd_prc_hold_ptr_fifo_ctl cvmx_ipd_prc_hold_ptr_fifo_ctl_t;
+
+/**
+ * cvmx_ipd_prc_port_ptr_fifo_ctl
+ *
+ * Allows reading of the Page-Pointers stored in the IPD's PRC PORT Fifo.
+ *
+ */
+union cvmx_ipd_prc_port_ptr_fifo_ctl {
+       u64 u64;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s {
+               u64 reserved_44_63 : 20;
+               u64 max_pkt : 7;
+               u64 ptr : 29;
+               u64 cena : 1;
+               u64 raddr : 7;
+       } s;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn30xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn31xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn38xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn50xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn52xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn52xxp1;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn56xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn56xxp1;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn58xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn58xxp1;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn61xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn63xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn63xxp1;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn66xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn70xx;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cn70xxp1;
+       struct cvmx_ipd_prc_port_ptr_fifo_ctl_s cnf71xx;
+};
+
+typedef union cvmx_ipd_prc_port_ptr_fifo_ctl cvmx_ipd_prc_port_ptr_fifo_ctl_t;
+
+/**
+ * cvmx_ipd_ptr_count
+ *
+ * Shows the number of WQE and Packet Page Pointers stored in the IPD.
+ *
+ */
+union cvmx_ipd_ptr_count {
+       u64 u64;
+       struct cvmx_ipd_ptr_count_s {
+               u64 reserved_19_63 : 45;
+               u64 pktv_cnt : 1;
+               u64 wqev_cnt : 1;
+               u64 pfif_cnt : 3;
+               u64 pkt_pcnt : 7;
+               u64 wqe_pcnt : 7;
+       } s;
+       struct cvmx_ipd_ptr_count_s cn30xx;
+       struct cvmx_ipd_ptr_count_s cn31xx;
+       struct cvmx_ipd_ptr_count_s cn38xx;
+       struct cvmx_ipd_ptr_count_s cn38xxp2;
+       struct cvmx_ipd_ptr_count_s cn50xx;
+       struct cvmx_ipd_ptr_count_s cn52xx;
+       struct cvmx_ipd_ptr_count_s cn52xxp1;
+       struct cvmx_ipd_ptr_count_s cn56xx;
+       struct cvmx_ipd_ptr_count_s cn56xxp1;
+       struct cvmx_ipd_ptr_count_s cn58xx;
+       struct cvmx_ipd_ptr_count_s cn58xxp1;
+       struct cvmx_ipd_ptr_count_s cn61xx;
+       struct cvmx_ipd_ptr_count_s cn63xx;
+       struct cvmx_ipd_ptr_count_s cn63xxp1;
+       struct cvmx_ipd_ptr_count_s cn66xx;
+       struct cvmx_ipd_ptr_count_s cn68xx;
+       struct cvmx_ipd_ptr_count_s cn68xxp1;
+       struct cvmx_ipd_ptr_count_s cn70xx;
+       struct cvmx_ipd_ptr_count_s cn70xxp1;
+       struct cvmx_ipd_ptr_count_s cnf71xx;
+};
+
+typedef union cvmx_ipd_ptr_count cvmx_ipd_ptr_count_t;
+
+/**
+ * cvmx_ipd_pwp_ptr_fifo_ctl
+ *
+ * Allows reading of the Page-Pointers stored in the IPD's PWP Fifo.
+ *
+ */
+union cvmx_ipd_pwp_ptr_fifo_ctl {
+       u64 u64;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s {
+               u64 reserved_61_63 : 3;
+               u64 max_cnts : 7;
+               u64 wraddr : 8;
+               u64 praddr : 8;
+               u64 ptr : 29;
+               u64 cena : 1;
+               u64 raddr : 8;
+       } s;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn30xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn31xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn38xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn50xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn52xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn52xxp1;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn56xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn56xxp1;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn58xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn58xxp1;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn61xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn63xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn63xxp1;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn66xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn70xx;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cn70xxp1;
+       struct cvmx_ipd_pwp_ptr_fifo_ctl_s cnf71xx;
+};
+
+typedef union cvmx_ipd_pwp_ptr_fifo_ctl cvmx_ipd_pwp_ptr_fifo_ctl_t;
+
+/**
+ * cvmx_ipd_qos#_red_marks
+ *
+ * Set the pass-drop marks for qos level.
+ *
+ */
+union cvmx_ipd_qosx_red_marks {
+       u64 u64;
+       struct cvmx_ipd_qosx_red_marks_s {
+               u64 drop : 32;
+               u64 pass : 32;
+       } s;
+       struct cvmx_ipd_qosx_red_marks_s cn30xx;
+       struct cvmx_ipd_qosx_red_marks_s cn31xx;
+       struct cvmx_ipd_qosx_red_marks_s cn38xx;
+       struct cvmx_ipd_qosx_red_marks_s cn38xxp2;
+       struct cvmx_ipd_qosx_red_marks_s cn50xx;
+       struct cvmx_ipd_qosx_red_marks_s cn52xx;
+       struct cvmx_ipd_qosx_red_marks_s cn52xxp1;
+       struct cvmx_ipd_qosx_red_marks_s cn56xx;
+       struct cvmx_ipd_qosx_red_marks_s cn56xxp1;
+       struct cvmx_ipd_qosx_red_marks_s cn58xx;
+       struct cvmx_ipd_qosx_red_marks_s cn58xxp1;
+       struct cvmx_ipd_qosx_red_marks_s cn61xx;
+       struct cvmx_ipd_qosx_red_marks_s cn63xx;
+       struct cvmx_ipd_qosx_red_marks_s cn63xxp1;
+       struct cvmx_ipd_qosx_red_marks_s cn66xx;
+       struct cvmx_ipd_qosx_red_marks_s cn68xx;
+       struct cvmx_ipd_qosx_red_marks_s cn68xxp1;
+       struct cvmx_ipd_qosx_red_marks_s cn70xx;
+       struct cvmx_ipd_qosx_red_marks_s cn70xxp1;
+       struct cvmx_ipd_qosx_red_marks_s cnf71xx;
+};
+
+typedef union cvmx_ipd_qosx_red_marks cvmx_ipd_qosx_red_marks_t;
+
+/**
+ * cvmx_ipd_que0_free_page_cnt
+ *
+ * Number of Free-Page Pointer that are available for use in the FPA for Queue-0.
+ *
+ */
+union cvmx_ipd_que0_free_page_cnt {
+       u64 u64;
+       struct cvmx_ipd_que0_free_page_cnt_s {
+               u64 reserved_32_63 : 32;
+               u64 q0_pcnt : 32;
+       } s;
+       struct cvmx_ipd_que0_free_page_cnt_s cn30xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn31xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn38xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn38xxp2;
+       struct cvmx_ipd_que0_free_page_cnt_s cn50xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn52xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn52xxp1;
+       struct cvmx_ipd_que0_free_page_cnt_s cn56xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn56xxp1;
+       struct cvmx_ipd_que0_free_page_cnt_s cn58xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn58xxp1;
+       struct cvmx_ipd_que0_free_page_cnt_s cn61xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn63xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn63xxp1;
+       struct cvmx_ipd_que0_free_page_cnt_s cn66xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn68xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn68xxp1;
+       struct cvmx_ipd_que0_free_page_cnt_s cn70xx;
+       struct cvmx_ipd_que0_free_page_cnt_s cn70xxp1;
+       struct cvmx_ipd_que0_free_page_cnt_s cnf71xx;
+};
+
+typedef union cvmx_ipd_que0_free_page_cnt cvmx_ipd_que0_free_page_cnt_t;
+
+/**
+ * cvmx_ipd_red_bpid_enable#
+ *
+ * IPD_RED_BPID_ENABLE = IPD RED BPID Enable
+ *
+ * Set the pass-drop marks for qos level.
+ */
+union cvmx_ipd_red_bpid_enablex {
+       u64 u64;
+       struct cvmx_ipd_red_bpid_enablex_s {
+               u64 prt_enb : 64;
+       } s;
+       struct cvmx_ipd_red_bpid_enablex_s cn68xx;
+       struct cvmx_ipd_red_bpid_enablex_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_red_bpid_enablex cvmx_ipd_red_bpid_enablex_t;
+
+/**
+ * cvmx_ipd_red_delay
+ *
+ * IPD_RED_DELAY = IPD RED BPID Enable
+ *
+ * Set the pass-drop marks for qos level.
+ */
+union cvmx_ipd_red_delay {
+       u64 u64;
+       struct cvmx_ipd_red_delay_s {
+               u64 reserved_28_63 : 36;
+               u64 prb_dly : 14;
+               u64 avg_dly : 14;
+       } s;
+       struct cvmx_ipd_red_delay_s cn68xx;
+       struct cvmx_ipd_red_delay_s cn68xxp1;
+};
+
+typedef union cvmx_ipd_red_delay cvmx_ipd_red_delay_t;
+
+/**
+ * cvmx_ipd_red_port_enable
+ *
+ * Set the pass-drop marks for qos level.
+ *
+ */
+union cvmx_ipd_red_port_enable {
+       u64 u64;
+       struct cvmx_ipd_red_port_enable_s {
+               u64 prb_dly : 14;
+               u64 avg_dly : 14;
+               u64 prt_enb : 36;
+       } s;
+       struct cvmx_ipd_red_port_enable_s cn30xx;
+       struct cvmx_ipd_red_port_enable_s cn31xx;
+       struct cvmx_ipd_red_port_enable_s cn38xx;
+       struct cvmx_ipd_red_port_enable_s cn38xxp2;
+       struct cvmx_ipd_red_port_enable_s cn50xx;
+       struct cvmx_ipd_red_port_enable_s cn52xx;
+       struct cvmx_ipd_red_port_enable_s cn52xxp1;
+       struct cvmx_ipd_red_port_enable_s cn56xx;
+       struct cvmx_ipd_red_port_enable_s cn56xxp1;
+       struct cvmx_ipd_red_port_enable_s cn58xx;
+       struct cvmx_ipd_red_port_enable_s cn58xxp1;
+       struct cvmx_ipd_red_port_enable_s cn61xx;
+       struct cvmx_ipd_red_port_enable_s cn63xx;
+       struct cvmx_ipd_red_port_enable_s cn63xxp1;
+       struct cvmx_ipd_red_port_enable_s cn66xx;
+       struct cvmx_ipd_red_port_enable_s cn70xx;
+       struct cvmx_ipd_red_port_enable_s cn70xxp1;
+       struct cvmx_ipd_red_port_enable_s cnf71xx;
+};
+
+typedef union cvmx_ipd_red_port_enable cvmx_ipd_red_port_enable_t;
+
+/**
+ * cvmx_ipd_red_port_enable2
+ *
+ * Set the pass-drop marks for qos level.
+ *
+ */
+union cvmx_ipd_red_port_enable2 {
+       u64 u64;
+       struct cvmx_ipd_red_port_enable2_s {
+               u64 reserved_12_63 : 52;
+               u64 prt_enb : 12;
+       } s;
+       struct cvmx_ipd_red_port_enable2_cn52xx {
+               u64 reserved_4_63 : 60;
+               u64 prt_enb : 4;
+       } cn52xx;
+       struct cvmx_ipd_red_port_enable2_cn52xx cn52xxp1;
+       struct cvmx_ipd_red_port_enable2_cn52xx cn56xx;
+       struct cvmx_ipd_red_port_enable2_cn52xx cn56xxp1;
+       struct cvmx_ipd_red_port_enable2_s cn61xx;
+       struct cvmx_ipd_red_port_enable2_cn63xx {
+               u64 reserved_8_63 : 56;
+               u64 prt_enb : 8;
+       } cn63xx;
+       struct cvmx_ipd_red_port_enable2_cn63xx cn63xxp1;
+       struct cvmx_ipd_red_port_enable2_s cn66xx;
+       struct cvmx_ipd_red_port_enable2_s cn70xx;
+       struct cvmx_ipd_red_port_enable2_s cn70xxp1;
+       struct cvmx_ipd_red_port_enable2_s cnf71xx;
+};
+
+typedef union cvmx_ipd_red_port_enable2 cvmx_ipd_red_port_enable2_t;
+
+/**
+ * cvmx_ipd_red_que#_param
+ *
+ * Value control the Passing and Dropping of packets by the red engine for QOS Level-0.
+ *
+ */
+union cvmx_ipd_red_quex_param {
+       u64 u64;
+       struct cvmx_ipd_red_quex_param_s {
+               u64 reserved_49_63 : 15;
+               u64 use_pcnt : 1;
+               u64 new_con : 8;
+               u64 avg_con : 8;
+               u64 prb_con : 32;
+       } s;
+       struct cvmx_ipd_red_quex_param_s cn30xx;
+       struct cvmx_ipd_red_quex_param_s cn31xx;
+       struct cvmx_ipd_red_quex_param_s cn38xx;
+       struct cvmx_ipd_red_quex_param_s cn38xxp2;
+       struct cvmx_ipd_red_quex_param_s cn50xx;
+       struct cvmx_ipd_red_quex_param_s cn52xx;
+       struct cvmx_ipd_red_quex_param_s cn52xxp1;
+       struct cvmx_ipd_red_quex_param_s cn56xx;
+       struct cvmx_ipd_red_quex_param_s cn56xxp1;
+       struct cvmx_ipd_red_quex_param_s cn58xx;
+       struct cvmx_ipd_red_quex_param_s cn58xxp1;
+       struct cvmx_ipd_red_quex_param_s cn61xx;
+       struct cvmx_ipd_red_quex_param_s cn63xx;
+       struct cvmx_ipd_red_quex_param_s cn63xxp1;
+       struct cvmx_ipd_red_quex_param_s cn66xx;
+       struct cvmx_ipd_red_quex_param_s cn68xx;
+       struct cvmx_ipd_red_quex_param_s cn68xxp1;
+       struct cvmx_ipd_red_quex_param_s cn70xx;
+       struct cvmx_ipd_red_quex_param_s cn70xxp1;
+       struct cvmx_ipd_red_quex_param_s cnf71xx;
+};
+
+typedef union cvmx_ipd_red_quex_param cvmx_ipd_red_quex_param_t;
+
+/**
+ * cvmx_ipd_req_wgt
+ *
+ * IPD_REQ_WGT = IPD REQ weights
+ *
+ * There are 8 devices that can request to send packet traffic to the IPD. These weights are used for the Weighted Round Robin
+ * grant generated by the IPD to requestors.
+ */
+union cvmx_ipd_req_wgt {
+       u64 u64;
+       struct cvmx_ipd_req_wgt_s {
+               u64 wgt7 : 8;
+               u64 wgt6 : 8;
+               u64 wgt5 : 8;
+               u64 wgt4 : 8;
+               u64 wgt3 : 8;
+               u64 wgt2 : 8;
+               u64 wgt1 : 8;
+               u64 wgt0 : 8;
+       } s;
+       struct cvmx_ipd_req_wgt_s cn68xx;
+};
+
+typedef union cvmx_ipd_req_wgt cvmx_ipd_req_wgt_t;
+
+/**
+ * cvmx_ipd_sub_port_bp_page_cnt
+ *
+ * Will add the value to the indicated port count register, the number of pages supplied. The
+ * value added should
+ * be the 2's complement of the value that needs to be subtracted. Users add 2's complement
+ * values to the
+ * port-mbuf-count register to return (lower the count) mbufs to the counter in order to avoid
+ * port-level
+ * backpressure being applied to the port. Backpressure is applied when the MBUF used count of a
+ * port exceeds the
+ * value in the IPD_PORTX_BP_PAGE_CNT, IPD_PORTX_BP_PAGE_CNT2, and IPD_PORTX_BP_PAGE_CNT3.
+ * This register can't be written from the PCI via a window write.
+ */
+union cvmx_ipd_sub_port_bp_page_cnt {
+       u64 u64;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s {
+               u64 reserved_31_63 : 33;
+               u64 port : 6;
+               u64 page_cnt : 25;
+       } s;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn30xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn31xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn38xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn38xxp2;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn50xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn52xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn52xxp1;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn56xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn56xxp1;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn58xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn58xxp1;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn61xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn63xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn63xxp1;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn66xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn68xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn68xxp1;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn70xx;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cn70xxp1;
+       struct cvmx_ipd_sub_port_bp_page_cnt_s cnf71xx;
+};
+
+typedef union cvmx_ipd_sub_port_bp_page_cnt cvmx_ipd_sub_port_bp_page_cnt_t;
+
+/**
+ * cvmx_ipd_sub_port_fcs
+ *
+ * When set '1' the port corresponding to the bit set will subtract 4 bytes from the end of
+ * the packet.
+ */
+union cvmx_ipd_sub_port_fcs {
+       u64 u64;
+       struct cvmx_ipd_sub_port_fcs_s {
+               u64 reserved_40_63 : 24;
+               u64 port_bit2 : 4;
+               u64 reserved_32_35 : 4;
+               u64 port_bit : 32;
+       } s;
+       struct cvmx_ipd_sub_port_fcs_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 port_bit : 3;
+       } cn30xx;
+       struct cvmx_ipd_sub_port_fcs_cn30xx cn31xx;
+       struct cvmx_ipd_sub_port_fcs_cn38xx {
+               u64 reserved_32_63 : 32;
+               u64 port_bit : 32;
+       } cn38xx;
+       struct cvmx_ipd_sub_port_fcs_cn38xx cn38xxp2;
+       struct cvmx_ipd_sub_port_fcs_cn30xx cn50xx;
+       struct cvmx_ipd_sub_port_fcs_s cn52xx;
+       struct cvmx_ipd_sub_port_fcs_s cn52xxp1;
+       struct cvmx_ipd_sub_port_fcs_s cn56xx;
+       struct cvmx_ipd_sub_port_fcs_s cn56xxp1;
+       struct cvmx_ipd_sub_port_fcs_cn38xx cn58xx;
+       struct cvmx_ipd_sub_port_fcs_cn38xx cn58xxp1;
+       struct cvmx_ipd_sub_port_fcs_s cn61xx;
+       struct cvmx_ipd_sub_port_fcs_s cn63xx;
+       struct cvmx_ipd_sub_port_fcs_s cn63xxp1;
+       struct cvmx_ipd_sub_port_fcs_s cn66xx;
+       struct cvmx_ipd_sub_port_fcs_s cn70xx;
+       struct cvmx_ipd_sub_port_fcs_s cn70xxp1;
+       struct cvmx_ipd_sub_port_fcs_s cnf71xx;
+};
+
+typedef union cvmx_ipd_sub_port_fcs cvmx_ipd_sub_port_fcs_t;
+
+/**
+ * cvmx_ipd_sub_port_qos_cnt
+ *
+ * Will add the value (CNT) to the indicated Port-QOS register (PORT_QOS). The value added must
+ * be
+ * be the 2's complement of the value that needs to be subtracted.
+ */
+union cvmx_ipd_sub_port_qos_cnt {
+       u64 u64;
+       struct cvmx_ipd_sub_port_qos_cnt_s {
+               u64 reserved_41_63 : 23;
+               u64 port_qos : 9;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn52xx;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn52xxp1;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn56xx;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn56xxp1;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn61xx;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn63xx;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn63xxp1;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn66xx;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn68xx;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn68xxp1;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn70xx;
+       struct cvmx_ipd_sub_port_qos_cnt_s cn70xxp1;
+       struct cvmx_ipd_sub_port_qos_cnt_s cnf71xx;
+};
+
+typedef union cvmx_ipd_sub_port_qos_cnt cvmx_ipd_sub_port_qos_cnt_t;
+
+/**
+ * cvmx_ipd_wqe_fpa_queue
+ *
+ * Which FPA Queue (0-7) to fetch page-pointers from for WQE's
+ *
+ */
+union cvmx_ipd_wqe_fpa_queue {
+       u64 u64;
+       struct cvmx_ipd_wqe_fpa_queue_s {
+               u64 reserved_3_63 : 61;
+               u64 wqe_pool : 3;
+       } s;
+       struct cvmx_ipd_wqe_fpa_queue_s cn30xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn31xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn38xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn38xxp2;
+       struct cvmx_ipd_wqe_fpa_queue_s cn50xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn52xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn52xxp1;
+       struct cvmx_ipd_wqe_fpa_queue_s cn56xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn56xxp1;
+       struct cvmx_ipd_wqe_fpa_queue_s cn58xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn58xxp1;
+       struct cvmx_ipd_wqe_fpa_queue_s cn61xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn63xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn63xxp1;
+       struct cvmx_ipd_wqe_fpa_queue_s cn66xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn68xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn68xxp1;
+       struct cvmx_ipd_wqe_fpa_queue_s cn70xx;
+       struct cvmx_ipd_wqe_fpa_queue_s cn70xxp1;
+       struct cvmx_ipd_wqe_fpa_queue_s cnf71xx;
+};
+
+typedef union cvmx_ipd_wqe_fpa_queue cvmx_ipd_wqe_fpa_queue_t;
+
+/**
+ * cvmx_ipd_wqe_ptr_valid
+ *
+ * The value of the WQE-pointer fetched and in the valid register.
+ *
+ */
+union cvmx_ipd_wqe_ptr_valid {
+       u64 u64;
+       struct cvmx_ipd_wqe_ptr_valid_s {
+               u64 reserved_29_63 : 35;
+               u64 ptr : 29;
+       } s;
+       struct cvmx_ipd_wqe_ptr_valid_s cn30xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn31xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn38xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn50xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn52xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn52xxp1;
+       struct cvmx_ipd_wqe_ptr_valid_s cn56xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn56xxp1;
+       struct cvmx_ipd_wqe_ptr_valid_s cn58xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn58xxp1;
+       struct cvmx_ipd_wqe_ptr_valid_s cn61xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn63xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn63xxp1;
+       struct cvmx_ipd_wqe_ptr_valid_s cn66xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn70xx;
+       struct cvmx_ipd_wqe_ptr_valid_s cn70xxp1;
+       struct cvmx_ipd_wqe_ptr_valid_s cnf71xx;
+};
+
+typedef union cvmx_ipd_wqe_ptr_valid cvmx_ipd_wqe_ptr_valid_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-ipd.h b/arch/mips/mach-octeon/include/mach/cvmx-ipd.h
new file mode 100644 (file)
index 0000000..cdff36f
--- /dev/null
@@ -0,0 +1,233 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Input Packet Data unit.
+ */
+
+#ifndef __CVMX_IPD_H__
+#define __CVMX_IPD_H__
+
+#include "cvmx-pki.h"
+
+/* CSR typedefs have been moved to cvmx-ipd-defs.h */
+
+typedef cvmx_ipd_1st_mbuff_skip_t cvmx_ipd_mbuff_not_first_skip_t;
+typedef cvmx_ipd_1st_next_ptr_back_t cvmx_ipd_second_next_ptr_back_t;
+
+typedef struct cvmx_ipd_tag_fields {
+       u64 ipv6_src_ip : 1;
+       u64 ipv6_dst_ip : 1;
+       u64 ipv6_src_port : 1;
+       u64 ipv6_dst_port : 1;
+       u64 ipv6_next_header : 1;
+       u64 ipv4_src_ip : 1;
+       u64 ipv4_dst_ip : 1;
+       u64 ipv4_src_port : 1;
+       u64 ipv4_dst_port : 1;
+       u64 ipv4_protocol : 1;
+       u64 input_port : 1;
+} cvmx_ipd_tag_fields_t;
+
+typedef struct cvmx_pip_port_config {
+       u64 parse_mode;
+       u64 tag_type;
+       u64 tag_mode;
+       cvmx_ipd_tag_fields_t tag_fields;
+} cvmx_pip_port_config_t;
+
+typedef struct cvmx_ipd_config_struct {
+       u64 first_mbuf_skip;
+       u64 not_first_mbuf_skip;
+       u64 ipd_enable;
+       u64 enable_len_M8_fix;
+       u64 cache_mode;
+       cvmx_fpa_pool_config_t packet_pool;
+       cvmx_fpa_pool_config_t wqe_pool;
+       cvmx_pip_port_config_t port_config;
+} cvmx_ipd_config_t;
+
+extern cvmx_ipd_config_t cvmx_ipd_cfg;
+
+/**
+ * Gets the fpa pool number of packet pool
+ */
+static inline s64 cvmx_fpa_get_packet_pool(void)
+{
+       return (cvmx_ipd_cfg.packet_pool.pool_num);
+}
+
+/**
+ * Gets the buffer size of packet pool buffer
+ */
+static inline u64 cvmx_fpa_get_packet_pool_block_size(void)
+{
+       return (cvmx_ipd_cfg.packet_pool.buffer_size);
+}
+
+/**
+ * Gets the buffer count of packet pool
+ */
+static inline u64 cvmx_fpa_get_packet_pool_buffer_count(void)
+{
+       return (cvmx_ipd_cfg.packet_pool.buffer_count);
+}
+
+/**
+ * Gets the fpa pool number of wqe pool
+ */
+static inline s64 cvmx_fpa_get_wqe_pool(void)
+{
+       return (cvmx_ipd_cfg.wqe_pool.pool_num);
+}
+
+/**
+ * Gets the buffer size of wqe pool buffer
+ */
+static inline u64 cvmx_fpa_get_wqe_pool_block_size(void)
+{
+       return (cvmx_ipd_cfg.wqe_pool.buffer_size);
+}
+
+/**
+ * Gets the buffer count of wqe pool
+ */
+static inline u64 cvmx_fpa_get_wqe_pool_buffer_count(void)
+{
+       return (cvmx_ipd_cfg.wqe_pool.buffer_count);
+}
+
+/**
+ * Sets the ipd related configuration in internal structure which is then used
+ * for seting IPD hardware block
+ */
+int cvmx_ipd_set_config(cvmx_ipd_config_t ipd_config);
+
+/**
+ * Gets the ipd related configuration from internal structure.
+ */
+void cvmx_ipd_get_config(cvmx_ipd_config_t *ipd_config);
+
+/**
+ * Sets the internal FPA pool data structure for packet buffer pool.
+ * @param pool fpa pool number yo use
+ * @param buffer_size  buffer size of pool
+ * @param buffer_count number of buufers to allocate to pool
+ */
+void cvmx_ipd_set_packet_pool_config(s64 pool, u64 buffer_size, u64 buffer_count);
+
+/**
+ * Sets the internal FPA pool data structure for wqe pool.
+ * @param pool fpa pool number yo use
+ * @param buffer_size  buffer size of pool
+ * @param buffer_count number of buufers to allocate to pool
+ */
+void cvmx_ipd_set_wqe_pool_config(s64 pool, u64 buffer_size, u64 buffer_count);
+
+/**
+ * Gets the FPA packet buffer pool parameters.
+ */
+static inline void cvmx_fpa_get_packet_pool_config(s64 *pool, u64 *buffer_size, u64 *buffer_count)
+{
+       if (pool)
+               *pool = cvmx_ipd_cfg.packet_pool.pool_num;
+       if (buffer_size)
+               *buffer_size = cvmx_ipd_cfg.packet_pool.buffer_size;
+       if (buffer_count)
+               *buffer_count = cvmx_ipd_cfg.packet_pool.buffer_count;
+}
+
+/**
+ * Sets the FPA packet buffer pool parameters.
+ */
+static inline void cvmx_fpa_set_packet_pool_config(s64 pool, u64 buffer_size, u64 buffer_count)
+{
+       cvmx_ipd_set_packet_pool_config(pool, buffer_size, buffer_count);
+}
+
+/**
+ * Gets the FPA WQE pool parameters.
+ */
+static inline void cvmx_fpa_get_wqe_pool_config(s64 *pool, u64 *buffer_size, u64 *buffer_count)
+{
+       if (pool)
+               *pool = cvmx_ipd_cfg.wqe_pool.pool_num;
+       if (buffer_size)
+               *buffer_size = cvmx_ipd_cfg.wqe_pool.buffer_size;
+       if (buffer_count)
+               *buffer_count = cvmx_ipd_cfg.wqe_pool.buffer_count;
+}
+
+/**
+ * Sets the FPA WQE pool parameters.
+ */
+static inline void cvmx_fpa_set_wqe_pool_config(s64 pool, u64 buffer_size, u64 buffer_count)
+{
+       cvmx_ipd_set_wqe_pool_config(pool, buffer_size, buffer_count);
+}
+
+/**
+ * Configure IPD
+ *
+ * @param mbuff_size Packets buffer size in 8 byte words
+ * @param first_mbuff_skip
+ *                   Number of 8 byte words to skip in the first buffer
+ * @param not_first_mbuff_skip
+ *                   Number of 8 byte words to skip in each following buffer
+ * @param first_back Must be same as first_mbuff_skip / 128
+ * @param second_back
+ *                   Must be same as not_first_mbuff_skip / 128
+ * @param wqe_fpa_pool
+ *                   FPA pool to get work entries from
+ * @param cache_mode
+ * @param back_pres_enable_flag
+ *                   Enable or disable port back pressure at a global level.
+ *                   This should always be 1 as more accurate control can be
+ *                   found in IPD_PORTX_BP_PAGE_CNT[BP_ENB].
+ */
+void cvmx_ipd_config(u64 mbuff_size, u64 first_mbuff_skip, u64 not_first_mbuff_skip, u64 first_back,
+                    u64 second_back, u64 wqe_fpa_pool, cvmx_ipd_mode_t cache_mode,
+                    u64 back_pres_enable_flag);
+/**
+ * Enable IPD
+ */
+void cvmx_ipd_enable(void);
+
+/**
+ * Disable IPD
+ */
+void cvmx_ipd_disable(void);
+
+void __cvmx_ipd_free_ptr(void);
+
+void cvmx_ipd_set_packet_pool_buffer_count(u64 buffer_count);
+void cvmx_ipd_set_wqe_pool_buffer_count(u64 buffer_count);
+
+/**
+ * Setup Random Early Drop on a specific input queue
+ *
+ * @param queue  Input queue to setup RED on (0-7)
+ * @param pass_thresh
+ *               Packets will begin slowly dropping when there are less than
+ *               this many packet buffers free in FPA 0.
+ * @param drop_thresh
+ *               All incoming packets will be dropped when there are less
+ *               than this many free packet buffers in FPA 0.
+ * @return Zero on success. Negative on failure
+ */
+int cvmx_ipd_setup_red_queue(int queue, int pass_thresh, int drop_thresh);
+
+/**
+ * Setup Random Early Drop to automatically begin dropping packets.
+ *
+ * @param pass_thresh
+ *               Packets will begin slowly dropping when there are less than
+ *               this many packet buffers free in FPA 0.
+ * @param drop_thresh
+ *               All incoming packets will be dropped when there are less
+ *               than this many free packet buffers in FPA 0.
+ * @return Zero on success. Negative on failure
+ */
+int cvmx_ipd_setup_red(int pass_thresh, int drop_thresh);
+
+#endif /*  __CVMX_IPD_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-l2c-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-l2c-defs.h
new file mode 100644 (file)
index 0000000..7fddcd6
--- /dev/null
@@ -0,0 +1,172 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_L2C_DEFS_H_
+#define __CVMX_L2C_DEFS_H_
+
+#define CVMX_L2C_CFG 0x0001180080000000ull
+#define CVMX_L2C_CTL 0x0001180080800000ull
+
+/*
+ * Mapping is done starting from 0x11800.80000000
+ * Use _REL for relative mapping
+ */
+#define CVMX_L2C_CTL_REL        0x00800000
+#define CVMX_L2C_BIG_CTL_REL    0x00800030
+#define CVMX_L2C_TADX_INT_REL(i) (0x00a00028 + (((i) & 7) * 0x40000))
+#define CVMX_L2C_MCIX_INT_REL(i) (0x00c00028 + (((i) & 3) * 0x40000))
+
+/**
+ * cvmx_l2c_cfg
+ *
+ * Specify the RSL base addresses for the block
+ *
+ *                  L2C_CFG = L2C Configuration
+ *
+ * Description:
+ */
+union cvmx_l2c_cfg {
+       u64 u64;
+       struct cvmx_l2c_cfg_s {
+               u64 reserved_20_63 : 44;
+               u64 bstrun : 1;
+               u64 lbist : 1;
+               u64 xor_bank : 1;
+               u64 dpres1 : 1;
+               u64 dpres0 : 1;
+               u64 dfill_dis : 1;
+               u64 fpexp : 4;
+               u64 fpempty : 1;
+               u64 fpen : 1;
+               u64 idxalias : 1;
+               u64 mwf_crd : 4;
+               u64 rsp_arb_mode : 1;
+               u64 rfb_arb_mode : 1;
+               u64 lrf_arb_mode : 1;
+       } s;
+};
+
+/**
+ * cvmx_l2c_ctl
+ *
+ * L2C_CTL = L2C Control
+ *
+ *
+ * Notes:
+ * (1) If MAXVAB is != 0, VAB_THRESH should be less than MAXVAB.
+ *
+ * (2) L2DFDBE and L2DFSBE allows software to generate L2DSBE, L2DDBE, VBFSBE,
+ * and VBFDBE errors for the purposes of testing error handling code.  When
+ * one (or both) of these bits are set a PL2 which misses in the L2 will fill
+ * with the appropriate error in the first 2 OWs of the fill. Software can
+ * determine which OW pair gets the error by choosing the desired fill order
+ * (address<6:5>).  A PL2 which hits in the L2 will not inject any errors.
+ * Therefore sending a WBIL2 prior to the PL2 is recommended to make a miss
+ * likely (if multiple processors are involved software must be careful to be
+ * sure no other processor or IO device can bring the block into the L2).
+ *
+ * To generate a VBFSBE or VBFDBE, software must first get the cache block
+ * into the cache with an error using a PL2 which misses the L2.  Then a
+ * store partial to a portion of the cache block without the error must
+ * change the block to dirty.  Then, a subsequent WBL2/WBIL2/victim will
+ * trigger the VBFSBE/VBFDBE error.
+ */
+union cvmx_l2c_ctl {
+       u64 u64;
+       struct cvmx_l2c_ctl_s {
+               u64 reserved_29_63 : 35;
+               u64 rdf_fast : 1;
+               u64 disstgl2i : 1;
+               u64 l2dfsbe : 1;
+               u64 l2dfdbe : 1;
+               u64 discclk : 1;
+               u64 maxvab : 4;
+               u64 maxlfb : 4;
+               u64 rsp_arb_mode : 1;
+               u64 xmc_arb_mode : 1;
+               u64 reserved_2_13 : 12;
+               u64 disecc : 1;
+               u64 disidxalias : 1;
+       } s;
+
+       struct cvmx_l2c_ctl_cn73xx {
+               u64 reserved_32_63 : 32;
+               u64 ocla_qos : 3;
+               u64 reserved_28_28 : 1;
+               u64 disstgl2i : 1;
+               u64 reserved_25_26 : 2;
+               u64 discclk : 1;
+               u64 reserved_16_23 : 8;
+               u64 rsp_arb_mode : 1;
+               u64 xmc_arb_mode : 1;
+               u64 rdf_cnt : 8;
+               u64 reserved_4_5 : 2;
+               u64 disldwb : 1;
+               u64 dissblkdty : 1;
+               u64 disecc : 1;
+               u64 disidxalias : 1;
+       } cn73xx;
+
+       struct cvmx_l2c_ctl_cn73xx cn78xx;
+};
+
+/**
+ * cvmx_l2c_big_ctl
+ *
+ * L2C_BIG_CTL = L2C Big memory control register
+ *
+ *
+ * Notes:
+ * (1) BIGRD interrupts can occur during normal operation as the PP's are
+ * allowed to prefetch to non-existent memory locations.  Therefore,
+ * BIGRD is for informational purposes only.
+ *
+ * (2) When HOLEWR/BIGWR blocks a store L2C_VER_ID, L2C_VER_PP, L2C_VER_IOB,
+ * and L2C_VER_MSC will be loaded just like a store which is blocked by VRTWR.
+ * Additionally, L2C_ERR_XMC will be loaded.
+ */
+union cvmx_l2c_big_ctl {
+       u64 u64;
+       struct cvmx_l2c_big_ctl_s {
+               u64 reserved_8_63 : 56;
+               u64 maxdram : 4;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_l2c_big_ctl_cn61xx {
+               u64 reserved_8_63 : 56;
+               u64 maxdram : 4;
+               u64 reserved_1_3 : 3;
+               u64 disable : 1;
+       } cn61xx;
+       struct cvmx_l2c_big_ctl_cn61xx cn63xx;
+       struct cvmx_l2c_big_ctl_cn61xx cn66xx;
+       struct cvmx_l2c_big_ctl_cn61xx cn68xx;
+       struct cvmx_l2c_big_ctl_cn61xx cn68xxp1;
+       struct cvmx_l2c_big_ctl_cn70xx {
+               u64 reserved_8_63 : 56;
+               u64 maxdram : 4;
+               u64 reserved_1_3 : 3;
+               u64 disbig : 1;
+       } cn70xx;
+       struct cvmx_l2c_big_ctl_cn70xx cn70xxp1;
+       struct cvmx_l2c_big_ctl_cn70xx cn73xx;
+       struct cvmx_l2c_big_ctl_cn70xx cn78xx;
+       struct cvmx_l2c_big_ctl_cn70xx cn78xxp1;
+       struct cvmx_l2c_big_ctl_cn61xx cnf71xx;
+       struct cvmx_l2c_big_ctl_cn70xx cnf75xx;
+};
+
+struct rlevel_byte_data {
+       int delay;
+       int loop_total;
+       int loop_count;
+       int best;
+       u64 bm;
+       int bmerrs;
+       int sqerrs;
+       int bestsq;
+};
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-mio-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-mio-defs.h
new file mode 100644 (file)
index 0000000..23a18be
--- /dev/null
@@ -0,0 +1,353 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_MIO_DEFS_H__
+#define __CVMX_MIO_DEFS_H__
+
+#define CVMX_MIO_PTP_CLOCK_CFG   (0x0001070000000F00ull)
+#define CVMX_MIO_PTP_EVT_CNT     (0x0001070000000F28ull)
+#define CVMX_MIO_RST_BOOT        (0x0001180000001600ull)
+#define CVMX_MIO_RST_CTLX(offset) (0x0001180000001618ull + ((offset) & 1))
+#define CVMX_MIO_QLMX_CFG(offset) (0x0001180000001590ull + ((offset) & 7) * 8)
+
+/**
+ * cvmx_mio_ptp_clock_cfg
+ *
+ * This register configures the timestamp architecture.
+ *
+ */
+union cvmx_mio_ptp_clock_cfg {
+       u64 u64;
+       struct cvmx_mio_ptp_clock_cfg_s {
+               u64 reserved_40_63 : 24;
+               u64 ext_clk_edge : 2;
+               u64 ckout_out4 : 1;
+               u64 pps_out : 5;
+               u64 pps_inv : 1;
+               u64 pps_en : 1;
+               u64 ckout_out : 4;
+               u64 ckout_inv : 1;
+               u64 ckout_en : 1;
+               u64 evcnt_in : 6;
+               u64 evcnt_edge : 1;
+               u64 evcnt_en : 1;
+               u64 tstmp_in : 6;
+               u64 tstmp_edge : 1;
+               u64 tstmp_en : 1;
+               u64 ext_clk_in : 6;
+               u64 ext_clk_en : 1;
+               u64 ptp_en : 1;
+       } s;
+       struct cvmx_mio_ptp_clock_cfg_cn61xx {
+               u64 reserved_42_63 : 22;
+               u64 pps : 1;
+               u64 ckout : 1;
+               u64 ext_clk_edge : 2;
+               u64 ckout_out4 : 1;
+               u64 pps_out : 5;
+               u64 pps_inv : 1;
+               u64 pps_en : 1;
+               u64 ckout_out : 4;
+               u64 ckout_inv : 1;
+               u64 ckout_en : 1;
+               u64 evcnt_in : 6;
+               u64 evcnt_edge : 1;
+               u64 evcnt_en : 1;
+               u64 tstmp_in : 6;
+               u64 tstmp_edge : 1;
+               u64 tstmp_en : 1;
+               u64 ext_clk_in : 6;
+               u64 ext_clk_en : 1;
+               u64 ptp_en : 1;
+       } cn61xx;
+       struct cvmx_mio_ptp_clock_cfg_cn63xx {
+               u64 reserved_24_63 : 40;
+               u64 evcnt_in : 6;
+               u64 evcnt_edge : 1;
+               u64 evcnt_en : 1;
+               u64 tstmp_in : 6;
+               u64 tstmp_edge : 1;
+               u64 tstmp_en : 1;
+               u64 ext_clk_in : 6;
+               u64 ext_clk_en : 1;
+               u64 ptp_en : 1;
+       } cn63xx;
+       struct cvmx_mio_ptp_clock_cfg_cn63xx cn63xxp1;
+       struct cvmx_mio_ptp_clock_cfg_s cn66xx;
+       struct cvmx_mio_ptp_clock_cfg_cn61xx cn68xx;
+       struct cvmx_mio_ptp_clock_cfg_cn63xx cn68xxp1;
+       struct cvmx_mio_ptp_clock_cfg_cn70xx {
+               u64 reserved_42_63 : 22;
+               u64 ckout : 1;
+               u64 pps : 1;
+               u64 ext_clk_edge : 2;
+               u64 reserved_32_37 : 6;
+               u64 pps_inv : 1;
+               u64 pps_en : 1;
+               u64 reserved_26_29 : 4;
+               u64 ckout_inv : 1;
+               u64 ckout_en : 1;
+               u64 evcnt_in : 6;
+               u64 evcnt_edge : 1;
+               u64 evcnt_en : 1;
+               u64 tstmp_in : 6;
+               u64 tstmp_edge : 1;
+               u64 tstmp_en : 1;
+               u64 ext_clk_in : 6;
+               u64 ext_clk_en : 1;
+               u64 ptp_en : 1;
+       } cn70xx;
+       struct cvmx_mio_ptp_clock_cfg_cn70xx cn70xxp1;
+       struct cvmx_mio_ptp_clock_cfg_cn70xx cn73xx;
+       struct cvmx_mio_ptp_clock_cfg_cn70xx cn78xx;
+       struct cvmx_mio_ptp_clock_cfg_cn70xx cn78xxp1;
+       struct cvmx_mio_ptp_clock_cfg_cn61xx cnf71xx;
+       struct cvmx_mio_ptp_clock_cfg_cn70xx cnf75xx;
+};
+
+typedef union cvmx_mio_ptp_clock_cfg cvmx_mio_ptp_clock_cfg_t;
+
+/**
+ * cvmx_mio_ptp_evt_cnt
+ *
+ * This register contains the PTP event counter.
+ *
+ */
+union cvmx_mio_ptp_evt_cnt {
+       u64 u64;
+       struct cvmx_mio_ptp_evt_cnt_s {
+               u64 cntr : 64;
+       } s;
+       struct cvmx_mio_ptp_evt_cnt_s cn61xx;
+       struct cvmx_mio_ptp_evt_cnt_s cn63xx;
+       struct cvmx_mio_ptp_evt_cnt_s cn63xxp1;
+       struct cvmx_mio_ptp_evt_cnt_s cn66xx;
+       struct cvmx_mio_ptp_evt_cnt_s cn68xx;
+       struct cvmx_mio_ptp_evt_cnt_s cn68xxp1;
+       struct cvmx_mio_ptp_evt_cnt_s cn70xx;
+       struct cvmx_mio_ptp_evt_cnt_s cn70xxp1;
+       struct cvmx_mio_ptp_evt_cnt_s cn73xx;
+       struct cvmx_mio_ptp_evt_cnt_s cn78xx;
+       struct cvmx_mio_ptp_evt_cnt_s cn78xxp1;
+       struct cvmx_mio_ptp_evt_cnt_s cnf71xx;
+       struct cvmx_mio_ptp_evt_cnt_s cnf75xx;
+};
+
+typedef union cvmx_mio_ptp_evt_cnt cvmx_mio_ptp_evt_cnt_t;
+
+/**
+ * cvmx_mio_rst_boot
+ *
+ * Notes:
+ * JTCSRDIS, EJTAGDIS, ROMEN reset to 1 in authentik mode; in all other modes they reset to 0.
+ *
+ */
+union cvmx_mio_rst_boot {
+       u64 u64;
+       struct cvmx_mio_rst_boot_s {
+               u64 chipkill : 1;
+               u64 jtcsrdis : 1;
+               u64 ejtagdis : 1;
+               u64 romen : 1;
+               u64 ckill_ppdis : 1;
+               u64 jt_tstmode : 1;
+               u64 reserved_50_57 : 8;
+               u64 lboot_ext : 2;
+               u64 reserved_44_47 : 4;
+               u64 qlm4_spd : 4;
+               u64 qlm3_spd : 4;
+               u64 c_mul : 6;
+               u64 pnr_mul : 6;
+               u64 qlm2_spd : 4;
+               u64 qlm1_spd : 4;
+               u64 qlm0_spd : 4;
+               u64 lboot : 10;
+               u64 rboot : 1;
+               u64 rboot_pin : 1;
+       } s;
+       struct cvmx_mio_rst_boot_cn61xx {
+               u64 chipkill : 1;
+               u64 jtcsrdis : 1;
+               u64 ejtagdis : 1;
+               u64 romen : 1;
+               u64 ckill_ppdis : 1;
+               u64 jt_tstmode : 1;
+               u64 reserved_50_57 : 8;
+               u64 lboot_ext : 2;
+               u64 reserved_36_47 : 12;
+               u64 c_mul : 6;
+               u64 pnr_mul : 6;
+               u64 qlm2_spd : 4;
+               u64 qlm1_spd : 4;
+               u64 qlm0_spd : 4;
+               u64 lboot : 10;
+               u64 rboot : 1;
+               u64 rboot_pin : 1;
+       } cn61xx;
+       struct cvmx_mio_rst_boot_cn63xx {
+               u64 reserved_36_63 : 28;
+               u64 c_mul : 6;
+               u64 pnr_mul : 6;
+               u64 qlm2_spd : 4;
+               u64 qlm1_spd : 4;
+               u64 qlm0_spd : 4;
+               u64 lboot : 10;
+               u64 rboot : 1;
+               u64 rboot_pin : 1;
+       } cn63xx;
+       struct cvmx_mio_rst_boot_cn63xx cn63xxp1;
+       struct cvmx_mio_rst_boot_cn66xx {
+               u64 chipkill : 1;
+               u64 jtcsrdis : 1;
+               u64 ejtagdis : 1;
+               u64 romen : 1;
+               u64 ckill_ppdis : 1;
+               u64 reserved_50_58 : 9;
+               u64 lboot_ext : 2;
+               u64 reserved_36_47 : 12;
+               u64 c_mul : 6;
+               u64 pnr_mul : 6;
+               u64 qlm2_spd : 4;
+               u64 qlm1_spd : 4;
+               u64 qlm0_spd : 4;
+               u64 lboot : 10;
+               u64 rboot : 1;
+               u64 rboot_pin : 1;
+       } cn66xx;
+       struct cvmx_mio_rst_boot_cn68xx {
+               u64 reserved_59_63 : 5;
+               u64 jt_tstmode : 1;
+               u64 reserved_44_57 : 14;
+               u64 qlm4_spd : 4;
+               u64 qlm3_spd : 4;
+               u64 c_mul : 6;
+               u64 pnr_mul : 6;
+               u64 qlm2_spd : 4;
+               u64 qlm1_spd : 4;
+               u64 qlm0_spd : 4;
+               u64 lboot : 10;
+               u64 rboot : 1;
+               u64 rboot_pin : 1;
+       } cn68xx;
+       struct cvmx_mio_rst_boot_cn68xxp1 {
+               u64 reserved_44_63 : 20;
+               u64 qlm4_spd : 4;
+               u64 qlm3_spd : 4;
+               u64 c_mul : 6;
+               u64 pnr_mul : 6;
+               u64 qlm2_spd : 4;
+               u64 qlm1_spd : 4;
+               u64 qlm0_spd : 4;
+               u64 lboot : 10;
+               u64 rboot : 1;
+               u64 rboot_pin : 1;
+       } cn68xxp1;
+       struct cvmx_mio_rst_boot_cn61xx cnf71xx;
+};
+
+typedef union cvmx_mio_rst_boot cvmx_mio_rst_boot_t;
+
+/**
+ * cvmx_mio_rst_ctl#
+ *
+ * Notes:
+ * GEN1_Only mode is enabled for PEM0 when QLM1_SPD[0] is set or when sclk < 550Mhz.
+ * GEN1_Only mode is enabled for PEM1 when QLM1_SPD[1] is set or when sclk < 550Mhz.
+ */
+union cvmx_mio_rst_ctlx {
+       u64 u64;
+       struct cvmx_mio_rst_ctlx_s {
+               u64 reserved_13_63 : 51;
+               u64 in_rev_ln : 1;
+               u64 rev_lanes : 1;
+               u64 gen1_only : 1;
+               u64 prst_link : 1;
+               u64 rst_done : 1;
+               u64 rst_link : 1;
+               u64 host_mode : 1;
+               u64 prtmode : 2;
+               u64 rst_drv : 1;
+               u64 rst_rcv : 1;
+               u64 rst_chip : 1;
+               u64 rst_val : 1;
+       } s;
+       struct cvmx_mio_rst_ctlx_s cn61xx;
+       struct cvmx_mio_rst_ctlx_cn63xx {
+               u64 reserved_10_63 : 54;
+               u64 prst_link : 1;
+               u64 rst_done : 1;
+               u64 rst_link : 1;
+               u64 host_mode : 1;
+               u64 prtmode : 2;
+               u64 rst_drv : 1;
+               u64 rst_rcv : 1;
+               u64 rst_chip : 1;
+               u64 rst_val : 1;
+       } cn63xx;
+       struct cvmx_mio_rst_ctlx_cn63xxp1 {
+               u64 reserved_9_63 : 55;
+               u64 rst_done : 1;
+               u64 rst_link : 1;
+               u64 host_mode : 1;
+               u64 prtmode : 2;
+               u64 rst_drv : 1;
+               u64 rst_rcv : 1;
+               u64 rst_chip : 1;
+               u64 rst_val : 1;
+       } cn63xxp1;
+       struct cvmx_mio_rst_ctlx_cn63xx cn66xx;
+       struct cvmx_mio_rst_ctlx_cn63xx cn68xx;
+       struct cvmx_mio_rst_ctlx_cn63xx cn68xxp1;
+       struct cvmx_mio_rst_ctlx_s cnf71xx;
+};
+
+typedef union cvmx_mio_rst_ctlx cvmx_mio_rst_ctlx_t;
+
+/**
+ * cvmx_mio_qlm#_cfg
+ *
+ * Notes:
+ * Certain QLM_SPD is valid only for certain QLM_CFG configuration, refer to HRM for valid
+ * combinations.  These csrs are reset only on COLD_RESET.  The Reset values for QLM_SPD and QLM_CFG
+ * are as follows:               MIO_QLM0_CFG  SPD=F, CFG=2 SGMII (AGX0)
+ *                               MIO_QLM1_CFG  SPD=0, CFG=1 PCIE 2x1 (PEM0/PEM1)
+ */
+union cvmx_mio_qlmx_cfg {
+       u64 u64;
+       struct cvmx_mio_qlmx_cfg_s {
+               u64 reserved_15_63 : 49;
+               u64 prtmode : 1;
+               u64 reserved_12_13 : 2;
+               u64 qlm_spd : 4;
+               u64 reserved_4_7 : 4;
+               u64 qlm_cfg : 4;
+       } s;
+       struct cvmx_mio_qlmx_cfg_cn61xx {
+               u64 reserved_15_63 : 49;
+               u64 prtmode : 1;
+               u64 reserved_12_13 : 2;
+               u64 qlm_spd : 4;
+               u64 reserved_2_7 : 6;
+               u64 qlm_cfg : 2;
+       } cn61xx;
+       struct cvmx_mio_qlmx_cfg_cn66xx {
+               u64 reserved_12_63 : 52;
+               u64 qlm_spd : 4;
+               u64 reserved_4_7 : 4;
+               u64 qlm_cfg : 4;
+       } cn66xx;
+       struct cvmx_mio_qlmx_cfg_cn68xx {
+               u64 reserved_12_63 : 52;
+               u64 qlm_spd : 4;
+               u64 reserved_3_7 : 5;
+               u64 qlm_cfg : 3;
+       } cn68xx;
+       struct cvmx_mio_qlmx_cfg_cn68xx cn68xxp1;
+       struct cvmx_mio_qlmx_cfg_cn61xx cnf71xx;
+};
+
+typedef union cvmx_mio_qlmx_cfg cvmx_mio_qlmx_cfg_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-npi-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-npi-defs.h
new file mode 100644 (file)
index 0000000..f23ed78
--- /dev/null
@@ -0,0 +1,1953 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon npi.
+ */
+
+#ifndef __CVMX_NPI_DEFS_H__
+#define __CVMX_NPI_DEFS_H__
+
+#define CVMX_NPI_BASE_ADDR_INPUT0         CVMX_NPI_BASE_ADDR_INPUTX(0)
+#define CVMX_NPI_BASE_ADDR_INPUT1         CVMX_NPI_BASE_ADDR_INPUTX(1)
+#define CVMX_NPI_BASE_ADDR_INPUT2         CVMX_NPI_BASE_ADDR_INPUTX(2)
+#define CVMX_NPI_BASE_ADDR_INPUT3         CVMX_NPI_BASE_ADDR_INPUTX(3)
+#define CVMX_NPI_BASE_ADDR_INPUTX(offset)  (0x00011F0000000070ull + ((offset) & 3) * 16)
+#define CVMX_NPI_BASE_ADDR_OUTPUT0        CVMX_NPI_BASE_ADDR_OUTPUTX(0)
+#define CVMX_NPI_BASE_ADDR_OUTPUT1        CVMX_NPI_BASE_ADDR_OUTPUTX(1)
+#define CVMX_NPI_BASE_ADDR_OUTPUT2        CVMX_NPI_BASE_ADDR_OUTPUTX(2)
+#define CVMX_NPI_BASE_ADDR_OUTPUT3        CVMX_NPI_BASE_ADDR_OUTPUTX(3)
+#define CVMX_NPI_BASE_ADDR_OUTPUTX(offset) (0x00011F00000000B8ull + ((offset) & 3) * 8)
+#define CVMX_NPI_BIST_STATUS              (0x00011F00000003F8ull)
+#define CVMX_NPI_BUFF_SIZE_OUTPUT0        CVMX_NPI_BUFF_SIZE_OUTPUTX(0)
+#define CVMX_NPI_BUFF_SIZE_OUTPUT1        CVMX_NPI_BUFF_SIZE_OUTPUTX(1)
+#define CVMX_NPI_BUFF_SIZE_OUTPUT2        CVMX_NPI_BUFF_SIZE_OUTPUTX(2)
+#define CVMX_NPI_BUFF_SIZE_OUTPUT3        CVMX_NPI_BUFF_SIZE_OUTPUTX(3)
+#define CVMX_NPI_BUFF_SIZE_OUTPUTX(offset) (0x00011F00000000E0ull + ((offset) & 3) * 8)
+#define CVMX_NPI_COMP_CTL                 (0x00011F0000000218ull)
+#define CVMX_NPI_CTL_STATUS               (0x00011F0000000010ull)
+#define CVMX_NPI_DBG_SELECT               (0x00011F0000000008ull)
+#define CVMX_NPI_DMA_CONTROL              (0x00011F0000000128ull)
+#define CVMX_NPI_DMA_HIGHP_COUNTS         (0x00011F0000000148ull)
+#define CVMX_NPI_DMA_HIGHP_NADDR          (0x00011F0000000158ull)
+#define CVMX_NPI_DMA_LOWP_COUNTS          (0x00011F0000000140ull)
+#define CVMX_NPI_DMA_LOWP_NADDR                   (0x00011F0000000150ull)
+#define CVMX_NPI_HIGHP_DBELL              (0x00011F0000000120ull)
+#define CVMX_NPI_HIGHP_IBUFF_SADDR        (0x00011F0000000110ull)
+#define CVMX_NPI_INPUT_CONTROL            (0x00011F0000000138ull)
+#define CVMX_NPI_INT_ENB                  (0x00011F0000000020ull)
+#define CVMX_NPI_INT_SUM                  (0x00011F0000000018ull)
+#define CVMX_NPI_LOWP_DBELL               (0x00011F0000000118ull)
+#define CVMX_NPI_LOWP_IBUFF_SADDR         (0x00011F0000000108ull)
+#define CVMX_NPI_MEM_ACCESS_SUBID3        CVMX_NPI_MEM_ACCESS_SUBIDX(3)
+#define CVMX_NPI_MEM_ACCESS_SUBID4        CVMX_NPI_MEM_ACCESS_SUBIDX(4)
+#define CVMX_NPI_MEM_ACCESS_SUBID5        CVMX_NPI_MEM_ACCESS_SUBIDX(5)
+#define CVMX_NPI_MEM_ACCESS_SUBID6        CVMX_NPI_MEM_ACCESS_SUBIDX(6)
+#define CVMX_NPI_MEM_ACCESS_SUBIDX(offset) (0x00011F0000000028ull + ((offset) & 7) * 8 - 8 * 3)
+#define CVMX_NPI_MSI_RCV                  (0x0000000000000190ull)
+#define CVMX_NPI_NPI_MSI_RCV              (0x00011F0000001190ull)
+#define CVMX_NPI_NUM_DESC_OUTPUT0         CVMX_NPI_NUM_DESC_OUTPUTX(0)
+#define CVMX_NPI_NUM_DESC_OUTPUT1         CVMX_NPI_NUM_DESC_OUTPUTX(1)
+#define CVMX_NPI_NUM_DESC_OUTPUT2         CVMX_NPI_NUM_DESC_OUTPUTX(2)
+#define CVMX_NPI_NUM_DESC_OUTPUT3         CVMX_NPI_NUM_DESC_OUTPUTX(3)
+#define CVMX_NPI_NUM_DESC_OUTPUTX(offset)  (0x00011F0000000050ull + ((offset) & 3) * 8)
+#define CVMX_NPI_OUTPUT_CONTROL                   (0x00011F0000000100ull)
+#define CVMX_NPI_P0_DBPAIR_ADDR                   CVMX_NPI_PX_DBPAIR_ADDR(0)
+#define CVMX_NPI_P0_INSTR_ADDR            CVMX_NPI_PX_INSTR_ADDR(0)
+#define CVMX_NPI_P0_INSTR_CNTS            CVMX_NPI_PX_INSTR_CNTS(0)
+#define CVMX_NPI_P0_PAIR_CNTS             CVMX_NPI_PX_PAIR_CNTS(0)
+#define CVMX_NPI_P1_DBPAIR_ADDR                   CVMX_NPI_PX_DBPAIR_ADDR(1)
+#define CVMX_NPI_P1_INSTR_ADDR            CVMX_NPI_PX_INSTR_ADDR(1)
+#define CVMX_NPI_P1_INSTR_CNTS            CVMX_NPI_PX_INSTR_CNTS(1)
+#define CVMX_NPI_P1_PAIR_CNTS             CVMX_NPI_PX_PAIR_CNTS(1)
+#define CVMX_NPI_P2_DBPAIR_ADDR                   CVMX_NPI_PX_DBPAIR_ADDR(2)
+#define CVMX_NPI_P2_INSTR_ADDR            CVMX_NPI_PX_INSTR_ADDR(2)
+#define CVMX_NPI_P2_INSTR_CNTS            CVMX_NPI_PX_INSTR_CNTS(2)
+#define CVMX_NPI_P2_PAIR_CNTS             CVMX_NPI_PX_PAIR_CNTS(2)
+#define CVMX_NPI_P3_DBPAIR_ADDR                   CVMX_NPI_PX_DBPAIR_ADDR(3)
+#define CVMX_NPI_P3_INSTR_ADDR            CVMX_NPI_PX_INSTR_ADDR(3)
+#define CVMX_NPI_P3_INSTR_CNTS            CVMX_NPI_PX_INSTR_CNTS(3)
+#define CVMX_NPI_P3_PAIR_CNTS             CVMX_NPI_PX_PAIR_CNTS(3)
+#define CVMX_NPI_PCI_BAR1_INDEXX(offset)   (0x00011F0000001100ull + ((offset) & 31) * 4)
+#define CVMX_NPI_PCI_BIST_REG             (0x00011F00000011C0ull)
+#define CVMX_NPI_PCI_BURST_SIZE                   (0x00011F00000000D8ull)
+#define CVMX_NPI_PCI_CFG00                (0x00011F0000001800ull)
+#define CVMX_NPI_PCI_CFG01                (0x00011F0000001804ull)
+#define CVMX_NPI_PCI_CFG02                (0x00011F0000001808ull)
+#define CVMX_NPI_PCI_CFG03                (0x00011F000000180Cull)
+#define CVMX_NPI_PCI_CFG04                (0x00011F0000001810ull)
+#define CVMX_NPI_PCI_CFG05                (0x00011F0000001814ull)
+#define CVMX_NPI_PCI_CFG06                (0x00011F0000001818ull)
+#define CVMX_NPI_PCI_CFG07                (0x00011F000000181Cull)
+#define CVMX_NPI_PCI_CFG08                (0x00011F0000001820ull)
+#define CVMX_NPI_PCI_CFG09                (0x00011F0000001824ull)
+#define CVMX_NPI_PCI_CFG10                (0x00011F0000001828ull)
+#define CVMX_NPI_PCI_CFG11                (0x00011F000000182Cull)
+#define CVMX_NPI_PCI_CFG12                (0x00011F0000001830ull)
+#define CVMX_NPI_PCI_CFG13                (0x00011F0000001834ull)
+#define CVMX_NPI_PCI_CFG15                (0x00011F000000183Cull)
+#define CVMX_NPI_PCI_CFG16                (0x00011F0000001840ull)
+#define CVMX_NPI_PCI_CFG17                (0x00011F0000001844ull)
+#define CVMX_NPI_PCI_CFG18                (0x00011F0000001848ull)
+#define CVMX_NPI_PCI_CFG19                (0x00011F000000184Cull)
+#define CVMX_NPI_PCI_CFG20                (0x00011F0000001850ull)
+#define CVMX_NPI_PCI_CFG21                (0x00011F0000001854ull)
+#define CVMX_NPI_PCI_CFG22                (0x00011F0000001858ull)
+#define CVMX_NPI_PCI_CFG56                (0x00011F00000018E0ull)
+#define CVMX_NPI_PCI_CFG57                (0x00011F00000018E4ull)
+#define CVMX_NPI_PCI_CFG58                (0x00011F00000018E8ull)
+#define CVMX_NPI_PCI_CFG59                (0x00011F00000018ECull)
+#define CVMX_NPI_PCI_CFG60                (0x00011F00000018F0ull)
+#define CVMX_NPI_PCI_CFG61                (0x00011F00000018F4ull)
+#define CVMX_NPI_PCI_CFG62                (0x00011F00000018F8ull)
+#define CVMX_NPI_PCI_CFG63                (0x00011F00000018FCull)
+#define CVMX_NPI_PCI_CNT_REG              (0x00011F00000011B8ull)
+#define CVMX_NPI_PCI_CTL_STATUS_2         (0x00011F000000118Cull)
+#define CVMX_NPI_PCI_INT_ARB_CFG          (0x00011F0000000130ull)
+#define CVMX_NPI_PCI_INT_ENB2             (0x00011F00000011A0ull)
+#define CVMX_NPI_PCI_INT_SUM2             (0x00011F0000001198ull)
+#define CVMX_NPI_PCI_READ_CMD             (0x00011F0000000048ull)
+#define CVMX_NPI_PCI_READ_CMD_6                   (0x00011F0000001180ull)
+#define CVMX_NPI_PCI_READ_CMD_C                   (0x00011F0000001184ull)
+#define CVMX_NPI_PCI_READ_CMD_E                   (0x00011F0000001188ull)
+#define CVMX_NPI_PCI_SCM_REG              (0x00011F00000011A8ull)
+#define CVMX_NPI_PCI_TSR_REG              (0x00011F00000011B0ull)
+#define CVMX_NPI_PORT32_INSTR_HDR         (0x00011F00000001F8ull)
+#define CVMX_NPI_PORT33_INSTR_HDR         (0x00011F0000000200ull)
+#define CVMX_NPI_PORT34_INSTR_HDR         (0x00011F0000000208ull)
+#define CVMX_NPI_PORT35_INSTR_HDR         (0x00011F0000000210ull)
+#define CVMX_NPI_PORT_BP_CONTROL          (0x00011F00000001F0ull)
+#define CVMX_NPI_PX_DBPAIR_ADDR(offset)           (0x00011F0000000180ull + ((offset) & 3) * 8)
+#define CVMX_NPI_PX_INSTR_ADDR(offset)    (0x00011F00000001C0ull + ((offset) & 3) * 8)
+#define CVMX_NPI_PX_INSTR_CNTS(offset)    (0x00011F00000001A0ull + ((offset) & 3) * 8)
+#define CVMX_NPI_PX_PAIR_CNTS(offset)     (0x00011F0000000160ull + ((offset) & 3) * 8)
+#define CVMX_NPI_RSL_INT_BLOCKS                   (0x00011F0000000000ull)
+#define CVMX_NPI_SIZE_INPUT0              CVMX_NPI_SIZE_INPUTX(0)
+#define CVMX_NPI_SIZE_INPUT1              CVMX_NPI_SIZE_INPUTX(1)
+#define CVMX_NPI_SIZE_INPUT2              CVMX_NPI_SIZE_INPUTX(2)
+#define CVMX_NPI_SIZE_INPUT3              CVMX_NPI_SIZE_INPUTX(3)
+#define CVMX_NPI_SIZE_INPUTX(offset)      (0x00011F0000000078ull + ((offset) & 3) * 16)
+#define CVMX_NPI_WIN_READ_TO              (0x00011F00000001E0ull)
+
+/**
+ * cvmx_npi_base_addr_input#
+ *
+ * NPI_BASE_ADDR_INPUT0 = NPI's Base Address Input 0 Register
+ *
+ * The address to start reading Instructions from for Input-0.
+ */
+union cvmx_npi_base_addr_inputx {
+       u64 u64;
+       struct cvmx_npi_base_addr_inputx_s {
+               u64 baddr : 61;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_npi_base_addr_inputx_s cn30xx;
+       struct cvmx_npi_base_addr_inputx_s cn31xx;
+       struct cvmx_npi_base_addr_inputx_s cn38xx;
+       struct cvmx_npi_base_addr_inputx_s cn38xxp2;
+       struct cvmx_npi_base_addr_inputx_s cn50xx;
+       struct cvmx_npi_base_addr_inputx_s cn58xx;
+       struct cvmx_npi_base_addr_inputx_s cn58xxp1;
+};
+
+typedef union cvmx_npi_base_addr_inputx cvmx_npi_base_addr_inputx_t;
+
+/**
+ * cvmx_npi_base_addr_output#
+ *
+ * NPI_BASE_ADDR_OUTPUT0 = NPI's Base Address Output 0 Register
+ *
+ * The address to start reading Instructions from for Output-0.
+ */
+union cvmx_npi_base_addr_outputx {
+       u64 u64;
+       struct cvmx_npi_base_addr_outputx_s {
+               u64 baddr : 61;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_npi_base_addr_outputx_s cn30xx;
+       struct cvmx_npi_base_addr_outputx_s cn31xx;
+       struct cvmx_npi_base_addr_outputx_s cn38xx;
+       struct cvmx_npi_base_addr_outputx_s cn38xxp2;
+       struct cvmx_npi_base_addr_outputx_s cn50xx;
+       struct cvmx_npi_base_addr_outputx_s cn58xx;
+       struct cvmx_npi_base_addr_outputx_s cn58xxp1;
+};
+
+typedef union cvmx_npi_base_addr_outputx cvmx_npi_base_addr_outputx_t;
+
+/**
+ * cvmx_npi_bist_status
+ *
+ * NPI_BIST_STATUS = NPI's BIST Status Register
+ *
+ * Results from BIST runs of NPI's memories.
+ */
+union cvmx_npi_bist_status {
+       u64 u64;
+       struct cvmx_npi_bist_status_s {
+               u64 reserved_20_63 : 44;
+               u64 csr_bs : 1;
+               u64 dif_bs : 1;
+               u64 rdp_bs : 1;
+               u64 pcnc_bs : 1;
+               u64 pcn_bs : 1;
+               u64 rdn_bs : 1;
+               u64 pcac_bs : 1;
+               u64 pcad_bs : 1;
+               u64 rdnl_bs : 1;
+               u64 pgf_bs : 1;
+               u64 pig_bs : 1;
+               u64 pof0_bs : 1;
+               u64 pof1_bs : 1;
+               u64 pof2_bs : 1;
+               u64 pof3_bs : 1;
+               u64 pos_bs : 1;
+               u64 nus_bs : 1;
+               u64 dob_bs : 1;
+               u64 pdf_bs : 1;
+               u64 dpi_bs : 1;
+       } s;
+       struct cvmx_npi_bist_status_cn30xx {
+               u64 reserved_20_63 : 44;
+               u64 csr_bs : 1;
+               u64 dif_bs : 1;
+               u64 rdp_bs : 1;
+               u64 pcnc_bs : 1;
+               u64 pcn_bs : 1;
+               u64 rdn_bs : 1;
+               u64 pcac_bs : 1;
+               u64 pcad_bs : 1;
+               u64 rdnl_bs : 1;
+               u64 pgf_bs : 1;
+               u64 pig_bs : 1;
+               u64 pof0_bs : 1;
+               u64 reserved_5_7 : 3;
+               u64 pos_bs : 1;
+               u64 nus_bs : 1;
+               u64 dob_bs : 1;
+               u64 pdf_bs : 1;
+               u64 dpi_bs : 1;
+       } cn30xx;
+       struct cvmx_npi_bist_status_s cn31xx;
+       struct cvmx_npi_bist_status_s cn38xx;
+       struct cvmx_npi_bist_status_s cn38xxp2;
+       struct cvmx_npi_bist_status_cn50xx {
+               u64 reserved_20_63 : 44;
+               u64 csr_bs : 1;
+               u64 dif_bs : 1;
+               u64 rdp_bs : 1;
+               u64 pcnc_bs : 1;
+               u64 pcn_bs : 1;
+               u64 rdn_bs : 1;
+               u64 pcac_bs : 1;
+               u64 pcad_bs : 1;
+               u64 rdnl_bs : 1;
+               u64 pgf_bs : 1;
+               u64 pig_bs : 1;
+               u64 pof0_bs : 1;
+               u64 pof1_bs : 1;
+               u64 reserved_5_6 : 2;
+               u64 pos_bs : 1;
+               u64 nus_bs : 1;
+               u64 dob_bs : 1;
+               u64 pdf_bs : 1;
+               u64 dpi_bs : 1;
+       } cn50xx;
+       struct cvmx_npi_bist_status_s cn58xx;
+       struct cvmx_npi_bist_status_s cn58xxp1;
+};
+
+typedef union cvmx_npi_bist_status cvmx_npi_bist_status_t;
+
+/**
+ * cvmx_npi_buff_size_output#
+ *
+ * NPI_BUFF_SIZE_OUTPUT0 = NPI's D/I Buffer Sizes For Output 0
+ *
+ * The size in bytes of the Data Bufffer and Information Buffer for output 0.
+ */
+union cvmx_npi_buff_size_outputx {
+       u64 u64;
+       struct cvmx_npi_buff_size_outputx_s {
+               u64 reserved_23_63 : 41;
+               u64 isize : 7;
+               u64 bsize : 16;
+       } s;
+       struct cvmx_npi_buff_size_outputx_s cn30xx;
+       struct cvmx_npi_buff_size_outputx_s cn31xx;
+       struct cvmx_npi_buff_size_outputx_s cn38xx;
+       struct cvmx_npi_buff_size_outputx_s cn38xxp2;
+       struct cvmx_npi_buff_size_outputx_s cn50xx;
+       struct cvmx_npi_buff_size_outputx_s cn58xx;
+       struct cvmx_npi_buff_size_outputx_s cn58xxp1;
+};
+
+typedef union cvmx_npi_buff_size_outputx cvmx_npi_buff_size_outputx_t;
+
+/**
+ * cvmx_npi_comp_ctl
+ *
+ * NPI_COMP_CTL = PCI Compensation Control
+ *
+ * PCI Compensation Control
+ */
+union cvmx_npi_comp_ctl {
+       u64 u64;
+       struct cvmx_npi_comp_ctl_s {
+               u64 reserved_10_63 : 54;
+               u64 pctl : 5;
+               u64 nctl : 5;
+       } s;
+       struct cvmx_npi_comp_ctl_s cn50xx;
+       struct cvmx_npi_comp_ctl_s cn58xx;
+       struct cvmx_npi_comp_ctl_s cn58xxp1;
+};
+
+typedef union cvmx_npi_comp_ctl cvmx_npi_comp_ctl_t;
+
+/**
+ * cvmx_npi_ctl_status
+ *
+ * NPI_CTL_STATUS = NPI's Control Status Register
+ *
+ * Contains control ans status for NPI.
+ * Writes to this register are not ordered with writes/reads to the PCI Memory space.
+ * To ensure that a write has completed the user must read the register before
+ * making an access(i.e. PCI memory space) that requires the value of this register to be updated.
+ */
+union cvmx_npi_ctl_status {
+       u64 u64;
+       struct cvmx_npi_ctl_status_s {
+               u64 reserved_63_63 : 1;
+               u64 chip_rev : 8;
+               u64 dis_pniw : 1;
+               u64 out3_enb : 1;
+               u64 out2_enb : 1;
+               u64 out1_enb : 1;
+               u64 out0_enb : 1;
+               u64 ins3_enb : 1;
+               u64 ins2_enb : 1;
+               u64 ins1_enb : 1;
+               u64 ins0_enb : 1;
+               u64 ins3_64b : 1;
+               u64 ins2_64b : 1;
+               u64 ins1_64b : 1;
+               u64 ins0_64b : 1;
+               u64 pci_wdis : 1;
+               u64 wait_com : 1;
+               u64 reserved_37_39 : 3;
+               u64 max_word : 5;
+               u64 reserved_10_31 : 22;
+               u64 timer : 10;
+       } s;
+       struct cvmx_npi_ctl_status_cn30xx {
+               u64 reserved_63_63 : 1;
+               u64 chip_rev : 8;
+               u64 dis_pniw : 1;
+               u64 reserved_51_53 : 3;
+               u64 out0_enb : 1;
+               u64 reserved_47_49 : 3;
+               u64 ins0_enb : 1;
+               u64 reserved_43_45 : 3;
+               u64 ins0_64b : 1;
+               u64 pci_wdis : 1;
+               u64 wait_com : 1;
+               u64 reserved_37_39 : 3;
+               u64 max_word : 5;
+               u64 reserved_10_31 : 22;
+               u64 timer : 10;
+       } cn30xx;
+       struct cvmx_npi_ctl_status_cn31xx {
+               u64 reserved_63_63 : 1;
+               u64 chip_rev : 8;
+               u64 dis_pniw : 1;
+               u64 reserved_52_53 : 2;
+               u64 out1_enb : 1;
+               u64 out0_enb : 1;
+               u64 reserved_48_49 : 2;
+               u64 ins1_enb : 1;
+               u64 ins0_enb : 1;
+               u64 reserved_44_45 : 2;
+               u64 ins1_64b : 1;
+               u64 ins0_64b : 1;
+               u64 pci_wdis : 1;
+               u64 wait_com : 1;
+               u64 reserved_37_39 : 3;
+               u64 max_word : 5;
+               u64 reserved_10_31 : 22;
+               u64 timer : 10;
+       } cn31xx;
+       struct cvmx_npi_ctl_status_s cn38xx;
+       struct cvmx_npi_ctl_status_s cn38xxp2;
+       struct cvmx_npi_ctl_status_cn31xx cn50xx;
+       struct cvmx_npi_ctl_status_s cn58xx;
+       struct cvmx_npi_ctl_status_s cn58xxp1;
+};
+
+typedef union cvmx_npi_ctl_status cvmx_npi_ctl_status_t;
+
+/**
+ * cvmx_npi_dbg_select
+ *
+ * NPI_DBG_SELECT = Debug Select Register
+ *
+ * Contains the debug select value in last written to the RSLs.
+ */
+union cvmx_npi_dbg_select {
+       u64 u64;
+       struct cvmx_npi_dbg_select_s {
+               u64 reserved_16_63 : 48;
+               u64 dbg_sel : 16;
+       } s;
+       struct cvmx_npi_dbg_select_s cn30xx;
+       struct cvmx_npi_dbg_select_s cn31xx;
+       struct cvmx_npi_dbg_select_s cn38xx;
+       struct cvmx_npi_dbg_select_s cn38xxp2;
+       struct cvmx_npi_dbg_select_s cn50xx;
+       struct cvmx_npi_dbg_select_s cn58xx;
+       struct cvmx_npi_dbg_select_s cn58xxp1;
+};
+
+typedef union cvmx_npi_dbg_select cvmx_npi_dbg_select_t;
+
+/**
+ * cvmx_npi_dma_control
+ *
+ * NPI_DMA_CONTROL = DMA Control Register
+ *
+ * Controls operation of the DMA IN/OUT of the NPI.
+ */
+union cvmx_npi_dma_control {
+       u64 u64;
+       struct cvmx_npi_dma_control_s {
+               u64 reserved_36_63 : 28;
+               u64 b0_lend : 1;
+               u64 dwb_denb : 1;
+               u64 dwb_ichk : 9;
+               u64 fpa_que : 3;
+               u64 o_add1 : 1;
+               u64 o_ro : 1;
+               u64 o_ns : 1;
+               u64 o_es : 2;
+               u64 o_mode : 1;
+               u64 hp_enb : 1;
+               u64 lp_enb : 1;
+               u64 csize : 14;
+       } s;
+       struct cvmx_npi_dma_control_s cn30xx;
+       struct cvmx_npi_dma_control_s cn31xx;
+       struct cvmx_npi_dma_control_s cn38xx;
+       struct cvmx_npi_dma_control_s cn38xxp2;
+       struct cvmx_npi_dma_control_s cn50xx;
+       struct cvmx_npi_dma_control_s cn58xx;
+       struct cvmx_npi_dma_control_s cn58xxp1;
+};
+
+typedef union cvmx_npi_dma_control cvmx_npi_dma_control_t;
+
+/**
+ * cvmx_npi_dma_highp_counts
+ *
+ * NPI_DMA_HIGHP_COUNTS = NPI's High Priority DMA Counts
+ *
+ * Values for determing the number of instructions for High Priority DMA in the NPI.
+ */
+union cvmx_npi_dma_highp_counts {
+       u64 u64;
+       struct cvmx_npi_dma_highp_counts_s {
+               u64 reserved_39_63 : 25;
+               u64 fcnt : 7;
+               u64 dbell : 32;
+       } s;
+       struct cvmx_npi_dma_highp_counts_s cn30xx;
+       struct cvmx_npi_dma_highp_counts_s cn31xx;
+       struct cvmx_npi_dma_highp_counts_s cn38xx;
+       struct cvmx_npi_dma_highp_counts_s cn38xxp2;
+       struct cvmx_npi_dma_highp_counts_s cn50xx;
+       struct cvmx_npi_dma_highp_counts_s cn58xx;
+       struct cvmx_npi_dma_highp_counts_s cn58xxp1;
+};
+
+typedef union cvmx_npi_dma_highp_counts cvmx_npi_dma_highp_counts_t;
+
+/**
+ * cvmx_npi_dma_highp_naddr
+ *
+ * NPI_DMA_HIGHP_NADDR = NPI's High Priority DMA Next Ichunk Address
+ *
+ * Place NPI will read the next Ichunk data from. This is valid when state is 0
+ */
+union cvmx_npi_dma_highp_naddr {
+       u64 u64;
+       struct cvmx_npi_dma_highp_naddr_s {
+               u64 reserved_40_63 : 24;
+               u64 state : 4;
+               u64 addr : 36;
+       } s;
+       struct cvmx_npi_dma_highp_naddr_s cn30xx;
+       struct cvmx_npi_dma_highp_naddr_s cn31xx;
+       struct cvmx_npi_dma_highp_naddr_s cn38xx;
+       struct cvmx_npi_dma_highp_naddr_s cn38xxp2;
+       struct cvmx_npi_dma_highp_naddr_s cn50xx;
+       struct cvmx_npi_dma_highp_naddr_s cn58xx;
+       struct cvmx_npi_dma_highp_naddr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_dma_highp_naddr cvmx_npi_dma_highp_naddr_t;
+
+/**
+ * cvmx_npi_dma_lowp_counts
+ *
+ * NPI_DMA_LOWP_COUNTS = NPI's Low Priority DMA Counts
+ *
+ * Values for determing the number of instructions for Low Priority DMA in the NPI.
+ */
+union cvmx_npi_dma_lowp_counts {
+       u64 u64;
+       struct cvmx_npi_dma_lowp_counts_s {
+               u64 reserved_39_63 : 25;
+               u64 fcnt : 7;
+               u64 dbell : 32;
+       } s;
+       struct cvmx_npi_dma_lowp_counts_s cn30xx;
+       struct cvmx_npi_dma_lowp_counts_s cn31xx;
+       struct cvmx_npi_dma_lowp_counts_s cn38xx;
+       struct cvmx_npi_dma_lowp_counts_s cn38xxp2;
+       struct cvmx_npi_dma_lowp_counts_s cn50xx;
+       struct cvmx_npi_dma_lowp_counts_s cn58xx;
+       struct cvmx_npi_dma_lowp_counts_s cn58xxp1;
+};
+
+typedef union cvmx_npi_dma_lowp_counts cvmx_npi_dma_lowp_counts_t;
+
+/**
+ * cvmx_npi_dma_lowp_naddr
+ *
+ * NPI_DMA_LOWP_NADDR = NPI's Low Priority DMA Next Ichunk Address
+ *
+ * Place NPI will read the next Ichunk data from. This is valid when state is 0
+ */
+union cvmx_npi_dma_lowp_naddr {
+       u64 u64;
+       struct cvmx_npi_dma_lowp_naddr_s {
+               u64 reserved_40_63 : 24;
+               u64 state : 4;
+               u64 addr : 36;
+       } s;
+       struct cvmx_npi_dma_lowp_naddr_s cn30xx;
+       struct cvmx_npi_dma_lowp_naddr_s cn31xx;
+       struct cvmx_npi_dma_lowp_naddr_s cn38xx;
+       struct cvmx_npi_dma_lowp_naddr_s cn38xxp2;
+       struct cvmx_npi_dma_lowp_naddr_s cn50xx;
+       struct cvmx_npi_dma_lowp_naddr_s cn58xx;
+       struct cvmx_npi_dma_lowp_naddr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_dma_lowp_naddr cvmx_npi_dma_lowp_naddr_t;
+
+/**
+ * cvmx_npi_highp_dbell
+ *
+ * NPI_HIGHP_DBELL = High Priority Door Bell
+ *
+ * The door bell register for the high priority DMA queue.
+ */
+union cvmx_npi_highp_dbell {
+       u64 u64;
+       struct cvmx_npi_highp_dbell_s {
+               u64 reserved_16_63 : 48;
+               u64 dbell : 16;
+       } s;
+       struct cvmx_npi_highp_dbell_s cn30xx;
+       struct cvmx_npi_highp_dbell_s cn31xx;
+       struct cvmx_npi_highp_dbell_s cn38xx;
+       struct cvmx_npi_highp_dbell_s cn38xxp2;
+       struct cvmx_npi_highp_dbell_s cn50xx;
+       struct cvmx_npi_highp_dbell_s cn58xx;
+       struct cvmx_npi_highp_dbell_s cn58xxp1;
+};
+
+typedef union cvmx_npi_highp_dbell cvmx_npi_highp_dbell_t;
+
+/**
+ * cvmx_npi_highp_ibuff_saddr
+ *
+ * NPI_HIGHP_IBUFF_SADDR = DMA High Priority Instruction Buffer Starting Address
+ *
+ * The address to start reading Instructions from for HIGHP.
+ */
+union cvmx_npi_highp_ibuff_saddr {
+       u64 u64;
+       struct cvmx_npi_highp_ibuff_saddr_s {
+               u64 reserved_36_63 : 28;
+               u64 saddr : 36;
+       } s;
+       struct cvmx_npi_highp_ibuff_saddr_s cn30xx;
+       struct cvmx_npi_highp_ibuff_saddr_s cn31xx;
+       struct cvmx_npi_highp_ibuff_saddr_s cn38xx;
+       struct cvmx_npi_highp_ibuff_saddr_s cn38xxp2;
+       struct cvmx_npi_highp_ibuff_saddr_s cn50xx;
+       struct cvmx_npi_highp_ibuff_saddr_s cn58xx;
+       struct cvmx_npi_highp_ibuff_saddr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_highp_ibuff_saddr cvmx_npi_highp_ibuff_saddr_t;
+
+/**
+ * cvmx_npi_input_control
+ *
+ * NPI_INPUT_CONTROL = NPI's Input Control Register
+ *
+ * Control for reads for gather list and instructions.
+ */
+union cvmx_npi_input_control {
+       u64 u64;
+       struct cvmx_npi_input_control_s {
+               u64 reserved_23_63 : 41;
+               u64 pkt_rr : 1;
+               u64 pbp_dhi : 13;
+               u64 d_nsr : 1;
+               u64 d_esr : 2;
+               u64 d_ror : 1;
+               u64 use_csr : 1;
+               u64 nsr : 1;
+               u64 esr : 2;
+               u64 ror : 1;
+       } s;
+       struct cvmx_npi_input_control_cn30xx {
+               u64 reserved_22_63 : 42;
+               u64 pbp_dhi : 13;
+               u64 d_nsr : 1;
+               u64 d_esr : 2;
+               u64 d_ror : 1;
+               u64 use_csr : 1;
+               u64 nsr : 1;
+               u64 esr : 2;
+               u64 ror : 1;
+       } cn30xx;
+       struct cvmx_npi_input_control_cn30xx cn31xx;
+       struct cvmx_npi_input_control_s cn38xx;
+       struct cvmx_npi_input_control_cn30xx cn38xxp2;
+       struct cvmx_npi_input_control_s cn50xx;
+       struct cvmx_npi_input_control_s cn58xx;
+       struct cvmx_npi_input_control_s cn58xxp1;
+};
+
+typedef union cvmx_npi_input_control cvmx_npi_input_control_t;
+
+/**
+ * cvmx_npi_int_enb
+ *
+ * NPI_INTERRUPT_ENB = NPI's Interrupt Enable Register
+ *
+ * Used to enable the various interrupting conditions of NPI
+ */
+union cvmx_npi_int_enb {
+       u64 u64;
+       struct cvmx_npi_int_enb_s {
+               u64 reserved_62_63 : 2;
+               u64 q1_a_f : 1;
+               u64 q1_s_e : 1;
+               u64 pdf_p_f : 1;
+               u64 pdf_p_e : 1;
+               u64 pcf_p_f : 1;
+               u64 pcf_p_e : 1;
+               u64 rdx_s_e : 1;
+               u64 rwx_s_e : 1;
+               u64 pnc_a_f : 1;
+               u64 pnc_s_e : 1;
+               u64 com_a_f : 1;
+               u64 com_s_e : 1;
+               u64 q3_a_f : 1;
+               u64 q3_s_e : 1;
+               u64 q2_a_f : 1;
+               u64 q2_s_e : 1;
+               u64 pcr_a_f : 1;
+               u64 pcr_s_e : 1;
+               u64 fcr_a_f : 1;
+               u64 fcr_s_e : 1;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 i3_pperr : 1;
+               u64 i2_pperr : 1;
+               u64 i1_pperr : 1;
+               u64 i0_pperr : 1;
+               u64 p3_ptout : 1;
+               u64 p2_ptout : 1;
+               u64 p1_ptout : 1;
+               u64 p0_ptout : 1;
+               u64 p3_pperr : 1;
+               u64 p2_pperr : 1;
+               u64 p1_pperr : 1;
+               u64 p0_pperr : 1;
+               u64 g3_rtout : 1;
+               u64 g2_rtout : 1;
+               u64 g1_rtout : 1;
+               u64 g0_rtout : 1;
+               u64 p3_perr : 1;
+               u64 p2_perr : 1;
+               u64 p1_perr : 1;
+               u64 p0_perr : 1;
+               u64 p3_rtout : 1;
+               u64 p2_rtout : 1;
+               u64 p1_rtout : 1;
+               u64 p0_rtout : 1;
+               u64 i3_overf : 1;
+               u64 i2_overf : 1;
+               u64 i1_overf : 1;
+               u64 i0_overf : 1;
+               u64 i3_rtout : 1;
+               u64 i2_rtout : 1;
+               u64 i1_rtout : 1;
+               u64 i0_rtout : 1;
+               u64 po3_2sml : 1;
+               u64 po2_2sml : 1;
+               u64 po1_2sml : 1;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } s;
+       struct cvmx_npi_int_enb_cn30xx {
+               u64 reserved_62_63 : 2;
+               u64 q1_a_f : 1;
+               u64 q1_s_e : 1;
+               u64 pdf_p_f : 1;
+               u64 pdf_p_e : 1;
+               u64 pcf_p_f : 1;
+               u64 pcf_p_e : 1;
+               u64 rdx_s_e : 1;
+               u64 rwx_s_e : 1;
+               u64 pnc_a_f : 1;
+               u64 pnc_s_e : 1;
+               u64 com_a_f : 1;
+               u64 com_s_e : 1;
+               u64 q3_a_f : 1;
+               u64 q3_s_e : 1;
+               u64 q2_a_f : 1;
+               u64 q2_s_e : 1;
+               u64 pcr_a_f : 1;
+               u64 pcr_s_e : 1;
+               u64 fcr_a_f : 1;
+               u64 fcr_s_e : 1;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 reserved_36_38 : 3;
+               u64 i0_pperr : 1;
+               u64 reserved_32_34 : 3;
+               u64 p0_ptout : 1;
+               u64 reserved_28_30 : 3;
+               u64 p0_pperr : 1;
+               u64 reserved_24_26 : 3;
+               u64 g0_rtout : 1;
+               u64 reserved_20_22 : 3;
+               u64 p0_perr : 1;
+               u64 reserved_16_18 : 3;
+               u64 p0_rtout : 1;
+               u64 reserved_12_14 : 3;
+               u64 i0_overf : 1;
+               u64 reserved_8_10 : 3;
+               u64 i0_rtout : 1;
+               u64 reserved_4_6 : 3;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } cn30xx;
+       struct cvmx_npi_int_enb_cn31xx {
+               u64 reserved_62_63 : 2;
+               u64 q1_a_f : 1;
+               u64 q1_s_e : 1;
+               u64 pdf_p_f : 1;
+               u64 pdf_p_e : 1;
+               u64 pcf_p_f : 1;
+               u64 pcf_p_e : 1;
+               u64 rdx_s_e : 1;
+               u64 rwx_s_e : 1;
+               u64 pnc_a_f : 1;
+               u64 pnc_s_e : 1;
+               u64 com_a_f : 1;
+               u64 com_s_e : 1;
+               u64 q3_a_f : 1;
+               u64 q3_s_e : 1;
+               u64 q2_a_f : 1;
+               u64 q2_s_e : 1;
+               u64 pcr_a_f : 1;
+               u64 pcr_s_e : 1;
+               u64 fcr_a_f : 1;
+               u64 fcr_s_e : 1;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 reserved_37_38 : 2;
+               u64 i1_pperr : 1;
+               u64 i0_pperr : 1;
+               u64 reserved_33_34 : 2;
+               u64 p1_ptout : 1;
+               u64 p0_ptout : 1;
+               u64 reserved_29_30 : 2;
+               u64 p1_pperr : 1;
+               u64 p0_pperr : 1;
+               u64 reserved_25_26 : 2;
+               u64 g1_rtout : 1;
+               u64 g0_rtout : 1;
+               u64 reserved_21_22 : 2;
+               u64 p1_perr : 1;
+               u64 p0_perr : 1;
+               u64 reserved_17_18 : 2;
+               u64 p1_rtout : 1;
+               u64 p0_rtout : 1;
+               u64 reserved_13_14 : 2;
+               u64 i1_overf : 1;
+               u64 i0_overf : 1;
+               u64 reserved_9_10 : 2;
+               u64 i1_rtout : 1;
+               u64 i0_rtout : 1;
+               u64 reserved_5_6 : 2;
+               u64 po1_2sml : 1;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } cn31xx;
+       struct cvmx_npi_int_enb_s cn38xx;
+       struct cvmx_npi_int_enb_cn38xxp2 {
+               u64 reserved_42_63 : 22;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 i3_pperr : 1;
+               u64 i2_pperr : 1;
+               u64 i1_pperr : 1;
+               u64 i0_pperr : 1;
+               u64 p3_ptout : 1;
+               u64 p2_ptout : 1;
+               u64 p1_ptout : 1;
+               u64 p0_ptout : 1;
+               u64 p3_pperr : 1;
+               u64 p2_pperr : 1;
+               u64 p1_pperr : 1;
+               u64 p0_pperr : 1;
+               u64 g3_rtout : 1;
+               u64 g2_rtout : 1;
+               u64 g1_rtout : 1;
+               u64 g0_rtout : 1;
+               u64 p3_perr : 1;
+               u64 p2_perr : 1;
+               u64 p1_perr : 1;
+               u64 p0_perr : 1;
+               u64 p3_rtout : 1;
+               u64 p2_rtout : 1;
+               u64 p1_rtout : 1;
+               u64 p0_rtout : 1;
+               u64 i3_overf : 1;
+               u64 i2_overf : 1;
+               u64 i1_overf : 1;
+               u64 i0_overf : 1;
+               u64 i3_rtout : 1;
+               u64 i2_rtout : 1;
+               u64 i1_rtout : 1;
+               u64 i0_rtout : 1;
+               u64 po3_2sml : 1;
+               u64 po2_2sml : 1;
+               u64 po1_2sml : 1;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } cn38xxp2;
+       struct cvmx_npi_int_enb_cn31xx cn50xx;
+       struct cvmx_npi_int_enb_s cn58xx;
+       struct cvmx_npi_int_enb_s cn58xxp1;
+};
+
+typedef union cvmx_npi_int_enb cvmx_npi_int_enb_t;
+
+/**
+ * cvmx_npi_int_sum
+ *
+ * NPI_INTERRUPT_SUM = NPI Interrupt Summary Register
+ *
+ * Set when an interrupt condition occurs, write '1' to clear.
+ */
+union cvmx_npi_int_sum {
+       u64 u64;
+       struct cvmx_npi_int_sum_s {
+               u64 reserved_62_63 : 2;
+               u64 q1_a_f : 1;
+               u64 q1_s_e : 1;
+               u64 pdf_p_f : 1;
+               u64 pdf_p_e : 1;
+               u64 pcf_p_f : 1;
+               u64 pcf_p_e : 1;
+               u64 rdx_s_e : 1;
+               u64 rwx_s_e : 1;
+               u64 pnc_a_f : 1;
+               u64 pnc_s_e : 1;
+               u64 com_a_f : 1;
+               u64 com_s_e : 1;
+               u64 q3_a_f : 1;
+               u64 q3_s_e : 1;
+               u64 q2_a_f : 1;
+               u64 q2_s_e : 1;
+               u64 pcr_a_f : 1;
+               u64 pcr_s_e : 1;
+               u64 fcr_a_f : 1;
+               u64 fcr_s_e : 1;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 i3_pperr : 1;
+               u64 i2_pperr : 1;
+               u64 i1_pperr : 1;
+               u64 i0_pperr : 1;
+               u64 p3_ptout : 1;
+               u64 p2_ptout : 1;
+               u64 p1_ptout : 1;
+               u64 p0_ptout : 1;
+               u64 p3_pperr : 1;
+               u64 p2_pperr : 1;
+               u64 p1_pperr : 1;
+               u64 p0_pperr : 1;
+               u64 g3_rtout : 1;
+               u64 g2_rtout : 1;
+               u64 g1_rtout : 1;
+               u64 g0_rtout : 1;
+               u64 p3_perr : 1;
+               u64 p2_perr : 1;
+               u64 p1_perr : 1;
+               u64 p0_perr : 1;
+               u64 p3_rtout : 1;
+               u64 p2_rtout : 1;
+               u64 p1_rtout : 1;
+               u64 p0_rtout : 1;
+               u64 i3_overf : 1;
+               u64 i2_overf : 1;
+               u64 i1_overf : 1;
+               u64 i0_overf : 1;
+               u64 i3_rtout : 1;
+               u64 i2_rtout : 1;
+               u64 i1_rtout : 1;
+               u64 i0_rtout : 1;
+               u64 po3_2sml : 1;
+               u64 po2_2sml : 1;
+               u64 po1_2sml : 1;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } s;
+       struct cvmx_npi_int_sum_cn30xx {
+               u64 reserved_62_63 : 2;
+               u64 q1_a_f : 1;
+               u64 q1_s_e : 1;
+               u64 pdf_p_f : 1;
+               u64 pdf_p_e : 1;
+               u64 pcf_p_f : 1;
+               u64 pcf_p_e : 1;
+               u64 rdx_s_e : 1;
+               u64 rwx_s_e : 1;
+               u64 pnc_a_f : 1;
+               u64 pnc_s_e : 1;
+               u64 com_a_f : 1;
+               u64 com_s_e : 1;
+               u64 q3_a_f : 1;
+               u64 q3_s_e : 1;
+               u64 q2_a_f : 1;
+               u64 q2_s_e : 1;
+               u64 pcr_a_f : 1;
+               u64 pcr_s_e : 1;
+               u64 fcr_a_f : 1;
+               u64 fcr_s_e : 1;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 reserved_36_38 : 3;
+               u64 i0_pperr : 1;
+               u64 reserved_32_34 : 3;
+               u64 p0_ptout : 1;
+               u64 reserved_28_30 : 3;
+               u64 p0_pperr : 1;
+               u64 reserved_24_26 : 3;
+               u64 g0_rtout : 1;
+               u64 reserved_20_22 : 3;
+               u64 p0_perr : 1;
+               u64 reserved_16_18 : 3;
+               u64 p0_rtout : 1;
+               u64 reserved_12_14 : 3;
+               u64 i0_overf : 1;
+               u64 reserved_8_10 : 3;
+               u64 i0_rtout : 1;
+               u64 reserved_4_6 : 3;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } cn30xx;
+       struct cvmx_npi_int_sum_cn31xx {
+               u64 reserved_62_63 : 2;
+               u64 q1_a_f : 1;
+               u64 q1_s_e : 1;
+               u64 pdf_p_f : 1;
+               u64 pdf_p_e : 1;
+               u64 pcf_p_f : 1;
+               u64 pcf_p_e : 1;
+               u64 rdx_s_e : 1;
+               u64 rwx_s_e : 1;
+               u64 pnc_a_f : 1;
+               u64 pnc_s_e : 1;
+               u64 com_a_f : 1;
+               u64 com_s_e : 1;
+               u64 q3_a_f : 1;
+               u64 q3_s_e : 1;
+               u64 q2_a_f : 1;
+               u64 q2_s_e : 1;
+               u64 pcr_a_f : 1;
+               u64 pcr_s_e : 1;
+               u64 fcr_a_f : 1;
+               u64 fcr_s_e : 1;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 reserved_37_38 : 2;
+               u64 i1_pperr : 1;
+               u64 i0_pperr : 1;
+               u64 reserved_33_34 : 2;
+               u64 p1_ptout : 1;
+               u64 p0_ptout : 1;
+               u64 reserved_29_30 : 2;
+               u64 p1_pperr : 1;
+               u64 p0_pperr : 1;
+               u64 reserved_25_26 : 2;
+               u64 g1_rtout : 1;
+               u64 g0_rtout : 1;
+               u64 reserved_21_22 : 2;
+               u64 p1_perr : 1;
+               u64 p0_perr : 1;
+               u64 reserved_17_18 : 2;
+               u64 p1_rtout : 1;
+               u64 p0_rtout : 1;
+               u64 reserved_13_14 : 2;
+               u64 i1_overf : 1;
+               u64 i0_overf : 1;
+               u64 reserved_9_10 : 2;
+               u64 i1_rtout : 1;
+               u64 i0_rtout : 1;
+               u64 reserved_5_6 : 2;
+               u64 po1_2sml : 1;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } cn31xx;
+       struct cvmx_npi_int_sum_s cn38xx;
+       struct cvmx_npi_int_sum_cn38xxp2 {
+               u64 reserved_42_63 : 22;
+               u64 iobdma : 1;
+               u64 p_dperr : 1;
+               u64 win_rto : 1;
+               u64 i3_pperr : 1;
+               u64 i2_pperr : 1;
+               u64 i1_pperr : 1;
+               u64 i0_pperr : 1;
+               u64 p3_ptout : 1;
+               u64 p2_ptout : 1;
+               u64 p1_ptout : 1;
+               u64 p0_ptout : 1;
+               u64 p3_pperr : 1;
+               u64 p2_pperr : 1;
+               u64 p1_pperr : 1;
+               u64 p0_pperr : 1;
+               u64 g3_rtout : 1;
+               u64 g2_rtout : 1;
+               u64 g1_rtout : 1;
+               u64 g0_rtout : 1;
+               u64 p3_perr : 1;
+               u64 p2_perr : 1;
+               u64 p1_perr : 1;
+               u64 p0_perr : 1;
+               u64 p3_rtout : 1;
+               u64 p2_rtout : 1;
+               u64 p1_rtout : 1;
+               u64 p0_rtout : 1;
+               u64 i3_overf : 1;
+               u64 i2_overf : 1;
+               u64 i1_overf : 1;
+               u64 i0_overf : 1;
+               u64 i3_rtout : 1;
+               u64 i2_rtout : 1;
+               u64 i1_rtout : 1;
+               u64 i0_rtout : 1;
+               u64 po3_2sml : 1;
+               u64 po2_2sml : 1;
+               u64 po1_2sml : 1;
+               u64 po0_2sml : 1;
+               u64 pci_rsl : 1;
+               u64 rml_wto : 1;
+               u64 rml_rto : 1;
+       } cn38xxp2;
+       struct cvmx_npi_int_sum_cn31xx cn50xx;
+       struct cvmx_npi_int_sum_s cn58xx;
+       struct cvmx_npi_int_sum_s cn58xxp1;
+};
+
+typedef union cvmx_npi_int_sum cvmx_npi_int_sum_t;
+
+/**
+ * cvmx_npi_lowp_dbell
+ *
+ * NPI_LOWP_DBELL = Low Priority Door Bell
+ *
+ * The door bell register for the low priority DMA queue.
+ */
+union cvmx_npi_lowp_dbell {
+       u64 u64;
+       struct cvmx_npi_lowp_dbell_s {
+               u64 reserved_16_63 : 48;
+               u64 dbell : 16;
+       } s;
+       struct cvmx_npi_lowp_dbell_s cn30xx;
+       struct cvmx_npi_lowp_dbell_s cn31xx;
+       struct cvmx_npi_lowp_dbell_s cn38xx;
+       struct cvmx_npi_lowp_dbell_s cn38xxp2;
+       struct cvmx_npi_lowp_dbell_s cn50xx;
+       struct cvmx_npi_lowp_dbell_s cn58xx;
+       struct cvmx_npi_lowp_dbell_s cn58xxp1;
+};
+
+typedef union cvmx_npi_lowp_dbell cvmx_npi_lowp_dbell_t;
+
+/**
+ * cvmx_npi_lowp_ibuff_saddr
+ *
+ * NPI_LOWP_IBUFF_SADDR = DMA Low Priority's Instruction Buffer Starting Address
+ *
+ * The address to start reading Instructions from for LOWP.
+ */
+union cvmx_npi_lowp_ibuff_saddr {
+       u64 u64;
+       struct cvmx_npi_lowp_ibuff_saddr_s {
+               u64 reserved_36_63 : 28;
+               u64 saddr : 36;
+       } s;
+       struct cvmx_npi_lowp_ibuff_saddr_s cn30xx;
+       struct cvmx_npi_lowp_ibuff_saddr_s cn31xx;
+       struct cvmx_npi_lowp_ibuff_saddr_s cn38xx;
+       struct cvmx_npi_lowp_ibuff_saddr_s cn38xxp2;
+       struct cvmx_npi_lowp_ibuff_saddr_s cn50xx;
+       struct cvmx_npi_lowp_ibuff_saddr_s cn58xx;
+       struct cvmx_npi_lowp_ibuff_saddr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_lowp_ibuff_saddr cvmx_npi_lowp_ibuff_saddr_t;
+
+/**
+ * cvmx_npi_mem_access_subid#
+ *
+ * NPI_MEM_ACCESS_SUBID3 = Memory Access SubId 3Register
+ *
+ * Carries Read/Write parameters for PP access to PCI memory that use NPI SubId3.
+ * Writes to this register are not ordered with writes/reads to the PCI Memory space.
+ * To ensure that a write has completed the user must read the register before
+ * making an access(i.e. PCI memory space) that requires the value of this register to be updated.
+ */
+union cvmx_npi_mem_access_subidx {
+       u64 u64;
+       struct cvmx_npi_mem_access_subidx_s {
+               u64 reserved_38_63 : 26;
+               u64 shortl : 1;
+               u64 nmerge : 1;
+               u64 esr : 2;
+               u64 esw : 2;
+               u64 nsr : 1;
+               u64 nsw : 1;
+               u64 ror : 1;
+               u64 row : 1;
+               u64 ba : 28;
+       } s;
+       struct cvmx_npi_mem_access_subidx_s cn30xx;
+       struct cvmx_npi_mem_access_subidx_cn31xx {
+               u64 reserved_36_63 : 28;
+               u64 esr : 2;
+               u64 esw : 2;
+               u64 nsr : 1;
+               u64 nsw : 1;
+               u64 ror : 1;
+               u64 row : 1;
+               u64 ba : 28;
+       } cn31xx;
+       struct cvmx_npi_mem_access_subidx_s cn38xx;
+       struct cvmx_npi_mem_access_subidx_cn31xx cn38xxp2;
+       struct cvmx_npi_mem_access_subidx_s cn50xx;
+       struct cvmx_npi_mem_access_subidx_s cn58xx;
+       struct cvmx_npi_mem_access_subidx_s cn58xxp1;
+};
+
+typedef union cvmx_npi_mem_access_subidx cvmx_npi_mem_access_subidx_t;
+
+/**
+ * cvmx_npi_msi_rcv
+ *
+ * NPI_MSI_RCV = NPI MSI Receive Vector Register
+ *
+ * A bit is set in this register relative to the vector received during a MSI. And cleared by a W1 to the register.
+ */
+union cvmx_npi_msi_rcv {
+       u64 u64;
+       struct cvmx_npi_msi_rcv_s {
+               u64 int_vec : 64;
+       } s;
+       struct cvmx_npi_msi_rcv_s cn30xx;
+       struct cvmx_npi_msi_rcv_s cn31xx;
+       struct cvmx_npi_msi_rcv_s cn38xx;
+       struct cvmx_npi_msi_rcv_s cn38xxp2;
+       struct cvmx_npi_msi_rcv_s cn50xx;
+       struct cvmx_npi_msi_rcv_s cn58xx;
+       struct cvmx_npi_msi_rcv_s cn58xxp1;
+};
+
+typedef union cvmx_npi_msi_rcv cvmx_npi_msi_rcv_t;
+
+/**
+ * cvmx_npi_num_desc_output#
+ *
+ * NUM_DESC_OUTPUT0 = Number Of Descriptors Available For Output 0
+ *
+ * The size of the Buffer/Info Pointer Pair ring for Output-0.
+ */
+union cvmx_npi_num_desc_outputx {
+       u64 u64;
+       struct cvmx_npi_num_desc_outputx_s {
+               u64 reserved_32_63 : 32;
+               u64 size : 32;
+       } s;
+       struct cvmx_npi_num_desc_outputx_s cn30xx;
+       struct cvmx_npi_num_desc_outputx_s cn31xx;
+       struct cvmx_npi_num_desc_outputx_s cn38xx;
+       struct cvmx_npi_num_desc_outputx_s cn38xxp2;
+       struct cvmx_npi_num_desc_outputx_s cn50xx;
+       struct cvmx_npi_num_desc_outputx_s cn58xx;
+       struct cvmx_npi_num_desc_outputx_s cn58xxp1;
+};
+
+typedef union cvmx_npi_num_desc_outputx cvmx_npi_num_desc_outputx_t;
+
+/**
+ * cvmx_npi_output_control
+ *
+ * NPI_OUTPUT_CONTROL = NPI's Output Control Register
+ *
+ * The address to start reading Instructions from for Output-3.
+ */
+union cvmx_npi_output_control {
+       u64 u64;
+       struct cvmx_npi_output_control_s {
+               u64 reserved_49_63 : 15;
+               u64 pkt_rr : 1;
+               u64 p3_bmode : 1;
+               u64 p2_bmode : 1;
+               u64 p1_bmode : 1;
+               u64 p0_bmode : 1;
+               u64 o3_es : 2;
+               u64 o3_ns : 1;
+               u64 o3_ro : 1;
+               u64 o2_es : 2;
+               u64 o2_ns : 1;
+               u64 o2_ro : 1;
+               u64 o1_es : 2;
+               u64 o1_ns : 1;
+               u64 o1_ro : 1;
+               u64 o0_es : 2;
+               u64 o0_ns : 1;
+               u64 o0_ro : 1;
+               u64 o3_csrm : 1;
+               u64 o2_csrm : 1;
+               u64 o1_csrm : 1;
+               u64 o0_csrm : 1;
+               u64 reserved_20_23 : 4;
+               u64 iptr_o3 : 1;
+               u64 iptr_o2 : 1;
+               u64 iptr_o1 : 1;
+               u64 iptr_o0 : 1;
+               u64 esr_sl3 : 2;
+               u64 nsr_sl3 : 1;
+               u64 ror_sl3 : 1;
+               u64 esr_sl2 : 2;
+               u64 nsr_sl2 : 1;
+               u64 ror_sl2 : 1;
+               u64 esr_sl1 : 2;
+               u64 nsr_sl1 : 1;
+               u64 ror_sl1 : 1;
+               u64 esr_sl0 : 2;
+               u64 nsr_sl0 : 1;
+               u64 ror_sl0 : 1;
+       } s;
+       struct cvmx_npi_output_control_cn30xx {
+               u64 reserved_45_63 : 19;
+               u64 p0_bmode : 1;
+               u64 reserved_32_43 : 12;
+               u64 o0_es : 2;
+               u64 o0_ns : 1;
+               u64 o0_ro : 1;
+               u64 reserved_25_27 : 3;
+               u64 o0_csrm : 1;
+               u64 reserved_17_23 : 7;
+               u64 iptr_o0 : 1;
+               u64 reserved_4_15 : 12;
+               u64 esr_sl0 : 2;
+               u64 nsr_sl0 : 1;
+               u64 ror_sl0 : 1;
+       } cn30xx;
+       struct cvmx_npi_output_control_cn31xx {
+               u64 reserved_46_63 : 18;
+               u64 p1_bmode : 1;
+               u64 p0_bmode : 1;
+               u64 reserved_36_43 : 8;
+               u64 o1_es : 2;
+               u64 o1_ns : 1;
+               u64 o1_ro : 1;
+               u64 o0_es : 2;
+               u64 o0_ns : 1;
+               u64 o0_ro : 1;
+               u64 reserved_26_27 : 2;
+               u64 o1_csrm : 1;
+               u64 o0_csrm : 1;
+               u64 reserved_18_23 : 6;
+               u64 iptr_o1 : 1;
+               u64 iptr_o0 : 1;
+               u64 reserved_8_15 : 8;
+               u64 esr_sl1 : 2;
+               u64 nsr_sl1 : 1;
+               u64 ror_sl1 : 1;
+               u64 esr_sl0 : 2;
+               u64 nsr_sl0 : 1;
+               u64 ror_sl0 : 1;
+       } cn31xx;
+       struct cvmx_npi_output_control_s cn38xx;
+       struct cvmx_npi_output_control_cn38xxp2 {
+               u64 reserved_48_63 : 16;
+               u64 p3_bmode : 1;
+               u64 p2_bmode : 1;
+               u64 p1_bmode : 1;
+               u64 p0_bmode : 1;
+               u64 o3_es : 2;
+               u64 o3_ns : 1;
+               u64 o3_ro : 1;
+               u64 o2_es : 2;
+               u64 o2_ns : 1;
+               u64 o2_ro : 1;
+               u64 o1_es : 2;
+               u64 o1_ns : 1;
+               u64 o1_ro : 1;
+               u64 o0_es : 2;
+               u64 o0_ns : 1;
+               u64 o0_ro : 1;
+               u64 o3_csrm : 1;
+               u64 o2_csrm : 1;
+               u64 o1_csrm : 1;
+               u64 o0_csrm : 1;
+               u64 reserved_20_23 : 4;
+               u64 iptr_o3 : 1;
+               u64 iptr_o2 : 1;
+               u64 iptr_o1 : 1;
+               u64 iptr_o0 : 1;
+               u64 esr_sl3 : 2;
+               u64 nsr_sl3 : 1;
+               u64 ror_sl3 : 1;
+               u64 esr_sl2 : 2;
+               u64 nsr_sl2 : 1;
+               u64 ror_sl2 : 1;
+               u64 esr_sl1 : 2;
+               u64 nsr_sl1 : 1;
+               u64 ror_sl1 : 1;
+               u64 esr_sl0 : 2;
+               u64 nsr_sl0 : 1;
+               u64 ror_sl0 : 1;
+       } cn38xxp2;
+       struct cvmx_npi_output_control_cn50xx {
+               u64 reserved_49_63 : 15;
+               u64 pkt_rr : 1;
+               u64 reserved_46_47 : 2;
+               u64 p1_bmode : 1;
+               u64 p0_bmode : 1;
+               u64 reserved_36_43 : 8;
+               u64 o1_es : 2;
+               u64 o1_ns : 1;
+               u64 o1_ro : 1;
+               u64 o0_es : 2;
+               u64 o0_ns : 1;
+               u64 o0_ro : 1;
+               u64 reserved_26_27 : 2;
+               u64 o1_csrm : 1;
+               u64 o0_csrm : 1;
+               u64 reserved_18_23 : 6;
+               u64 iptr_o1 : 1;
+               u64 iptr_o0 : 1;
+               u64 reserved_8_15 : 8;
+               u64 esr_sl1 : 2;
+               u64 nsr_sl1 : 1;
+               u64 ror_sl1 : 1;
+               u64 esr_sl0 : 2;
+               u64 nsr_sl0 : 1;
+               u64 ror_sl0 : 1;
+       } cn50xx;
+       struct cvmx_npi_output_control_s cn58xx;
+       struct cvmx_npi_output_control_s cn58xxp1;
+};
+
+typedef union cvmx_npi_output_control cvmx_npi_output_control_t;
+
+/**
+ * cvmx_npi_p#_dbpair_addr
+ *
+ * NPI_P0_DBPAIR_ADDR = NPI's Port-0 DATA-BUFFER Pair Next Read Address.
+ *
+ * Contains the next address to read for Port's-0 Data/Buffer Pair.
+ */
+union cvmx_npi_px_dbpair_addr {
+       u64 u64;
+       struct cvmx_npi_px_dbpair_addr_s {
+               u64 reserved_63_63 : 1;
+               u64 state : 2;
+               u64 naddr : 61;
+       } s;
+       struct cvmx_npi_px_dbpair_addr_s cn30xx;
+       struct cvmx_npi_px_dbpair_addr_s cn31xx;
+       struct cvmx_npi_px_dbpair_addr_s cn38xx;
+       struct cvmx_npi_px_dbpair_addr_s cn38xxp2;
+       struct cvmx_npi_px_dbpair_addr_s cn50xx;
+       struct cvmx_npi_px_dbpair_addr_s cn58xx;
+       struct cvmx_npi_px_dbpair_addr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_px_dbpair_addr cvmx_npi_px_dbpair_addr_t;
+
+/**
+ * cvmx_npi_p#_instr_addr
+ *
+ * NPI_P0_INSTR_ADDR = NPI's Port-0 Instruction Next Read Address.
+ *
+ * Contains the next address to read for Port's-0 Instructions.
+ */
+union cvmx_npi_px_instr_addr {
+       u64 u64;
+       struct cvmx_npi_px_instr_addr_s {
+               u64 state : 3;
+               u64 naddr : 61;
+       } s;
+       struct cvmx_npi_px_instr_addr_s cn30xx;
+       struct cvmx_npi_px_instr_addr_s cn31xx;
+       struct cvmx_npi_px_instr_addr_s cn38xx;
+       struct cvmx_npi_px_instr_addr_s cn38xxp2;
+       struct cvmx_npi_px_instr_addr_s cn50xx;
+       struct cvmx_npi_px_instr_addr_s cn58xx;
+       struct cvmx_npi_px_instr_addr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_px_instr_addr cvmx_npi_px_instr_addr_t;
+
+/**
+ * cvmx_npi_p#_instr_cnts
+ *
+ * NPI_P0_INSTR_CNTS = NPI's Port-0 Instruction Counts For Packets In.
+ *
+ * Used to determine the number of instruction in the NPI and to be fetched for Input-Packets.
+ */
+union cvmx_npi_px_instr_cnts {
+       u64 u64;
+       struct cvmx_npi_px_instr_cnts_s {
+               u64 reserved_38_63 : 26;
+               u64 fcnt : 6;
+               u64 avail : 32;
+       } s;
+       struct cvmx_npi_px_instr_cnts_s cn30xx;
+       struct cvmx_npi_px_instr_cnts_s cn31xx;
+       struct cvmx_npi_px_instr_cnts_s cn38xx;
+       struct cvmx_npi_px_instr_cnts_s cn38xxp2;
+       struct cvmx_npi_px_instr_cnts_s cn50xx;
+       struct cvmx_npi_px_instr_cnts_s cn58xx;
+       struct cvmx_npi_px_instr_cnts_s cn58xxp1;
+};
+
+typedef union cvmx_npi_px_instr_cnts cvmx_npi_px_instr_cnts_t;
+
+/**
+ * cvmx_npi_p#_pair_cnts
+ *
+ * NPI_P0_PAIR_CNTS = NPI's Port-0 Instruction Counts For Packets Out.
+ *
+ * Used to determine the number of instruction in the NPI and to be fetched for Output-Packets.
+ */
+union cvmx_npi_px_pair_cnts {
+       u64 u64;
+       struct cvmx_npi_px_pair_cnts_s {
+               u64 reserved_37_63 : 27;
+               u64 fcnt : 5;
+               u64 avail : 32;
+       } s;
+       struct cvmx_npi_px_pair_cnts_s cn30xx;
+       struct cvmx_npi_px_pair_cnts_s cn31xx;
+       struct cvmx_npi_px_pair_cnts_s cn38xx;
+       struct cvmx_npi_px_pair_cnts_s cn38xxp2;
+       struct cvmx_npi_px_pair_cnts_s cn50xx;
+       struct cvmx_npi_px_pair_cnts_s cn58xx;
+       struct cvmx_npi_px_pair_cnts_s cn58xxp1;
+};
+
+typedef union cvmx_npi_px_pair_cnts cvmx_npi_px_pair_cnts_t;
+
+/**
+ * cvmx_npi_pci_burst_size
+ *
+ * NPI_PCI_BURST_SIZE = NPI PCI Burst Size Register
+ *
+ * Control the number of words the NPI will attempt to read / write to/from the PCI.
+ */
+union cvmx_npi_pci_burst_size {
+       u64 u64;
+       struct cvmx_npi_pci_burst_size_s {
+               u64 reserved_14_63 : 50;
+               u64 wr_brst : 7;
+               u64 rd_brst : 7;
+       } s;
+       struct cvmx_npi_pci_burst_size_s cn30xx;
+       struct cvmx_npi_pci_burst_size_s cn31xx;
+       struct cvmx_npi_pci_burst_size_s cn38xx;
+       struct cvmx_npi_pci_burst_size_s cn38xxp2;
+       struct cvmx_npi_pci_burst_size_s cn50xx;
+       struct cvmx_npi_pci_burst_size_s cn58xx;
+       struct cvmx_npi_pci_burst_size_s cn58xxp1;
+};
+
+typedef union cvmx_npi_pci_burst_size cvmx_npi_pci_burst_size_t;
+
+/**
+ * cvmx_npi_pci_int_arb_cfg
+ *
+ * NPI_PCI_INT_ARB_CFG = Configuration For PCI Arbiter
+ *
+ * Controls operation of the Internal PCI Arbiter.  This register should
+ * only be written when PRST# is asserted.  NPI_PCI_INT_ARB_CFG[EN] should
+ * only be set when Octane is a host.
+ */
+union cvmx_npi_pci_int_arb_cfg {
+       u64 u64;
+       struct cvmx_npi_pci_int_arb_cfg_s {
+               u64 reserved_13_63 : 51;
+               u64 hostmode : 1;
+               u64 pci_ovr : 4;
+               u64 reserved_5_7 : 3;
+               u64 en : 1;
+               u64 park_mod : 1;
+               u64 park_dev : 3;
+       } s;
+       struct cvmx_npi_pci_int_arb_cfg_cn30xx {
+               u64 reserved_5_63 : 59;
+               u64 en : 1;
+               u64 park_mod : 1;
+               u64 park_dev : 3;
+       } cn30xx;
+       struct cvmx_npi_pci_int_arb_cfg_cn30xx cn31xx;
+       struct cvmx_npi_pci_int_arb_cfg_cn30xx cn38xx;
+       struct cvmx_npi_pci_int_arb_cfg_cn30xx cn38xxp2;
+       struct cvmx_npi_pci_int_arb_cfg_s cn50xx;
+       struct cvmx_npi_pci_int_arb_cfg_s cn58xx;
+       struct cvmx_npi_pci_int_arb_cfg_s cn58xxp1;
+};
+
+typedef union cvmx_npi_pci_int_arb_cfg cvmx_npi_pci_int_arb_cfg_t;
+
+/**
+ * cvmx_npi_pci_read_cmd
+ *
+ * NPI_PCI_READ_CMD = NPI PCI Read Command Register
+ *
+ * Controls the type of read command sent.
+ * Writes to this register are not ordered with writes/reads to the PCI Memory space.
+ * To ensure that a write has completed the user must read the register before
+ * making an access(i.e. PCI memory space) that requires the value of this register to be updated.
+ * Also any previously issued reads/writes to PCI memory space, still stored in the outbound
+ * FIFO will use the value of this register after it has been updated.
+ */
+union cvmx_npi_pci_read_cmd {
+       u64 u64;
+       struct cvmx_npi_pci_read_cmd_s {
+               u64 reserved_11_63 : 53;
+               u64 cmd_size : 11;
+       } s;
+       struct cvmx_npi_pci_read_cmd_s cn30xx;
+       struct cvmx_npi_pci_read_cmd_s cn31xx;
+       struct cvmx_npi_pci_read_cmd_s cn38xx;
+       struct cvmx_npi_pci_read_cmd_s cn38xxp2;
+       struct cvmx_npi_pci_read_cmd_s cn50xx;
+       struct cvmx_npi_pci_read_cmd_s cn58xx;
+       struct cvmx_npi_pci_read_cmd_s cn58xxp1;
+};
+
+typedef union cvmx_npi_pci_read_cmd cvmx_npi_pci_read_cmd_t;
+
+/**
+ * cvmx_npi_port32_instr_hdr
+ *
+ * NPI_PORT32_INSTR_HDR = NPI Port 32 Instruction Header
+ *
+ * Contains bits [62:42] of the Instruction Header for port 32.
+ */
+union cvmx_npi_port32_instr_hdr {
+       u64 u64;
+       struct cvmx_npi_port32_instr_hdr_s {
+               u64 reserved_44_63 : 20;
+               u64 pbp : 1;
+               u64 rsv_f : 5;
+               u64 rparmode : 2;
+               u64 rsv_e : 1;
+               u64 rskp_len : 7;
+               u64 rsv_d : 6;
+               u64 use_ihdr : 1;
+               u64 rsv_c : 5;
+               u64 par_mode : 2;
+               u64 rsv_b : 1;
+               u64 skp_len : 7;
+               u64 rsv_a : 6;
+       } s;
+       struct cvmx_npi_port32_instr_hdr_s cn30xx;
+       struct cvmx_npi_port32_instr_hdr_s cn31xx;
+       struct cvmx_npi_port32_instr_hdr_s cn38xx;
+       struct cvmx_npi_port32_instr_hdr_s cn38xxp2;
+       struct cvmx_npi_port32_instr_hdr_s cn50xx;
+       struct cvmx_npi_port32_instr_hdr_s cn58xx;
+       struct cvmx_npi_port32_instr_hdr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_port32_instr_hdr cvmx_npi_port32_instr_hdr_t;
+
+/**
+ * cvmx_npi_port33_instr_hdr
+ *
+ * NPI_PORT33_INSTR_HDR = NPI Port 33 Instruction Header
+ *
+ * Contains bits [62:42] of the Instruction Header for port 33.
+ */
+union cvmx_npi_port33_instr_hdr {
+       u64 u64;
+       struct cvmx_npi_port33_instr_hdr_s {
+               u64 reserved_44_63 : 20;
+               u64 pbp : 1;
+               u64 rsv_f : 5;
+               u64 rparmode : 2;
+               u64 rsv_e : 1;
+               u64 rskp_len : 7;
+               u64 rsv_d : 6;
+               u64 use_ihdr : 1;
+               u64 rsv_c : 5;
+               u64 par_mode : 2;
+               u64 rsv_b : 1;
+               u64 skp_len : 7;
+               u64 rsv_a : 6;
+       } s;
+       struct cvmx_npi_port33_instr_hdr_s cn31xx;
+       struct cvmx_npi_port33_instr_hdr_s cn38xx;
+       struct cvmx_npi_port33_instr_hdr_s cn38xxp2;
+       struct cvmx_npi_port33_instr_hdr_s cn50xx;
+       struct cvmx_npi_port33_instr_hdr_s cn58xx;
+       struct cvmx_npi_port33_instr_hdr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_port33_instr_hdr cvmx_npi_port33_instr_hdr_t;
+
+/**
+ * cvmx_npi_port34_instr_hdr
+ *
+ * NPI_PORT34_INSTR_HDR = NPI Port 34 Instruction Header
+ *
+ * Contains bits [62:42] of the Instruction Header for port 34. Added for PASS-2.
+ */
+union cvmx_npi_port34_instr_hdr {
+       u64 u64;
+       struct cvmx_npi_port34_instr_hdr_s {
+               u64 reserved_44_63 : 20;
+               u64 pbp : 1;
+               u64 rsv_f : 5;
+               u64 rparmode : 2;
+               u64 rsv_e : 1;
+               u64 rskp_len : 7;
+               u64 rsv_d : 6;
+               u64 use_ihdr : 1;
+               u64 rsv_c : 5;
+               u64 par_mode : 2;
+               u64 rsv_b : 1;
+               u64 skp_len : 7;
+               u64 rsv_a : 6;
+       } s;
+       struct cvmx_npi_port34_instr_hdr_s cn38xx;
+       struct cvmx_npi_port34_instr_hdr_s cn38xxp2;
+       struct cvmx_npi_port34_instr_hdr_s cn58xx;
+       struct cvmx_npi_port34_instr_hdr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_port34_instr_hdr cvmx_npi_port34_instr_hdr_t;
+
+/**
+ * cvmx_npi_port35_instr_hdr
+ *
+ * NPI_PORT35_INSTR_HDR = NPI Port 35 Instruction Header
+ *
+ * Contains bits [62:42] of the Instruction Header for port 35. Added for PASS-2.
+ */
+union cvmx_npi_port35_instr_hdr {
+       u64 u64;
+       struct cvmx_npi_port35_instr_hdr_s {
+               u64 reserved_44_63 : 20;
+               u64 pbp : 1;
+               u64 rsv_f : 5;
+               u64 rparmode : 2;
+               u64 rsv_e : 1;
+               u64 rskp_len : 7;
+               u64 rsv_d : 6;
+               u64 use_ihdr : 1;
+               u64 rsv_c : 5;
+               u64 par_mode : 2;
+               u64 rsv_b : 1;
+               u64 skp_len : 7;
+               u64 rsv_a : 6;
+       } s;
+       struct cvmx_npi_port35_instr_hdr_s cn38xx;
+       struct cvmx_npi_port35_instr_hdr_s cn38xxp2;
+       struct cvmx_npi_port35_instr_hdr_s cn58xx;
+       struct cvmx_npi_port35_instr_hdr_s cn58xxp1;
+};
+
+typedef union cvmx_npi_port35_instr_hdr cvmx_npi_port35_instr_hdr_t;
+
+/**
+ * cvmx_npi_port_bp_control
+ *
+ * NPI_PORT_BP_CONTROL = Port Backpressure Control
+ *
+ * Enables Port Level Backpressure
+ */
+union cvmx_npi_port_bp_control {
+       u64 u64;
+       struct cvmx_npi_port_bp_control_s {
+               u64 reserved_8_63 : 56;
+               u64 bp_on : 4;
+               u64 enb : 4;
+       } s;
+       struct cvmx_npi_port_bp_control_s cn30xx;
+       struct cvmx_npi_port_bp_control_s cn31xx;
+       struct cvmx_npi_port_bp_control_s cn38xx;
+       struct cvmx_npi_port_bp_control_s cn38xxp2;
+       struct cvmx_npi_port_bp_control_s cn50xx;
+       struct cvmx_npi_port_bp_control_s cn58xx;
+       struct cvmx_npi_port_bp_control_s cn58xxp1;
+};
+
+typedef union cvmx_npi_port_bp_control cvmx_npi_port_bp_control_t;
+
+/**
+ * cvmx_npi_rsl_int_blocks
+ *
+ * RSL_INT_BLOCKS = RSL Interrupt Blocks Register
+ *
+ * Reading this register will return a vector with a bit set '1' for a corresponding RSL block
+ * that presently has an interrupt pending. The Field Description below supplies the name of the
+ * register that software should read to find out why that intterupt bit is set.
+ */
+union cvmx_npi_rsl_int_blocks {
+       u64 u64;
+       struct cvmx_npi_rsl_int_blocks_s {
+               u64 reserved_32_63 : 32;
+               u64 rint_31 : 1;
+               u64 iob : 1;
+               u64 reserved_28_29 : 2;
+               u64 rint_27 : 1;
+               u64 rint_26 : 1;
+               u64 rint_25 : 1;
+               u64 rint_24 : 1;
+               u64 asx1 : 1;
+               u64 asx0 : 1;
+               u64 rint_21 : 1;
+               u64 pip : 1;
+               u64 spx1 : 1;
+               u64 spx0 : 1;
+               u64 lmc : 1;
+               u64 l2c : 1;
+               u64 rint_15 : 1;
+               u64 reserved_13_14 : 2;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 rint_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 npi : 1;
+               u64 gmx1 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } s;
+       struct cvmx_npi_rsl_int_blocks_cn30xx {
+               u64 reserved_32_63 : 32;
+               u64 rint_31 : 1;
+               u64 iob : 1;
+               u64 rint_29 : 1;
+               u64 rint_28 : 1;
+               u64 rint_27 : 1;
+               u64 rint_26 : 1;
+               u64 rint_25 : 1;
+               u64 rint_24 : 1;
+               u64 asx1 : 1;
+               u64 asx0 : 1;
+               u64 rint_21 : 1;
+               u64 pip : 1;
+               u64 spx1 : 1;
+               u64 spx0 : 1;
+               u64 lmc : 1;
+               u64 l2c : 1;
+               u64 rint_15 : 1;
+               u64 rint_14 : 1;
+               u64 usb : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 rint_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 npi : 1;
+               u64 gmx1 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } cn30xx;
+       struct cvmx_npi_rsl_int_blocks_cn30xx cn31xx;
+       struct cvmx_npi_rsl_int_blocks_cn38xx {
+               u64 reserved_32_63 : 32;
+               u64 rint_31 : 1;
+               u64 iob : 1;
+               u64 rint_29 : 1;
+               u64 rint_28 : 1;
+               u64 rint_27 : 1;
+               u64 rint_26 : 1;
+               u64 rint_25 : 1;
+               u64 rint_24 : 1;
+               u64 asx1 : 1;
+               u64 asx0 : 1;
+               u64 rint_21 : 1;
+               u64 pip : 1;
+               u64 spx1 : 1;
+               u64 spx0 : 1;
+               u64 lmc : 1;
+               u64 l2c : 1;
+               u64 rint_15 : 1;
+               u64 rint_14 : 1;
+               u64 rint_13 : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 rint_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 npi : 1;
+               u64 gmx1 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } cn38xx;
+       struct cvmx_npi_rsl_int_blocks_cn38xx cn38xxp2;
+       struct cvmx_npi_rsl_int_blocks_cn50xx {
+               u64 reserved_31_63 : 33;
+               u64 iob : 1;
+               u64 lmc1 : 1;
+               u64 agl : 1;
+               u64 reserved_24_27 : 4;
+               u64 asx1 : 1;
+               u64 asx0 : 1;
+               u64 reserved_21_21 : 1;
+               u64 pip : 1;
+               u64 spx1 : 1;
+               u64 spx0 : 1;
+               u64 lmc : 1;
+               u64 l2c : 1;
+               u64 reserved_15_15 : 1;
+               u64 rad : 1;
+               u64 usb : 1;
+               u64 pow : 1;
+               u64 tim : 1;
+               u64 pko : 1;
+               u64 ipd : 1;
+               u64 reserved_8_8 : 1;
+               u64 zip : 1;
+               u64 dfa : 1;
+               u64 fpa : 1;
+               u64 key : 1;
+               u64 npi : 1;
+               u64 gmx1 : 1;
+               u64 gmx0 : 1;
+               u64 mio : 1;
+       } cn50xx;
+       struct cvmx_npi_rsl_int_blocks_cn38xx cn58xx;
+       struct cvmx_npi_rsl_int_blocks_cn38xx cn58xxp1;
+};
+
+typedef union cvmx_npi_rsl_int_blocks cvmx_npi_rsl_int_blocks_t;
+
+/**
+ * cvmx_npi_size_input#
+ *
+ * NPI_SIZE_INPUT0 = NPI's Size for Input 0 Register
+ *
+ * The size (in instructions) of Instruction Queue-0.
+ */
+union cvmx_npi_size_inputx {
+       u64 u64;
+       struct cvmx_npi_size_inputx_s {
+               u64 reserved_32_63 : 32;
+               u64 size : 32;
+       } s;
+       struct cvmx_npi_size_inputx_s cn30xx;
+       struct cvmx_npi_size_inputx_s cn31xx;
+       struct cvmx_npi_size_inputx_s cn38xx;
+       struct cvmx_npi_size_inputx_s cn38xxp2;
+       struct cvmx_npi_size_inputx_s cn50xx;
+       struct cvmx_npi_size_inputx_s cn58xx;
+       struct cvmx_npi_size_inputx_s cn58xxp1;
+};
+
+typedef union cvmx_npi_size_inputx cvmx_npi_size_inputx_t;
+
+/**
+ * cvmx_npi_win_read_to
+ *
+ * NPI_WIN_READ_TO = NPI WINDOW READ Timeout Register
+ *
+ * Number of core clocks to wait before timing out on a WINDOW-READ to the NCB.
+ */
+union cvmx_npi_win_read_to {
+       u64 u64;
+       struct cvmx_npi_win_read_to_s {
+               u64 reserved_32_63 : 32;
+               u64 time : 32;
+       } s;
+       struct cvmx_npi_win_read_to_s cn30xx;
+       struct cvmx_npi_win_read_to_s cn31xx;
+       struct cvmx_npi_win_read_to_s cn38xx;
+       struct cvmx_npi_win_read_to_s cn38xxp2;
+       struct cvmx_npi_win_read_to_s cn50xx;
+       struct cvmx_npi_win_read_to_s cn58xx;
+       struct cvmx_npi_win_read_to_s cn58xxp1;
+};
+
+typedef union cvmx_npi_win_read_to cvmx_npi_win_read_to_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-packet.h b/arch/mips/mach-octeon/include/mach/cvmx-packet.h
new file mode 100644 (file)
index 0000000..f3cfe9c
--- /dev/null
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Packet buffer defines.
+ */
+
+#ifndef __CVMX_PACKET_H__
+#define __CVMX_PACKET_H__
+
+union cvmx_buf_ptr_pki {
+       u64 u64;
+       struct {
+               u64 size : 16;
+               u64 packet_outside_wqe : 1;
+               u64 rsvd0 : 5;
+               u64 addr : 42;
+       };
+};
+
+typedef union cvmx_buf_ptr_pki cvmx_buf_ptr_pki_t;
+
+/**
+ * This structure defines a buffer pointer on Octeon
+ */
+union cvmx_buf_ptr {
+       void *ptr;
+       u64 u64;
+       struct {
+               u64 i : 1;
+               u64 back : 4;
+               u64 pool : 3;
+               u64 size : 16;
+               u64 addr : 40;
+       } s;
+};
+
+typedef union cvmx_buf_ptr cvmx_buf_ptr_t;
+
+#endif /*  __CVMX_PACKET_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pcie.h b/arch/mips/mach-octeon/include/mach/cvmx-pcie.h
new file mode 100644 (file)
index 0000000..a819196
--- /dev/null
@@ -0,0 +1,279 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_PCIE_H__
+#define __CVMX_PCIE_H__
+
+#define CVMX_PCIE_MAX_PORTS 4
+#define CVMX_PCIE_PORTS                                                                            \
+       ((OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX)) ?                      \
+                      CVMX_PCIE_MAX_PORTS :                                                             \
+                      (OCTEON_IS_MODEL(OCTEON_CN70XX) ? 3 : 2))
+
+/*
+ * The physical memory base mapped by BAR1.  256MB at the end of the
+ * first 4GB.
+ */
+#define CVMX_PCIE_BAR1_PHYS_BASE ((1ull << 32) - (1ull << 28))
+#define CVMX_PCIE_BAR1_PHYS_SIZE BIT_ULL(28)
+
+/*
+ * The RC base of BAR1.  gen1 has a 39-bit BAR2, gen2 has 41-bit BAR2,
+ * place BAR1 so it is the same for both.
+ */
+#define CVMX_PCIE_BAR1_RC_BASE BIT_ULL(41)
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 upper : 2;           /* Normally 2 for XKPHYS */
+               u64 reserved_49_61 : 13; /* Must be zero */
+               u64 io : 1;              /* 1 for IO space access */
+               u64 did : 5;             /* PCIe DID = 3 */
+               u64 subdid : 3;          /* PCIe SubDID = 1 */
+               u64 reserved_38_39 : 2;  /* Must be zero */
+               u64 node : 2;            /* Numa node number */
+               u64 es : 2;              /* Endian swap = 1 */
+               u64 port : 2;            /* PCIe port 0,1 */
+               u64 reserved_29_31 : 3;  /* Must be zero */
+               u64 ty : 1;
+               u64 bus : 8;
+               u64 dev : 5;
+               u64 func : 3;
+               u64 reg : 12;
+       } config;
+       struct {
+               u64 upper : 2;           /* Normally 2 for XKPHYS */
+               u64 reserved_49_61 : 13; /* Must be zero */
+               u64 io : 1;              /* 1 for IO space access */
+               u64 did : 5;             /* PCIe DID = 3 */
+               u64 subdid : 3;          /* PCIe SubDID = 2 */
+               u64 reserved_38_39 : 2;  /* Must be zero */
+               u64 node : 2;            /* Numa node number */
+               u64 es : 2;              /* Endian swap = 1 */
+               u64 port : 2;            /* PCIe port 0,1 */
+               u64 address : 32;        /* PCIe IO address */
+       } io;
+       struct {
+               u64 upper : 2;           /* Normally 2 for XKPHYS */
+               u64 reserved_49_61 : 13; /* Must be zero */
+               u64 io : 1;              /* 1 for IO space access */
+               u64 did : 5;             /* PCIe DID = 3 */
+               u64 subdid : 3;          /* PCIe SubDID = 3-6 */
+               u64 reserved_38_39 : 2;  /* Must be zero */
+               u64 node : 2;            /* Numa node number */
+               u64 address : 36;        /* PCIe Mem address */
+       } mem;
+} cvmx_pcie_address_t;
+
+/**
+ * Return the Core virtual base address for PCIe IO access. IOs are
+ * read/written as an offset from this address.
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return 64bit Octeon IO base address for read/write
+ */
+u64 cvmx_pcie_get_io_base_address(int pcie_port);
+
+/**
+ * Size of the IO address region returned at address
+ * cvmx_pcie_get_io_base_address()
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return Size of the IO window
+ */
+u64 cvmx_pcie_get_io_size(int pcie_port);
+
+/**
+ * Return the Core virtual base address for PCIe MEM access. Memory is
+ * read/written as an offset from this address.
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return 64bit Octeon IO base address for read/write
+ */
+u64 cvmx_pcie_get_mem_base_address(int pcie_port);
+
+/**
+ * Size of the Mem address region returned at address
+ * cvmx_pcie_get_mem_base_address()
+ *
+ * @param pcie_port PCIe port the IO is for
+ *
+ * @return Size of the Mem window
+ */
+u64 cvmx_pcie_get_mem_size(int pcie_port);
+
+/**
+ * Initialize a PCIe port for use in host(RC) mode. It doesn't enumerate the bus.
+ *
+ * @param pcie_port PCIe port to initialize
+ *
+ * @return Zero on success
+ */
+int cvmx_pcie_rc_initialize(int pcie_port);
+
+/**
+ * Shutdown a PCIe port and put it in reset
+ *
+ * @param pcie_port PCIe port to shutdown
+ *
+ * @return Zero on success
+ */
+int cvmx_pcie_rc_shutdown(int pcie_port);
+
+/**
+ * Read 8bits from a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ *
+ * @return Result of the read
+ */
+u8 cvmx_pcie_config_read8(int pcie_port, int bus, int dev, int fn, int reg);
+
+/**
+ * Read 16bits from a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ *
+ * @return Result of the read
+ */
+u16 cvmx_pcie_config_read16(int pcie_port, int bus, int dev, int fn, int reg);
+
+/**
+ * Read 32bits from a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ *
+ * @return Result of the read
+ */
+u32 cvmx_pcie_config_read32(int pcie_port, int bus, int dev, int fn, int reg);
+
+/**
+ * Write 8bits to a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ * @param val       Value to write
+ */
+void cvmx_pcie_config_write8(int pcie_port, int bus, int dev, int fn, int reg, u8 val);
+
+/**
+ * Write 16bits to a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ * @param val       Value to write
+ */
+void cvmx_pcie_config_write16(int pcie_port, int bus, int dev, int fn, int reg, u16 val);
+
+/**
+ * Write 32bits to a Device's config space
+ *
+ * @param pcie_port PCIe port the device is on
+ * @param bus       Sub bus
+ * @param dev       Device ID
+ * @param fn        Device sub function
+ * @param reg       Register to access
+ * @param val       Value to write
+ */
+void cvmx_pcie_config_write32(int pcie_port, int bus, int dev, int fn, int reg, u32 val);
+
+/**
+ * Read a PCIe config space register indirectly. This is used for
+ * registers of the form PCIEEP_CFG??? and PCIERC?_CFG???.
+ *
+ * @param pcie_port  PCIe port to read from
+ * @param cfg_offset Address to read
+ *
+ * @return Value read
+ */
+u32 cvmx_pcie_cfgx_read(int pcie_port, u32 cfg_offset);
+u32 cvmx_pcie_cfgx_read_node(int node, int pcie_port, u32 cfg_offset);
+
+/**
+ * Write a PCIe config space register indirectly. This is used for
+ * registers of the form PCIEEP_CFG??? and PCIERC?_CFG???.
+ *
+ * @param pcie_port  PCIe port to write to
+ * @param cfg_offset Address to write
+ * @param val        Value to write
+ */
+void cvmx_pcie_cfgx_write(int pcie_port, u32 cfg_offset, u32 val);
+void cvmx_pcie_cfgx_write_node(int node, int pcie_port, u32 cfg_offset, u32 val);
+
+/**
+ * Write a 32bit value to the Octeon NPEI register space
+ *
+ * @param address Address to write to
+ * @param val     Value to write
+ */
+static inline void cvmx_pcie_npei_write32(u64 address, u32 val)
+{
+       cvmx_write64_uint32(address ^ 4, val);
+       cvmx_read64_uint32(address ^ 4);
+}
+
+/**
+ * Read a 32bit value from the Octeon NPEI register space
+ *
+ * @param address Address to read
+ * @return The result
+ */
+static inline u32 cvmx_pcie_npei_read32(u64 address)
+{
+       return cvmx_read64_uint32(address ^ 4);
+}
+
+/**
+ * Initialize a PCIe port for use in target(EP) mode.
+ *
+ * @param pcie_port PCIe port to initialize
+ *
+ * @return Zero on success
+ */
+int cvmx_pcie_ep_initialize(int pcie_port);
+
+/**
+ * Wait for posted PCIe read/writes to reach the other side of
+ * the internal PCIe switch. This will insure that core
+ * read/writes are posted before anything after this function
+ * is called. This may be necessary when writing to memory that
+ * will later be read using the DMA/PKT engines.
+ *
+ * @param pcie_port PCIe port to wait for
+ */
+void cvmx_pcie_wait_for_pending(int pcie_port);
+
+/**
+ * Returns if a PCIe port is in host or target mode.
+ *
+ * @param pcie_port PCIe port number (PEM number)
+ *
+ * @return 0 if PCIe port is in target mode, !0 if in host mode.
+ */
+int cvmx_pcie_is_host_mode(int pcie_port);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pcieepx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pcieepx-defs.h
new file mode 100644 (file)
index 0000000..13ef599
--- /dev/null
@@ -0,0 +1,6848 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pcieepx.
+ */
+
+#ifndef __CVMX_PCIEEPX_DEFS_H__
+#define __CVMX_PCIEEPX_DEFS_H__
+
+static inline u64 CVMX_PCIEEPX_CFG000(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000000ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000000ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000000ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000000ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000000ull;
+       }
+       return 0x0000030000000000ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG001(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000004ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000004ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000004ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000004ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000004ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000004ull;
+       }
+       return 0x0000030000000004ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG002(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000008ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000008ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000008ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000008ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000008ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000008ull;
+       }
+       return 0x0000030000000008ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG003(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000000Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000000Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000000Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000000Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000000Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000000Cull;
+       }
+       return 0x000003000000000Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG004(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000010ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000010ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000010ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000010ull;
+       }
+       return 0x0000030000000010ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG004_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000010ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030080000010ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030080000010ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000080000010ull;
+       }
+       return 0x0000030080000010ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG005(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000014ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000014ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000014ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000014ull;
+       }
+       return 0x0000030000000014ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG005_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000014ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030080000014ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030080000014ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000080000014ull;
+       }
+       return 0x0000030080000014ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG006(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000018ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000018ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000018ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000018ull;
+       }
+       return 0x0000030000000018ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG006_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000018ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030080000018ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030080000018ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000080000018ull;
+       }
+       return 0x0000030080000018ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG007(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000001Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000001Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000001Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000001Cull;
+       }
+       return 0x000003000000001Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG007_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003008000001Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003008000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003008000001Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003008000001Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003008000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000008000001Cull;
+       }
+       return 0x000003008000001Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG008(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000020ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000020ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000020ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000020ull;
+       }
+       return 0x0000030000000020ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG008_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000020ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030080000020ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030080000020ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000080000020ull;
+       }
+       return 0x0000030080000020ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG009(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000024ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000024ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000024ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000024ull;
+       }
+       return 0x0000030000000024ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG009_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000024ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030080000024ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030080000024ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000080000024ull;
+       }
+       return 0x0000030080000024ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG010(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000028ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000028ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000028ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000028ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000028ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000028ull;
+       }
+       return 0x0000030000000028ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG011(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000002Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000002Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000002Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000002Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000002Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000002Cull;
+       }
+       return 0x000003000000002Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG012(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000030ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000030ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000030ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000030ull;
+       }
+       return 0x0000030000000030ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG012_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000030ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030080000030ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030080000030ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030080000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000080000030ull;
+       }
+       return 0x0000030080000030ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG013(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000034ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000034ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000034ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000034ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000034ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000034ull;
+       }
+       return 0x0000030000000034ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG015(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000003Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000003Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000003Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000003Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000003Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000003Cull;
+       }
+       return 0x000003000000003Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG016(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000040ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000040ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000040ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000040ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000040ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000040ull;
+       }
+       return 0x0000030000000040ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG017(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000044ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000044ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000044ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000044ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000044ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000044ull;
+       }
+       return 0x0000030000000044ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG020(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000050ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000050ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000050ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000050ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000050ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000050ull;
+       }
+       return 0x0000030000000050ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG021(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000054ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000054ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000054ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000054ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000054ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000054ull;
+       }
+       return 0x0000030000000054ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG022(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000058ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000058ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000058ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000058ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000058ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000058ull;
+       }
+       return 0x0000030000000058ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG023(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000005Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000005Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000005Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000005Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000005Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000005Cull;
+       }
+       return 0x000003000000005Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG024(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000060ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000060ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000060ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000060ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000060ull + (offset) * 0x100000000ull;
+       }
+       return 0x0000030000000060ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG025(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000064ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000064ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000064ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000064ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000064ull + (offset) * 0x100000000ull;
+       }
+       return 0x0000030000000064ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG028(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000070ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000070ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000070ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000070ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000070ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000070ull;
+       }
+       return 0x0000030000000070ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG029(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000074ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000074ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000074ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000074ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000074ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000074ull;
+       }
+       return 0x0000030000000074ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG030(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000078ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000078ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000078ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000078ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000078ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000078ull;
+       }
+       return 0x0000030000000078ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG031(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000007Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000007Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000007Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000007Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000007Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000007Cull;
+       }
+       return 0x000003000000007Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG032(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000080ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000080ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000080ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000080ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000080ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000080ull;
+       }
+       return 0x0000030000000080ull;
+}
+
+#define CVMX_PCIEEPX_CFG033(offset) (0x0000000000000084ull)
+#define CVMX_PCIEEPX_CFG034(offset) (0x0000000000000088ull)
+static inline u64 CVMX_PCIEEPX_CFG037(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000094ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000094ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000094ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000094ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000094ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000094ull;
+       }
+       return 0x0000030000000094ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG038(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000098ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000098ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000098ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000098ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000098ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000098ull;
+       }
+       return 0x0000030000000098ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG039(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000009Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000009Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000009Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000009Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000009Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000009Cull;
+       }
+       return 0x000003000000009Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG040(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000A0ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000A0ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000000A0ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000000A0ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000A0ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000000A0ull;
+       }
+       return 0x00000300000000A0ull;
+}
+
+#define CVMX_PCIEEPX_CFG041(offset) (0x00000000000000A4ull)
+#define CVMX_PCIEEPX_CFG042(offset) (0x00000000000000A8ull)
+static inline u64 CVMX_PCIEEPX_CFG044(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000000B0ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000000B0ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000B0ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000B0ull;
+       }
+       return 0x00000300000000B0ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG045(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000000B4ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000000B4ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000B4ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000B4ull;
+       }
+       return 0x00000300000000B4ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG046(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000000B8ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000000B8ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000B8ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000000B8ull;
+       }
+       return 0x00000300000000B8ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG064(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000100ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000100ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000100ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000100ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000100ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000100ull;
+       }
+       return 0x0000030000000100ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG065(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000104ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000104ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000104ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000104ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000104ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000104ull;
+       }
+       return 0x0000030000000104ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG066(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000108ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000108ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000108ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000108ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000108ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000108ull;
+       }
+       return 0x0000030000000108ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG067(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000010Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000010Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000010Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000010Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000010Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000010Cull;
+       }
+       return 0x000003000000010Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG068(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000110ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000110ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000110ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000110ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000110ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000110ull;
+       }
+       return 0x0000030000000110ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG069(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000114ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000114ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000114ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000114ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000114ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000114ull;
+       }
+       return 0x0000030000000114ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG070(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000118ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000118ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000118ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000118ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000118ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000118ull;
+       }
+       return 0x0000030000000118ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG071(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000011Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000011Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000011Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000011Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000011Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000011Cull;
+       }
+       return 0x000003000000011Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG072(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000120ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000120ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000120ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000120ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000120ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000120ull;
+       }
+       return 0x0000030000000120ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG073(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000124ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000124ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000124ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000124ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000124ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000124ull;
+       }
+       return 0x0000030000000124ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG074(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000128ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000128ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000128ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000128ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000128ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000128ull;
+       }
+       return 0x0000030000000128ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG078(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000138ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000138ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000138ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000138ull;
+       }
+       return 0x0000030000000138ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG082(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000148ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000148ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000148ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000148ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000148ull + (offset) * 0x100000000ull;
+       }
+       return 0x0000030000000148ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG083(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000014Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000014Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000014Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000014Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000014Cull + (offset) * 0x100000000ull;
+       }
+       return 0x000003000000014Cull;
+}
+
+#define CVMX_PCIEEPX_CFG084(offset) (0x0000030000000150ull + ((offset) & 3) * 0x100000000ull)
+static inline u64 CVMX_PCIEEPX_CFG086(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000158ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000158ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000158ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000158ull;
+       }
+       return 0x0000030000000158ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG087(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000015Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000015Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000015Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000015Cull;
+       }
+       return 0x000003000000015Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG088(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000160ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000160ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000160ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000160ull;
+       }
+       return 0x0000030000000160ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG089(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000164ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000164ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000164ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000164ull;
+       }
+       return 0x0000030000000164ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG090(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000168ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000168ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000168ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000168ull;
+       }
+       return 0x0000030000000168ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG091(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000016Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000016Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000016Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000016Cull;
+       }
+       return 0x000003000000016Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG092(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000170ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000170ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000170ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000170ull;
+       }
+       return 0x0000030000000170ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG094(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000178ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000178ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000178ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000178ull;
+       }
+       return 0x0000030000000178ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG095(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000017Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000017Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000017Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000017Cull;
+       }
+       return 0x000003000000017Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG096(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000180ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000180ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000180ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000180ull;
+       }
+       return 0x0000030000000180ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG097(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000184ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000184ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000184ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000184ull;
+       }
+       return 0x0000030000000184ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG098(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000188ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000188ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000188ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000188ull;
+       }
+       return 0x0000030000000188ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG099(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000018Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000018Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000018Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000018Cull;
+       }
+       return 0x000003000000018Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG100(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000190ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000190ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000190ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000190ull;
+       }
+       return 0x0000030000000190ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG101(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000194ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000194ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000194ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000194ull;
+       }
+       return 0x0000030000000194ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG102(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000198ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000198ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000198ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000198ull;
+       }
+       return 0x0000030000000198ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG103(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000019Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000019Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000019Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000019Cull;
+       }
+       return 0x000003000000019Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG104(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001A0ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001A0ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001A0ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001A0ull;
+       }
+       return 0x00000300000001A0ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG105(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001A4ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001A4ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001A4ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001A4ull;
+       }
+       return 0x00000300000001A4ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG106(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001A8ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001A8ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001A8ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001A8ull;
+       }
+       return 0x00000300000001A8ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG107(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001ACull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001ACull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001ACull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001ACull;
+       }
+       return 0x00000300000001ACull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG108(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001B0ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001B0ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001B0ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001B0ull;
+       }
+       return 0x00000300000001B0ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG109(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001B4ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001B4ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001B4ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001B4ull;
+       }
+       return 0x00000300000001B4ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG110(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001B8ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001B8ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001B8ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001B8ull;
+       }
+       return 0x00000300000001B8ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG111(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001BCull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001BCull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001BCull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001BCull;
+       }
+       return 0x00000300000001BCull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG112(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000001C0ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000001C0ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001C0ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000001C0ull;
+       }
+       return 0x00000300000001C0ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG448(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000700ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000700ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000700ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000700ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000700ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000700ull;
+       }
+       return 0x0000030000000700ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG449(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000704ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000704ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000704ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000704ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000704ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000704ull;
+       }
+       return 0x0000030000000704ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG450(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000708ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000708ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000708ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000708ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000708ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000708ull;
+       }
+       return 0x0000030000000708ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG451(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000070Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000070Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000070Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000070Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000070Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000070Cull;
+       }
+       return 0x000003000000070Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG452(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000710ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000710ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000710ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000710ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000710ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000710ull;
+       }
+       return 0x0000030000000710ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG453(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000714ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000714ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000714ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000714ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000714ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000714ull;
+       }
+       return 0x0000030000000714ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG454(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000718ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000718ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000718ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000718ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000718ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000718ull;
+       }
+       return 0x0000030000000718ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG455(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000071Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000071Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000071Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000071Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000071Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000071Cull;
+       }
+       return 0x000003000000071Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG456(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000720ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000720ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000720ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000720ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000720ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000720ull;
+       }
+       return 0x0000030000000720ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG458(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000728ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000728ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000728ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000728ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000728ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000728ull;
+       }
+       return 0x0000030000000728ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG459(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000072Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000072Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000072Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000072Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000072Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000072Cull;
+       }
+       return 0x000003000000072Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG460(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000730ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000730ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000730ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000730ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000730ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000730ull;
+       }
+       return 0x0000030000000730ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG461(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000734ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000734ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000734ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000734ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000734ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000734ull;
+       }
+       return 0x0000030000000734ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG462(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000738ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000738ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000738ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000738ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000738ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000738ull;
+       }
+       return 0x0000030000000738ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG463(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000073Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000073Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000073Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000073Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000073Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000073Cull;
+       }
+       return 0x000003000000073Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG464(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000740ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000740ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000740ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000740ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000740ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000740ull;
+       }
+       return 0x0000030000000740ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG465(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000744ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000744ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000744ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000744ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000744ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000744ull;
+       }
+       return 0x0000030000000744ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG466(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000748ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000748ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000748ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000748ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000748ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000748ull;
+       }
+       return 0x0000030000000748ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG467(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000074Cull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000074Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000074Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000074Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000074Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000074Cull;
+       }
+       return 0x000003000000074Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG468(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000750ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000750ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000750ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000750ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000750ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000750ull;
+       }
+       return 0x0000030000000750ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG490(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000007A8ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000007A8ull + (offset) * 0x100000000ull;
+       }
+       return 0x00000000000007A8ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG491(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000007ACull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000007ACull + (offset) * 0x100000000ull;
+       }
+       return 0x00000000000007ACull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG492(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000007B0ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000007B0ull + (offset) * 0x100000000ull;
+       }
+       return 0x00000000000007B0ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG515(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000080Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000003000000080Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000003000000080Cull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000080Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000003000000080Cull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000080Cull;
+       }
+       return 0x000003000000080Cull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG516(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000810ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000810ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000810ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000810ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000810ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000810ull;
+       }
+       return 0x0000030000000810ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG517(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000814ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000814ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000814ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000814ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000814ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000814ull;
+       }
+       return 0x0000030000000814ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG548(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000030000000890ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000030000000890ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000890ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000030000000890ull;
+       }
+       return 0x0000030000000890ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG554(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000008A8ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000008A8ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000008A8ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000008A8ull;
+       }
+       return 0x00000300000008A8ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG558(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000008B8ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000008B8ull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000008B8ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000008B8ull;
+       }
+       return 0x00000300000008B8ull;
+}
+
+static inline u64 CVMX_PCIEEPX_CFG559(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000300000008BCull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000300000008BCull + (offset) * 0x100000000ull;
+
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000008BCull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000300000008BCull;
+       }
+       return 0x00000300000008BCull;
+}
+
+/**
+ * cvmx_pcieep#_cfg000
+ *
+ * This register contains the first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg000 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg000_s {
+               u32 devid : 16;
+               u32 vendid : 16;
+       } s;
+       struct cvmx_pcieepx_cfg000_s cn52xx;
+       struct cvmx_pcieepx_cfg000_s cn52xxp1;
+       struct cvmx_pcieepx_cfg000_s cn56xx;
+       struct cvmx_pcieepx_cfg000_s cn56xxp1;
+       struct cvmx_pcieepx_cfg000_s cn61xx;
+       struct cvmx_pcieepx_cfg000_s cn63xx;
+       struct cvmx_pcieepx_cfg000_s cn63xxp1;
+       struct cvmx_pcieepx_cfg000_s cn66xx;
+       struct cvmx_pcieepx_cfg000_s cn68xx;
+       struct cvmx_pcieepx_cfg000_s cn68xxp1;
+       struct cvmx_pcieepx_cfg000_s cn70xx;
+       struct cvmx_pcieepx_cfg000_s cn70xxp1;
+       struct cvmx_pcieepx_cfg000_s cn73xx;
+       struct cvmx_pcieepx_cfg000_s cn78xx;
+       struct cvmx_pcieepx_cfg000_s cn78xxp1;
+       struct cvmx_pcieepx_cfg000_s cnf71xx;
+       struct cvmx_pcieepx_cfg000_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg000 cvmx_pcieepx_cfg000_t;
+
+/**
+ * cvmx_pcieep#_cfg001
+ *
+ * This register contains the second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg001 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg001_s {
+               u32 dpe : 1;
+               u32 sse : 1;
+               u32 rma : 1;
+               u32 rta : 1;
+               u32 sta : 1;
+               u32 devt : 2;
+               u32 mdpe : 1;
+               u32 fbb : 1;
+               u32 reserved_22_22 : 1;
+               u32 m66 : 1;
+               u32 cl : 1;
+               u32 i_stat : 1;
+               u32 reserved_11_18 : 8;
+               u32 i_dis : 1;
+               u32 fbbe : 1;
+               u32 see : 1;
+               u32 ids_wcc : 1;
+               u32 per : 1;
+               u32 vps : 1;
+               u32 mwice : 1;
+               u32 scse : 1;
+               u32 me : 1;
+               u32 msae : 1;
+               u32 isae : 1;
+       } s;
+       struct cvmx_pcieepx_cfg001_s cn52xx;
+       struct cvmx_pcieepx_cfg001_s cn52xxp1;
+       struct cvmx_pcieepx_cfg001_s cn56xx;
+       struct cvmx_pcieepx_cfg001_s cn56xxp1;
+       struct cvmx_pcieepx_cfg001_s cn61xx;
+       struct cvmx_pcieepx_cfg001_s cn63xx;
+       struct cvmx_pcieepx_cfg001_s cn63xxp1;
+       struct cvmx_pcieepx_cfg001_s cn66xx;
+       struct cvmx_pcieepx_cfg001_s cn68xx;
+       struct cvmx_pcieepx_cfg001_s cn68xxp1;
+       struct cvmx_pcieepx_cfg001_s cn70xx;
+       struct cvmx_pcieepx_cfg001_s cn70xxp1;
+       struct cvmx_pcieepx_cfg001_s cn73xx;
+       struct cvmx_pcieepx_cfg001_s cn78xx;
+       struct cvmx_pcieepx_cfg001_s cn78xxp1;
+       struct cvmx_pcieepx_cfg001_s cnf71xx;
+       struct cvmx_pcieepx_cfg001_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg001 cvmx_pcieepx_cfg001_t;
+
+/**
+ * cvmx_pcieep#_cfg002
+ *
+ * This register contains the third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg002 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg002_s {
+               u32 bcc : 8;
+               u32 sc : 8;
+               u32 pi : 8;
+               u32 rid : 8;
+       } s;
+       struct cvmx_pcieepx_cfg002_s cn52xx;
+       struct cvmx_pcieepx_cfg002_s cn52xxp1;
+       struct cvmx_pcieepx_cfg002_s cn56xx;
+       struct cvmx_pcieepx_cfg002_s cn56xxp1;
+       struct cvmx_pcieepx_cfg002_s cn61xx;
+       struct cvmx_pcieepx_cfg002_s cn63xx;
+       struct cvmx_pcieepx_cfg002_s cn63xxp1;
+       struct cvmx_pcieepx_cfg002_s cn66xx;
+       struct cvmx_pcieepx_cfg002_s cn68xx;
+       struct cvmx_pcieepx_cfg002_s cn68xxp1;
+       struct cvmx_pcieepx_cfg002_s cn70xx;
+       struct cvmx_pcieepx_cfg002_s cn70xxp1;
+       struct cvmx_pcieepx_cfg002_s cn73xx;
+       struct cvmx_pcieepx_cfg002_s cn78xx;
+       struct cvmx_pcieepx_cfg002_s cn78xxp1;
+       struct cvmx_pcieepx_cfg002_s cnf71xx;
+       struct cvmx_pcieepx_cfg002_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg002 cvmx_pcieepx_cfg002_t;
+
+/**
+ * cvmx_pcieep#_cfg003
+ *
+ * This register contains the fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg003 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg003_s {
+               u32 bist : 8;
+               u32 mfd : 1;
+               u32 chf : 7;
+               u32 lt : 8;
+               u32 cls : 8;
+       } s;
+       struct cvmx_pcieepx_cfg003_s cn52xx;
+       struct cvmx_pcieepx_cfg003_s cn52xxp1;
+       struct cvmx_pcieepx_cfg003_s cn56xx;
+       struct cvmx_pcieepx_cfg003_s cn56xxp1;
+       struct cvmx_pcieepx_cfg003_s cn61xx;
+       struct cvmx_pcieepx_cfg003_s cn63xx;
+       struct cvmx_pcieepx_cfg003_s cn63xxp1;
+       struct cvmx_pcieepx_cfg003_s cn66xx;
+       struct cvmx_pcieepx_cfg003_s cn68xx;
+       struct cvmx_pcieepx_cfg003_s cn68xxp1;
+       struct cvmx_pcieepx_cfg003_s cn70xx;
+       struct cvmx_pcieepx_cfg003_s cn70xxp1;
+       struct cvmx_pcieepx_cfg003_s cn73xx;
+       struct cvmx_pcieepx_cfg003_s cn78xx;
+       struct cvmx_pcieepx_cfg003_s cn78xxp1;
+       struct cvmx_pcieepx_cfg003_s cnf71xx;
+       struct cvmx_pcieepx_cfg003_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg003 cvmx_pcieepx_cfg003_t;
+
+/**
+ * cvmx_pcieep#_cfg004
+ *
+ * This register contains the fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg004 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg004_s {
+               u32 reserved_4_31 : 28;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } s;
+       struct cvmx_pcieepx_cfg004_cn52xx {
+               u32 lbab : 18;
+               u32 reserved_4_13 : 10;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg004_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg004_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg004_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg004_cn52xx cn61xx;
+       struct cvmx_pcieepx_cfg004_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg004_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg004_cn52xx cn66xx;
+       struct cvmx_pcieepx_cfg004_cn52xx cn68xx;
+       struct cvmx_pcieepx_cfg004_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg004_cn52xx cn70xx;
+       struct cvmx_pcieepx_cfg004_cn52xx cn70xxp1;
+       struct cvmx_pcieepx_cfg004_cn73xx {
+               u32 lbab : 9;
+               u32 reserved_4_22 : 19;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg004_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg004_cn78xxp1 {
+               u32 lbab : 17;
+               u32 reserved_4_14 : 11;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } cn78xxp1;
+       struct cvmx_pcieepx_cfg004_cn52xx cnf71xx;
+       struct cvmx_pcieepx_cfg004_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg004 cvmx_pcieepx_cfg004_t;
+
+/**
+ * cvmx_pcieep#_cfg004_mask
+ *
+ * The BAR 0 mask register is invisible to host software and not readable from the application.
+ * The BAR 0 mask register is only writable through PEM()_CFG_WR.
+ */
+union cvmx_pcieepx_cfg004_mask {
+       u32 u32;
+       struct cvmx_pcieepx_cfg004_mask_s {
+               u32 lmask : 31;
+               u32 enb : 1;
+       } s;
+       struct cvmx_pcieepx_cfg004_mask_s cn52xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn52xxp1;
+       struct cvmx_pcieepx_cfg004_mask_s cn56xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn56xxp1;
+       struct cvmx_pcieepx_cfg004_mask_s cn61xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn63xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn63xxp1;
+       struct cvmx_pcieepx_cfg004_mask_s cn66xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn68xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn68xxp1;
+       struct cvmx_pcieepx_cfg004_mask_s cn70xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn70xxp1;
+       struct cvmx_pcieepx_cfg004_mask_s cn73xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn78xx;
+       struct cvmx_pcieepx_cfg004_mask_s cn78xxp1;
+       struct cvmx_pcieepx_cfg004_mask_s cnf71xx;
+       struct cvmx_pcieepx_cfg004_mask_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg004_mask cvmx_pcieepx_cfg004_mask_t;
+
+/**
+ * cvmx_pcieep#_cfg005
+ *
+ * This register contains the sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg005 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg005_s {
+               u32 ubab : 32;
+       } s;
+       struct cvmx_pcieepx_cfg005_s cn52xx;
+       struct cvmx_pcieepx_cfg005_s cn52xxp1;
+       struct cvmx_pcieepx_cfg005_s cn56xx;
+       struct cvmx_pcieepx_cfg005_s cn56xxp1;
+       struct cvmx_pcieepx_cfg005_s cn61xx;
+       struct cvmx_pcieepx_cfg005_s cn63xx;
+       struct cvmx_pcieepx_cfg005_s cn63xxp1;
+       struct cvmx_pcieepx_cfg005_s cn66xx;
+       struct cvmx_pcieepx_cfg005_s cn68xx;
+       struct cvmx_pcieepx_cfg005_s cn68xxp1;
+       struct cvmx_pcieepx_cfg005_s cn70xx;
+       struct cvmx_pcieepx_cfg005_s cn70xxp1;
+       struct cvmx_pcieepx_cfg005_s cn73xx;
+       struct cvmx_pcieepx_cfg005_s cn78xx;
+       struct cvmx_pcieepx_cfg005_s cn78xxp1;
+       struct cvmx_pcieepx_cfg005_s cnf71xx;
+       struct cvmx_pcieepx_cfg005_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg005 cvmx_pcieepx_cfg005_t;
+
+/**
+ * cvmx_pcieep#_cfg005_mask
+ *
+ * The BAR 0 mask register is invisible to host software and not readable from the application.
+ * The BAR 0 mask register is only writable through PEM()_CFG_WR.
+ */
+union cvmx_pcieepx_cfg005_mask {
+       u32 u32;
+       struct cvmx_pcieepx_cfg005_mask_s {
+               u32 umask : 32;
+       } s;
+       struct cvmx_pcieepx_cfg005_mask_s cn52xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn52xxp1;
+       struct cvmx_pcieepx_cfg005_mask_s cn56xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn56xxp1;
+       struct cvmx_pcieepx_cfg005_mask_s cn61xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn63xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn63xxp1;
+       struct cvmx_pcieepx_cfg005_mask_s cn66xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn68xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn68xxp1;
+       struct cvmx_pcieepx_cfg005_mask_s cn70xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn70xxp1;
+       struct cvmx_pcieepx_cfg005_mask_s cn73xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn78xx;
+       struct cvmx_pcieepx_cfg005_mask_s cn78xxp1;
+       struct cvmx_pcieepx_cfg005_mask_s cnf71xx;
+       struct cvmx_pcieepx_cfg005_mask_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg005_mask cvmx_pcieepx_cfg005_mask_t;
+
+/**
+ * cvmx_pcieep#_cfg006
+ *
+ * This register contains the seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg006 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg006_s {
+               u32 lbab : 6;
+               u32 reserved_4_25 : 22;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } s;
+       struct cvmx_pcieepx_cfg006_s cn52xx;
+       struct cvmx_pcieepx_cfg006_s cn52xxp1;
+       struct cvmx_pcieepx_cfg006_s cn56xx;
+       struct cvmx_pcieepx_cfg006_s cn56xxp1;
+       struct cvmx_pcieepx_cfg006_s cn61xx;
+       struct cvmx_pcieepx_cfg006_s cn63xx;
+       struct cvmx_pcieepx_cfg006_s cn63xxp1;
+       struct cvmx_pcieepx_cfg006_s cn66xx;
+       struct cvmx_pcieepx_cfg006_s cn68xx;
+       struct cvmx_pcieepx_cfg006_s cn68xxp1;
+       struct cvmx_pcieepx_cfg006_s cn70xx;
+       struct cvmx_pcieepx_cfg006_s cn70xxp1;
+       struct cvmx_pcieepx_cfg006_s cn73xx;
+       struct cvmx_pcieepx_cfg006_s cn78xx;
+       struct cvmx_pcieepx_cfg006_s cn78xxp1;
+       struct cvmx_pcieepx_cfg006_s cnf71xx;
+       struct cvmx_pcieepx_cfg006_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg006 cvmx_pcieepx_cfg006_t;
+
+/**
+ * cvmx_pcieep#_cfg006_mask
+ *
+ * The BAR 1 mask register is invisible to host software and not readable from the application.
+ * The BAR 1 mask register is only writable through PEM()_CFG_WR.
+ */
+union cvmx_pcieepx_cfg006_mask {
+       u32 u32;
+       struct cvmx_pcieepx_cfg006_mask_s {
+               u32 lmask : 31;
+               u32 enb : 1;
+       } s;
+       struct cvmx_pcieepx_cfg006_mask_s cn52xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn52xxp1;
+       struct cvmx_pcieepx_cfg006_mask_s cn56xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn56xxp1;
+       struct cvmx_pcieepx_cfg006_mask_s cn61xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn63xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn63xxp1;
+       struct cvmx_pcieepx_cfg006_mask_s cn66xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn68xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn68xxp1;
+       struct cvmx_pcieepx_cfg006_mask_s cn70xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn70xxp1;
+       struct cvmx_pcieepx_cfg006_mask_s cn73xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn78xx;
+       struct cvmx_pcieepx_cfg006_mask_s cn78xxp1;
+       struct cvmx_pcieepx_cfg006_mask_s cnf71xx;
+       struct cvmx_pcieepx_cfg006_mask_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg006_mask cvmx_pcieepx_cfg006_mask_t;
+
+/**
+ * cvmx_pcieep#_cfg007
+ *
+ * This register contains the eighth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg007 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg007_s {
+               u32 ubab : 32;
+       } s;
+       struct cvmx_pcieepx_cfg007_s cn52xx;
+       struct cvmx_pcieepx_cfg007_s cn52xxp1;
+       struct cvmx_pcieepx_cfg007_s cn56xx;
+       struct cvmx_pcieepx_cfg007_s cn56xxp1;
+       struct cvmx_pcieepx_cfg007_s cn61xx;
+       struct cvmx_pcieepx_cfg007_s cn63xx;
+       struct cvmx_pcieepx_cfg007_s cn63xxp1;
+       struct cvmx_pcieepx_cfg007_s cn66xx;
+       struct cvmx_pcieepx_cfg007_s cn68xx;
+       struct cvmx_pcieepx_cfg007_s cn68xxp1;
+       struct cvmx_pcieepx_cfg007_s cn70xx;
+       struct cvmx_pcieepx_cfg007_s cn70xxp1;
+       struct cvmx_pcieepx_cfg007_s cn73xx;
+       struct cvmx_pcieepx_cfg007_s cn78xx;
+       struct cvmx_pcieepx_cfg007_s cn78xxp1;
+       struct cvmx_pcieepx_cfg007_s cnf71xx;
+       struct cvmx_pcieepx_cfg007_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg007 cvmx_pcieepx_cfg007_t;
+
+/**
+ * cvmx_pcieep#_cfg007_mask
+ *
+ * The BAR 1 mask register is invisible to host software and not readable from the application.
+ * The BAR 1 mask register is only writable through PEM()_CFG_WR.
+ */
+union cvmx_pcieepx_cfg007_mask {
+       u32 u32;
+       struct cvmx_pcieepx_cfg007_mask_s {
+               u32 umask : 32;
+       } s;
+       struct cvmx_pcieepx_cfg007_mask_s cn52xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn52xxp1;
+       struct cvmx_pcieepx_cfg007_mask_s cn56xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn56xxp1;
+       struct cvmx_pcieepx_cfg007_mask_s cn61xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn63xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn63xxp1;
+       struct cvmx_pcieepx_cfg007_mask_s cn66xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn68xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn68xxp1;
+       struct cvmx_pcieepx_cfg007_mask_s cn70xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn70xxp1;
+       struct cvmx_pcieepx_cfg007_mask_s cn73xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn78xx;
+       struct cvmx_pcieepx_cfg007_mask_s cn78xxp1;
+       struct cvmx_pcieepx_cfg007_mask_s cnf71xx;
+       struct cvmx_pcieepx_cfg007_mask_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg007_mask cvmx_pcieepx_cfg007_mask_t;
+
+/**
+ * cvmx_pcieep#_cfg008
+ *
+ * This register contains the ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg008 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg008_s {
+               u32 lbab : 12;
+               u32 reserved_4_19 : 16;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } s;
+       struct cvmx_pcieepx_cfg008_cn52xx {
+               u32 reserved_4_31 : 28;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg008_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg008_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg008_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg008_cn52xx cn61xx;
+       struct cvmx_pcieepx_cfg008_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg008_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg008_cn52xx cn66xx;
+       struct cvmx_pcieepx_cfg008_cn52xx cn68xx;
+       struct cvmx_pcieepx_cfg008_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg008_s cn70xx;
+       struct cvmx_pcieepx_cfg008_s cn70xxp1;
+       struct cvmx_pcieepx_cfg008_s cn73xx;
+       struct cvmx_pcieepx_cfg008_s cn78xx;
+       struct cvmx_pcieepx_cfg008_s cn78xxp1;
+       struct cvmx_pcieepx_cfg008_cn52xx cnf71xx;
+       struct cvmx_pcieepx_cfg008_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg008 cvmx_pcieepx_cfg008_t;
+
+/**
+ * cvmx_pcieep#_cfg008_mask
+ *
+ * The BAR 2 mask register is invisible to host software and not readable from the application.
+ * The BAR 2 mask register is only writable through PEM()_CFG_WR.
+ */
+union cvmx_pcieepx_cfg008_mask {
+       u32 u32;
+       struct cvmx_pcieepx_cfg008_mask_s {
+               u32 lmask : 31;
+               u32 enb : 1;
+       } s;
+       struct cvmx_pcieepx_cfg008_mask_s cn52xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn52xxp1;
+       struct cvmx_pcieepx_cfg008_mask_s cn56xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn56xxp1;
+       struct cvmx_pcieepx_cfg008_mask_s cn61xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn63xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn63xxp1;
+       struct cvmx_pcieepx_cfg008_mask_s cn66xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn68xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn68xxp1;
+       struct cvmx_pcieepx_cfg008_mask_s cn70xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn70xxp1;
+       struct cvmx_pcieepx_cfg008_mask_s cn73xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn78xx;
+       struct cvmx_pcieepx_cfg008_mask_s cn78xxp1;
+       struct cvmx_pcieepx_cfg008_mask_s cnf71xx;
+       struct cvmx_pcieepx_cfg008_mask_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg008_mask cvmx_pcieepx_cfg008_mask_t;
+
+/**
+ * cvmx_pcieep#_cfg009
+ *
+ * This register contains the tenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg009 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg009_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg009_cn52xx {
+               u32 ubab : 25;
+               u32 reserved_0_6 : 7;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg009_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg009_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg009_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg009_cn61xx {
+               u32 ubab : 23;
+               u32 reserved_0_8 : 9;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg009_cn61xx cn63xx;
+       struct cvmx_pcieepx_cfg009_cn61xx cn63xxp1;
+       struct cvmx_pcieepx_cfg009_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg009_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg009_cn61xx cn68xxp1;
+       struct cvmx_pcieepx_cfg009_cn70xx {
+               u32 ubab : 32;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg009_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg009_cn70xx cn73xx;
+       struct cvmx_pcieepx_cfg009_cn70xx cn78xx;
+       struct cvmx_pcieepx_cfg009_cn70xx cn78xxp1;
+       struct cvmx_pcieepx_cfg009_cn61xx cnf71xx;
+       struct cvmx_pcieepx_cfg009_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg009 cvmx_pcieepx_cfg009_t;
+
+/**
+ * cvmx_pcieep#_cfg009_mask
+ *
+ * The BAR 2 mask register is invisible to host software and not readable from the application.
+ * The BAR 2 mask register is only writable through PEM()_CFG_WR.
+ */
+union cvmx_pcieepx_cfg009_mask {
+       u32 u32;
+       struct cvmx_pcieepx_cfg009_mask_s {
+               u32 umask : 32;
+       } s;
+       struct cvmx_pcieepx_cfg009_mask_s cn52xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn52xxp1;
+       struct cvmx_pcieepx_cfg009_mask_s cn56xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn56xxp1;
+       struct cvmx_pcieepx_cfg009_mask_s cn61xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn63xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn63xxp1;
+       struct cvmx_pcieepx_cfg009_mask_s cn66xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn68xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn68xxp1;
+       struct cvmx_pcieepx_cfg009_mask_s cn70xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn70xxp1;
+       struct cvmx_pcieepx_cfg009_mask_s cn73xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn78xx;
+       struct cvmx_pcieepx_cfg009_mask_s cn78xxp1;
+       struct cvmx_pcieepx_cfg009_mask_s cnf71xx;
+       struct cvmx_pcieepx_cfg009_mask_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg009_mask cvmx_pcieepx_cfg009_mask_t;
+
+/**
+ * cvmx_pcieep#_cfg010
+ *
+ * This register contains the eleventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg010 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg010_s {
+               u32 cisp : 32;
+       } s;
+       struct cvmx_pcieepx_cfg010_s cn52xx;
+       struct cvmx_pcieepx_cfg010_s cn52xxp1;
+       struct cvmx_pcieepx_cfg010_s cn56xx;
+       struct cvmx_pcieepx_cfg010_s cn56xxp1;
+       struct cvmx_pcieepx_cfg010_s cn61xx;
+       struct cvmx_pcieepx_cfg010_s cn63xx;
+       struct cvmx_pcieepx_cfg010_s cn63xxp1;
+       struct cvmx_pcieepx_cfg010_s cn66xx;
+       struct cvmx_pcieepx_cfg010_s cn68xx;
+       struct cvmx_pcieepx_cfg010_s cn68xxp1;
+       struct cvmx_pcieepx_cfg010_s cn70xx;
+       struct cvmx_pcieepx_cfg010_s cn70xxp1;
+       struct cvmx_pcieepx_cfg010_s cn73xx;
+       struct cvmx_pcieepx_cfg010_s cn78xx;
+       struct cvmx_pcieepx_cfg010_s cn78xxp1;
+       struct cvmx_pcieepx_cfg010_s cnf71xx;
+       struct cvmx_pcieepx_cfg010_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg010 cvmx_pcieepx_cfg010_t;
+
+/**
+ * cvmx_pcieep#_cfg011
+ *
+ * This register contains the twelfth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg011 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg011_s {
+               u32 ssid : 16;
+               u32 ssvid : 16;
+       } s;
+       struct cvmx_pcieepx_cfg011_s cn52xx;
+       struct cvmx_pcieepx_cfg011_s cn52xxp1;
+       struct cvmx_pcieepx_cfg011_s cn56xx;
+       struct cvmx_pcieepx_cfg011_s cn56xxp1;
+       struct cvmx_pcieepx_cfg011_s cn61xx;
+       struct cvmx_pcieepx_cfg011_s cn63xx;
+       struct cvmx_pcieepx_cfg011_s cn63xxp1;
+       struct cvmx_pcieepx_cfg011_s cn66xx;
+       struct cvmx_pcieepx_cfg011_s cn68xx;
+       struct cvmx_pcieepx_cfg011_s cn68xxp1;
+       struct cvmx_pcieepx_cfg011_s cn70xx;
+       struct cvmx_pcieepx_cfg011_s cn70xxp1;
+       struct cvmx_pcieepx_cfg011_s cn73xx;
+       struct cvmx_pcieepx_cfg011_s cn78xx;
+       struct cvmx_pcieepx_cfg011_s cn78xxp1;
+       struct cvmx_pcieepx_cfg011_s cnf71xx;
+       struct cvmx_pcieepx_cfg011_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg011 cvmx_pcieepx_cfg011_t;
+
+/**
+ * cvmx_pcieep#_cfg012
+ *
+ * This register contains the thirteenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg012 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg012_s {
+               u32 eraddr : 16;
+               u32 reserved_1_15 : 15;
+               u32 er_en : 1;
+       } s;
+       struct cvmx_pcieepx_cfg012_s cn52xx;
+       struct cvmx_pcieepx_cfg012_s cn52xxp1;
+       struct cvmx_pcieepx_cfg012_s cn56xx;
+       struct cvmx_pcieepx_cfg012_s cn56xxp1;
+       struct cvmx_pcieepx_cfg012_s cn61xx;
+       struct cvmx_pcieepx_cfg012_s cn63xx;
+       struct cvmx_pcieepx_cfg012_s cn63xxp1;
+       struct cvmx_pcieepx_cfg012_s cn66xx;
+       struct cvmx_pcieepx_cfg012_s cn68xx;
+       struct cvmx_pcieepx_cfg012_s cn68xxp1;
+       struct cvmx_pcieepx_cfg012_s cn70xx;
+       struct cvmx_pcieepx_cfg012_s cn70xxp1;
+       struct cvmx_pcieepx_cfg012_s cn73xx;
+       struct cvmx_pcieepx_cfg012_s cn78xx;
+       struct cvmx_pcieepx_cfg012_s cn78xxp1;
+       struct cvmx_pcieepx_cfg012_s cnf71xx;
+       struct cvmx_pcieepx_cfg012_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg012 cvmx_pcieepx_cfg012_t;
+
+/**
+ * cvmx_pcieep#_cfg012_mask
+ *
+ * The ROM mask register is invisible to host software and not readable from the application. The
+ * ROM mask register is only writable through PEM()_CFG_WR.
+ */
+union cvmx_pcieepx_cfg012_mask {
+       u32 u32;
+       struct cvmx_pcieepx_cfg012_mask_s {
+               u32 mask : 31;
+               u32 enb : 1;
+       } s;
+       struct cvmx_pcieepx_cfg012_mask_s cn52xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn52xxp1;
+       struct cvmx_pcieepx_cfg012_mask_s cn56xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn56xxp1;
+       struct cvmx_pcieepx_cfg012_mask_s cn61xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn63xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn63xxp1;
+       struct cvmx_pcieepx_cfg012_mask_s cn66xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn68xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn68xxp1;
+       struct cvmx_pcieepx_cfg012_mask_s cn70xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn70xxp1;
+       struct cvmx_pcieepx_cfg012_mask_s cn73xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn78xx;
+       struct cvmx_pcieepx_cfg012_mask_s cn78xxp1;
+       struct cvmx_pcieepx_cfg012_mask_s cnf71xx;
+       struct cvmx_pcieepx_cfg012_mask_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg012_mask cvmx_pcieepx_cfg012_mask_t;
+
+/**
+ * cvmx_pcieep#_cfg013
+ *
+ * This register contains the fourteenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg013 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg013_s {
+               u32 reserved_8_31 : 24;
+               u32 cp : 8;
+       } s;
+       struct cvmx_pcieepx_cfg013_s cn52xx;
+       struct cvmx_pcieepx_cfg013_s cn52xxp1;
+       struct cvmx_pcieepx_cfg013_s cn56xx;
+       struct cvmx_pcieepx_cfg013_s cn56xxp1;
+       struct cvmx_pcieepx_cfg013_s cn61xx;
+       struct cvmx_pcieepx_cfg013_s cn63xx;
+       struct cvmx_pcieepx_cfg013_s cn63xxp1;
+       struct cvmx_pcieepx_cfg013_s cn66xx;
+       struct cvmx_pcieepx_cfg013_s cn68xx;
+       struct cvmx_pcieepx_cfg013_s cn68xxp1;
+       struct cvmx_pcieepx_cfg013_s cn70xx;
+       struct cvmx_pcieepx_cfg013_s cn70xxp1;
+       struct cvmx_pcieepx_cfg013_s cn73xx;
+       struct cvmx_pcieepx_cfg013_s cn78xx;
+       struct cvmx_pcieepx_cfg013_s cn78xxp1;
+       struct cvmx_pcieepx_cfg013_s cnf71xx;
+       struct cvmx_pcieepx_cfg013_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg013 cvmx_pcieepx_cfg013_t;
+
+/**
+ * cvmx_pcieep#_cfg015
+ *
+ * This register contains the sixteenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg015 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg015_s {
+               u32 ml : 8;
+               u32 mg : 8;
+               u32 inta : 8;
+               u32 il : 8;
+       } s;
+       struct cvmx_pcieepx_cfg015_s cn52xx;
+       struct cvmx_pcieepx_cfg015_s cn52xxp1;
+       struct cvmx_pcieepx_cfg015_s cn56xx;
+       struct cvmx_pcieepx_cfg015_s cn56xxp1;
+       struct cvmx_pcieepx_cfg015_s cn61xx;
+       struct cvmx_pcieepx_cfg015_s cn63xx;
+       struct cvmx_pcieepx_cfg015_s cn63xxp1;
+       struct cvmx_pcieepx_cfg015_s cn66xx;
+       struct cvmx_pcieepx_cfg015_s cn68xx;
+       struct cvmx_pcieepx_cfg015_s cn68xxp1;
+       struct cvmx_pcieepx_cfg015_s cn70xx;
+       struct cvmx_pcieepx_cfg015_s cn70xxp1;
+       struct cvmx_pcieepx_cfg015_s cn73xx;
+       struct cvmx_pcieepx_cfg015_s cn78xx;
+       struct cvmx_pcieepx_cfg015_s cn78xxp1;
+       struct cvmx_pcieepx_cfg015_s cnf71xx;
+       struct cvmx_pcieepx_cfg015_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg015 cvmx_pcieepx_cfg015_t;
+
+/**
+ * cvmx_pcieep#_cfg016
+ *
+ * This register contains the seventeenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg016 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg016_s {
+               u32 pmes : 5;
+               u32 d2s : 1;
+               u32 d1s : 1;
+               u32 auxc : 3;
+               u32 dsi : 1;
+               u32 reserved_20_20 : 1;
+               u32 pme_clock : 1;
+               u32 pmsv : 3;
+               u32 ncp : 8;
+               u32 pmcid : 8;
+       } s;
+       struct cvmx_pcieepx_cfg016_s cn52xx;
+       struct cvmx_pcieepx_cfg016_s cn52xxp1;
+       struct cvmx_pcieepx_cfg016_s cn56xx;
+       struct cvmx_pcieepx_cfg016_s cn56xxp1;
+       struct cvmx_pcieepx_cfg016_s cn61xx;
+       struct cvmx_pcieepx_cfg016_s cn63xx;
+       struct cvmx_pcieepx_cfg016_s cn63xxp1;
+       struct cvmx_pcieepx_cfg016_s cn66xx;
+       struct cvmx_pcieepx_cfg016_s cn68xx;
+       struct cvmx_pcieepx_cfg016_s cn68xxp1;
+       struct cvmx_pcieepx_cfg016_s cn70xx;
+       struct cvmx_pcieepx_cfg016_s cn70xxp1;
+       struct cvmx_pcieepx_cfg016_s cn73xx;
+       struct cvmx_pcieepx_cfg016_s cn78xx;
+       struct cvmx_pcieepx_cfg016_s cn78xxp1;
+       struct cvmx_pcieepx_cfg016_s cnf71xx;
+       struct cvmx_pcieepx_cfg016_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg016 cvmx_pcieepx_cfg016_t;
+
+/**
+ * cvmx_pcieep#_cfg017
+ *
+ * This register contains the eighteenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg017 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg017_s {
+               u32 pmdia : 8;
+               u32 bpccee : 1;
+               u32 bd3h : 1;
+               u32 reserved_16_21 : 6;
+               u32 pmess : 1;
+               u32 pmedsia : 2;
+               u32 pmds : 4;
+               u32 pmeens : 1;
+               u32 reserved_4_7 : 4;
+               u32 nsr : 1;
+               u32 reserved_2_2 : 1;
+               u32 ps : 2;
+       } s;
+       struct cvmx_pcieepx_cfg017_s cn52xx;
+       struct cvmx_pcieepx_cfg017_s cn52xxp1;
+       struct cvmx_pcieepx_cfg017_s cn56xx;
+       struct cvmx_pcieepx_cfg017_s cn56xxp1;
+       struct cvmx_pcieepx_cfg017_s cn61xx;
+       struct cvmx_pcieepx_cfg017_s cn63xx;
+       struct cvmx_pcieepx_cfg017_s cn63xxp1;
+       struct cvmx_pcieepx_cfg017_s cn66xx;
+       struct cvmx_pcieepx_cfg017_s cn68xx;
+       struct cvmx_pcieepx_cfg017_s cn68xxp1;
+       struct cvmx_pcieepx_cfg017_s cn70xx;
+       struct cvmx_pcieepx_cfg017_s cn70xxp1;
+       struct cvmx_pcieepx_cfg017_s cn73xx;
+       struct cvmx_pcieepx_cfg017_s cn78xx;
+       struct cvmx_pcieepx_cfg017_s cn78xxp1;
+       struct cvmx_pcieepx_cfg017_s cnf71xx;
+       struct cvmx_pcieepx_cfg017_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg017 cvmx_pcieepx_cfg017_t;
+
+/**
+ * cvmx_pcieep#_cfg020
+ *
+ * This register contains the twenty-first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg020 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg020_s {
+               u32 reserved_25_31 : 7;
+               u32 pvm : 1;
+               u32 m64 : 1;
+               u32 mme : 3;
+               u32 mmc : 3;
+               u32 msien : 1;
+               u32 ncp : 8;
+               u32 msicid : 8;
+       } s;
+       struct cvmx_pcieepx_cfg020_cn52xx {
+               u32 reserved_24_31 : 8;
+               u32 m64 : 1;
+               u32 mme : 3;
+               u32 mmc : 3;
+               u32 msien : 1;
+               u32 ncp : 8;
+               u32 msicid : 8;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg020_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg020_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg020_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg020_s cn61xx;
+       struct cvmx_pcieepx_cfg020_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg020_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg020_s cn66xx;
+       struct cvmx_pcieepx_cfg020_s cn68xx;
+       struct cvmx_pcieepx_cfg020_s cn68xxp1;
+       struct cvmx_pcieepx_cfg020_s cn70xx;
+       struct cvmx_pcieepx_cfg020_s cn70xxp1;
+       struct cvmx_pcieepx_cfg020_s cn73xx;
+       struct cvmx_pcieepx_cfg020_s cn78xx;
+       struct cvmx_pcieepx_cfg020_s cn78xxp1;
+       struct cvmx_pcieepx_cfg020_s cnf71xx;
+       struct cvmx_pcieepx_cfg020_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg020 cvmx_pcieepx_cfg020_t;
+
+/**
+ * cvmx_pcieep#_cfg021
+ *
+ * This register contains the twenty-second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg021 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg021_s {
+               u32 lmsi : 30;
+               u32 reserved_0_1 : 2;
+       } s;
+       struct cvmx_pcieepx_cfg021_s cn52xx;
+       struct cvmx_pcieepx_cfg021_s cn52xxp1;
+       struct cvmx_pcieepx_cfg021_s cn56xx;
+       struct cvmx_pcieepx_cfg021_s cn56xxp1;
+       struct cvmx_pcieepx_cfg021_s cn61xx;
+       struct cvmx_pcieepx_cfg021_s cn63xx;
+       struct cvmx_pcieepx_cfg021_s cn63xxp1;
+       struct cvmx_pcieepx_cfg021_s cn66xx;
+       struct cvmx_pcieepx_cfg021_s cn68xx;
+       struct cvmx_pcieepx_cfg021_s cn68xxp1;
+       struct cvmx_pcieepx_cfg021_s cn70xx;
+       struct cvmx_pcieepx_cfg021_s cn70xxp1;
+       struct cvmx_pcieepx_cfg021_s cn73xx;
+       struct cvmx_pcieepx_cfg021_s cn78xx;
+       struct cvmx_pcieepx_cfg021_s cn78xxp1;
+       struct cvmx_pcieepx_cfg021_s cnf71xx;
+       struct cvmx_pcieepx_cfg021_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg021 cvmx_pcieepx_cfg021_t;
+
+/**
+ * cvmx_pcieep#_cfg022
+ *
+ * This register contains the twenty-third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg022 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg022_s {
+               u32 umsi : 32;
+       } s;
+       struct cvmx_pcieepx_cfg022_s cn52xx;
+       struct cvmx_pcieepx_cfg022_s cn52xxp1;
+       struct cvmx_pcieepx_cfg022_s cn56xx;
+       struct cvmx_pcieepx_cfg022_s cn56xxp1;
+       struct cvmx_pcieepx_cfg022_s cn61xx;
+       struct cvmx_pcieepx_cfg022_s cn63xx;
+       struct cvmx_pcieepx_cfg022_s cn63xxp1;
+       struct cvmx_pcieepx_cfg022_s cn66xx;
+       struct cvmx_pcieepx_cfg022_s cn68xx;
+       struct cvmx_pcieepx_cfg022_s cn68xxp1;
+       struct cvmx_pcieepx_cfg022_s cn70xx;
+       struct cvmx_pcieepx_cfg022_s cn70xxp1;
+       struct cvmx_pcieepx_cfg022_s cn73xx;
+       struct cvmx_pcieepx_cfg022_s cn78xx;
+       struct cvmx_pcieepx_cfg022_s cn78xxp1;
+       struct cvmx_pcieepx_cfg022_s cnf71xx;
+       struct cvmx_pcieepx_cfg022_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg022 cvmx_pcieepx_cfg022_t;
+
+/**
+ * cvmx_pcieep#_cfg023
+ *
+ * This register contains the twenty-fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg023 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg023_s {
+               u32 reserved_16_31 : 16;
+               u32 msimd : 16;
+       } s;
+       struct cvmx_pcieepx_cfg023_s cn52xx;
+       struct cvmx_pcieepx_cfg023_s cn52xxp1;
+       struct cvmx_pcieepx_cfg023_s cn56xx;
+       struct cvmx_pcieepx_cfg023_s cn56xxp1;
+       struct cvmx_pcieepx_cfg023_s cn61xx;
+       struct cvmx_pcieepx_cfg023_s cn63xx;
+       struct cvmx_pcieepx_cfg023_s cn63xxp1;
+       struct cvmx_pcieepx_cfg023_s cn66xx;
+       struct cvmx_pcieepx_cfg023_s cn68xx;
+       struct cvmx_pcieepx_cfg023_s cn68xxp1;
+       struct cvmx_pcieepx_cfg023_s cn70xx;
+       struct cvmx_pcieepx_cfg023_s cn70xxp1;
+       struct cvmx_pcieepx_cfg023_s cn73xx;
+       struct cvmx_pcieepx_cfg023_s cn78xx;
+       struct cvmx_pcieepx_cfg023_s cn78xxp1;
+       struct cvmx_pcieepx_cfg023_s cnf71xx;
+       struct cvmx_pcieepx_cfg023_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg023 cvmx_pcieepx_cfg023_t;
+
+/**
+ * cvmx_pcieep#_cfg024
+ *
+ * This register contains the twenty-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg024 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg024_s {
+               u32 msimm : 32;
+       } s;
+       struct cvmx_pcieepx_cfg024_s cn70xx;
+       struct cvmx_pcieepx_cfg024_s cn70xxp1;
+       struct cvmx_pcieepx_cfg024_s cn73xx;
+       struct cvmx_pcieepx_cfg024_s cn78xx;
+       struct cvmx_pcieepx_cfg024_s cn78xxp1;
+       struct cvmx_pcieepx_cfg024_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg024 cvmx_pcieepx_cfg024_t;
+
+/**
+ * cvmx_pcieep#_cfg025
+ *
+ * This register contains the twenty-sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg025 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg025_s {
+               u32 msimp : 32;
+       } s;
+       struct cvmx_pcieepx_cfg025_s cn70xx;
+       struct cvmx_pcieepx_cfg025_s cn70xxp1;
+       struct cvmx_pcieepx_cfg025_s cn73xx;
+       struct cvmx_pcieepx_cfg025_s cn78xx;
+       struct cvmx_pcieepx_cfg025_s cn78xxp1;
+       struct cvmx_pcieepx_cfg025_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg025 cvmx_pcieepx_cfg025_t;
+
+/**
+ * cvmx_pcieep#_cfg028
+ *
+ * This register contains the twenty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg028 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg028_s {
+               u32 reserved_30_31 : 2;
+               u32 imn : 5;
+               u32 si : 1;
+               u32 dpt : 4;
+               u32 pciecv : 4;
+               u32 ncp : 8;
+               u32 pcieid : 8;
+       } s;
+       struct cvmx_pcieepx_cfg028_s cn52xx;
+       struct cvmx_pcieepx_cfg028_s cn52xxp1;
+       struct cvmx_pcieepx_cfg028_s cn56xx;
+       struct cvmx_pcieepx_cfg028_s cn56xxp1;
+       struct cvmx_pcieepx_cfg028_s cn61xx;
+       struct cvmx_pcieepx_cfg028_s cn63xx;
+       struct cvmx_pcieepx_cfg028_s cn63xxp1;
+       struct cvmx_pcieepx_cfg028_s cn66xx;
+       struct cvmx_pcieepx_cfg028_s cn68xx;
+       struct cvmx_pcieepx_cfg028_s cn68xxp1;
+       struct cvmx_pcieepx_cfg028_s cn70xx;
+       struct cvmx_pcieepx_cfg028_s cn70xxp1;
+       struct cvmx_pcieepx_cfg028_s cn73xx;
+       struct cvmx_pcieepx_cfg028_s cn78xx;
+       struct cvmx_pcieepx_cfg028_s cn78xxp1;
+       struct cvmx_pcieepx_cfg028_s cnf71xx;
+       struct cvmx_pcieepx_cfg028_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg028 cvmx_pcieepx_cfg028_t;
+
+/**
+ * cvmx_pcieep#_cfg029
+ *
+ * This register contains the thirtieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg029 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg029_s {
+               u32 reserved_28_31 : 4;
+               u32 cspls : 2;
+               u32 csplv : 8;
+               u32 reserved_16_17 : 2;
+               u32 rber : 1;
+               u32 reserved_12_14 : 3;
+               u32 el1al : 3;
+               u32 el0al : 3;
+               u32 etfs : 1;
+               u32 pfs : 2;
+               u32 mpss : 3;
+       } s;
+       struct cvmx_pcieepx_cfg029_s cn52xx;
+       struct cvmx_pcieepx_cfg029_s cn52xxp1;
+       struct cvmx_pcieepx_cfg029_s cn56xx;
+       struct cvmx_pcieepx_cfg029_s cn56xxp1;
+       struct cvmx_pcieepx_cfg029_cn61xx {
+               u32 reserved_29_31 : 3;
+               u32 flr_cap : 1;
+               u32 cspls : 2;
+               u32 csplv : 8;
+               u32 reserved_16_17 : 2;
+               u32 rber : 1;
+               u32 reserved_12_14 : 3;
+               u32 el1al : 3;
+               u32 el0al : 3;
+               u32 etfs : 1;
+               u32 pfs : 2;
+               u32 mpss : 3;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg029_s cn63xx;
+       struct cvmx_pcieepx_cfg029_s cn63xxp1;
+       struct cvmx_pcieepx_cfg029_cn66xx {
+               u32 reserved_29_31 : 3;
+               u32 flr : 1;
+               u32 cspls : 2;
+               u32 csplv : 8;
+               u32 reserved_16_17 : 2;
+               u32 rber : 1;
+               u32 reserved_12_14 : 3;
+               u32 el1al : 3;
+               u32 el0al : 3;
+               u32 etfs : 1;
+               u32 pfs : 2;
+               u32 mpss : 3;
+       } cn66xx;
+       struct cvmx_pcieepx_cfg029_cn66xx cn68xx;
+       struct cvmx_pcieepx_cfg029_cn66xx cn68xxp1;
+       struct cvmx_pcieepx_cfg029_cn61xx cn70xx;
+       struct cvmx_pcieepx_cfg029_cn61xx cn70xxp1;
+       struct cvmx_pcieepx_cfg029_cn61xx cn73xx;
+       struct cvmx_pcieepx_cfg029_cn61xx cn78xx;
+       struct cvmx_pcieepx_cfg029_cn61xx cn78xxp1;
+       struct cvmx_pcieepx_cfg029_cn61xx cnf71xx;
+       struct cvmx_pcieepx_cfg029_cn61xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg029 cvmx_pcieepx_cfg029_t;
+
+/**
+ * cvmx_pcieep#_cfg030
+ *
+ * This register contains the thirty-first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg030 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg030_s {
+               u32 reserved_22_31 : 10;
+               u32 tp : 1;
+               u32 ap_d : 1;
+               u32 ur_d : 1;
+               u32 fe_d : 1;
+               u32 nfe_d : 1;
+               u32 ce_d : 1;
+               u32 i_flr : 1;
+               u32 mrrs : 3;
+               u32 ns_en : 1;
+               u32 ap_en : 1;
+               u32 pf_en : 1;
+               u32 etf_en : 1;
+               u32 mps : 3;
+               u32 ro_en : 1;
+               u32 ur_en : 1;
+               u32 fe_en : 1;
+               u32 nfe_en : 1;
+               u32 ce_en : 1;
+       } s;
+       struct cvmx_pcieepx_cfg030_cn52xx {
+               u32 reserved_22_31 : 10;
+               u32 tp : 1;
+               u32 ap_d : 1;
+               u32 ur_d : 1;
+               u32 fe_d : 1;
+               u32 nfe_d : 1;
+               u32 ce_d : 1;
+               u32 reserved_15_15 : 1;
+               u32 mrrs : 3;
+               u32 ns_en : 1;
+               u32 ap_en : 1;
+               u32 pf_en : 1;
+               u32 etf_en : 1;
+               u32 mps : 3;
+               u32 ro_en : 1;
+               u32 ur_en : 1;
+               u32 fe_en : 1;
+               u32 nfe_en : 1;
+               u32 ce_en : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg030_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg030_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg030_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg030_s cn61xx;
+       struct cvmx_pcieepx_cfg030_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg030_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg030_s cn66xx;
+       struct cvmx_pcieepx_cfg030_s cn68xx;
+       struct cvmx_pcieepx_cfg030_s cn68xxp1;
+       struct cvmx_pcieepx_cfg030_s cn70xx;
+       struct cvmx_pcieepx_cfg030_s cn70xxp1;
+       struct cvmx_pcieepx_cfg030_s cn73xx;
+       struct cvmx_pcieepx_cfg030_s cn78xx;
+       struct cvmx_pcieepx_cfg030_s cn78xxp1;
+       struct cvmx_pcieepx_cfg030_s cnf71xx;
+       struct cvmx_pcieepx_cfg030_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg030 cvmx_pcieepx_cfg030_t;
+
+/**
+ * cvmx_pcieep#_cfg031
+ *
+ * This register contains the thirty-second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg031 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg031_s {
+               u32 pnum : 8;
+               u32 reserved_23_23 : 1;
+               u32 aspm : 1;
+               u32 lbnc : 1;
+               u32 dllarc : 1;
+               u32 sderc : 1;
+               u32 cpm : 1;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 aslpms : 2;
+               u32 mlw : 6;
+               u32 mls : 4;
+       } s;
+       struct cvmx_pcieepx_cfg031_cn52xx {
+               u32 pnum : 8;
+               u32 reserved_22_23 : 2;
+               u32 lbnc : 1;
+               u32 dllarc : 1;
+               u32 sderc : 1;
+               u32 cpm : 1;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 aslpms : 2;
+               u32 mlw : 6;
+               u32 mls : 4;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg031_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg031_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg031_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg031_s cn61xx;
+       struct cvmx_pcieepx_cfg031_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg031_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg031_s cn66xx;
+       struct cvmx_pcieepx_cfg031_s cn68xx;
+       struct cvmx_pcieepx_cfg031_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg031_s cn70xx;
+       struct cvmx_pcieepx_cfg031_s cn70xxp1;
+       struct cvmx_pcieepx_cfg031_s cn73xx;
+       struct cvmx_pcieepx_cfg031_s cn78xx;
+       struct cvmx_pcieepx_cfg031_s cn78xxp1;
+       struct cvmx_pcieepx_cfg031_s cnf71xx;
+       struct cvmx_pcieepx_cfg031_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg031 cvmx_pcieepx_cfg031_t;
+
+/**
+ * cvmx_pcieep#_cfg032
+ *
+ * This register contains the thirty-third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg032 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg032_s {
+               u32 lab : 1;
+               u32 lbm : 1;
+               u32 dlla : 1;
+               u32 scc : 1;
+               u32 lt : 1;
+               u32 reserved_26_26 : 1;
+               u32 nlw : 6;
+               u32 ls : 4;
+               u32 reserved_12_15 : 4;
+               u32 lab_int_enb : 1;
+               u32 lbm_int_enb : 1;
+               u32 hawd : 1;
+               u32 ecpm : 1;
+               u32 es : 1;
+               u32 ccc : 1;
+               u32 rl : 1;
+               u32 ld : 1;
+               u32 rcb : 1;
+               u32 reserved_2_2 : 1;
+               u32 aslpc : 2;
+       } s;
+       struct cvmx_pcieepx_cfg032_cn52xx {
+               u32 reserved_30_31 : 2;
+               u32 dlla : 1;
+               u32 scc : 1;
+               u32 lt : 1;
+               u32 reserved_26_26 : 1;
+               u32 nlw : 6;
+               u32 ls : 4;
+               u32 reserved_10_15 : 6;
+               u32 hawd : 1;
+               u32 ecpm : 1;
+               u32 es : 1;
+               u32 ccc : 1;
+               u32 rl : 1;
+               u32 ld : 1;
+               u32 rcb : 1;
+               u32 reserved_2_2 : 1;
+               u32 aslpc : 2;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg032_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg032_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg032_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg032_s cn61xx;
+       struct cvmx_pcieepx_cfg032_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg032_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg032_s cn66xx;
+       struct cvmx_pcieepx_cfg032_s cn68xx;
+       struct cvmx_pcieepx_cfg032_cn68xxp1 {
+               u32 reserved_30_31 : 2;
+               u32 dlla : 1;
+               u32 scc : 1;
+               u32 lt : 1;
+               u32 reserved_26_26 : 1;
+               u32 nlw : 6;
+               u32 ls : 4;
+               u32 reserved_12_15 : 4;
+               u32 lab_int_enb : 1;
+               u32 lbm_int_enb : 1;
+               u32 hawd : 1;
+               u32 ecpm : 1;
+               u32 es : 1;
+               u32 ccc : 1;
+               u32 rl : 1;
+               u32 ld : 1;
+               u32 rcb : 1;
+               u32 reserved_2_2 : 1;
+               u32 aslpc : 2;
+       } cn68xxp1;
+       struct cvmx_pcieepx_cfg032_s cn70xx;
+       struct cvmx_pcieepx_cfg032_s cn70xxp1;
+       struct cvmx_pcieepx_cfg032_s cn73xx;
+       struct cvmx_pcieepx_cfg032_s cn78xx;
+       struct cvmx_pcieepx_cfg032_s cn78xxp1;
+       struct cvmx_pcieepx_cfg032_s cnf71xx;
+       struct cvmx_pcieepx_cfg032_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg032 cvmx_pcieepx_cfg032_t;
+
+/**
+ * cvmx_pcieep#_cfg033
+ *
+ * PCIE_CFG033 = Thirty-fourth 32-bits of PCIE type 0 config space
+ * (Slot Capabilities Register)
+ */
+union cvmx_pcieepx_cfg033 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg033_s {
+               u32 ps_num : 13;
+               u32 nccs : 1;
+               u32 emip : 1;
+               u32 sp_ls : 2;
+               u32 sp_lv : 8;
+               u32 hp_c : 1;
+               u32 hp_s : 1;
+               u32 pip : 1;
+               u32 aip : 1;
+               u32 mrlsp : 1;
+               u32 pcp : 1;
+               u32 abp : 1;
+       } s;
+       struct cvmx_pcieepx_cfg033_s cn52xx;
+       struct cvmx_pcieepx_cfg033_s cn52xxp1;
+       struct cvmx_pcieepx_cfg033_s cn56xx;
+       struct cvmx_pcieepx_cfg033_s cn56xxp1;
+       struct cvmx_pcieepx_cfg033_s cn63xx;
+       struct cvmx_pcieepx_cfg033_s cn63xxp1;
+};
+
+typedef union cvmx_pcieepx_cfg033 cvmx_pcieepx_cfg033_t;
+
+/**
+ * cvmx_pcieep#_cfg034
+ *
+ * PCIE_CFG034 = Thirty-fifth 32-bits of PCIE type 0 config space
+ * (Slot Control Register/Slot Status Register)
+ */
+union cvmx_pcieepx_cfg034 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg034_s {
+               u32 reserved_25_31 : 7;
+               u32 dlls_c : 1;
+               u32 emis : 1;
+               u32 pds : 1;
+               u32 mrlss : 1;
+               u32 ccint_d : 1;
+               u32 pd_c : 1;
+               u32 mrls_c : 1;
+               u32 pf_d : 1;
+               u32 abp_d : 1;
+               u32 reserved_13_15 : 3;
+               u32 dlls_en : 1;
+               u32 emic : 1;
+               u32 pcc : 1;
+               u32 pic : 2;
+               u32 aic : 2;
+               u32 hpint_en : 1;
+               u32 ccint_en : 1;
+               u32 pd_en : 1;
+               u32 mrls_en : 1;
+               u32 pf_en : 1;
+               u32 abp_en : 1;
+       } s;
+       struct cvmx_pcieepx_cfg034_s cn52xx;
+       struct cvmx_pcieepx_cfg034_s cn52xxp1;
+       struct cvmx_pcieepx_cfg034_s cn56xx;
+       struct cvmx_pcieepx_cfg034_s cn56xxp1;
+       struct cvmx_pcieepx_cfg034_s cn63xx;
+       struct cvmx_pcieepx_cfg034_s cn63xxp1;
+};
+
+typedef union cvmx_pcieepx_cfg034 cvmx_pcieepx_cfg034_t;
+
+/**
+ * cvmx_pcieep#_cfg037
+ *
+ * This register contains the thirty-eighth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg037 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg037_s {
+               u32 reserved_24_31 : 8;
+               u32 meetp : 2;
+               u32 eetps : 1;
+               u32 effs : 1;
+               u32 obffs : 2;
+               u32 reserved_12_17 : 6;
+               u32 ltrs : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } s;
+       struct cvmx_pcieepx_cfg037_cn52xx {
+               u32 reserved_5_31 : 27;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg037_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg037_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg037_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg037_cn61xx {
+               u32 reserved_14_31 : 18;
+               u32 tph : 2;
+               u32 reserved_11_11 : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg037_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg037_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg037_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg037_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg037_cn61xx cn68xxp1;
+       struct cvmx_pcieepx_cfg037_cn61xx cn70xx;
+       struct cvmx_pcieepx_cfg037_cn61xx cn70xxp1;
+       struct cvmx_pcieepx_cfg037_cn73xx {
+               u32 reserved_24_31 : 8;
+               u32 meetp : 2;
+               u32 eetps : 1;
+               u32 effs : 1;
+               u32 obffs : 2;
+               u32 reserved_14_17 : 4;
+               u32 tphs : 2;
+               u32 ltrs : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg037_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg037_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg037_cnf71xx {
+               u32 reserved_20_31 : 12;
+               u32 obffs : 2;
+               u32 reserved_14_17 : 4;
+               u32 tphs : 2;
+               u32 ltrs : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cnf71xx;
+       struct cvmx_pcieepx_cfg037_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg037 cvmx_pcieepx_cfg037_t;
+
+/**
+ * cvmx_pcieep#_cfg038
+ *
+ * This register contains the thirty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg038 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg038_s {
+               u32 reserved_16_31 : 16;
+               u32 eetpb : 1;
+               u32 obffe : 2;
+               u32 reserved_11_12 : 2;
+               u32 ltre : 1;
+               u32 id0_cp : 1;
+               u32 id0_rq : 1;
+               u32 atom_op_eb : 1;
+               u32 atom_op : 1;
+               u32 ari : 1;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } s;
+       struct cvmx_pcieepx_cfg038_cn52xx {
+               u32 reserved_5_31 : 27;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg038_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg038_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg038_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg038_cn61xx {
+               u32 reserved_10_31 : 22;
+               u32 id0_cp : 1;
+               u32 id0_rq : 1;
+               u32 atom_op_eb : 1;
+               u32 atom_op : 1;
+               u32 ari : 1;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg038_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg038_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg038_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg038_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg038_cn61xx cn68xxp1;
+       struct cvmx_pcieepx_cfg038_cn61xx cn70xx;
+       struct cvmx_pcieepx_cfg038_cn61xx cn70xxp1;
+       struct cvmx_pcieepx_cfg038_s cn73xx;
+       struct cvmx_pcieepx_cfg038_s cn78xx;
+       struct cvmx_pcieepx_cfg038_s cn78xxp1;
+       struct cvmx_pcieepx_cfg038_cnf71xx {
+               u32 reserved_15_31 : 17;
+               u32 obffe : 2;
+               u32 reserved_11_12 : 2;
+               u32 ltre : 1;
+               u32 id0_cp : 1;
+               u32 id0_rq : 1;
+               u32 atom_op_eb : 1;
+               u32 atom_op : 1;
+               u32 ari : 1;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } cnf71xx;
+       struct cvmx_pcieepx_cfg038_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg038 cvmx_pcieepx_cfg038_t;
+
+/**
+ * cvmx_pcieep#_cfg039
+ *
+ * This register contains the fortieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg039 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg039_s {
+               u32 reserved_9_31 : 23;
+               u32 cls : 1;
+               u32 slsv : 7;
+               u32 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pcieepx_cfg039_cn52xx {
+               u32 reserved_0_31 : 32;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg039_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg039_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg039_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg039_s cn61xx;
+       struct cvmx_pcieepx_cfg039_s cn63xx;
+       struct cvmx_pcieepx_cfg039_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg039_s cn66xx;
+       struct cvmx_pcieepx_cfg039_s cn68xx;
+       struct cvmx_pcieepx_cfg039_s cn68xxp1;
+       struct cvmx_pcieepx_cfg039_s cn70xx;
+       struct cvmx_pcieepx_cfg039_s cn70xxp1;
+       struct cvmx_pcieepx_cfg039_s cn73xx;
+       struct cvmx_pcieepx_cfg039_s cn78xx;
+       struct cvmx_pcieepx_cfg039_s cn78xxp1;
+       struct cvmx_pcieepx_cfg039_s cnf71xx;
+       struct cvmx_pcieepx_cfg039_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg039 cvmx_pcieepx_cfg039_t;
+
+/**
+ * cvmx_pcieep#_cfg040
+ *
+ * This register contains the forty-first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg040 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg040_s {
+               u32 reserved_22_31 : 10;
+               u32 ler : 1;
+               u32 ep3s : 1;
+               u32 ep2s : 1;
+               u32 ep1s : 1;
+               u32 eqc : 1;
+               u32 cdl : 1;
+               u32 cde : 4;
+               u32 csos : 1;
+               u32 emc : 1;
+               u32 tm : 3;
+               u32 sde : 1;
+               u32 hasd : 1;
+               u32 ec : 1;
+               u32 tls : 4;
+       } s;
+       struct cvmx_pcieepx_cfg040_cn52xx {
+               u32 reserved_0_31 : 32;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg040_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg040_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg040_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg040_cn61xx {
+               u32 reserved_17_31 : 15;
+               u32 cdl : 1;
+               u32 reserved_13_15 : 3;
+               u32 cde : 1;
+               u32 csos : 1;
+               u32 emc : 1;
+               u32 tm : 3;
+               u32 sde : 1;
+               u32 hasd : 1;
+               u32 ec : 1;
+               u32 tls : 4;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg040_cn61xx cn63xx;
+       struct cvmx_pcieepx_cfg040_cn61xx cn63xxp1;
+       struct cvmx_pcieepx_cfg040_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg040_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg040_cn61xx cn68xxp1;
+       struct cvmx_pcieepx_cfg040_cn61xx cn70xx;
+       struct cvmx_pcieepx_cfg040_cn61xx cn70xxp1;
+       struct cvmx_pcieepx_cfg040_s cn73xx;
+       struct cvmx_pcieepx_cfg040_s cn78xx;
+       struct cvmx_pcieepx_cfg040_s cn78xxp1;
+       struct cvmx_pcieepx_cfg040_cn61xx cnf71xx;
+       struct cvmx_pcieepx_cfg040_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg040 cvmx_pcieepx_cfg040_t;
+
+/**
+ * cvmx_pcieep#_cfg041
+ *
+ * PCIE_CFG041 = Fourty-second 32-bits of PCIE type 0 config space
+ * (Slot Capabilities 2 Register)
+ */
+union cvmx_pcieepx_cfg041 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg041_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg041_s cn52xx;
+       struct cvmx_pcieepx_cfg041_s cn52xxp1;
+       struct cvmx_pcieepx_cfg041_s cn56xx;
+       struct cvmx_pcieepx_cfg041_s cn56xxp1;
+       struct cvmx_pcieepx_cfg041_s cn63xx;
+       struct cvmx_pcieepx_cfg041_s cn63xxp1;
+};
+
+typedef union cvmx_pcieepx_cfg041 cvmx_pcieepx_cfg041_t;
+
+/**
+ * cvmx_pcieep#_cfg042
+ *
+ * PCIE_CFG042 = Fourty-third 32-bits of PCIE type 0 config space
+ * (Slot Control 2 Register/Slot Status 2 Register)
+ */
+union cvmx_pcieepx_cfg042 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg042_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg042_s cn52xx;
+       struct cvmx_pcieepx_cfg042_s cn52xxp1;
+       struct cvmx_pcieepx_cfg042_s cn56xx;
+       struct cvmx_pcieepx_cfg042_s cn56xxp1;
+       struct cvmx_pcieepx_cfg042_s cn63xx;
+       struct cvmx_pcieepx_cfg042_s cn63xxp1;
+};
+
+typedef union cvmx_pcieepx_cfg042 cvmx_pcieepx_cfg042_t;
+
+/**
+ * cvmx_pcieep#_cfg044
+ *
+ * This register contains the forty-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg044 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg044_s {
+               u32 msixen : 1;
+               u32 funm : 1;
+               u32 reserved_27_29 : 3;
+               u32 msixts : 11;
+               u32 ncp : 8;
+               u32 msixcid : 8;
+       } s;
+       struct cvmx_pcieepx_cfg044_s cn73xx;
+       struct cvmx_pcieepx_cfg044_s cn78xx;
+       struct cvmx_pcieepx_cfg044_s cn78xxp1;
+       struct cvmx_pcieepx_cfg044_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg044 cvmx_pcieepx_cfg044_t;
+
+/**
+ * cvmx_pcieep#_cfg045
+ *
+ * This register contains the forty-sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg045 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg045_s {
+               u32 msixtoffs : 29;
+               u32 msixtbir : 3;
+       } s;
+       struct cvmx_pcieepx_cfg045_s cn73xx;
+       struct cvmx_pcieepx_cfg045_s cn78xx;
+       struct cvmx_pcieepx_cfg045_s cn78xxp1;
+       struct cvmx_pcieepx_cfg045_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg045 cvmx_pcieepx_cfg045_t;
+
+/**
+ * cvmx_pcieep#_cfg046
+ *
+ * This register contains the forty-seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg046 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg046_s {
+               u32 msixpoffs : 29;
+               u32 msixpbir : 3;
+       } s;
+       struct cvmx_pcieepx_cfg046_s cn73xx;
+       struct cvmx_pcieepx_cfg046_s cn78xx;
+       struct cvmx_pcieepx_cfg046_s cn78xxp1;
+       struct cvmx_pcieepx_cfg046_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg046 cvmx_pcieepx_cfg046_t;
+
+/**
+ * cvmx_pcieep#_cfg064
+ *
+ * This register contains the sixty-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg064 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg064_s {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 pcieec : 16;
+       } s;
+       struct cvmx_pcieepx_cfg064_s cn52xx;
+       struct cvmx_pcieepx_cfg064_s cn52xxp1;
+       struct cvmx_pcieepx_cfg064_s cn56xx;
+       struct cvmx_pcieepx_cfg064_s cn56xxp1;
+       struct cvmx_pcieepx_cfg064_s cn61xx;
+       struct cvmx_pcieepx_cfg064_s cn63xx;
+       struct cvmx_pcieepx_cfg064_s cn63xxp1;
+       struct cvmx_pcieepx_cfg064_s cn66xx;
+       struct cvmx_pcieepx_cfg064_s cn68xx;
+       struct cvmx_pcieepx_cfg064_s cn68xxp1;
+       struct cvmx_pcieepx_cfg064_s cn70xx;
+       struct cvmx_pcieepx_cfg064_s cn70xxp1;
+       struct cvmx_pcieepx_cfg064_s cn73xx;
+       struct cvmx_pcieepx_cfg064_s cn78xx;
+       struct cvmx_pcieepx_cfg064_s cn78xxp1;
+       struct cvmx_pcieepx_cfg064_s cnf71xx;
+       struct cvmx_pcieepx_cfg064_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg064 cvmx_pcieepx_cfg064_t;
+
+/**
+ * cvmx_pcieep#_cfg065
+ *
+ * This register contains the sixty-sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg065 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg065_s {
+               u32 reserved_26_31 : 6;
+               u32 tpbes : 1;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pcieepx_cfg065_cn52xx {
+               u32 reserved_21_31 : 11;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg065_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg065_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg065_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg065_cn61xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_21_23 : 3;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg065_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg065_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg065_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg065_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg065_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg065_cn70xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg065_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg065_cn73xx {
+               u32 reserved_26_31 : 6;
+               u32 tpbes : 1;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_5_11 : 7;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg065_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg065_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg065_cnf71xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_5_11 : 7;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cnf71xx;
+       struct cvmx_pcieepx_cfg065_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg065 cvmx_pcieepx_cfg065_t;
+
+/**
+ * cvmx_pcieep#_cfg066
+ *
+ * This register contains the sixty-seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg066 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg066_s {
+               u32 reserved_26_31 : 6;
+               u32 tpbem : 1;
+               u32 uatombm : 1;
+               u32 reserved_23_23 : 1;
+               u32 uciem : 1;
+               u32 reserved_21_21 : 1;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pcieepx_cfg066_cn52xx {
+               u32 reserved_21_31 : 11;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg066_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg066_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg066_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg066_cn61xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombm : 1;
+               u32 reserved_21_23 : 3;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg066_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg066_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg066_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg066_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg066_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg066_cn70xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombm : 1;
+               u32 reserved_23_23 : 1;
+               u32 uciem : 1;
+               u32 reserved_21_21 : 1;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg066_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg066_cn73xx {
+               u32 reserved_26_31 : 6;
+               u32 tpbem : 1;
+               u32 uatombm : 1;
+               u32 reserved_23_23 : 1;
+               u32 uciem : 1;
+               u32 reserved_21_21 : 1;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_5_11 : 7;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg066_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg066_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg066_cnf71xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombm : 1;
+               u32 reserved_23_23 : 1;
+               u32 uciem : 1;
+               u32 reserved_21_21 : 1;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_5_11 : 7;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cnf71xx;
+       struct cvmx_pcieepx_cfg066_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg066 cvmx_pcieepx_cfg066_t;
+
+/**
+ * cvmx_pcieep#_cfg067
+ *
+ * This register contains the sixty-eighth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg067 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg067_s {
+               u32 reserved_26_31 : 6;
+               u32 tpbes : 1;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pcieepx_cfg067_cn52xx {
+               u32 reserved_21_31 : 11;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg067_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg067_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg067_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg067_cn61xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_21_23 : 3;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg067_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg067_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg067_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg067_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg067_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg067_cn70xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg067_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg067_cn73xx {
+               u32 reserved_26_31 : 6;
+               u32 tpbes : 1;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_11_5 : 7;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg067_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg067_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg067_cnf71xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_5_11 : 7;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cnf71xx;
+       struct cvmx_pcieepx_cfg067_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg067 cvmx_pcieepx_cfg067_t;
+
+/**
+ * cvmx_pcieep#_cfg068
+ *
+ * This register contains the sixty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg068 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg068_s {
+               u32 reserved_15_31 : 17;
+               u32 cies : 1;
+               u32 anfes : 1;
+               u32 rtts : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrs : 1;
+               u32 bdllps : 1;
+               u32 btlps : 1;
+               u32 reserved_1_5 : 5;
+               u32 res : 1;
+       } s;
+       struct cvmx_pcieepx_cfg068_cn52xx {
+               u32 reserved_14_31 : 18;
+               u32 anfes : 1;
+               u32 rtts : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrs : 1;
+               u32 bdllps : 1;
+               u32 btlps : 1;
+               u32 reserved_1_5 : 5;
+               u32 res : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg068_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg068_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg068_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg068_cn52xx cn61xx;
+       struct cvmx_pcieepx_cfg068_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg068_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg068_cn52xx cn66xx;
+       struct cvmx_pcieepx_cfg068_cn52xx cn68xx;
+       struct cvmx_pcieepx_cfg068_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg068_s cn70xx;
+       struct cvmx_pcieepx_cfg068_s cn70xxp1;
+       struct cvmx_pcieepx_cfg068_s cn73xx;
+       struct cvmx_pcieepx_cfg068_s cn78xx;
+       struct cvmx_pcieepx_cfg068_s cn78xxp1;
+       struct cvmx_pcieepx_cfg068_s cnf71xx;
+       struct cvmx_pcieepx_cfg068_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg068 cvmx_pcieepx_cfg068_t;
+
+/**
+ * cvmx_pcieep#_cfg069
+ *
+ * This register contains the seventieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg069 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg069_s {
+               u32 reserved_15_31 : 17;
+               u32 ciem : 1;
+               u32 anfem : 1;
+               u32 rttm : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrm : 1;
+               u32 bdllpm : 1;
+               u32 btlpm : 1;
+               u32 reserved_1_5 : 5;
+               u32 rem : 1;
+       } s;
+       struct cvmx_pcieepx_cfg069_cn52xx {
+               u32 reserved_14_31 : 18;
+               u32 anfem : 1;
+               u32 rttm : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrm : 1;
+               u32 bdllpm : 1;
+               u32 btlpm : 1;
+               u32 reserved_1_5 : 5;
+               u32 rem : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg069_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg069_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg069_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg069_cn52xx cn61xx;
+       struct cvmx_pcieepx_cfg069_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg069_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg069_cn52xx cn66xx;
+       struct cvmx_pcieepx_cfg069_cn52xx cn68xx;
+       struct cvmx_pcieepx_cfg069_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg069_s cn70xx;
+       struct cvmx_pcieepx_cfg069_s cn70xxp1;
+       struct cvmx_pcieepx_cfg069_s cn73xx;
+       struct cvmx_pcieepx_cfg069_s cn78xx;
+       struct cvmx_pcieepx_cfg069_s cn78xxp1;
+       struct cvmx_pcieepx_cfg069_s cnf71xx;
+       struct cvmx_pcieepx_cfg069_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg069 cvmx_pcieepx_cfg069_t;
+
+/**
+ * cvmx_pcieep#_cfg070
+ *
+ * This register contains the seventy-first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg070 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg070_s {
+               u32 reserved_12_31 : 20;
+               u32 tlp_plp : 1;
+               u32 reserved_9_10 : 2;
+               u32 ce : 1;
+               u32 cc : 1;
+               u32 ge : 1;
+               u32 gc : 1;
+               u32 fep : 5;
+       } s;
+       struct cvmx_pcieepx_cfg070_cn52xx {
+               u32 reserved_9_31 : 23;
+               u32 ce : 1;
+               u32 cc : 1;
+               u32 ge : 1;
+               u32 gc : 1;
+               u32 fep : 5;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg070_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg070_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg070_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg070_cn52xx cn61xx;
+       struct cvmx_pcieepx_cfg070_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg070_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg070_cn52xx cn66xx;
+       struct cvmx_pcieepx_cfg070_cn52xx cn68xx;
+       struct cvmx_pcieepx_cfg070_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg070_cn52xx cn70xx;
+       struct cvmx_pcieepx_cfg070_cn52xx cn70xxp1;
+       struct cvmx_pcieepx_cfg070_s cn73xx;
+       struct cvmx_pcieepx_cfg070_s cn78xx;
+       struct cvmx_pcieepx_cfg070_s cn78xxp1;
+       struct cvmx_pcieepx_cfg070_cn52xx cnf71xx;
+       struct cvmx_pcieepx_cfg070_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg070 cvmx_pcieepx_cfg070_t;
+
+/**
+ * cvmx_pcieep#_cfg071
+ *
+ * This register contains the seventy-second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg071 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg071_s {
+               u32 dword1 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg071_s cn52xx;
+       struct cvmx_pcieepx_cfg071_s cn52xxp1;
+       struct cvmx_pcieepx_cfg071_s cn56xx;
+       struct cvmx_pcieepx_cfg071_s cn56xxp1;
+       struct cvmx_pcieepx_cfg071_s cn61xx;
+       struct cvmx_pcieepx_cfg071_s cn63xx;
+       struct cvmx_pcieepx_cfg071_s cn63xxp1;
+       struct cvmx_pcieepx_cfg071_s cn66xx;
+       struct cvmx_pcieepx_cfg071_s cn68xx;
+       struct cvmx_pcieepx_cfg071_s cn68xxp1;
+       struct cvmx_pcieepx_cfg071_s cn70xx;
+       struct cvmx_pcieepx_cfg071_s cn70xxp1;
+       struct cvmx_pcieepx_cfg071_s cn73xx;
+       struct cvmx_pcieepx_cfg071_s cn78xx;
+       struct cvmx_pcieepx_cfg071_s cn78xxp1;
+       struct cvmx_pcieepx_cfg071_s cnf71xx;
+       struct cvmx_pcieepx_cfg071_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg071 cvmx_pcieepx_cfg071_t;
+
+/**
+ * cvmx_pcieep#_cfg072
+ *
+ * This register contains the seventy-third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg072 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg072_s {
+               u32 dword2 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg072_s cn52xx;
+       struct cvmx_pcieepx_cfg072_s cn52xxp1;
+       struct cvmx_pcieepx_cfg072_s cn56xx;
+       struct cvmx_pcieepx_cfg072_s cn56xxp1;
+       struct cvmx_pcieepx_cfg072_s cn61xx;
+       struct cvmx_pcieepx_cfg072_s cn63xx;
+       struct cvmx_pcieepx_cfg072_s cn63xxp1;
+       struct cvmx_pcieepx_cfg072_s cn66xx;
+       struct cvmx_pcieepx_cfg072_s cn68xx;
+       struct cvmx_pcieepx_cfg072_s cn68xxp1;
+       struct cvmx_pcieepx_cfg072_s cn70xx;
+       struct cvmx_pcieepx_cfg072_s cn70xxp1;
+       struct cvmx_pcieepx_cfg072_s cn73xx;
+       struct cvmx_pcieepx_cfg072_s cn78xx;
+       struct cvmx_pcieepx_cfg072_s cn78xxp1;
+       struct cvmx_pcieepx_cfg072_s cnf71xx;
+       struct cvmx_pcieepx_cfg072_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg072 cvmx_pcieepx_cfg072_t;
+
+/**
+ * cvmx_pcieep#_cfg073
+ *
+ * This register contains the seventy-fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg073 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg073_s {
+               u32 dword3 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg073_s cn52xx;
+       struct cvmx_pcieepx_cfg073_s cn52xxp1;
+       struct cvmx_pcieepx_cfg073_s cn56xx;
+       struct cvmx_pcieepx_cfg073_s cn56xxp1;
+       struct cvmx_pcieepx_cfg073_s cn61xx;
+       struct cvmx_pcieepx_cfg073_s cn63xx;
+       struct cvmx_pcieepx_cfg073_s cn63xxp1;
+       struct cvmx_pcieepx_cfg073_s cn66xx;
+       struct cvmx_pcieepx_cfg073_s cn68xx;
+       struct cvmx_pcieepx_cfg073_s cn68xxp1;
+       struct cvmx_pcieepx_cfg073_s cn70xx;
+       struct cvmx_pcieepx_cfg073_s cn70xxp1;
+       struct cvmx_pcieepx_cfg073_s cn73xx;
+       struct cvmx_pcieepx_cfg073_s cn78xx;
+       struct cvmx_pcieepx_cfg073_s cn78xxp1;
+       struct cvmx_pcieepx_cfg073_s cnf71xx;
+       struct cvmx_pcieepx_cfg073_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg073 cvmx_pcieepx_cfg073_t;
+
+/**
+ * cvmx_pcieep#_cfg074
+ *
+ * This register contains the seventy-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg074 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg074_s {
+               u32 dword4 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg074_s cn52xx;
+       struct cvmx_pcieepx_cfg074_s cn52xxp1;
+       struct cvmx_pcieepx_cfg074_s cn56xx;
+       struct cvmx_pcieepx_cfg074_s cn56xxp1;
+       struct cvmx_pcieepx_cfg074_s cn61xx;
+       struct cvmx_pcieepx_cfg074_s cn63xx;
+       struct cvmx_pcieepx_cfg074_s cn63xxp1;
+       struct cvmx_pcieepx_cfg074_s cn66xx;
+       struct cvmx_pcieepx_cfg074_s cn68xx;
+       struct cvmx_pcieepx_cfg074_s cn68xxp1;
+       struct cvmx_pcieepx_cfg074_s cn70xx;
+       struct cvmx_pcieepx_cfg074_s cn70xxp1;
+       struct cvmx_pcieepx_cfg074_s cn73xx;
+       struct cvmx_pcieepx_cfg074_s cn78xx;
+       struct cvmx_pcieepx_cfg074_s cn78xxp1;
+       struct cvmx_pcieepx_cfg074_s cnf71xx;
+       struct cvmx_pcieepx_cfg074_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg074 cvmx_pcieepx_cfg074_t;
+
+/**
+ * cvmx_pcieep#_cfg078
+ *
+ * This register contains the seventy-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg078 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg078_s {
+               u32 tlp_pfx_log : 32;
+       } s;
+       struct cvmx_pcieepx_cfg078_s cn73xx;
+       struct cvmx_pcieepx_cfg078_s cn78xx;
+       struct cvmx_pcieepx_cfg078_s cn78xxp1;
+       struct cvmx_pcieepx_cfg078_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg078 cvmx_pcieepx_cfg078_t;
+
+/**
+ * cvmx_pcieep#_cfg082
+ *
+ * This register contains the eighty-third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg082 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg082_s {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 reserved_0_15 : 16;
+       } s;
+       struct cvmx_pcieepx_cfg082_cn70xx {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 pcieec : 16;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg082_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg082_cn73xx {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 ariid : 16;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg082_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg082_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg082_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg082 cvmx_pcieepx_cfg082_t;
+
+/**
+ * cvmx_pcieep#_cfg083
+ *
+ * This register contains the eighty-fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg083 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg083_s {
+               u32 reserved_2_31 : 30;
+               u32 acsfgc : 1;
+               u32 mfvcfgc : 1;
+       } s;
+       struct cvmx_pcieepx_cfg083_cn70xx {
+               u32 reserved_26_31 : 6;
+               u32 srs : 22;
+               u32 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg083_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg083_cn73xx {
+               u32 reserved_23_31 : 9;
+               u32 fg : 3;
+               u32 reserved_18_19 : 2;
+               u32 acsfge : 1;
+               u32 mfvcfge : 1;
+               u32 nfn : 8;
+               u32 reserved_2_7 : 6;
+               u32 acsfgc : 1;
+               u32 mfvcfgc : 1;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg083_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg083_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg083_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg083 cvmx_pcieepx_cfg083_t;
+
+/**
+ * cvmx_pcieep#_cfg084
+ *
+ * PCIE_CFG084 = Eighty-fifth 32-bits of PCIE type 0 config space
+ * (PCI Express Resizable BAR (RBAR) Control Register)
+ */
+union cvmx_pcieepx_cfg084 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg084_s {
+               u32 reserved_13_31 : 19;
+               u32 rbars : 5;
+               u32 nrbar : 3;
+               u32 reserved_3_4 : 2;
+               u32 rbari : 3;
+       } s;
+       struct cvmx_pcieepx_cfg084_s cn70xx;
+       struct cvmx_pcieepx_cfg084_s cn70xxp1;
+};
+
+typedef union cvmx_pcieepx_cfg084 cvmx_pcieepx_cfg084_t;
+
+/**
+ * cvmx_pcieep#_cfg086
+ *
+ * This register contains the eighty-seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg086 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg086_s {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 pcieec : 16;
+       } s;
+       struct cvmx_pcieepx_cfg086_s cn73xx;
+       struct cvmx_pcieepx_cfg086_s cn78xx;
+       struct cvmx_pcieepx_cfg086_s cn78xxp1;
+       struct cvmx_pcieepx_cfg086_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg086 cvmx_pcieepx_cfg086_t;
+
+/**
+ * cvmx_pcieep#_cfg087
+ *
+ * This register contains the eighty-eighth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg087 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg087_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg087_s cn73xx;
+       struct cvmx_pcieepx_cfg087_s cn78xx;
+       struct cvmx_pcieepx_cfg087_s cn78xxp1;
+       struct cvmx_pcieepx_cfg087_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg087 cvmx_pcieepx_cfg087_t;
+
+/**
+ * cvmx_pcieep#_cfg088
+ *
+ * This register contains the eighty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg088 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg088_s {
+               u32 reserved_8_31 : 24;
+               u32 les : 8;
+       } s;
+       struct cvmx_pcieepx_cfg088_s cn73xx;
+       struct cvmx_pcieepx_cfg088_s cn78xx;
+       struct cvmx_pcieepx_cfg088_s cn78xxp1;
+       struct cvmx_pcieepx_cfg088_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg088 cvmx_pcieepx_cfg088_t;
+
+/**
+ * cvmx_pcieep#_cfg089
+ *
+ * This register contains the ninetieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg089 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg089_s {
+               u32 reserved_31_31 : 1;
+               u32 l1dph : 3;
+               u32 l1dtp : 4;
+               u32 reserved_15_23 : 9;
+               u32 l0dph : 3;
+               u32 l0dtp : 4;
+               u32 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pcieepx_cfg089_s cn73xx;
+       struct cvmx_pcieepx_cfg089_s cn78xx;
+       struct cvmx_pcieepx_cfg089_s cn78xxp1;
+       struct cvmx_pcieepx_cfg089_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg089 cvmx_pcieepx_cfg089_t;
+
+/**
+ * cvmx_pcieep#_cfg090
+ *
+ * This register contains the ninety-first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg090 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg090_s {
+               u32 reserved_31_31 : 1;
+               u32 l3dph : 3;
+               u32 l3dtp : 4;
+               u32 reserved_15_23 : 9;
+               u32 l2dph : 3;
+               u32 l2dtp : 4;
+               u32 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pcieepx_cfg090_s cn73xx;
+       struct cvmx_pcieepx_cfg090_s cn78xx;
+       struct cvmx_pcieepx_cfg090_s cn78xxp1;
+       struct cvmx_pcieepx_cfg090_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg090 cvmx_pcieepx_cfg090_t;
+
+/**
+ * cvmx_pcieep#_cfg091
+ *
+ * This register contains the ninety-second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg091 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg091_s {
+               u32 reserved_31_31 : 1;
+               u32 l5dph : 3;
+               u32 l5dtp : 4;
+               u32 reserved_15_23 : 9;
+               u32 l4dph : 3;
+               u32 l4dtp : 4;
+               u32 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pcieepx_cfg091_s cn73xx;
+       struct cvmx_pcieepx_cfg091_s cn78xx;
+       struct cvmx_pcieepx_cfg091_s cn78xxp1;
+       struct cvmx_pcieepx_cfg091_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg091 cvmx_pcieepx_cfg091_t;
+
+/**
+ * cvmx_pcieep#_cfg092
+ *
+ * This register contains the ninety-fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg092 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg092_s {
+               u32 reserved_31_31 : 1;
+               u32 l7dph : 3;
+               u32 l7dtp : 4;
+               u32 reserved_15_23 : 9;
+               u32 l6dph : 3;
+               u32 l6dtp : 4;
+               u32 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pcieepx_cfg092_s cn73xx;
+       struct cvmx_pcieepx_cfg092_s cn78xx;
+       struct cvmx_pcieepx_cfg092_s cn78xxp1;
+       struct cvmx_pcieepx_cfg092_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg092 cvmx_pcieepx_cfg092_t;
+
+/**
+ * cvmx_pcieep#_cfg094
+ *
+ * This register contains the ninety-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg094 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg094_s {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 pcieec : 16;
+       } s;
+       struct cvmx_pcieepx_cfg094_s cn73xx;
+       struct cvmx_pcieepx_cfg094_s cn78xx;
+       struct cvmx_pcieepx_cfg094_s cn78xxp1;
+       struct cvmx_pcieepx_cfg094_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg094 cvmx_pcieepx_cfg094_t;
+
+/**
+ * cvmx_pcieep#_cfg095
+ *
+ * This register contains the ninety-sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg095 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg095_s {
+               u32 vfmimn : 11;
+               u32 reserved_2_20 : 19;
+               u32 arichp : 1;
+               u32 vfmc : 1;
+       } s;
+       struct cvmx_pcieepx_cfg095_s cn73xx;
+       struct cvmx_pcieepx_cfg095_s cn78xx;
+       struct cvmx_pcieepx_cfg095_s cn78xxp1;
+       struct cvmx_pcieepx_cfg095_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg095 cvmx_pcieepx_cfg095_t;
+
+/**
+ * cvmx_pcieep#_cfg096
+ *
+ * This register contains the ninety-seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg096 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg096_s {
+               u32 reserved_17_31 : 15;
+               u32 ms : 1;
+               u32 reserved_5_15 : 11;
+               u32 ach : 1;
+               u32 mse : 1;
+               u32 mie : 1;
+               u32 me : 1;
+               u32 vfe : 1;
+       } s;
+       struct cvmx_pcieepx_cfg096_s cn73xx;
+       struct cvmx_pcieepx_cfg096_s cn78xx;
+       struct cvmx_pcieepx_cfg096_s cn78xxp1;
+       struct cvmx_pcieepx_cfg096_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg096 cvmx_pcieepx_cfg096_t;
+
+/**
+ * cvmx_pcieep#_cfg097
+ *
+ * This register contains the ninety-eighth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg097 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg097_s {
+               u32 tvf : 16;
+               u32 ivf : 16;
+       } s;
+       struct cvmx_pcieepx_cfg097_s cn73xx;
+       struct cvmx_pcieepx_cfg097_s cn78xx;
+       struct cvmx_pcieepx_cfg097_s cn78xxp1;
+       struct cvmx_pcieepx_cfg097_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg097 cvmx_pcieepx_cfg097_t;
+
+/**
+ * cvmx_pcieep#_cfg098
+ *
+ * This register contains the ninety-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg098 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg098_s {
+               u32 reserved_24_31 : 8;
+               u32 fdl : 8;
+               u32 nvf : 16;
+       } s;
+       struct cvmx_pcieepx_cfg098_s cn73xx;
+       struct cvmx_pcieepx_cfg098_s cn78xx;
+       struct cvmx_pcieepx_cfg098_s cn78xxp1;
+       struct cvmx_pcieepx_cfg098_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg098 cvmx_pcieepx_cfg098_t;
+
+/**
+ * cvmx_pcieep#_cfg099
+ *
+ * This register contains the one hundredth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg099 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg099_s {
+               u32 vfs : 16;
+               u32 fo : 16;
+       } s;
+       struct cvmx_pcieepx_cfg099_s cn73xx;
+       struct cvmx_pcieepx_cfg099_s cn78xx;
+       struct cvmx_pcieepx_cfg099_s cn78xxp1;
+       struct cvmx_pcieepx_cfg099_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg099 cvmx_pcieepx_cfg099_t;
+
+/**
+ * cvmx_pcieep#_cfg100
+ *
+ * This register contains the one hundred first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg100 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg100_s {
+               u32 vfdev : 16;
+               u32 reserved_0_15 : 16;
+       } s;
+       struct cvmx_pcieepx_cfg100_s cn73xx;
+       struct cvmx_pcieepx_cfg100_s cn78xx;
+       struct cvmx_pcieepx_cfg100_s cn78xxp1;
+       struct cvmx_pcieepx_cfg100_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg100 cvmx_pcieepx_cfg100_t;
+
+/**
+ * cvmx_pcieep#_cfg101
+ *
+ * This register contains the one hundred second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg101 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg101_s {
+               u32 supps : 32;
+       } s;
+       struct cvmx_pcieepx_cfg101_s cn73xx;
+       struct cvmx_pcieepx_cfg101_s cn78xx;
+       struct cvmx_pcieepx_cfg101_s cn78xxp1;
+       struct cvmx_pcieepx_cfg101_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg101 cvmx_pcieepx_cfg101_t;
+
+/**
+ * cvmx_pcieep#_cfg102
+ *
+ * This register contains the one hundred third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg102 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg102_s {
+               u32 ps : 32;
+       } s;
+       struct cvmx_pcieepx_cfg102_s cn73xx;
+       struct cvmx_pcieepx_cfg102_s cn78xx;
+       struct cvmx_pcieepx_cfg102_s cn78xxp1;
+       struct cvmx_pcieepx_cfg102_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg102 cvmx_pcieepx_cfg102_t;
+
+/**
+ * cvmx_pcieep#_cfg103
+ *
+ * This register contains the one hundred fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg103 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg103_s {
+               u32 reserved_4_31 : 28;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } s;
+       struct cvmx_pcieepx_cfg103_cn73xx {
+               u32 lbab : 12;
+               u32 reserved_4_19 : 16;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg103_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg103_cn78xxp1 {
+               u32 lbab : 17;
+               u32 reserved_4_14 : 11;
+               u32 pf : 1;
+               u32 typ : 2;
+               u32 mspc : 1;
+       } cn78xxp1;
+       struct cvmx_pcieepx_cfg103_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg103 cvmx_pcieepx_cfg103_t;
+
+/**
+ * cvmx_pcieep#_cfg104
+ *
+ * This register contains the one hundred seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg104 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg104_s {
+               u32 ubab : 32;
+       } s;
+       struct cvmx_pcieepx_cfg104_s cn73xx;
+       struct cvmx_pcieepx_cfg104_s cn78xx;
+       struct cvmx_pcieepx_cfg104_s cn78xxp1;
+       struct cvmx_pcieepx_cfg104_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg104 cvmx_pcieepx_cfg104_t;
+
+/**
+ * cvmx_pcieep#_cfg105
+ *
+ * This register contains the one hundred sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg105 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg105_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg105_s cn73xx;
+       struct cvmx_pcieepx_cfg105_s cn78xx;
+       struct cvmx_pcieepx_cfg105_s cn78xxp1;
+       struct cvmx_pcieepx_cfg105_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg105 cvmx_pcieepx_cfg105_t;
+
+/**
+ * cvmx_pcieep#_cfg106
+ *
+ * This register contains the one hundred seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg106 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg106_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg106_s cn73xx;
+       struct cvmx_pcieepx_cfg106_s cn78xx;
+       struct cvmx_pcieepx_cfg106_s cn78xxp1;
+       struct cvmx_pcieepx_cfg106_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg106 cvmx_pcieepx_cfg106_t;
+
+/**
+ * cvmx_pcieep#_cfg107
+ *
+ * This register contains the one hundred eighth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg107 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg107_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg107_s cn73xx;
+       struct cvmx_pcieepx_cfg107_s cn78xx;
+       struct cvmx_pcieepx_cfg107_s cn78xxp1;
+       struct cvmx_pcieepx_cfg107_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg107 cvmx_pcieepx_cfg107_t;
+
+/**
+ * cvmx_pcieep#_cfg108
+ *
+ * This register contains the one hundred ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg108 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg108_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg108_s cn73xx;
+       struct cvmx_pcieepx_cfg108_s cn78xx;
+       struct cvmx_pcieepx_cfg108_s cn78xxp1;
+       struct cvmx_pcieepx_cfg108_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg108 cvmx_pcieepx_cfg108_t;
+
+/**
+ * cvmx_pcieep#_cfg109
+ *
+ * This register contains the one hundred tenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg109 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg109_s {
+               u32 mso : 29;
+               u32 msbir : 3;
+       } s;
+       struct cvmx_pcieepx_cfg109_s cn73xx;
+       struct cvmx_pcieepx_cfg109_s cn78xx;
+       struct cvmx_pcieepx_cfg109_s cn78xxp1;
+       struct cvmx_pcieepx_cfg109_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg109 cvmx_pcieepx_cfg109_t;
+
+/**
+ * cvmx_pcieep#_cfg110
+ *
+ * This register contains the one hundred eleventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg110 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg110_s {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 pcieec : 16;
+       } s;
+       struct cvmx_pcieepx_cfg110_s cn73xx;
+       struct cvmx_pcieepx_cfg110_s cn78xx;
+       struct cvmx_pcieepx_cfg110_s cn78xxp1;
+       struct cvmx_pcieepx_cfg110_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg110 cvmx_pcieepx_cfg110_t;
+
+/**
+ * cvmx_pcieep#_cfg111
+ *
+ * This register contains the one hundred twelfth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg111 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg111_s {
+               u32 reserved_30_31 : 2;
+               u32 srs : 26;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pcieepx_cfg111_s cn73xx;
+       struct cvmx_pcieepx_cfg111_s cn78xx;
+       struct cvmx_pcieepx_cfg111_s cn78xxp1;
+       struct cvmx_pcieepx_cfg111_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg111 cvmx_pcieepx_cfg111_t;
+
+/**
+ * cvmx_pcieep#_cfg112
+ *
+ * This register contains the one hundred thirteenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg112 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg112_s {
+               u32 reserved_13_31 : 19;
+               u32 rbars : 5;
+               u32 nrbar : 3;
+               u32 reserved_3_4 : 2;
+               u32 rbari : 3;
+       } s;
+       struct cvmx_pcieepx_cfg112_s cn73xx;
+       struct cvmx_pcieepx_cfg112_s cn78xx;
+       struct cvmx_pcieepx_cfg112_s cn78xxp1;
+       struct cvmx_pcieepx_cfg112_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg112 cvmx_pcieepx_cfg112_t;
+
+/**
+ * cvmx_pcieep#_cfg448
+ *
+ * This register contains the four hundred forty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg448 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg448_s {
+               u32 rtl : 16;
+               u32 rtltl : 16;
+       } s;
+       struct cvmx_pcieepx_cfg448_s cn52xx;
+       struct cvmx_pcieepx_cfg448_s cn52xxp1;
+       struct cvmx_pcieepx_cfg448_s cn56xx;
+       struct cvmx_pcieepx_cfg448_s cn56xxp1;
+       struct cvmx_pcieepx_cfg448_s cn61xx;
+       struct cvmx_pcieepx_cfg448_s cn63xx;
+       struct cvmx_pcieepx_cfg448_s cn63xxp1;
+       struct cvmx_pcieepx_cfg448_s cn66xx;
+       struct cvmx_pcieepx_cfg448_s cn68xx;
+       struct cvmx_pcieepx_cfg448_s cn68xxp1;
+       struct cvmx_pcieepx_cfg448_s cn70xx;
+       struct cvmx_pcieepx_cfg448_s cn70xxp1;
+       struct cvmx_pcieepx_cfg448_s cn73xx;
+       struct cvmx_pcieepx_cfg448_s cn78xx;
+       struct cvmx_pcieepx_cfg448_s cn78xxp1;
+       struct cvmx_pcieepx_cfg448_s cnf71xx;
+       struct cvmx_pcieepx_cfg448_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg448 cvmx_pcieepx_cfg448_t;
+
+/**
+ * cvmx_pcieep#_cfg449
+ *
+ * This register contains the four hundred fiftieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg449 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg449_s {
+               u32 omr : 32;
+       } s;
+       struct cvmx_pcieepx_cfg449_s cn52xx;
+       struct cvmx_pcieepx_cfg449_s cn52xxp1;
+       struct cvmx_pcieepx_cfg449_s cn56xx;
+       struct cvmx_pcieepx_cfg449_s cn56xxp1;
+       struct cvmx_pcieepx_cfg449_s cn61xx;
+       struct cvmx_pcieepx_cfg449_s cn63xx;
+       struct cvmx_pcieepx_cfg449_s cn63xxp1;
+       struct cvmx_pcieepx_cfg449_s cn66xx;
+       struct cvmx_pcieepx_cfg449_s cn68xx;
+       struct cvmx_pcieepx_cfg449_s cn68xxp1;
+       struct cvmx_pcieepx_cfg449_s cn70xx;
+       struct cvmx_pcieepx_cfg449_s cn70xxp1;
+       struct cvmx_pcieepx_cfg449_s cn73xx;
+       struct cvmx_pcieepx_cfg449_s cn78xx;
+       struct cvmx_pcieepx_cfg449_s cn78xxp1;
+       struct cvmx_pcieepx_cfg449_s cnf71xx;
+       struct cvmx_pcieepx_cfg449_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg449 cvmx_pcieepx_cfg449_t;
+
+/**
+ * cvmx_pcieep#_cfg450
+ *
+ * This register contains the four hundred fifty-first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg450 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg450_s {
+               u32 lpec : 8;
+               u32 reserved_22_23 : 2;
+               u32 link_state : 6;
+               u32 force_link : 1;
+               u32 reserved_8_14 : 7;
+               u32 link_num : 8;
+       } s;
+       struct cvmx_pcieepx_cfg450_s cn52xx;
+       struct cvmx_pcieepx_cfg450_s cn52xxp1;
+       struct cvmx_pcieepx_cfg450_s cn56xx;
+       struct cvmx_pcieepx_cfg450_s cn56xxp1;
+       struct cvmx_pcieepx_cfg450_s cn61xx;
+       struct cvmx_pcieepx_cfg450_s cn63xx;
+       struct cvmx_pcieepx_cfg450_s cn63xxp1;
+       struct cvmx_pcieepx_cfg450_s cn66xx;
+       struct cvmx_pcieepx_cfg450_s cn68xx;
+       struct cvmx_pcieepx_cfg450_s cn68xxp1;
+       struct cvmx_pcieepx_cfg450_cn70xx {
+               u32 lpec : 8;
+               u32 reserved_22_23 : 2;
+               u32 link_state : 6;
+               u32 force_link : 1;
+               u32 reserved_12_14 : 3;
+               u32 link_cmd : 4;
+               u32 link_num : 8;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg450_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg450_cn73xx {
+               u32 lpec : 8;
+               u32 reserved_22_23 : 2;
+               u32 link_state : 6;
+               u32 force_link : 1;
+               u32 reserved_12_14 : 3;
+               u32 forced_ltssm : 4;
+               u32 link_num : 8;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg450_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg450_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg450_s cnf71xx;
+       struct cvmx_pcieepx_cfg450_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg450 cvmx_pcieepx_cfg450_t;
+
+/**
+ * cvmx_pcieep#_cfg451
+ *
+ * This register contains the four hundred fifty-second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg451 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg451_s {
+               u32 reserved_31_31 : 1;
+               u32 easpml1 : 1;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 n_fts_cc : 8;
+               u32 n_fts : 8;
+               u32 ack_freq : 8;
+       } s;
+       struct cvmx_pcieepx_cfg451_cn52xx {
+               u32 reserved_30_31 : 2;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 n_fts_cc : 8;
+               u32 n_fts : 8;
+               u32 ack_freq : 8;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg451_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg451_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg451_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg451_s cn61xx;
+       struct cvmx_pcieepx_cfg451_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg451_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg451_s cn66xx;
+       struct cvmx_pcieepx_cfg451_s cn68xx;
+       struct cvmx_pcieepx_cfg451_s cn68xxp1;
+       struct cvmx_pcieepx_cfg451_s cn70xx;
+       struct cvmx_pcieepx_cfg451_s cn70xxp1;
+       struct cvmx_pcieepx_cfg451_s cn73xx;
+       struct cvmx_pcieepx_cfg451_s cn78xx;
+       struct cvmx_pcieepx_cfg451_s cn78xxp1;
+       struct cvmx_pcieepx_cfg451_s cnf71xx;
+       struct cvmx_pcieepx_cfg451_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg451 cvmx_pcieepx_cfg451_t;
+
+/**
+ * cvmx_pcieep#_cfg452
+ *
+ * This register contains the four hundred fifty-third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg452 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg452_s {
+               u32 reserved_26_31 : 6;
+               u32 eccrc : 1;
+               u32 reserved_22_24 : 3;
+               u32 lme : 6;
+               u32 reserved_12_15 : 4;
+               u32 link_rate : 4;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } s;
+       struct cvmx_pcieepx_cfg452_cn52xx {
+               u32 reserved_26_31 : 6;
+               u32 eccrc : 1;
+               u32 reserved_22_24 : 3;
+               u32 lme : 6;
+               u32 reserved_8_15 : 8;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg452_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg452_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg452_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg452_cn61xx {
+               u32 reserved_22_31 : 10;
+               u32 lme : 6;
+               u32 reserved_8_15 : 8;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg452_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg452_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg452_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg452_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg452_cn61xx cn68xxp1;
+       struct cvmx_pcieepx_cfg452_cn70xx {
+               u32 reserved_22_31 : 10;
+               u32 lme : 6;
+               u32 reserved_12_15 : 4;
+               u32 link_rate : 4;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg452_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg452_cn70xx cn73xx;
+       struct cvmx_pcieepx_cfg452_cn70xx cn78xx;
+       struct cvmx_pcieepx_cfg452_cn70xx cn78xxp1;
+       struct cvmx_pcieepx_cfg452_cn61xx cnf71xx;
+       struct cvmx_pcieepx_cfg452_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg452 cvmx_pcieepx_cfg452_t;
+
+/**
+ * cvmx_pcieep#_cfg453
+ *
+ * This register contains the four hundred fifty-fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg453 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg453_s {
+               u32 dlld : 1;
+               u32 reserved_26_30 : 5;
+               u32 ack_nak : 1;
+               u32 fcd : 1;
+               u32 ilst : 24;
+       } s;
+       struct cvmx_pcieepx_cfg453_s cn52xx;
+       struct cvmx_pcieepx_cfg453_s cn52xxp1;
+       struct cvmx_pcieepx_cfg453_s cn56xx;
+       struct cvmx_pcieepx_cfg453_s cn56xxp1;
+       struct cvmx_pcieepx_cfg453_s cn61xx;
+       struct cvmx_pcieepx_cfg453_s cn63xx;
+       struct cvmx_pcieepx_cfg453_s cn63xxp1;
+       struct cvmx_pcieepx_cfg453_s cn66xx;
+       struct cvmx_pcieepx_cfg453_s cn68xx;
+       struct cvmx_pcieepx_cfg453_s cn68xxp1;
+       struct cvmx_pcieepx_cfg453_s cn70xx;
+       struct cvmx_pcieepx_cfg453_s cn70xxp1;
+       struct cvmx_pcieepx_cfg453_s cn73xx;
+       struct cvmx_pcieepx_cfg453_s cn78xx;
+       struct cvmx_pcieepx_cfg453_s cn78xxp1;
+       struct cvmx_pcieepx_cfg453_s cnf71xx;
+       struct cvmx_pcieepx_cfg453_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg453 cvmx_pcieepx_cfg453_t;
+
+/**
+ * cvmx_pcieep#_cfg454
+ *
+ * This register contains the four hundred fifty-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg454 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg454_s {
+               u32 cx_nfunc : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_11_13 : 3;
+               u32 nskps : 3;
+               u32 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pcieepx_cfg454_cn52xx {
+               u32 reserved_29_31 : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_11_13 : 3;
+               u32 nskps : 3;
+               u32 reserved_4_7 : 4;
+               u32 ntss : 4;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg454_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg454_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg454_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg454_cn61xx {
+               u32 cx_nfunc : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_8_13 : 6;
+               u32 mfuncn : 8;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg454_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg454_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg454_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg454_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg454_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg454_cn70xx {
+               u32 reserved_24_31 : 8;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_8_13 : 6;
+               u32 mfuncn : 8;
+       } cn70xx;
+       struct cvmx_pcieepx_cfg454_cn70xx cn70xxp1;
+       struct cvmx_pcieepx_cfg454_cn73xx {
+               u32 reserved_29_31 : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_8_13 : 6;
+               u32 mfuncn : 8;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg454_cn73xx cn78xx;
+       struct cvmx_pcieepx_cfg454_cn73xx cn78xxp1;
+       struct cvmx_pcieepx_cfg454_cn61xx cnf71xx;
+       struct cvmx_pcieepx_cfg454_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg454 cvmx_pcieepx_cfg454_t;
+
+/**
+ * cvmx_pcieep#_cfg455
+ *
+ * This register contains the four hundred fifty-sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg455 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg455_s {
+               u32 m_cfg0_filt : 1;
+               u32 m_io_filt : 1;
+               u32 msg_ctrl : 1;
+               u32 m_cpl_ecrc_filt : 1;
+               u32 m_ecrc_filt : 1;
+               u32 m_cpl_len_err : 1;
+               u32 m_cpl_attr_err : 1;
+               u32 m_cpl_tc_err : 1;
+               u32 m_cpl_fun_err : 1;
+               u32 m_cpl_rid_err : 1;
+               u32 m_cpl_tag_err : 1;
+               u32 m_lk_filt : 1;
+               u32 m_cfg1_filt : 1;
+               u32 m_bar_match : 1;
+               u32 m_pois_filt : 1;
+               u32 m_fun : 1;
+               u32 dfcwt : 1;
+               u32 reserved_11_14 : 4;
+               u32 skpiv : 11;
+       } s;
+       struct cvmx_pcieepx_cfg455_s cn52xx;
+       struct cvmx_pcieepx_cfg455_s cn52xxp1;
+       struct cvmx_pcieepx_cfg455_s cn56xx;
+       struct cvmx_pcieepx_cfg455_s cn56xxp1;
+       struct cvmx_pcieepx_cfg455_s cn61xx;
+       struct cvmx_pcieepx_cfg455_s cn63xx;
+       struct cvmx_pcieepx_cfg455_s cn63xxp1;
+       struct cvmx_pcieepx_cfg455_s cn66xx;
+       struct cvmx_pcieepx_cfg455_s cn68xx;
+       struct cvmx_pcieepx_cfg455_s cn68xxp1;
+       struct cvmx_pcieepx_cfg455_s cn70xx;
+       struct cvmx_pcieepx_cfg455_s cn70xxp1;
+       struct cvmx_pcieepx_cfg455_s cn73xx;
+       struct cvmx_pcieepx_cfg455_s cn78xx;
+       struct cvmx_pcieepx_cfg455_s cn78xxp1;
+       struct cvmx_pcieepx_cfg455_s cnf71xx;
+       struct cvmx_pcieepx_cfg455_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg455 cvmx_pcieepx_cfg455_t;
+
+/**
+ * cvmx_pcieep#_cfg456
+ *
+ * This register contains the four hundred fifty-seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg456 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg456_s {
+               u32 reserved_4_31 : 28;
+               u32 m_handle_flush : 1;
+               u32 m_dabort_4ucpl : 1;
+               u32 m_vend1_drp : 1;
+               u32 m_vend0_drp : 1;
+       } s;
+       struct cvmx_pcieepx_cfg456_cn52xx {
+               u32 reserved_2_31 : 30;
+               u32 m_vend1_drp : 1;
+               u32 m_vend0_drp : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg456_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg456_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg456_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg456_s cn61xx;
+       struct cvmx_pcieepx_cfg456_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg456_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg456_s cn66xx;
+       struct cvmx_pcieepx_cfg456_s cn68xx;
+       struct cvmx_pcieepx_cfg456_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg456_s cn70xx;
+       struct cvmx_pcieepx_cfg456_s cn70xxp1;
+       struct cvmx_pcieepx_cfg456_s cn73xx;
+       struct cvmx_pcieepx_cfg456_s cn78xx;
+       struct cvmx_pcieepx_cfg456_s cn78xxp1;
+       struct cvmx_pcieepx_cfg456_s cnf71xx;
+       struct cvmx_pcieepx_cfg456_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg456 cvmx_pcieepx_cfg456_t;
+
+/**
+ * cvmx_pcieep#_cfg458
+ *
+ * This register contains the four hundred fifty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg458 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg458_s {
+               u32 dbg_info_l32 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg458_s cn52xx;
+       struct cvmx_pcieepx_cfg458_s cn52xxp1;
+       struct cvmx_pcieepx_cfg458_s cn56xx;
+       struct cvmx_pcieepx_cfg458_s cn56xxp1;
+       struct cvmx_pcieepx_cfg458_s cn61xx;
+       struct cvmx_pcieepx_cfg458_s cn63xx;
+       struct cvmx_pcieepx_cfg458_s cn63xxp1;
+       struct cvmx_pcieepx_cfg458_s cn66xx;
+       struct cvmx_pcieepx_cfg458_s cn68xx;
+       struct cvmx_pcieepx_cfg458_s cn68xxp1;
+       struct cvmx_pcieepx_cfg458_s cn70xx;
+       struct cvmx_pcieepx_cfg458_s cn70xxp1;
+       struct cvmx_pcieepx_cfg458_s cn73xx;
+       struct cvmx_pcieepx_cfg458_s cn78xx;
+       struct cvmx_pcieepx_cfg458_s cn78xxp1;
+       struct cvmx_pcieepx_cfg458_s cnf71xx;
+       struct cvmx_pcieepx_cfg458_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg458 cvmx_pcieepx_cfg458_t;
+
+/**
+ * cvmx_pcieep#_cfg459
+ *
+ * This register contains the four hundred sixtieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg459 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg459_s {
+               u32 dbg_info_u32 : 32;
+       } s;
+       struct cvmx_pcieepx_cfg459_s cn52xx;
+       struct cvmx_pcieepx_cfg459_s cn52xxp1;
+       struct cvmx_pcieepx_cfg459_s cn56xx;
+       struct cvmx_pcieepx_cfg459_s cn56xxp1;
+       struct cvmx_pcieepx_cfg459_s cn61xx;
+       struct cvmx_pcieepx_cfg459_s cn63xx;
+       struct cvmx_pcieepx_cfg459_s cn63xxp1;
+       struct cvmx_pcieepx_cfg459_s cn66xx;
+       struct cvmx_pcieepx_cfg459_s cn68xx;
+       struct cvmx_pcieepx_cfg459_s cn68xxp1;
+       struct cvmx_pcieepx_cfg459_s cn70xx;
+       struct cvmx_pcieepx_cfg459_s cn70xxp1;
+       struct cvmx_pcieepx_cfg459_s cn73xx;
+       struct cvmx_pcieepx_cfg459_s cn78xx;
+       struct cvmx_pcieepx_cfg459_s cn78xxp1;
+       struct cvmx_pcieepx_cfg459_s cnf71xx;
+       struct cvmx_pcieepx_cfg459_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg459 cvmx_pcieepx_cfg459_t;
+
+/**
+ * cvmx_pcieep#_cfg460
+ *
+ * This register contains the four hundred sixty-first 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg460 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg460_s {
+               u32 reserved_20_31 : 12;
+               u32 tphfcc : 8;
+               u32 tpdfcc : 12;
+       } s;
+       struct cvmx_pcieepx_cfg460_s cn52xx;
+       struct cvmx_pcieepx_cfg460_s cn52xxp1;
+       struct cvmx_pcieepx_cfg460_s cn56xx;
+       struct cvmx_pcieepx_cfg460_s cn56xxp1;
+       struct cvmx_pcieepx_cfg460_s cn61xx;
+       struct cvmx_pcieepx_cfg460_s cn63xx;
+       struct cvmx_pcieepx_cfg460_s cn63xxp1;
+       struct cvmx_pcieepx_cfg460_s cn66xx;
+       struct cvmx_pcieepx_cfg460_s cn68xx;
+       struct cvmx_pcieepx_cfg460_s cn68xxp1;
+       struct cvmx_pcieepx_cfg460_s cn70xx;
+       struct cvmx_pcieepx_cfg460_s cn70xxp1;
+       struct cvmx_pcieepx_cfg460_s cn73xx;
+       struct cvmx_pcieepx_cfg460_s cn78xx;
+       struct cvmx_pcieepx_cfg460_s cn78xxp1;
+       struct cvmx_pcieepx_cfg460_s cnf71xx;
+       struct cvmx_pcieepx_cfg460_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg460 cvmx_pcieepx_cfg460_t;
+
+/**
+ * cvmx_pcieep#_cfg461
+ *
+ * This register contains the four hundred sixty-second 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg461 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg461_s {
+               u32 reserved_20_31 : 12;
+               u32 tchfcc : 8;
+               u32 tcdfcc : 12;
+       } s;
+       struct cvmx_pcieepx_cfg461_s cn52xx;
+       struct cvmx_pcieepx_cfg461_s cn52xxp1;
+       struct cvmx_pcieepx_cfg461_s cn56xx;
+       struct cvmx_pcieepx_cfg461_s cn56xxp1;
+       struct cvmx_pcieepx_cfg461_s cn61xx;
+       struct cvmx_pcieepx_cfg461_s cn63xx;
+       struct cvmx_pcieepx_cfg461_s cn63xxp1;
+       struct cvmx_pcieepx_cfg461_s cn66xx;
+       struct cvmx_pcieepx_cfg461_s cn68xx;
+       struct cvmx_pcieepx_cfg461_s cn68xxp1;
+       struct cvmx_pcieepx_cfg461_s cn70xx;
+       struct cvmx_pcieepx_cfg461_s cn70xxp1;
+       struct cvmx_pcieepx_cfg461_s cn73xx;
+       struct cvmx_pcieepx_cfg461_s cn78xx;
+       struct cvmx_pcieepx_cfg461_s cn78xxp1;
+       struct cvmx_pcieepx_cfg461_s cnf71xx;
+       struct cvmx_pcieepx_cfg461_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg461 cvmx_pcieepx_cfg461_t;
+
+/**
+ * cvmx_pcieep#_cfg462
+ *
+ * This register contains the four hundred sixty-third 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg462 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg462_s {
+               u32 reserved_20_31 : 12;
+               u32 tchfcc : 8;
+               u32 tcdfcc : 12;
+       } s;
+       struct cvmx_pcieepx_cfg462_s cn52xx;
+       struct cvmx_pcieepx_cfg462_s cn52xxp1;
+       struct cvmx_pcieepx_cfg462_s cn56xx;
+       struct cvmx_pcieepx_cfg462_s cn56xxp1;
+       struct cvmx_pcieepx_cfg462_s cn61xx;
+       struct cvmx_pcieepx_cfg462_s cn63xx;
+       struct cvmx_pcieepx_cfg462_s cn63xxp1;
+       struct cvmx_pcieepx_cfg462_s cn66xx;
+       struct cvmx_pcieepx_cfg462_s cn68xx;
+       struct cvmx_pcieepx_cfg462_s cn68xxp1;
+       struct cvmx_pcieepx_cfg462_s cn70xx;
+       struct cvmx_pcieepx_cfg462_s cn70xxp1;
+       struct cvmx_pcieepx_cfg462_s cn73xx;
+       struct cvmx_pcieepx_cfg462_s cn78xx;
+       struct cvmx_pcieepx_cfg462_s cn78xxp1;
+       struct cvmx_pcieepx_cfg462_s cnf71xx;
+       struct cvmx_pcieepx_cfg462_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg462 cvmx_pcieepx_cfg462_t;
+
+/**
+ * cvmx_pcieep#_cfg463
+ *
+ * This register contains the four hundred sixty-fourth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg463 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg463_s {
+               u32 fcltoe : 1;
+               u32 reserved_29_30 : 2;
+               u32 fcltov : 13;
+               u32 reserved_3_15 : 13;
+               u32 rqne : 1;
+               u32 trbne : 1;
+               u32 rtlpfccnr : 1;
+       } s;
+       struct cvmx_pcieepx_cfg463_cn52xx {
+               u32 reserved_3_31 : 29;
+               u32 rqne : 1;
+               u32 trbne : 1;
+               u32 rtlpfccnr : 1;
+       } cn52xx;
+       struct cvmx_pcieepx_cfg463_cn52xx cn52xxp1;
+       struct cvmx_pcieepx_cfg463_cn52xx cn56xx;
+       struct cvmx_pcieepx_cfg463_cn52xx cn56xxp1;
+       struct cvmx_pcieepx_cfg463_cn52xx cn61xx;
+       struct cvmx_pcieepx_cfg463_cn52xx cn63xx;
+       struct cvmx_pcieepx_cfg463_cn52xx cn63xxp1;
+       struct cvmx_pcieepx_cfg463_cn52xx cn66xx;
+       struct cvmx_pcieepx_cfg463_cn52xx cn68xx;
+       struct cvmx_pcieepx_cfg463_cn52xx cn68xxp1;
+       struct cvmx_pcieepx_cfg463_cn52xx cn70xx;
+       struct cvmx_pcieepx_cfg463_cn52xx cn70xxp1;
+       struct cvmx_pcieepx_cfg463_s cn73xx;
+       struct cvmx_pcieepx_cfg463_s cn78xx;
+       struct cvmx_pcieepx_cfg463_s cn78xxp1;
+       struct cvmx_pcieepx_cfg463_cn52xx cnf71xx;
+       struct cvmx_pcieepx_cfg463_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg463 cvmx_pcieepx_cfg463_t;
+
+/**
+ * cvmx_pcieep#_cfg464
+ *
+ * This register contains the four hundred sixty-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg464 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg464_s {
+               u32 wrr_vc3 : 8;
+               u32 wrr_vc2 : 8;
+               u32 wrr_vc1 : 8;
+               u32 wrr_vc0 : 8;
+       } s;
+       struct cvmx_pcieepx_cfg464_s cn52xx;
+       struct cvmx_pcieepx_cfg464_s cn52xxp1;
+       struct cvmx_pcieepx_cfg464_s cn56xx;
+       struct cvmx_pcieepx_cfg464_s cn56xxp1;
+       struct cvmx_pcieepx_cfg464_s cn61xx;
+       struct cvmx_pcieepx_cfg464_s cn63xx;
+       struct cvmx_pcieepx_cfg464_s cn63xxp1;
+       struct cvmx_pcieepx_cfg464_s cn66xx;
+       struct cvmx_pcieepx_cfg464_s cn68xx;
+       struct cvmx_pcieepx_cfg464_s cn68xxp1;
+       struct cvmx_pcieepx_cfg464_s cn70xx;
+       struct cvmx_pcieepx_cfg464_s cn70xxp1;
+       struct cvmx_pcieepx_cfg464_s cn73xx;
+       struct cvmx_pcieepx_cfg464_s cn78xx;
+       struct cvmx_pcieepx_cfg464_s cn78xxp1;
+       struct cvmx_pcieepx_cfg464_s cnf71xx;
+       struct cvmx_pcieepx_cfg464_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg464 cvmx_pcieepx_cfg464_t;
+
+/**
+ * cvmx_pcieep#_cfg465
+ *
+ * This register contains the four hundred sixty-sixth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg465 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg465_s {
+               u32 wrr_vc7 : 8;
+               u32 wrr_vc6 : 8;
+               u32 wrr_vc5 : 8;
+               u32 wrr_vc4 : 8;
+       } s;
+       struct cvmx_pcieepx_cfg465_s cn52xx;
+       struct cvmx_pcieepx_cfg465_s cn52xxp1;
+       struct cvmx_pcieepx_cfg465_s cn56xx;
+       struct cvmx_pcieepx_cfg465_s cn56xxp1;
+       struct cvmx_pcieepx_cfg465_s cn61xx;
+       struct cvmx_pcieepx_cfg465_s cn63xx;
+       struct cvmx_pcieepx_cfg465_s cn63xxp1;
+       struct cvmx_pcieepx_cfg465_s cn66xx;
+       struct cvmx_pcieepx_cfg465_s cn68xx;
+       struct cvmx_pcieepx_cfg465_s cn68xxp1;
+       struct cvmx_pcieepx_cfg465_s cn70xx;
+       struct cvmx_pcieepx_cfg465_s cn70xxp1;
+       struct cvmx_pcieepx_cfg465_s cn73xx;
+       struct cvmx_pcieepx_cfg465_s cn78xx;
+       struct cvmx_pcieepx_cfg465_s cn78xxp1;
+       struct cvmx_pcieepx_cfg465_s cnf71xx;
+       struct cvmx_pcieepx_cfg465_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg465 cvmx_pcieepx_cfg465_t;
+
+/**
+ * cvmx_pcieep#_cfg466
+ *
+ * This register contains the four hundred sixty-seventh 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg466 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg466_s {
+               u32 rx_queue_order : 1;
+               u32 type_ordering : 1;
+               u32 reserved_24_29 : 6;
+               u32 queue_mode : 3;
+               u32 reserved_20_20 : 1;
+               u32 header_credits : 8;
+               u32 data_credits : 12;
+       } s;
+       struct cvmx_pcieepx_cfg466_s cn52xx;
+       struct cvmx_pcieepx_cfg466_s cn52xxp1;
+       struct cvmx_pcieepx_cfg466_s cn56xx;
+       struct cvmx_pcieepx_cfg466_s cn56xxp1;
+       struct cvmx_pcieepx_cfg466_s cn61xx;
+       struct cvmx_pcieepx_cfg466_s cn63xx;
+       struct cvmx_pcieepx_cfg466_s cn63xxp1;
+       struct cvmx_pcieepx_cfg466_s cn66xx;
+       struct cvmx_pcieepx_cfg466_s cn68xx;
+       struct cvmx_pcieepx_cfg466_s cn68xxp1;
+       struct cvmx_pcieepx_cfg466_s cn70xx;
+       struct cvmx_pcieepx_cfg466_s cn70xxp1;
+       struct cvmx_pcieepx_cfg466_s cn73xx;
+       struct cvmx_pcieepx_cfg466_s cn78xx;
+       struct cvmx_pcieepx_cfg466_s cn78xxp1;
+       struct cvmx_pcieepx_cfg466_s cnf71xx;
+       struct cvmx_pcieepx_cfg466_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg466 cvmx_pcieepx_cfg466_t;
+
+/**
+ * cvmx_pcieep#_cfg467
+ *
+ * This register contains the four hundred sixty-eighth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg467 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg467_s {
+               u32 reserved_24_31 : 8;
+               u32 queue_mode : 3;
+               u32 reserved_20_20 : 1;
+               u32 header_credits : 8;
+               u32 data_credits : 12;
+       } s;
+       struct cvmx_pcieepx_cfg467_s cn52xx;
+       struct cvmx_pcieepx_cfg467_s cn52xxp1;
+       struct cvmx_pcieepx_cfg467_s cn56xx;
+       struct cvmx_pcieepx_cfg467_s cn56xxp1;
+       struct cvmx_pcieepx_cfg467_s cn61xx;
+       struct cvmx_pcieepx_cfg467_s cn63xx;
+       struct cvmx_pcieepx_cfg467_s cn63xxp1;
+       struct cvmx_pcieepx_cfg467_s cn66xx;
+       struct cvmx_pcieepx_cfg467_s cn68xx;
+       struct cvmx_pcieepx_cfg467_s cn68xxp1;
+       struct cvmx_pcieepx_cfg467_s cn70xx;
+       struct cvmx_pcieepx_cfg467_s cn70xxp1;
+       struct cvmx_pcieepx_cfg467_s cn73xx;
+       struct cvmx_pcieepx_cfg467_s cn78xx;
+       struct cvmx_pcieepx_cfg467_s cn78xxp1;
+       struct cvmx_pcieepx_cfg467_s cnf71xx;
+       struct cvmx_pcieepx_cfg467_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg467 cvmx_pcieepx_cfg467_t;
+
+/**
+ * cvmx_pcieep#_cfg468
+ *
+ * This register contains the four hundred sixty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg468 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg468_s {
+               u32 reserved_24_31 : 8;
+               u32 queue_mode : 3;
+               u32 reserved_20_20 : 1;
+               u32 header_credits : 8;
+               u32 data_credits : 12;
+       } s;
+       struct cvmx_pcieepx_cfg468_s cn52xx;
+       struct cvmx_pcieepx_cfg468_s cn52xxp1;
+       struct cvmx_pcieepx_cfg468_s cn56xx;
+       struct cvmx_pcieepx_cfg468_s cn56xxp1;
+       struct cvmx_pcieepx_cfg468_s cn61xx;
+       struct cvmx_pcieepx_cfg468_s cn63xx;
+       struct cvmx_pcieepx_cfg468_s cn63xxp1;
+       struct cvmx_pcieepx_cfg468_s cn66xx;
+       struct cvmx_pcieepx_cfg468_s cn68xx;
+       struct cvmx_pcieepx_cfg468_s cn68xxp1;
+       struct cvmx_pcieepx_cfg468_s cn70xx;
+       struct cvmx_pcieepx_cfg468_s cn70xxp1;
+       struct cvmx_pcieepx_cfg468_s cn73xx;
+       struct cvmx_pcieepx_cfg468_s cn78xx;
+       struct cvmx_pcieepx_cfg468_s cn78xxp1;
+       struct cvmx_pcieepx_cfg468_s cnf71xx;
+       struct cvmx_pcieepx_cfg468_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg468 cvmx_pcieepx_cfg468_t;
+
+/**
+ * cvmx_pcieep#_cfg490
+ *
+ * PCIE_CFG490 = Four hundred ninety-first 32-bits of PCIE type 0 config space
+ * (VC0 Posted Buffer Depth)
+ */
+union cvmx_pcieepx_cfg490 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg490_s {
+               u32 reserved_26_31 : 6;
+               u32 header_depth : 10;
+               u32 reserved_14_15 : 2;
+               u32 data_depth : 14;
+       } s;
+       struct cvmx_pcieepx_cfg490_s cn52xx;
+       struct cvmx_pcieepx_cfg490_s cn52xxp1;
+       struct cvmx_pcieepx_cfg490_s cn56xx;
+       struct cvmx_pcieepx_cfg490_s cn56xxp1;
+       struct cvmx_pcieepx_cfg490_s cn61xx;
+       struct cvmx_pcieepx_cfg490_s cn63xx;
+       struct cvmx_pcieepx_cfg490_s cn63xxp1;
+       struct cvmx_pcieepx_cfg490_s cn66xx;
+       struct cvmx_pcieepx_cfg490_s cn68xx;
+       struct cvmx_pcieepx_cfg490_s cn68xxp1;
+       struct cvmx_pcieepx_cfg490_s cn70xx;
+       struct cvmx_pcieepx_cfg490_s cn70xxp1;
+       struct cvmx_pcieepx_cfg490_s cnf71xx;
+};
+
+typedef union cvmx_pcieepx_cfg490 cvmx_pcieepx_cfg490_t;
+
+/**
+ * cvmx_pcieep#_cfg491
+ *
+ * PCIE_CFG491 = Four hundred ninety-second 32-bits of PCIE type 0 config space
+ * (VC0 Non-Posted Buffer Depth)
+ */
+union cvmx_pcieepx_cfg491 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg491_s {
+               u32 reserved_26_31 : 6;
+               u32 header_depth : 10;
+               u32 reserved_14_15 : 2;
+               u32 data_depth : 14;
+       } s;
+       struct cvmx_pcieepx_cfg491_s cn52xx;
+       struct cvmx_pcieepx_cfg491_s cn52xxp1;
+       struct cvmx_pcieepx_cfg491_s cn56xx;
+       struct cvmx_pcieepx_cfg491_s cn56xxp1;
+       struct cvmx_pcieepx_cfg491_s cn61xx;
+       struct cvmx_pcieepx_cfg491_s cn63xx;
+       struct cvmx_pcieepx_cfg491_s cn63xxp1;
+       struct cvmx_pcieepx_cfg491_s cn66xx;
+       struct cvmx_pcieepx_cfg491_s cn68xx;
+       struct cvmx_pcieepx_cfg491_s cn68xxp1;
+       struct cvmx_pcieepx_cfg491_s cn70xx;
+       struct cvmx_pcieepx_cfg491_s cn70xxp1;
+       struct cvmx_pcieepx_cfg491_s cnf71xx;
+};
+
+typedef union cvmx_pcieepx_cfg491 cvmx_pcieepx_cfg491_t;
+
+/**
+ * cvmx_pcieep#_cfg492
+ *
+ * PCIE_CFG492 = Four hundred ninety-third 32-bits of PCIE type 0 config space
+ * (VC0 Completion Buffer Depth)
+ */
+union cvmx_pcieepx_cfg492 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg492_s {
+               u32 reserved_26_31 : 6;
+               u32 header_depth : 10;
+               u32 reserved_14_15 : 2;
+               u32 data_depth : 14;
+       } s;
+       struct cvmx_pcieepx_cfg492_s cn52xx;
+       struct cvmx_pcieepx_cfg492_s cn52xxp1;
+       struct cvmx_pcieepx_cfg492_s cn56xx;
+       struct cvmx_pcieepx_cfg492_s cn56xxp1;
+       struct cvmx_pcieepx_cfg492_s cn61xx;
+       struct cvmx_pcieepx_cfg492_s cn63xx;
+       struct cvmx_pcieepx_cfg492_s cn63xxp1;
+       struct cvmx_pcieepx_cfg492_s cn66xx;
+       struct cvmx_pcieepx_cfg492_s cn68xx;
+       struct cvmx_pcieepx_cfg492_s cn68xxp1;
+       struct cvmx_pcieepx_cfg492_s cn70xx;
+       struct cvmx_pcieepx_cfg492_s cn70xxp1;
+       struct cvmx_pcieepx_cfg492_s cnf71xx;
+};
+
+typedef union cvmx_pcieepx_cfg492 cvmx_pcieepx_cfg492_t;
+
+/**
+ * cvmx_pcieep#_cfg515
+ *
+ * This register contains the five hundred sixteenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg515 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg515_s {
+               u32 reserved_21_31 : 11;
+               u32 s_d_e : 1;
+               u32 ctcrb : 1;
+               u32 cpyts : 1;
+               u32 dsc : 1;
+               u32 reserved_8_16 : 9;
+               u32 n_fts : 8;
+       } s;
+       struct cvmx_pcieepx_cfg515_cn61xx {
+               u32 reserved_21_31 : 11;
+               u32 s_d_e : 1;
+               u32 ctcrb : 1;
+               u32 cpyts : 1;
+               u32 dsc : 1;
+               u32 le : 9;
+               u32 n_fts : 8;
+       } cn61xx;
+       struct cvmx_pcieepx_cfg515_cn61xx cn63xx;
+       struct cvmx_pcieepx_cfg515_cn61xx cn63xxp1;
+       struct cvmx_pcieepx_cfg515_cn61xx cn66xx;
+       struct cvmx_pcieepx_cfg515_cn61xx cn68xx;
+       struct cvmx_pcieepx_cfg515_cn61xx cn68xxp1;
+       struct cvmx_pcieepx_cfg515_cn61xx cn70xx;
+       struct cvmx_pcieepx_cfg515_cn61xx cn70xxp1;
+       struct cvmx_pcieepx_cfg515_cn61xx cn73xx;
+       struct cvmx_pcieepx_cfg515_cn78xx {
+               u32 reserved_21_31 : 11;
+               u32 s_d_e : 1;
+               u32 ctcrb : 1;
+               u32 cpyts : 1;
+               u32 dsc : 1;
+               u32 alaneflip : 1;
+               u32 pdetlane : 3;
+               u32 nlanes : 5;
+               u32 n_fts : 8;
+       } cn78xx;
+       struct cvmx_pcieepx_cfg515_cn61xx cn78xxp1;
+       struct cvmx_pcieepx_cfg515_cn61xx cnf71xx;
+       struct cvmx_pcieepx_cfg515_cn78xx cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg515 cvmx_pcieepx_cfg515_t;
+
+/**
+ * cvmx_pcieep#_cfg516
+ *
+ * This register contains the five hundred seventeenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg516 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg516_s {
+               u32 phy_stat : 32;
+       } s;
+       struct cvmx_pcieepx_cfg516_s cn52xx;
+       struct cvmx_pcieepx_cfg516_s cn52xxp1;
+       struct cvmx_pcieepx_cfg516_s cn56xx;
+       struct cvmx_pcieepx_cfg516_s cn56xxp1;
+       struct cvmx_pcieepx_cfg516_s cn61xx;
+       struct cvmx_pcieepx_cfg516_s cn63xx;
+       struct cvmx_pcieepx_cfg516_s cn63xxp1;
+       struct cvmx_pcieepx_cfg516_s cn66xx;
+       struct cvmx_pcieepx_cfg516_s cn68xx;
+       struct cvmx_pcieepx_cfg516_s cn68xxp1;
+       struct cvmx_pcieepx_cfg516_s cn70xx;
+       struct cvmx_pcieepx_cfg516_s cn70xxp1;
+       struct cvmx_pcieepx_cfg516_s cn73xx;
+       struct cvmx_pcieepx_cfg516_s cn78xx;
+       struct cvmx_pcieepx_cfg516_s cn78xxp1;
+       struct cvmx_pcieepx_cfg516_s cnf71xx;
+       struct cvmx_pcieepx_cfg516_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg516 cvmx_pcieepx_cfg516_t;
+
+/**
+ * cvmx_pcieep#_cfg517
+ *
+ * This register contains the five hundred eighteenth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg517 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg517_s {
+               u32 phy_ctrl : 32;
+       } s;
+       struct cvmx_pcieepx_cfg517_s cn52xx;
+       struct cvmx_pcieepx_cfg517_s cn52xxp1;
+       struct cvmx_pcieepx_cfg517_s cn56xx;
+       struct cvmx_pcieepx_cfg517_s cn56xxp1;
+       struct cvmx_pcieepx_cfg517_s cn61xx;
+       struct cvmx_pcieepx_cfg517_s cn63xx;
+       struct cvmx_pcieepx_cfg517_s cn63xxp1;
+       struct cvmx_pcieepx_cfg517_s cn66xx;
+       struct cvmx_pcieepx_cfg517_s cn68xx;
+       struct cvmx_pcieepx_cfg517_s cn68xxp1;
+       struct cvmx_pcieepx_cfg517_s cn70xx;
+       struct cvmx_pcieepx_cfg517_s cn70xxp1;
+       struct cvmx_pcieepx_cfg517_s cn73xx;
+       struct cvmx_pcieepx_cfg517_s cn78xx;
+       struct cvmx_pcieepx_cfg517_s cn78xxp1;
+       struct cvmx_pcieepx_cfg517_s cnf71xx;
+       struct cvmx_pcieepx_cfg517_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg517 cvmx_pcieepx_cfg517_t;
+
+/**
+ * cvmx_pcieep#_cfg548
+ *
+ * This register contains the five hundred forty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg548 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg548_s {
+               u32 reserved_26_31 : 6;
+               u32 rss : 2;
+               u32 eiedd : 1;
+               u32 reserved_19_22 : 4;
+               u32 dcbd : 1;
+               u32 dtdd : 1;
+               u32 ed : 1;
+               u32 reserved_13_15 : 3;
+               u32 rxeq_ph01_en : 1;
+               u32 erd : 1;
+               u32 ecrd : 1;
+               u32 ep2p3d : 1;
+               u32 dsg3 : 1;
+               u32 reserved_1_7 : 7;
+               u32 grizdnc : 1;
+       } s;
+       struct cvmx_pcieepx_cfg548_s cn73xx;
+       struct cvmx_pcieepx_cfg548_s cn78xx;
+       struct cvmx_pcieepx_cfg548_s cn78xxp1;
+       struct cvmx_pcieepx_cfg548_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg548 cvmx_pcieepx_cfg548_t;
+
+/**
+ * cvmx_pcieep#_cfg554
+ *
+ * This register contains the five hundred fifty-fifth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg554 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg554_s {
+               u32 reserved_27_31 : 5;
+               u32 scefpm : 1;
+               u32 reserved_25_25 : 1;
+               u32 iif : 1;
+               u32 prv : 16;
+               u32 reserved_6_7 : 2;
+               u32 p23td : 1;
+               u32 bt : 1;
+               u32 fm : 4;
+       } s;
+       struct cvmx_pcieepx_cfg554_cn73xx {
+               u32 reserved_25_31 : 7;
+               u32 iif : 1;
+               u32 prv : 16;
+               u32 reserved_6_7 : 2;
+               u32 p23td : 1;
+               u32 bt : 1;
+               u32 fm : 4;
+       } cn73xx;
+       struct cvmx_pcieepx_cfg554_s cn78xx;
+       struct cvmx_pcieepx_cfg554_s cn78xxp1;
+       struct cvmx_pcieepx_cfg554_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg554 cvmx_pcieepx_cfg554_t;
+
+/**
+ * cvmx_pcieep#_cfg558
+ *
+ * This register contains the five hundred fifty-ninth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg558 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg558_s {
+               u32 ple : 1;
+               u32 rxstatus : 31;
+       } s;
+       struct cvmx_pcieepx_cfg558_s cn73xx;
+       struct cvmx_pcieepx_cfg558_s cn78xx;
+       struct cvmx_pcieepx_cfg558_s cn78xxp1;
+       struct cvmx_pcieepx_cfg558_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg558 cvmx_pcieepx_cfg558_t;
+
+/**
+ * cvmx_pcieep#_cfg559
+ *
+ * This register contains the five hundred sixtieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pcieepx_cfg559 {
+       u32 u32;
+       struct cvmx_pcieepx_cfg559_s {
+               u32 reserved_1_31 : 31;
+               u32 dbi_ro_wr_en : 1;
+       } s;
+       struct cvmx_pcieepx_cfg559_s cn73xx;
+       struct cvmx_pcieepx_cfg559_s cn78xx;
+       struct cvmx_pcieepx_cfg559_s cn78xxp1;
+       struct cvmx_pcieepx_cfg559_s cnf75xx;
+};
+
+typedef union cvmx_pcieepx_cfg559 cvmx_pcieepx_cfg559_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pciercx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pciercx-defs.h
new file mode 100644 (file)
index 0000000..1e3e045
--- /dev/null
@@ -0,0 +1,5586 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pciercx.
+ */
+
+#ifndef __CVMX_PCIERCX_DEFS_H__
+#define __CVMX_PCIERCX_DEFS_H__
+
+static inline u64 CVMX_PCIERCX_CFG000(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000000ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000000ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000000ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000000ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000000ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000000ull;
+       }
+       return 0x0000020000000000ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG001(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000004ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000004ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000004ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000004ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000004ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000004ull;
+       }
+       return 0x0000020000000004ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG002(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000008ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000008ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000008ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000008ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000008ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000008ull;
+       }
+       return 0x0000020000000008ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG003(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000000Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000000Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000000Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000000Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000000Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000000Cull;
+       }
+       return 0x000002000000000Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG004(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000010ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000010ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000010ull;
+       }
+       return 0x0000020000000010ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG005(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000014ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000014ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000014ull;
+       }
+       return 0x0000020000000014ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG006(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000018ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000018ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000018ull;
+       }
+       return 0x0000020000000018ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG007(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000001Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000001Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000001Cull;
+       }
+       return 0x000002000000001Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG008(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000020ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000020ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000020ull;
+       }
+       return 0x0000020000000020ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG009(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000024ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000024ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000024ull;
+       }
+       return 0x0000020000000024ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG010(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000028ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000028ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000028ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000028ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000028ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000028ull;
+       }
+       return 0x0000020000000028ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG011(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000002Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000002Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000002Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000002Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000002Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000002Cull;
+       }
+       return 0x000002000000002Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG012(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000030ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000030ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000030ull;
+       }
+       return 0x0000020000000030ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG013(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000034ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000034ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000034ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000034ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000034ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000034ull;
+       }
+       return 0x0000020000000034ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG014(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000038ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000038ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000038ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000038ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000038ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000038ull;
+       }
+       return 0x0000020000000038ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG015(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000003Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000003Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000003Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000003Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000003Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000003Cull;
+       }
+       return 0x000002000000003Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG016(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000040ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000040ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000040ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000040ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000040ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000040ull;
+       }
+       return 0x0000020000000040ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG017(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000044ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000044ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000044ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000044ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000044ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000044ull;
+       }
+       return 0x0000020000000044ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG020(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000050ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000050ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000050ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000050ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000050ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000050ull;
+       }
+       return 0x0000020000000050ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG021(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000054ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000054ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000054ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000054ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000054ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000054ull;
+       }
+       return 0x0000020000000054ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG022(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000058ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000058ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000058ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000058ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000058ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000058ull;
+       }
+       return 0x0000020000000058ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG023(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000005Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000005Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000005Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000005Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000005Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000005Cull;
+       }
+       return 0x000002000000005Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG028(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000070ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000070ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000070ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000070ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000070ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000070ull;
+       }
+       return 0x0000020000000070ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG029(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000074ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000074ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000074ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000074ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000074ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000074ull;
+       }
+       return 0x0000020000000074ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG030(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000078ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000078ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000078ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000078ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000078ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000078ull;
+       }
+       return 0x0000020000000078ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG031(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000007Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000007Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000007Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000007Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000007Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000007Cull;
+       }
+       return 0x000002000000007Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG032(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000080ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000080ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000080ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000080ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000080ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000080ull;
+       }
+       return 0x0000020000000080ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG033(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000084ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000084ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000084ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000084ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000084ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000084ull;
+       }
+       return 0x0000020000000084ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG034(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000088ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000088ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000088ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000088ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000088ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000088ull;
+       }
+       return 0x0000020000000088ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG035(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000008Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000008Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000008Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000008Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000008Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000008Cull;
+       }
+       return 0x000002000000008Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG036(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000090ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000090ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000090ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000090ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000090ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000090ull;
+       }
+       return 0x0000020000000090ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG037(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000094ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000094ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000094ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000094ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000094ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000094ull;
+       }
+       return 0x0000020000000094ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG038(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000098ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000098ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000098ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000098ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000098ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000098ull;
+       }
+       return 0x0000020000000098ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG039(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000009Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000009Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000009Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000009Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000009Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000009Cull;
+       }
+       return 0x000002000000009Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG040(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A0ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A0ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000200000000A0ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000200000000A0ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A0ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000000A0ull;
+       }
+       return 0x00000200000000A0ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG041(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A4ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A4ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000200000000A4ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000200000000A4ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A4ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000000A4ull;
+       }
+       return 0x00000200000000A4ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG042(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A8ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A8ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000200000000A8ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000200000000A8ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000000A8ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000000A8ull;
+       }
+       return 0x00000200000000A8ull + (offset) * 0x100000000ull;
+}
+
+#define CVMX_PCIERCX_CFG044(offset) (0x00000200000000B0ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG045(offset) (0x00000200000000B4ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG046(offset) (0x00000200000000B8ull + ((offset) & 3) * 0x100000000ull)
+static inline u64 CVMX_PCIERCX_CFG064(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000100ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000100ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000100ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000100ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000100ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000100ull;
+       }
+       return 0x0000020000000100ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG065(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000104ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000104ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000104ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000104ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000104ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000104ull;
+       }
+       return 0x0000020000000104ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG066(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000108ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000108ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000108ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000108ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000108ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000108ull;
+       }
+       return 0x0000020000000108ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG067(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000010Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000010Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000010Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000010Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000010Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000010Cull;
+       }
+       return 0x000002000000010Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG068(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000110ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000110ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000110ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000110ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000110ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000110ull;
+       }
+       return 0x0000020000000110ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG069(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000114ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000114ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000114ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000114ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000114ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000114ull;
+       }
+       return 0x0000020000000114ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG070(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000118ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000118ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000118ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000118ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000118ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000118ull;
+       }
+       return 0x0000020000000118ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG071(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000011Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000011Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000011Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000011Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000011Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000011Cull;
+       }
+       return 0x000002000000011Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG072(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000120ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000120ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000120ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000120ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000120ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000120ull;
+       }
+       return 0x0000020000000120ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG073(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000124ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000124ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000124ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000124ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000124ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000124ull;
+       }
+       return 0x0000020000000124ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG074(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000128ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000128ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000128ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000128ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000128ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000128ull;
+       }
+       return 0x0000020000000128ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG075(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000012Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000012Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000012Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000012Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000012Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000012Cull;
+       }
+       return 0x000002000000012Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG076(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000130ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000130ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000130ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000130ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000130ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000130ull;
+       }
+       return 0x0000020000000130ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG077(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000134ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000134ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000134ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000134ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000134ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000134ull;
+       }
+       return 0x0000020000000134ull + (offset) * 0x100000000ull;
+}
+
+#define CVMX_PCIERCX_CFG086(offset) (0x0000020000000158ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG087(offset) (0x000002000000015Cull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG088(offset) (0x0000020000000160ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG089(offset) (0x0000020000000164ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG090(offset) (0x0000020000000168ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG091(offset) (0x000002000000016Cull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG092(offset) (0x0000020000000170ull + ((offset) & 3) * 0x100000000ull)
+static inline u64 CVMX_PCIERCX_CFG448(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000700ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000700ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000700ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000700ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000700ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000700ull;
+       }
+       return 0x0000020000000700ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG449(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000704ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000704ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000704ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000704ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000704ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000704ull;
+       }
+       return 0x0000020000000704ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG450(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000708ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000708ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000708ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000708ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000708ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000708ull;
+       }
+       return 0x0000020000000708ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG451(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000070Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000070Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000070Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000070Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000070Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000070Cull;
+       }
+       return 0x000002000000070Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG452(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000710ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000710ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000710ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000710ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000710ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000710ull;
+       }
+       return 0x0000020000000710ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG453(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000714ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000714ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000714ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000714ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000714ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000714ull;
+       }
+       return 0x0000020000000714ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG454(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000718ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000718ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000718ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000718ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000718ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000718ull;
+       }
+       return 0x0000020000000718ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG455(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000071Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000071Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000071Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000071Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000071Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000071Cull;
+       }
+       return 0x000002000000071Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG456(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000720ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000720ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000720ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000720ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000720ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000720ull;
+       }
+       return 0x0000020000000720ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG458(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000728ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000728ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000728ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000728ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000728ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000728ull;
+       }
+       return 0x0000020000000728ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG459(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000072Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000072Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000072Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000072Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000072Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000072Cull;
+       }
+       return 0x000002000000072Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG460(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000730ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000730ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000730ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000730ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000730ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000730ull;
+       }
+       return 0x0000020000000730ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG461(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000734ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000734ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000734ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000734ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000734ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000734ull;
+       }
+       return 0x0000020000000734ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG462(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000738ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000738ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000738ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000738ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000738ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000738ull;
+       }
+       return 0x0000020000000738ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG463(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000073Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000073Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000073Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000073Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000073Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000073Cull;
+       }
+       return 0x000002000000073Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG464(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000740ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000740ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000740ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000740ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000740ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000740ull;
+       }
+       return 0x0000020000000740ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG465(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000744ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000744ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000744ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000744ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000744ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000744ull;
+       }
+       return 0x0000020000000744ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG466(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000748ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000748ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000748ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000748ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000748ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000748ull;
+       }
+       return 0x0000020000000748ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG467(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000074Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000074Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000074Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000074Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000074Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000074Cull;
+       }
+       return 0x000002000000074Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG468(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000750ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000750ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000750ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000750ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000750ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000750ull;
+       }
+       return 0x0000020000000750ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG490(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000007A8ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000007A8ull + (offset) * 0x100000000ull;
+       }
+       return 0x00000000000007A8ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG491(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000007ACull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000007ACull + (offset) * 0x100000000ull;
+       }
+       return 0x00000000000007ACull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG492(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000007B0ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00000200000007B0ull + (offset) * 0x100000000ull;
+       }
+       return 0x00000000000007B0ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG515(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000080Cull + (offset) * 0x100000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000080Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x000002000000080Cull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x000002000000080Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x000002000000080Cull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x000000000000080Cull;
+       }
+       return 0x000002000000080Cull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG516(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000810ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000810ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000810ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000810ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000810ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000810ull;
+       }
+       return 0x0000020000000810ull + (offset) * 0x100000000ull;
+}
+
+static inline u64 CVMX_PCIERCX_CFG517(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000814ull + (offset) * 0x100000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000814ull + (offset) * 0x100000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000020000000814ull + (offset) * 0x100000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000020000000814ull + (offset) * 0x100000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000020000000814ull + (offset) * 0x100000000ull;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000814ull;
+       }
+       return 0x0000020000000814ull + (offset) * 0x100000000ull;
+}
+
+#define CVMX_PCIERCX_CFG548(offset) (0x0000020000000890ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG554(offset) (0x00000200000008A8ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG558(offset) (0x00000200000008B8ull + ((offset) & 3) * 0x100000000ull)
+#define CVMX_PCIERCX_CFG559(offset) (0x00000200000008BCull + ((offset) & 3) * 0x100000000ull)
+
+/**
+ * cvmx_pcierc#_cfg000
+ *
+ * This register contains the first 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg000 {
+       u32 u32;
+       struct cvmx_pciercx_cfg000_s {
+               u32 devid : 16;
+               u32 vendid : 16;
+       } s;
+       struct cvmx_pciercx_cfg000_s cn52xx;
+       struct cvmx_pciercx_cfg000_s cn52xxp1;
+       struct cvmx_pciercx_cfg000_s cn56xx;
+       struct cvmx_pciercx_cfg000_s cn56xxp1;
+       struct cvmx_pciercx_cfg000_s cn61xx;
+       struct cvmx_pciercx_cfg000_s cn63xx;
+       struct cvmx_pciercx_cfg000_s cn63xxp1;
+       struct cvmx_pciercx_cfg000_s cn66xx;
+       struct cvmx_pciercx_cfg000_s cn68xx;
+       struct cvmx_pciercx_cfg000_s cn68xxp1;
+       struct cvmx_pciercx_cfg000_s cn70xx;
+       struct cvmx_pciercx_cfg000_s cn70xxp1;
+       struct cvmx_pciercx_cfg000_s cn73xx;
+       struct cvmx_pciercx_cfg000_s cn78xx;
+       struct cvmx_pciercx_cfg000_s cn78xxp1;
+       struct cvmx_pciercx_cfg000_s cnf71xx;
+       struct cvmx_pciercx_cfg000_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg000 cvmx_pciercx_cfg000_t;
+
+/**
+ * cvmx_pcierc#_cfg001
+ *
+ * This register contains the second 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg001 {
+       u32 u32;
+       struct cvmx_pciercx_cfg001_s {
+               u32 dpe : 1;
+               u32 sse : 1;
+               u32 rma : 1;
+               u32 rta : 1;
+               u32 sta : 1;
+               u32 devt : 2;
+               u32 mdpe : 1;
+               u32 fbb : 1;
+               u32 reserved_22_22 : 1;
+               u32 m66 : 1;
+               u32 cl : 1;
+               u32 i_stat : 1;
+               u32 reserved_11_18 : 8;
+               u32 i_dis : 1;
+               u32 fbbe : 1;
+               u32 see : 1;
+               u32 ids_wcc : 1;
+               u32 per : 1;
+               u32 vps : 1;
+               u32 mwice : 1;
+               u32 scse : 1;
+               u32 me : 1;
+               u32 msae : 1;
+               u32 isae : 1;
+       } s;
+       struct cvmx_pciercx_cfg001_s cn52xx;
+       struct cvmx_pciercx_cfg001_s cn52xxp1;
+       struct cvmx_pciercx_cfg001_s cn56xx;
+       struct cvmx_pciercx_cfg001_s cn56xxp1;
+       struct cvmx_pciercx_cfg001_s cn61xx;
+       struct cvmx_pciercx_cfg001_s cn63xx;
+       struct cvmx_pciercx_cfg001_s cn63xxp1;
+       struct cvmx_pciercx_cfg001_s cn66xx;
+       struct cvmx_pciercx_cfg001_s cn68xx;
+       struct cvmx_pciercx_cfg001_s cn68xxp1;
+       struct cvmx_pciercx_cfg001_s cn70xx;
+       struct cvmx_pciercx_cfg001_s cn70xxp1;
+       struct cvmx_pciercx_cfg001_s cn73xx;
+       struct cvmx_pciercx_cfg001_s cn78xx;
+       struct cvmx_pciercx_cfg001_s cn78xxp1;
+       struct cvmx_pciercx_cfg001_s cnf71xx;
+       struct cvmx_pciercx_cfg001_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg001 cvmx_pciercx_cfg001_t;
+
+/**
+ * cvmx_pcierc#_cfg002
+ *
+ * This register contains the third 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg002 {
+       u32 u32;
+       struct cvmx_pciercx_cfg002_s {
+               u32 bcc : 8;
+               u32 sc : 8;
+               u32 pi : 8;
+               u32 rid : 8;
+       } s;
+       struct cvmx_pciercx_cfg002_s cn52xx;
+       struct cvmx_pciercx_cfg002_s cn52xxp1;
+       struct cvmx_pciercx_cfg002_s cn56xx;
+       struct cvmx_pciercx_cfg002_s cn56xxp1;
+       struct cvmx_pciercx_cfg002_s cn61xx;
+       struct cvmx_pciercx_cfg002_s cn63xx;
+       struct cvmx_pciercx_cfg002_s cn63xxp1;
+       struct cvmx_pciercx_cfg002_s cn66xx;
+       struct cvmx_pciercx_cfg002_s cn68xx;
+       struct cvmx_pciercx_cfg002_s cn68xxp1;
+       struct cvmx_pciercx_cfg002_s cn70xx;
+       struct cvmx_pciercx_cfg002_s cn70xxp1;
+       struct cvmx_pciercx_cfg002_s cn73xx;
+       struct cvmx_pciercx_cfg002_s cn78xx;
+       struct cvmx_pciercx_cfg002_s cn78xxp1;
+       struct cvmx_pciercx_cfg002_s cnf71xx;
+       struct cvmx_pciercx_cfg002_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg002 cvmx_pciercx_cfg002_t;
+
+/**
+ * cvmx_pcierc#_cfg003
+ *
+ * This register contains the fourth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg003 {
+       u32 u32;
+       struct cvmx_pciercx_cfg003_s {
+               u32 bist : 8;
+               u32 mfd : 1;
+               u32 chf : 7;
+               u32 lt : 8;
+               u32 cls : 8;
+       } s;
+       struct cvmx_pciercx_cfg003_s cn52xx;
+       struct cvmx_pciercx_cfg003_s cn52xxp1;
+       struct cvmx_pciercx_cfg003_s cn56xx;
+       struct cvmx_pciercx_cfg003_s cn56xxp1;
+       struct cvmx_pciercx_cfg003_s cn61xx;
+       struct cvmx_pciercx_cfg003_s cn63xx;
+       struct cvmx_pciercx_cfg003_s cn63xxp1;
+       struct cvmx_pciercx_cfg003_s cn66xx;
+       struct cvmx_pciercx_cfg003_s cn68xx;
+       struct cvmx_pciercx_cfg003_s cn68xxp1;
+       struct cvmx_pciercx_cfg003_s cn70xx;
+       struct cvmx_pciercx_cfg003_s cn70xxp1;
+       struct cvmx_pciercx_cfg003_s cn73xx;
+       struct cvmx_pciercx_cfg003_s cn78xx;
+       struct cvmx_pciercx_cfg003_s cn78xxp1;
+       struct cvmx_pciercx_cfg003_s cnf71xx;
+       struct cvmx_pciercx_cfg003_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg003 cvmx_pciercx_cfg003_t;
+
+/**
+ * cvmx_pcierc#_cfg004
+ *
+ * This register contains the fifth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg004 {
+       u32 u32;
+       struct cvmx_pciercx_cfg004_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pciercx_cfg004_s cn52xx;
+       struct cvmx_pciercx_cfg004_s cn52xxp1;
+       struct cvmx_pciercx_cfg004_s cn56xx;
+       struct cvmx_pciercx_cfg004_s cn56xxp1;
+       struct cvmx_pciercx_cfg004_s cn61xx;
+       struct cvmx_pciercx_cfg004_s cn63xx;
+       struct cvmx_pciercx_cfg004_s cn63xxp1;
+       struct cvmx_pciercx_cfg004_s cn66xx;
+       struct cvmx_pciercx_cfg004_s cn68xx;
+       struct cvmx_pciercx_cfg004_s cn68xxp1;
+       struct cvmx_pciercx_cfg004_cn70xx {
+               u32 reserved_31_0 : 32;
+       } cn70xx;
+       struct cvmx_pciercx_cfg004_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg004_cn70xx cn73xx;
+       struct cvmx_pciercx_cfg004_cn70xx cn78xx;
+       struct cvmx_pciercx_cfg004_cn70xx cn78xxp1;
+       struct cvmx_pciercx_cfg004_s cnf71xx;
+       struct cvmx_pciercx_cfg004_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg004 cvmx_pciercx_cfg004_t;
+
+/**
+ * cvmx_pcierc#_cfg005
+ *
+ * This register contains the sixth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg005 {
+       u32 u32;
+       struct cvmx_pciercx_cfg005_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pciercx_cfg005_s cn52xx;
+       struct cvmx_pciercx_cfg005_s cn52xxp1;
+       struct cvmx_pciercx_cfg005_s cn56xx;
+       struct cvmx_pciercx_cfg005_s cn56xxp1;
+       struct cvmx_pciercx_cfg005_s cn61xx;
+       struct cvmx_pciercx_cfg005_s cn63xx;
+       struct cvmx_pciercx_cfg005_s cn63xxp1;
+       struct cvmx_pciercx_cfg005_s cn66xx;
+       struct cvmx_pciercx_cfg005_s cn68xx;
+       struct cvmx_pciercx_cfg005_s cn68xxp1;
+       struct cvmx_pciercx_cfg005_cn70xx {
+               u32 reserved_31_0 : 32;
+       } cn70xx;
+       struct cvmx_pciercx_cfg005_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg005_cn70xx cn73xx;
+       struct cvmx_pciercx_cfg005_cn70xx cn78xx;
+       struct cvmx_pciercx_cfg005_cn70xx cn78xxp1;
+       struct cvmx_pciercx_cfg005_s cnf71xx;
+       struct cvmx_pciercx_cfg005_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg005 cvmx_pciercx_cfg005_t;
+
+/**
+ * cvmx_pcierc#_cfg006
+ *
+ * This register contains the seventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg006 {
+       u32 u32;
+       struct cvmx_pciercx_cfg006_s {
+               u32 slt : 8;
+               u32 subbnum : 8;
+               u32 sbnum : 8;
+               u32 pbnum : 8;
+       } s;
+       struct cvmx_pciercx_cfg006_s cn52xx;
+       struct cvmx_pciercx_cfg006_s cn52xxp1;
+       struct cvmx_pciercx_cfg006_s cn56xx;
+       struct cvmx_pciercx_cfg006_s cn56xxp1;
+       struct cvmx_pciercx_cfg006_s cn61xx;
+       struct cvmx_pciercx_cfg006_s cn63xx;
+       struct cvmx_pciercx_cfg006_s cn63xxp1;
+       struct cvmx_pciercx_cfg006_s cn66xx;
+       struct cvmx_pciercx_cfg006_s cn68xx;
+       struct cvmx_pciercx_cfg006_s cn68xxp1;
+       struct cvmx_pciercx_cfg006_s cn70xx;
+       struct cvmx_pciercx_cfg006_s cn70xxp1;
+       struct cvmx_pciercx_cfg006_s cn73xx;
+       struct cvmx_pciercx_cfg006_s cn78xx;
+       struct cvmx_pciercx_cfg006_s cn78xxp1;
+       struct cvmx_pciercx_cfg006_s cnf71xx;
+       struct cvmx_pciercx_cfg006_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg006 cvmx_pciercx_cfg006_t;
+
+/**
+ * cvmx_pcierc#_cfg007
+ *
+ * This register contains the eighth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg007 {
+       u32 u32;
+       struct cvmx_pciercx_cfg007_s {
+               u32 dpe : 1;
+               u32 sse : 1;
+               u32 rma : 1;
+               u32 rta : 1;
+               u32 sta : 1;
+               u32 devt : 2;
+               u32 mdpe : 1;
+               u32 fbb : 1;
+               u32 reserved_22_22 : 1;
+               u32 m66 : 1;
+               u32 reserved_16_20 : 5;
+               u32 lio_limi : 4;
+               u32 reserved_9_11 : 3;
+               u32 io32b : 1;
+               u32 lio_base : 4;
+               u32 reserved_1_3 : 3;
+               u32 io32a : 1;
+       } s;
+       struct cvmx_pciercx_cfg007_s cn52xx;
+       struct cvmx_pciercx_cfg007_s cn52xxp1;
+       struct cvmx_pciercx_cfg007_s cn56xx;
+       struct cvmx_pciercx_cfg007_s cn56xxp1;
+       struct cvmx_pciercx_cfg007_s cn61xx;
+       struct cvmx_pciercx_cfg007_s cn63xx;
+       struct cvmx_pciercx_cfg007_s cn63xxp1;
+       struct cvmx_pciercx_cfg007_s cn66xx;
+       struct cvmx_pciercx_cfg007_s cn68xx;
+       struct cvmx_pciercx_cfg007_s cn68xxp1;
+       struct cvmx_pciercx_cfg007_s cn70xx;
+       struct cvmx_pciercx_cfg007_s cn70xxp1;
+       struct cvmx_pciercx_cfg007_s cn73xx;
+       struct cvmx_pciercx_cfg007_s cn78xx;
+       struct cvmx_pciercx_cfg007_s cn78xxp1;
+       struct cvmx_pciercx_cfg007_s cnf71xx;
+       struct cvmx_pciercx_cfg007_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg007 cvmx_pciercx_cfg007_t;
+
+/**
+ * cvmx_pcierc#_cfg008
+ *
+ * This register contains the ninth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg008 {
+       u32 u32;
+       struct cvmx_pciercx_cfg008_s {
+               u32 ml_addr : 12;
+               u32 reserved_16_19 : 4;
+               u32 mb_addr : 12;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pciercx_cfg008_s cn52xx;
+       struct cvmx_pciercx_cfg008_s cn52xxp1;
+       struct cvmx_pciercx_cfg008_s cn56xx;
+       struct cvmx_pciercx_cfg008_s cn56xxp1;
+       struct cvmx_pciercx_cfg008_s cn61xx;
+       struct cvmx_pciercx_cfg008_s cn63xx;
+       struct cvmx_pciercx_cfg008_s cn63xxp1;
+       struct cvmx_pciercx_cfg008_s cn66xx;
+       struct cvmx_pciercx_cfg008_s cn68xx;
+       struct cvmx_pciercx_cfg008_s cn68xxp1;
+       struct cvmx_pciercx_cfg008_cn70xx {
+               u32 ml_addr : 12;
+               u32 reserved_19_16 : 4;
+               u32 mb_addr : 12;
+               u32 reserved_3_0 : 4;
+       } cn70xx;
+       struct cvmx_pciercx_cfg008_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg008_cn70xx cn73xx;
+       struct cvmx_pciercx_cfg008_cn70xx cn78xx;
+       struct cvmx_pciercx_cfg008_cn70xx cn78xxp1;
+       struct cvmx_pciercx_cfg008_s cnf71xx;
+       struct cvmx_pciercx_cfg008_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg008 cvmx_pciercx_cfg008_t;
+
+/**
+ * cvmx_pcierc#_cfg009
+ *
+ * This register contains the tenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg009 {
+       u32 u32;
+       struct cvmx_pciercx_cfg009_s {
+               u32 lmem_limit : 12;
+               u32 reserved_17_19 : 3;
+               u32 mem64b : 1;
+               u32 lmem_base : 12;
+               u32 reserved_1_3 : 3;
+               u32 mem64a : 1;
+       } s;
+       struct cvmx_pciercx_cfg009_s cn52xx;
+       struct cvmx_pciercx_cfg009_s cn52xxp1;
+       struct cvmx_pciercx_cfg009_s cn56xx;
+       struct cvmx_pciercx_cfg009_s cn56xxp1;
+       struct cvmx_pciercx_cfg009_s cn61xx;
+       struct cvmx_pciercx_cfg009_s cn63xx;
+       struct cvmx_pciercx_cfg009_s cn63xxp1;
+       struct cvmx_pciercx_cfg009_s cn66xx;
+       struct cvmx_pciercx_cfg009_s cn68xx;
+       struct cvmx_pciercx_cfg009_s cn68xxp1;
+       struct cvmx_pciercx_cfg009_cn70xx {
+               u32 lmem_limit : 12;
+               u32 reserved_19_17 : 3;
+               u32 mem64b : 1;
+               u32 lmem_base : 12;
+               u32 reserved_3_1 : 3;
+               u32 mem64a : 1;
+       } cn70xx;
+       struct cvmx_pciercx_cfg009_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg009_cn70xx cn73xx;
+       struct cvmx_pciercx_cfg009_cn70xx cn78xx;
+       struct cvmx_pciercx_cfg009_cn70xx cn78xxp1;
+       struct cvmx_pciercx_cfg009_s cnf71xx;
+       struct cvmx_pciercx_cfg009_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg009 cvmx_pciercx_cfg009_t;
+
+/**
+ * cvmx_pcierc#_cfg010
+ *
+ * This register contains the eleventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg010 {
+       u32 u32;
+       struct cvmx_pciercx_cfg010_s {
+               u32 umem_base : 32;
+       } s;
+       struct cvmx_pciercx_cfg010_s cn52xx;
+       struct cvmx_pciercx_cfg010_s cn52xxp1;
+       struct cvmx_pciercx_cfg010_s cn56xx;
+       struct cvmx_pciercx_cfg010_s cn56xxp1;
+       struct cvmx_pciercx_cfg010_s cn61xx;
+       struct cvmx_pciercx_cfg010_s cn63xx;
+       struct cvmx_pciercx_cfg010_s cn63xxp1;
+       struct cvmx_pciercx_cfg010_s cn66xx;
+       struct cvmx_pciercx_cfg010_s cn68xx;
+       struct cvmx_pciercx_cfg010_s cn68xxp1;
+       struct cvmx_pciercx_cfg010_s cn70xx;
+       struct cvmx_pciercx_cfg010_s cn70xxp1;
+       struct cvmx_pciercx_cfg010_s cn73xx;
+       struct cvmx_pciercx_cfg010_s cn78xx;
+       struct cvmx_pciercx_cfg010_s cn78xxp1;
+       struct cvmx_pciercx_cfg010_s cnf71xx;
+       struct cvmx_pciercx_cfg010_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg010 cvmx_pciercx_cfg010_t;
+
+/**
+ * cvmx_pcierc#_cfg011
+ *
+ * This register contains the twelfth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg011 {
+       u32 u32;
+       struct cvmx_pciercx_cfg011_s {
+               u32 umem_limit : 32;
+       } s;
+       struct cvmx_pciercx_cfg011_s cn52xx;
+       struct cvmx_pciercx_cfg011_s cn52xxp1;
+       struct cvmx_pciercx_cfg011_s cn56xx;
+       struct cvmx_pciercx_cfg011_s cn56xxp1;
+       struct cvmx_pciercx_cfg011_s cn61xx;
+       struct cvmx_pciercx_cfg011_s cn63xx;
+       struct cvmx_pciercx_cfg011_s cn63xxp1;
+       struct cvmx_pciercx_cfg011_s cn66xx;
+       struct cvmx_pciercx_cfg011_s cn68xx;
+       struct cvmx_pciercx_cfg011_s cn68xxp1;
+       struct cvmx_pciercx_cfg011_s cn70xx;
+       struct cvmx_pciercx_cfg011_s cn70xxp1;
+       struct cvmx_pciercx_cfg011_s cn73xx;
+       struct cvmx_pciercx_cfg011_s cn78xx;
+       struct cvmx_pciercx_cfg011_s cn78xxp1;
+       struct cvmx_pciercx_cfg011_s cnf71xx;
+       struct cvmx_pciercx_cfg011_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg011 cvmx_pciercx_cfg011_t;
+
+/**
+ * cvmx_pcierc#_cfg012
+ *
+ * This register contains the thirteenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg012 {
+       u32 u32;
+       struct cvmx_pciercx_cfg012_s {
+               u32 uio_limit : 16;
+               u32 uio_base : 16;
+       } s;
+       struct cvmx_pciercx_cfg012_s cn52xx;
+       struct cvmx_pciercx_cfg012_s cn52xxp1;
+       struct cvmx_pciercx_cfg012_s cn56xx;
+       struct cvmx_pciercx_cfg012_s cn56xxp1;
+       struct cvmx_pciercx_cfg012_s cn61xx;
+       struct cvmx_pciercx_cfg012_s cn63xx;
+       struct cvmx_pciercx_cfg012_s cn63xxp1;
+       struct cvmx_pciercx_cfg012_s cn66xx;
+       struct cvmx_pciercx_cfg012_s cn68xx;
+       struct cvmx_pciercx_cfg012_s cn68xxp1;
+       struct cvmx_pciercx_cfg012_s cn70xx;
+       struct cvmx_pciercx_cfg012_s cn70xxp1;
+       struct cvmx_pciercx_cfg012_s cn73xx;
+       struct cvmx_pciercx_cfg012_s cn78xx;
+       struct cvmx_pciercx_cfg012_s cn78xxp1;
+       struct cvmx_pciercx_cfg012_s cnf71xx;
+       struct cvmx_pciercx_cfg012_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg012 cvmx_pciercx_cfg012_t;
+
+/**
+ * cvmx_pcierc#_cfg013
+ *
+ * This register contains the fourteenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg013 {
+       u32 u32;
+       struct cvmx_pciercx_cfg013_s {
+               u32 reserved_8_31 : 24;
+               u32 cp : 8;
+       } s;
+       struct cvmx_pciercx_cfg013_s cn52xx;
+       struct cvmx_pciercx_cfg013_s cn52xxp1;
+       struct cvmx_pciercx_cfg013_s cn56xx;
+       struct cvmx_pciercx_cfg013_s cn56xxp1;
+       struct cvmx_pciercx_cfg013_s cn61xx;
+       struct cvmx_pciercx_cfg013_s cn63xx;
+       struct cvmx_pciercx_cfg013_s cn63xxp1;
+       struct cvmx_pciercx_cfg013_s cn66xx;
+       struct cvmx_pciercx_cfg013_s cn68xx;
+       struct cvmx_pciercx_cfg013_s cn68xxp1;
+       struct cvmx_pciercx_cfg013_s cn70xx;
+       struct cvmx_pciercx_cfg013_s cn70xxp1;
+       struct cvmx_pciercx_cfg013_s cn73xx;
+       struct cvmx_pciercx_cfg013_s cn78xx;
+       struct cvmx_pciercx_cfg013_s cn78xxp1;
+       struct cvmx_pciercx_cfg013_s cnf71xx;
+       struct cvmx_pciercx_cfg013_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg013 cvmx_pciercx_cfg013_t;
+
+/**
+ * cvmx_pcierc#_cfg014
+ *
+ * This register contains the fifteenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg014 {
+       u32 u32;
+       struct cvmx_pciercx_cfg014_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pciercx_cfg014_s cn52xx;
+       struct cvmx_pciercx_cfg014_s cn52xxp1;
+       struct cvmx_pciercx_cfg014_s cn56xx;
+       struct cvmx_pciercx_cfg014_s cn56xxp1;
+       struct cvmx_pciercx_cfg014_s cn61xx;
+       struct cvmx_pciercx_cfg014_s cn63xx;
+       struct cvmx_pciercx_cfg014_s cn63xxp1;
+       struct cvmx_pciercx_cfg014_s cn66xx;
+       struct cvmx_pciercx_cfg014_s cn68xx;
+       struct cvmx_pciercx_cfg014_s cn68xxp1;
+       struct cvmx_pciercx_cfg014_s cn70xx;
+       struct cvmx_pciercx_cfg014_s cn70xxp1;
+       struct cvmx_pciercx_cfg014_s cn73xx;
+       struct cvmx_pciercx_cfg014_s cn78xx;
+       struct cvmx_pciercx_cfg014_s cn78xxp1;
+       struct cvmx_pciercx_cfg014_s cnf71xx;
+       struct cvmx_pciercx_cfg014_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg014 cvmx_pciercx_cfg014_t;
+
+/**
+ * cvmx_pcierc#_cfg015
+ *
+ * This register contains the sixteenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg015 {
+       u32 u32;
+       struct cvmx_pciercx_cfg015_s {
+               u32 reserved_28_31 : 4;
+               u32 dtsees : 1;
+               u32 dts : 1;
+               u32 sdt : 1;
+               u32 pdt : 1;
+               u32 fbbe : 1;
+               u32 sbrst : 1;
+               u32 mam : 1;
+               u32 vga16d : 1;
+               u32 vgae : 1;
+               u32 isae : 1;
+               u32 see : 1;
+               u32 pere : 1;
+               u32 inta : 8;
+               u32 il : 8;
+       } s;
+       struct cvmx_pciercx_cfg015_s cn52xx;
+       struct cvmx_pciercx_cfg015_s cn52xxp1;
+       struct cvmx_pciercx_cfg015_s cn56xx;
+       struct cvmx_pciercx_cfg015_s cn56xxp1;
+       struct cvmx_pciercx_cfg015_s cn61xx;
+       struct cvmx_pciercx_cfg015_s cn63xx;
+       struct cvmx_pciercx_cfg015_s cn63xxp1;
+       struct cvmx_pciercx_cfg015_s cn66xx;
+       struct cvmx_pciercx_cfg015_s cn68xx;
+       struct cvmx_pciercx_cfg015_s cn68xxp1;
+       struct cvmx_pciercx_cfg015_cn70xx {
+               u32 reserved_31_28 : 4;
+               u32 dtsees : 1;
+               u32 dts : 1;
+               u32 sdt : 1;
+               u32 pdt : 1;
+               u32 fbbe : 1;
+               u32 sbrst : 1;
+               u32 mam : 1;
+               u32 vga16d : 1;
+               u32 vgae : 1;
+               u32 isae : 1;
+               u32 see : 1;
+               u32 pere : 1;
+               u32 inta : 8;
+               u32 il : 8;
+       } cn70xx;
+       struct cvmx_pciercx_cfg015_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg015_cn70xx cn73xx;
+       struct cvmx_pciercx_cfg015_cn70xx cn78xx;
+       struct cvmx_pciercx_cfg015_cn70xx cn78xxp1;
+       struct cvmx_pciercx_cfg015_s cnf71xx;
+       struct cvmx_pciercx_cfg015_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg015 cvmx_pciercx_cfg015_t;
+
+/**
+ * cvmx_pcierc#_cfg016
+ *
+ * This register contains the seventeenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg016 {
+       u32 u32;
+       struct cvmx_pciercx_cfg016_s {
+               u32 pmes : 5;
+               u32 d2s : 1;
+               u32 d1s : 1;
+               u32 auxc : 3;
+               u32 dsi : 1;
+               u32 reserved_20_20 : 1;
+               u32 pme_clock : 1;
+               u32 pmsv : 3;
+               u32 ncp : 8;
+               u32 pmcid : 8;
+       } s;
+       struct cvmx_pciercx_cfg016_s cn52xx;
+       struct cvmx_pciercx_cfg016_s cn52xxp1;
+       struct cvmx_pciercx_cfg016_s cn56xx;
+       struct cvmx_pciercx_cfg016_s cn56xxp1;
+       struct cvmx_pciercx_cfg016_s cn61xx;
+       struct cvmx_pciercx_cfg016_s cn63xx;
+       struct cvmx_pciercx_cfg016_s cn63xxp1;
+       struct cvmx_pciercx_cfg016_s cn66xx;
+       struct cvmx_pciercx_cfg016_s cn68xx;
+       struct cvmx_pciercx_cfg016_s cn68xxp1;
+       struct cvmx_pciercx_cfg016_s cn70xx;
+       struct cvmx_pciercx_cfg016_s cn70xxp1;
+       struct cvmx_pciercx_cfg016_s cn73xx;
+       struct cvmx_pciercx_cfg016_s cn78xx;
+       struct cvmx_pciercx_cfg016_s cn78xxp1;
+       struct cvmx_pciercx_cfg016_s cnf71xx;
+       struct cvmx_pciercx_cfg016_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg016 cvmx_pciercx_cfg016_t;
+
+/**
+ * cvmx_pcierc#_cfg017
+ *
+ * This register contains the eighteenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg017 {
+       u32 u32;
+       struct cvmx_pciercx_cfg017_s {
+               u32 pmdia : 8;
+               u32 bpccee : 1;
+               u32 bd3h : 1;
+               u32 reserved_16_21 : 6;
+               u32 pmess : 1;
+               u32 pmedsia : 2;
+               u32 pmds : 4;
+               u32 pmeens : 1;
+               u32 reserved_4_7 : 4;
+               u32 nsr : 1;
+               u32 reserved_2_2 : 1;
+               u32 ps : 2;
+       } s;
+       struct cvmx_pciercx_cfg017_s cn52xx;
+       struct cvmx_pciercx_cfg017_s cn52xxp1;
+       struct cvmx_pciercx_cfg017_s cn56xx;
+       struct cvmx_pciercx_cfg017_s cn56xxp1;
+       struct cvmx_pciercx_cfg017_s cn61xx;
+       struct cvmx_pciercx_cfg017_s cn63xx;
+       struct cvmx_pciercx_cfg017_s cn63xxp1;
+       struct cvmx_pciercx_cfg017_s cn66xx;
+       struct cvmx_pciercx_cfg017_s cn68xx;
+       struct cvmx_pciercx_cfg017_s cn68xxp1;
+       struct cvmx_pciercx_cfg017_s cn70xx;
+       struct cvmx_pciercx_cfg017_s cn70xxp1;
+       struct cvmx_pciercx_cfg017_s cn73xx;
+       struct cvmx_pciercx_cfg017_s cn78xx;
+       struct cvmx_pciercx_cfg017_s cn78xxp1;
+       struct cvmx_pciercx_cfg017_s cnf71xx;
+       struct cvmx_pciercx_cfg017_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg017 cvmx_pciercx_cfg017_t;
+
+/**
+ * cvmx_pcierc#_cfg020
+ *
+ * This register contains the twenty-first 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg020 {
+       u32 u32;
+       struct cvmx_pciercx_cfg020_s {
+               u32 reserved_24_31 : 8;
+               u32 m64 : 1;
+               u32 mme : 3;
+               u32 mmc : 3;
+               u32 msien : 1;
+               u32 ncp : 8;
+               u32 msicid : 8;
+       } s;
+       struct cvmx_pciercx_cfg020_s cn52xx;
+       struct cvmx_pciercx_cfg020_s cn52xxp1;
+       struct cvmx_pciercx_cfg020_s cn56xx;
+       struct cvmx_pciercx_cfg020_s cn56xxp1;
+       struct cvmx_pciercx_cfg020_cn61xx {
+               u32 reserved_25_31 : 7;
+               u32 pvm : 1;
+               u32 m64 : 1;
+               u32 mme : 3;
+               u32 mmc : 3;
+               u32 msien : 1;
+               u32 ncp : 8;
+               u32 msicid : 8;
+       } cn61xx;
+       struct cvmx_pciercx_cfg020_s cn63xx;
+       struct cvmx_pciercx_cfg020_s cn63xxp1;
+       struct cvmx_pciercx_cfg020_s cn66xx;
+       struct cvmx_pciercx_cfg020_s cn68xx;
+       struct cvmx_pciercx_cfg020_s cn68xxp1;
+       struct cvmx_pciercx_cfg020_cn61xx cn70xx;
+       struct cvmx_pciercx_cfg020_cn61xx cn70xxp1;
+       struct cvmx_pciercx_cfg020_cn73xx {
+               u32 reserved_25_31 : 7;
+               u32 pvms : 1;
+               u32 m64 : 1;
+               u32 mme : 3;
+               u32 mmc : 3;
+               u32 msien : 1;
+               u32 ncp : 8;
+               u32 msicid : 8;
+       } cn73xx;
+       struct cvmx_pciercx_cfg020_cn73xx cn78xx;
+       struct cvmx_pciercx_cfg020_cn73xx cn78xxp1;
+       struct cvmx_pciercx_cfg020_cn61xx cnf71xx;
+       struct cvmx_pciercx_cfg020_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg020 cvmx_pciercx_cfg020_t;
+
+/**
+ * cvmx_pcierc#_cfg021
+ *
+ * This register contains the twenty-second 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg021 {
+       u32 u32;
+       struct cvmx_pciercx_cfg021_s {
+               u32 lmsi : 30;
+               u32 reserved_0_1 : 2;
+       } s;
+       struct cvmx_pciercx_cfg021_s cn52xx;
+       struct cvmx_pciercx_cfg021_s cn52xxp1;
+       struct cvmx_pciercx_cfg021_s cn56xx;
+       struct cvmx_pciercx_cfg021_s cn56xxp1;
+       struct cvmx_pciercx_cfg021_s cn61xx;
+       struct cvmx_pciercx_cfg021_s cn63xx;
+       struct cvmx_pciercx_cfg021_s cn63xxp1;
+       struct cvmx_pciercx_cfg021_s cn66xx;
+       struct cvmx_pciercx_cfg021_s cn68xx;
+       struct cvmx_pciercx_cfg021_s cn68xxp1;
+       struct cvmx_pciercx_cfg021_s cn70xx;
+       struct cvmx_pciercx_cfg021_s cn70xxp1;
+       struct cvmx_pciercx_cfg021_s cn73xx;
+       struct cvmx_pciercx_cfg021_s cn78xx;
+       struct cvmx_pciercx_cfg021_s cn78xxp1;
+       struct cvmx_pciercx_cfg021_s cnf71xx;
+       struct cvmx_pciercx_cfg021_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg021 cvmx_pciercx_cfg021_t;
+
+/**
+ * cvmx_pcierc#_cfg022
+ *
+ * This register contains the twenty-third 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg022 {
+       u32 u32;
+       struct cvmx_pciercx_cfg022_s {
+               u32 umsi : 32;
+       } s;
+       struct cvmx_pciercx_cfg022_s cn52xx;
+       struct cvmx_pciercx_cfg022_s cn52xxp1;
+       struct cvmx_pciercx_cfg022_s cn56xx;
+       struct cvmx_pciercx_cfg022_s cn56xxp1;
+       struct cvmx_pciercx_cfg022_s cn61xx;
+       struct cvmx_pciercx_cfg022_s cn63xx;
+       struct cvmx_pciercx_cfg022_s cn63xxp1;
+       struct cvmx_pciercx_cfg022_s cn66xx;
+       struct cvmx_pciercx_cfg022_s cn68xx;
+       struct cvmx_pciercx_cfg022_s cn68xxp1;
+       struct cvmx_pciercx_cfg022_s cn70xx;
+       struct cvmx_pciercx_cfg022_s cn70xxp1;
+       struct cvmx_pciercx_cfg022_s cn73xx;
+       struct cvmx_pciercx_cfg022_s cn78xx;
+       struct cvmx_pciercx_cfg022_s cn78xxp1;
+       struct cvmx_pciercx_cfg022_s cnf71xx;
+       struct cvmx_pciercx_cfg022_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg022 cvmx_pciercx_cfg022_t;
+
+/**
+ * cvmx_pcierc#_cfg023
+ *
+ * This register contains the twenty-fourth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg023 {
+       u32 u32;
+       struct cvmx_pciercx_cfg023_s {
+               u32 reserved_16_31 : 16;
+               u32 msimd : 16;
+       } s;
+       struct cvmx_pciercx_cfg023_s cn52xx;
+       struct cvmx_pciercx_cfg023_s cn52xxp1;
+       struct cvmx_pciercx_cfg023_s cn56xx;
+       struct cvmx_pciercx_cfg023_s cn56xxp1;
+       struct cvmx_pciercx_cfg023_s cn61xx;
+       struct cvmx_pciercx_cfg023_s cn63xx;
+       struct cvmx_pciercx_cfg023_s cn63xxp1;
+       struct cvmx_pciercx_cfg023_s cn66xx;
+       struct cvmx_pciercx_cfg023_s cn68xx;
+       struct cvmx_pciercx_cfg023_s cn68xxp1;
+       struct cvmx_pciercx_cfg023_s cn70xx;
+       struct cvmx_pciercx_cfg023_s cn70xxp1;
+       struct cvmx_pciercx_cfg023_s cn73xx;
+       struct cvmx_pciercx_cfg023_s cn78xx;
+       struct cvmx_pciercx_cfg023_s cn78xxp1;
+       struct cvmx_pciercx_cfg023_s cnf71xx;
+       struct cvmx_pciercx_cfg023_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg023 cvmx_pciercx_cfg023_t;
+
+/**
+ * cvmx_pcierc#_cfg028
+ *
+ * This register contains the twenty-ninth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg028 {
+       u32 u32;
+       struct cvmx_pciercx_cfg028_s {
+               u32 reserved_30_31 : 2;
+               u32 imn : 5;
+               u32 si : 1;
+               u32 dpt : 4;
+               u32 pciecv : 4;
+               u32 ncp : 8;
+               u32 pcieid : 8;
+       } s;
+       struct cvmx_pciercx_cfg028_s cn52xx;
+       struct cvmx_pciercx_cfg028_s cn52xxp1;
+       struct cvmx_pciercx_cfg028_s cn56xx;
+       struct cvmx_pciercx_cfg028_s cn56xxp1;
+       struct cvmx_pciercx_cfg028_s cn61xx;
+       struct cvmx_pciercx_cfg028_s cn63xx;
+       struct cvmx_pciercx_cfg028_s cn63xxp1;
+       struct cvmx_pciercx_cfg028_s cn66xx;
+       struct cvmx_pciercx_cfg028_s cn68xx;
+       struct cvmx_pciercx_cfg028_s cn68xxp1;
+       struct cvmx_pciercx_cfg028_s cn70xx;
+       struct cvmx_pciercx_cfg028_s cn70xxp1;
+       struct cvmx_pciercx_cfg028_s cn73xx;
+       struct cvmx_pciercx_cfg028_s cn78xx;
+       struct cvmx_pciercx_cfg028_s cn78xxp1;
+       struct cvmx_pciercx_cfg028_s cnf71xx;
+       struct cvmx_pciercx_cfg028_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg028 cvmx_pciercx_cfg028_t;
+
+/**
+ * cvmx_pcierc#_cfg029
+ *
+ * This register contains the thirtieth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg029 {
+       u32 u32;
+       struct cvmx_pciercx_cfg029_s {
+               u32 reserved_29_31 : 3;
+               u32 flr_cap : 1;
+               u32 cspls : 2;
+               u32 csplv : 8;
+               u32 reserved_16_17 : 2;
+               u32 rber : 1;
+               u32 reserved_12_14 : 3;
+               u32 el1al : 3;
+               u32 el0al : 3;
+               u32 etfs : 1;
+               u32 pfs : 2;
+               u32 mpss : 3;
+       } s;
+       struct cvmx_pciercx_cfg029_cn52xx {
+               u32 reserved_28_31 : 4;
+               u32 cspls : 2;
+               u32 csplv : 8;
+               u32 reserved_16_17 : 2;
+               u32 rber : 1;
+               u32 reserved_12_14 : 3;
+               u32 el1al : 3;
+               u32 el0al : 3;
+               u32 etfs : 1;
+               u32 pfs : 2;
+               u32 mpss : 3;
+       } cn52xx;
+       struct cvmx_pciercx_cfg029_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg029_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg029_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg029_cn52xx cn61xx;
+       struct cvmx_pciercx_cfg029_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg029_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg029_cn52xx cn66xx;
+       struct cvmx_pciercx_cfg029_cn52xx cn68xx;
+       struct cvmx_pciercx_cfg029_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg029_cn52xx cn70xx;
+       struct cvmx_pciercx_cfg029_cn52xx cn70xxp1;
+       struct cvmx_pciercx_cfg029_s cn73xx;
+       struct cvmx_pciercx_cfg029_s cn78xx;
+       struct cvmx_pciercx_cfg029_s cn78xxp1;
+       struct cvmx_pciercx_cfg029_cn52xx cnf71xx;
+       struct cvmx_pciercx_cfg029_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg029 cvmx_pciercx_cfg029_t;
+
+/**
+ * cvmx_pcierc#_cfg030
+ *
+ * This register contains the thirty-first 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg030 {
+       u32 u32;
+       struct cvmx_pciercx_cfg030_s {
+               u32 reserved_22_31 : 10;
+               u32 tp : 1;
+               u32 ap_d : 1;
+               u32 ur_d : 1;
+               u32 fe_d : 1;
+               u32 nfe_d : 1;
+               u32 ce_d : 1;
+               u32 reserved_15_15 : 1;
+               u32 mrrs : 3;
+               u32 ns_en : 1;
+               u32 ap_en : 1;
+               u32 pf_en : 1;
+               u32 etf_en : 1;
+               u32 mps : 3;
+               u32 ro_en : 1;
+               u32 ur_en : 1;
+               u32 fe_en : 1;
+               u32 nfe_en : 1;
+               u32 ce_en : 1;
+       } s;
+       struct cvmx_pciercx_cfg030_s cn52xx;
+       struct cvmx_pciercx_cfg030_s cn52xxp1;
+       struct cvmx_pciercx_cfg030_s cn56xx;
+       struct cvmx_pciercx_cfg030_s cn56xxp1;
+       struct cvmx_pciercx_cfg030_s cn61xx;
+       struct cvmx_pciercx_cfg030_s cn63xx;
+       struct cvmx_pciercx_cfg030_s cn63xxp1;
+       struct cvmx_pciercx_cfg030_s cn66xx;
+       struct cvmx_pciercx_cfg030_s cn68xx;
+       struct cvmx_pciercx_cfg030_s cn68xxp1;
+       struct cvmx_pciercx_cfg030_s cn70xx;
+       struct cvmx_pciercx_cfg030_s cn70xxp1;
+       struct cvmx_pciercx_cfg030_s cn73xx;
+       struct cvmx_pciercx_cfg030_s cn78xx;
+       struct cvmx_pciercx_cfg030_s cn78xxp1;
+       struct cvmx_pciercx_cfg030_s cnf71xx;
+       struct cvmx_pciercx_cfg030_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg030 cvmx_pciercx_cfg030_t;
+
+/**
+ * cvmx_pcierc#_cfg031
+ *
+ * This register contains the thirty-second 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg031 {
+       u32 u32;
+       struct cvmx_pciercx_cfg031_s {
+               u32 pnum : 8;
+               u32 reserved_23_23 : 1;
+               u32 aspm : 1;
+               u32 lbnc : 1;
+               u32 dllarc : 1;
+               u32 sderc : 1;
+               u32 cpm : 1;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 aslpms : 2;
+               u32 mlw : 6;
+               u32 mls : 4;
+       } s;
+       struct cvmx_pciercx_cfg031_cn52xx {
+               u32 pnum : 8;
+               u32 reserved_22_23 : 2;
+               u32 lbnc : 1;
+               u32 dllarc : 1;
+               u32 sderc : 1;
+               u32 cpm : 1;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 aslpms : 2;
+               u32 mlw : 6;
+               u32 mls : 4;
+       } cn52xx;
+       struct cvmx_pciercx_cfg031_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg031_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg031_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg031_s cn61xx;
+       struct cvmx_pciercx_cfg031_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg031_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg031_s cn66xx;
+       struct cvmx_pciercx_cfg031_s cn68xx;
+       struct cvmx_pciercx_cfg031_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg031_s cn70xx;
+       struct cvmx_pciercx_cfg031_s cn70xxp1;
+       struct cvmx_pciercx_cfg031_s cn73xx;
+       struct cvmx_pciercx_cfg031_s cn78xx;
+       struct cvmx_pciercx_cfg031_s cn78xxp1;
+       struct cvmx_pciercx_cfg031_s cnf71xx;
+       struct cvmx_pciercx_cfg031_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg031 cvmx_pciercx_cfg031_t;
+
+/**
+ * cvmx_pcierc#_cfg032
+ *
+ * This register contains the thirty-third 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg032 {
+       u32 u32;
+       struct cvmx_pciercx_cfg032_s {
+               u32 lab : 1;
+               u32 lbm : 1;
+               u32 dlla : 1;
+               u32 scc : 1;
+               u32 lt : 1;
+               u32 reserved_26_26 : 1;
+               u32 nlw : 6;
+               u32 ls : 4;
+               u32 reserved_12_15 : 4;
+               u32 lab_int_enb : 1;
+               u32 lbm_int_enb : 1;
+               u32 hawd : 1;
+               u32 ecpm : 1;
+               u32 es : 1;
+               u32 ccc : 1;
+               u32 rl : 1;
+               u32 ld : 1;
+               u32 rcb : 1;
+               u32 reserved_2_2 : 1;
+               u32 aslpc : 2;
+       } s;
+       struct cvmx_pciercx_cfg032_s cn52xx;
+       struct cvmx_pciercx_cfg032_s cn52xxp1;
+       struct cvmx_pciercx_cfg032_s cn56xx;
+       struct cvmx_pciercx_cfg032_s cn56xxp1;
+       struct cvmx_pciercx_cfg032_s cn61xx;
+       struct cvmx_pciercx_cfg032_s cn63xx;
+       struct cvmx_pciercx_cfg032_s cn63xxp1;
+       struct cvmx_pciercx_cfg032_s cn66xx;
+       struct cvmx_pciercx_cfg032_s cn68xx;
+       struct cvmx_pciercx_cfg032_s cn68xxp1;
+       struct cvmx_pciercx_cfg032_s cn70xx;
+       struct cvmx_pciercx_cfg032_s cn70xxp1;
+       struct cvmx_pciercx_cfg032_s cn73xx;
+       struct cvmx_pciercx_cfg032_s cn78xx;
+       struct cvmx_pciercx_cfg032_s cn78xxp1;
+       struct cvmx_pciercx_cfg032_s cnf71xx;
+       struct cvmx_pciercx_cfg032_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg032 cvmx_pciercx_cfg032_t;
+
+/**
+ * cvmx_pcierc#_cfg033
+ *
+ * This register contains the thirty-fourth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg033 {
+       u32 u32;
+       struct cvmx_pciercx_cfg033_s {
+               u32 ps_num : 13;
+               u32 nccs : 1;
+               u32 emip : 1;
+               u32 sp_ls : 2;
+               u32 sp_lv : 8;
+               u32 hp_c : 1;
+               u32 hp_s : 1;
+               u32 pip : 1;
+               u32 aip : 1;
+               u32 mrlsp : 1;
+               u32 pcp : 1;
+               u32 abp : 1;
+       } s;
+       struct cvmx_pciercx_cfg033_s cn52xx;
+       struct cvmx_pciercx_cfg033_s cn52xxp1;
+       struct cvmx_pciercx_cfg033_s cn56xx;
+       struct cvmx_pciercx_cfg033_s cn56xxp1;
+       struct cvmx_pciercx_cfg033_s cn61xx;
+       struct cvmx_pciercx_cfg033_s cn63xx;
+       struct cvmx_pciercx_cfg033_s cn63xxp1;
+       struct cvmx_pciercx_cfg033_s cn66xx;
+       struct cvmx_pciercx_cfg033_s cn68xx;
+       struct cvmx_pciercx_cfg033_s cn68xxp1;
+       struct cvmx_pciercx_cfg033_s cn70xx;
+       struct cvmx_pciercx_cfg033_s cn70xxp1;
+       struct cvmx_pciercx_cfg033_s cn73xx;
+       struct cvmx_pciercx_cfg033_s cn78xx;
+       struct cvmx_pciercx_cfg033_s cn78xxp1;
+       struct cvmx_pciercx_cfg033_s cnf71xx;
+       struct cvmx_pciercx_cfg033_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg033 cvmx_pciercx_cfg033_t;
+
+/**
+ * cvmx_pcierc#_cfg034
+ *
+ * This register contains the thirty-fifth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg034 {
+       u32 u32;
+       struct cvmx_pciercx_cfg034_s {
+               u32 reserved_25_31 : 7;
+               u32 dlls_c : 1;
+               u32 emis : 1;
+               u32 pds : 1;
+               u32 mrlss : 1;
+               u32 ccint_d : 1;
+               u32 pd_c : 1;
+               u32 mrls_c : 1;
+               u32 pf_d : 1;
+               u32 abp_d : 1;
+               u32 reserved_13_15 : 3;
+               u32 dlls_en : 1;
+               u32 emic : 1;
+               u32 pcc : 1;
+               u32 pic : 2;
+               u32 aic : 2;
+               u32 hpint_en : 1;
+               u32 ccint_en : 1;
+               u32 pd_en : 1;
+               u32 mrls_en : 1;
+               u32 pf_en : 1;
+               u32 abp_en : 1;
+       } s;
+       struct cvmx_pciercx_cfg034_s cn52xx;
+       struct cvmx_pciercx_cfg034_s cn52xxp1;
+       struct cvmx_pciercx_cfg034_s cn56xx;
+       struct cvmx_pciercx_cfg034_s cn56xxp1;
+       struct cvmx_pciercx_cfg034_s cn61xx;
+       struct cvmx_pciercx_cfg034_s cn63xx;
+       struct cvmx_pciercx_cfg034_s cn63xxp1;
+       struct cvmx_pciercx_cfg034_s cn66xx;
+       struct cvmx_pciercx_cfg034_s cn68xx;
+       struct cvmx_pciercx_cfg034_s cn68xxp1;
+       struct cvmx_pciercx_cfg034_s cn70xx;
+       struct cvmx_pciercx_cfg034_s cn70xxp1;
+       struct cvmx_pciercx_cfg034_s cn73xx;
+       struct cvmx_pciercx_cfg034_s cn78xx;
+       struct cvmx_pciercx_cfg034_s cn78xxp1;
+       struct cvmx_pciercx_cfg034_s cnf71xx;
+       struct cvmx_pciercx_cfg034_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg034 cvmx_pciercx_cfg034_t;
+
+/**
+ * cvmx_pcierc#_cfg035
+ *
+ * This register contains the thirty-sixth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg035 {
+       u32 u32;
+       struct cvmx_pciercx_cfg035_s {
+               u32 reserved_17_31 : 15;
+               u32 crssv : 1;
+               u32 reserved_5_15 : 11;
+               u32 crssve : 1;
+               u32 pmeie : 1;
+               u32 sefee : 1;
+               u32 senfee : 1;
+               u32 secee : 1;
+       } s;
+       struct cvmx_pciercx_cfg035_s cn52xx;
+       struct cvmx_pciercx_cfg035_s cn52xxp1;
+       struct cvmx_pciercx_cfg035_s cn56xx;
+       struct cvmx_pciercx_cfg035_s cn56xxp1;
+       struct cvmx_pciercx_cfg035_s cn61xx;
+       struct cvmx_pciercx_cfg035_s cn63xx;
+       struct cvmx_pciercx_cfg035_s cn63xxp1;
+       struct cvmx_pciercx_cfg035_s cn66xx;
+       struct cvmx_pciercx_cfg035_s cn68xx;
+       struct cvmx_pciercx_cfg035_s cn68xxp1;
+       struct cvmx_pciercx_cfg035_s cn70xx;
+       struct cvmx_pciercx_cfg035_s cn70xxp1;
+       struct cvmx_pciercx_cfg035_s cn73xx;
+       struct cvmx_pciercx_cfg035_s cn78xx;
+       struct cvmx_pciercx_cfg035_s cn78xxp1;
+       struct cvmx_pciercx_cfg035_s cnf71xx;
+       struct cvmx_pciercx_cfg035_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg035 cvmx_pciercx_cfg035_t;
+
+/**
+ * cvmx_pcierc#_cfg036
+ *
+ * This register contains the thirty-seventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg036 {
+       u32 u32;
+       struct cvmx_pciercx_cfg036_s {
+               u32 reserved_18_31 : 14;
+               u32 pme_pend : 1;
+               u32 pme_stat : 1;
+               u32 pme_rid : 16;
+       } s;
+       struct cvmx_pciercx_cfg036_s cn52xx;
+       struct cvmx_pciercx_cfg036_s cn52xxp1;
+       struct cvmx_pciercx_cfg036_s cn56xx;
+       struct cvmx_pciercx_cfg036_s cn56xxp1;
+       struct cvmx_pciercx_cfg036_s cn61xx;
+       struct cvmx_pciercx_cfg036_s cn63xx;
+       struct cvmx_pciercx_cfg036_s cn63xxp1;
+       struct cvmx_pciercx_cfg036_s cn66xx;
+       struct cvmx_pciercx_cfg036_s cn68xx;
+       struct cvmx_pciercx_cfg036_s cn68xxp1;
+       struct cvmx_pciercx_cfg036_s cn70xx;
+       struct cvmx_pciercx_cfg036_s cn70xxp1;
+       struct cvmx_pciercx_cfg036_s cn73xx;
+       struct cvmx_pciercx_cfg036_s cn78xx;
+       struct cvmx_pciercx_cfg036_s cn78xxp1;
+       struct cvmx_pciercx_cfg036_s cnf71xx;
+       struct cvmx_pciercx_cfg036_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg036 cvmx_pciercx_cfg036_t;
+
+/**
+ * cvmx_pcierc#_cfg037
+ *
+ * This register contains the thirty-eighth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg037 {
+       u32 u32;
+       struct cvmx_pciercx_cfg037_s {
+               u32 reserved_24_31 : 8;
+               u32 meetp : 2;
+               u32 eetps : 1;
+               u32 effs : 1;
+               u32 obffs : 2;
+               u32 reserved_12_17 : 6;
+               u32 ltrs : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 reserved_5_5 : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } s;
+       struct cvmx_pciercx_cfg037_cn52xx {
+               u32 reserved_5_31 : 27;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cn52xx;
+       struct cvmx_pciercx_cfg037_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg037_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg037_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg037_cn61xx {
+               u32 reserved_14_31 : 18;
+               u32 tph : 2;
+               u32 reserved_11_11 : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari_fw : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cn61xx;
+       struct cvmx_pciercx_cfg037_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg037_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg037_cn66xx {
+               u32 reserved_14_31 : 18;
+               u32 tph : 2;
+               u32 reserved_11_11 : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cn66xx;
+       struct cvmx_pciercx_cfg037_cn66xx cn68xx;
+       struct cvmx_pciercx_cfg037_cn66xx cn68xxp1;
+       struct cvmx_pciercx_cfg037_cn61xx cn70xx;
+       struct cvmx_pciercx_cfg037_cn61xx cn70xxp1;
+       struct cvmx_pciercx_cfg037_cn73xx {
+               u32 reserved_24_31 : 8;
+               u32 meetp : 2;
+               u32 eetps : 1;
+               u32 effs : 1;
+               u32 obffs : 2;
+               u32 reserved_14_17 : 4;
+               u32 tph : 2;
+               u32 ltrs : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari_fw : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cn73xx;
+       struct cvmx_pciercx_cfg037_cn73xx cn78xx;
+       struct cvmx_pciercx_cfg037_cn73xx cn78xxp1;
+       struct cvmx_pciercx_cfg037_cnf71xx {
+               u32 reserved_20_31 : 12;
+               u32 obffs : 2;
+               u32 reserved_14_17 : 4;
+               u32 tphs : 2;
+               u32 ltrs : 1;
+               u32 noroprpr : 1;
+               u32 atom128s : 1;
+               u32 atom64s : 1;
+               u32 atom32s : 1;
+               u32 atom_ops : 1;
+               u32 ari_fw : 1;
+               u32 ctds : 1;
+               u32 ctrs : 4;
+       } cnf71xx;
+       struct cvmx_pciercx_cfg037_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg037 cvmx_pciercx_cfg037_t;
+
+/**
+ * cvmx_pcierc#_cfg038
+ *
+ * This register contains the thirty-ninth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg038 {
+       u32 u32;
+       struct cvmx_pciercx_cfg038_s {
+               u32 reserved_16_31 : 16;
+               u32 eetpb : 1;
+               u32 obffe : 2;
+               u32 reserved_11_12 : 2;
+               u32 ltre : 1;
+               u32 id0_cp : 1;
+               u32 id0_rq : 1;
+               u32 atom_op_eb : 1;
+               u32 atom_op : 1;
+               u32 ari : 1;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } s;
+       struct cvmx_pciercx_cfg038_cn52xx {
+               u32 reserved_5_31 : 27;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } cn52xx;
+       struct cvmx_pciercx_cfg038_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg038_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg038_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg038_cn61xx {
+               u32 reserved_10_31 : 22;
+               u32 id0_cp : 1;
+               u32 id0_rq : 1;
+               u32 atom_op_eb : 1;
+               u32 atom_op : 1;
+               u32 ari : 1;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } cn61xx;
+       struct cvmx_pciercx_cfg038_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg038_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg038_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg038_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg038_cn61xx cn68xxp1;
+       struct cvmx_pciercx_cfg038_cn61xx cn70xx;
+       struct cvmx_pciercx_cfg038_cn61xx cn70xxp1;
+       struct cvmx_pciercx_cfg038_s cn73xx;
+       struct cvmx_pciercx_cfg038_s cn78xx;
+       struct cvmx_pciercx_cfg038_s cn78xxp1;
+       struct cvmx_pciercx_cfg038_cnf71xx {
+               u32 reserved_15_31 : 17;
+               u32 obffe : 2;
+               u32 reserved_11_12 : 2;
+               u32 ltre : 1;
+               u32 id0_cp : 1;
+               u32 id0_rq : 1;
+               u32 atom_op_eb : 1;
+               u32 atom_op : 1;
+               u32 ari : 1;
+               u32 ctd : 1;
+               u32 ctv : 4;
+       } cnf71xx;
+       struct cvmx_pciercx_cfg038_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg038 cvmx_pciercx_cfg038_t;
+
+/**
+ * cvmx_pcierc#_cfg039
+ *
+ * This register contains the fortieth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg039 {
+       u32 u32;
+       struct cvmx_pciercx_cfg039_s {
+               u32 reserved_9_31 : 23;
+               u32 cls : 1;
+               u32 slsv : 7;
+               u32 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pciercx_cfg039_cn52xx {
+               u32 reserved_0_31 : 32;
+       } cn52xx;
+       struct cvmx_pciercx_cfg039_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg039_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg039_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg039_s cn61xx;
+       struct cvmx_pciercx_cfg039_s cn63xx;
+       struct cvmx_pciercx_cfg039_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg039_s cn66xx;
+       struct cvmx_pciercx_cfg039_s cn68xx;
+       struct cvmx_pciercx_cfg039_s cn68xxp1;
+       struct cvmx_pciercx_cfg039_s cn70xx;
+       struct cvmx_pciercx_cfg039_s cn70xxp1;
+       struct cvmx_pciercx_cfg039_s cn73xx;
+       struct cvmx_pciercx_cfg039_s cn78xx;
+       struct cvmx_pciercx_cfg039_s cn78xxp1;
+       struct cvmx_pciercx_cfg039_s cnf71xx;
+       struct cvmx_pciercx_cfg039_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg039 cvmx_pciercx_cfg039_t;
+
+/**
+ * cvmx_pcierc#_cfg040
+ *
+ * This register contains the forty-first 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg040 {
+       u32 u32;
+       struct cvmx_pciercx_cfg040_s {
+               u32 reserved_22_31 : 10;
+               u32 ler : 1;
+               u32 ep3s : 1;
+               u32 ep2s : 1;
+               u32 ep1s : 1;
+               u32 eqc : 1;
+               u32 cdl : 1;
+               u32 cde : 4;
+               u32 csos : 1;
+               u32 emc : 1;
+               u32 tm : 3;
+               u32 sde : 1;
+               u32 hasd : 1;
+               u32 ec : 1;
+               u32 tls : 4;
+       } s;
+       struct cvmx_pciercx_cfg040_cn52xx {
+               u32 reserved_0_31 : 32;
+       } cn52xx;
+       struct cvmx_pciercx_cfg040_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg040_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg040_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg040_cn61xx {
+               u32 reserved_17_31 : 15;
+               u32 cdl : 1;
+               u32 reserved_13_15 : 3;
+               u32 cde : 1;
+               u32 csos : 1;
+               u32 emc : 1;
+               u32 tm : 3;
+               u32 sde : 1;
+               u32 hasd : 1;
+               u32 ec : 1;
+               u32 tls : 4;
+       } cn61xx;
+       struct cvmx_pciercx_cfg040_cn61xx cn63xx;
+       struct cvmx_pciercx_cfg040_cn61xx cn63xxp1;
+       struct cvmx_pciercx_cfg040_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg040_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg040_cn61xx cn68xxp1;
+       struct cvmx_pciercx_cfg040_cn61xx cn70xx;
+       struct cvmx_pciercx_cfg040_cn61xx cn70xxp1;
+       struct cvmx_pciercx_cfg040_s cn73xx;
+       struct cvmx_pciercx_cfg040_s cn78xx;
+       struct cvmx_pciercx_cfg040_s cn78xxp1;
+       struct cvmx_pciercx_cfg040_cn61xx cnf71xx;
+       struct cvmx_pciercx_cfg040_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg040 cvmx_pciercx_cfg040_t;
+
+/**
+ * cvmx_pcierc#_cfg041
+ *
+ * This register contains the forty-second 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg041 {
+       u32 u32;
+       struct cvmx_pciercx_cfg041_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pciercx_cfg041_s cn52xx;
+       struct cvmx_pciercx_cfg041_s cn52xxp1;
+       struct cvmx_pciercx_cfg041_s cn56xx;
+       struct cvmx_pciercx_cfg041_s cn56xxp1;
+       struct cvmx_pciercx_cfg041_s cn61xx;
+       struct cvmx_pciercx_cfg041_s cn63xx;
+       struct cvmx_pciercx_cfg041_s cn63xxp1;
+       struct cvmx_pciercx_cfg041_s cn66xx;
+       struct cvmx_pciercx_cfg041_s cn68xx;
+       struct cvmx_pciercx_cfg041_s cn68xxp1;
+       struct cvmx_pciercx_cfg041_s cn70xx;
+       struct cvmx_pciercx_cfg041_s cn70xxp1;
+       struct cvmx_pciercx_cfg041_s cn73xx;
+       struct cvmx_pciercx_cfg041_s cn78xx;
+       struct cvmx_pciercx_cfg041_s cn78xxp1;
+       struct cvmx_pciercx_cfg041_s cnf71xx;
+       struct cvmx_pciercx_cfg041_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg041 cvmx_pciercx_cfg041_t;
+
+/**
+ * cvmx_pcierc#_cfg042
+ *
+ * This register contains the forty-third 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg042 {
+       u32 u32;
+       struct cvmx_pciercx_cfg042_s {
+               u32 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pciercx_cfg042_s cn52xx;
+       struct cvmx_pciercx_cfg042_s cn52xxp1;
+       struct cvmx_pciercx_cfg042_s cn56xx;
+       struct cvmx_pciercx_cfg042_s cn56xxp1;
+       struct cvmx_pciercx_cfg042_s cn61xx;
+       struct cvmx_pciercx_cfg042_s cn63xx;
+       struct cvmx_pciercx_cfg042_s cn63xxp1;
+       struct cvmx_pciercx_cfg042_s cn66xx;
+       struct cvmx_pciercx_cfg042_s cn68xx;
+       struct cvmx_pciercx_cfg042_s cn68xxp1;
+       struct cvmx_pciercx_cfg042_s cn70xx;
+       struct cvmx_pciercx_cfg042_s cn70xxp1;
+       struct cvmx_pciercx_cfg042_s cn73xx;
+       struct cvmx_pciercx_cfg042_s cn78xx;
+       struct cvmx_pciercx_cfg042_s cn78xxp1;
+       struct cvmx_pciercx_cfg042_s cnf71xx;
+       struct cvmx_pciercx_cfg042_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg042 cvmx_pciercx_cfg042_t;
+
+/**
+ * cvmx_pcierc#_cfg044
+ *
+ * This register contains the forty-fifth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg044 {
+       u32 u32;
+       struct cvmx_pciercx_cfg044_s {
+               u32 msixen : 1;
+               u32 funm : 1;
+               u32 reserved_27_29 : 3;
+               u32 msixts : 11;
+               u32 ncp : 8;
+               u32 msixcid : 8;
+       } s;
+       struct cvmx_pciercx_cfg044_s cn73xx;
+       struct cvmx_pciercx_cfg044_s cn78xx;
+       struct cvmx_pciercx_cfg044_s cn78xxp1;
+       struct cvmx_pciercx_cfg044_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg044 cvmx_pciercx_cfg044_t;
+
+/**
+ * cvmx_pcierc#_cfg045
+ *
+ * This register contains the forty-sixth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg045 {
+       u32 u32;
+       struct cvmx_pciercx_cfg045_s {
+               u32 msixtoffs : 29;
+               u32 msixtbir : 3;
+       } s;
+       struct cvmx_pciercx_cfg045_s cn73xx;
+       struct cvmx_pciercx_cfg045_s cn78xx;
+       struct cvmx_pciercx_cfg045_s cn78xxp1;
+       struct cvmx_pciercx_cfg045_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg045 cvmx_pciercx_cfg045_t;
+
+/**
+ * cvmx_pcierc#_cfg046
+ *
+ * This register contains the forty-seventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg046 {
+       u32 u32;
+       struct cvmx_pciercx_cfg046_s {
+               u32 msixpoffs : 29;
+               u32 msixpbir : 3;
+       } s;
+       struct cvmx_pciercx_cfg046_s cn73xx;
+       struct cvmx_pciercx_cfg046_s cn78xx;
+       struct cvmx_pciercx_cfg046_s cn78xxp1;
+       struct cvmx_pciercx_cfg046_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg046 cvmx_pciercx_cfg046_t;
+
+/**
+ * cvmx_pcierc#_cfg064
+ *
+ * This register contains the sixty-fifth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg064 {
+       u32 u32;
+       struct cvmx_pciercx_cfg064_s {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 pcieec : 16;
+       } s;
+       struct cvmx_pciercx_cfg064_s cn52xx;
+       struct cvmx_pciercx_cfg064_s cn52xxp1;
+       struct cvmx_pciercx_cfg064_s cn56xx;
+       struct cvmx_pciercx_cfg064_s cn56xxp1;
+       struct cvmx_pciercx_cfg064_s cn61xx;
+       struct cvmx_pciercx_cfg064_s cn63xx;
+       struct cvmx_pciercx_cfg064_s cn63xxp1;
+       struct cvmx_pciercx_cfg064_s cn66xx;
+       struct cvmx_pciercx_cfg064_s cn68xx;
+       struct cvmx_pciercx_cfg064_s cn68xxp1;
+       struct cvmx_pciercx_cfg064_s cn70xx;
+       struct cvmx_pciercx_cfg064_s cn70xxp1;
+       struct cvmx_pciercx_cfg064_s cn73xx;
+       struct cvmx_pciercx_cfg064_s cn78xx;
+       struct cvmx_pciercx_cfg064_s cn78xxp1;
+       struct cvmx_pciercx_cfg064_s cnf71xx;
+       struct cvmx_pciercx_cfg064_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg064 cvmx_pciercx_cfg064_t;
+
+/**
+ * cvmx_pcierc#_cfg065
+ *
+ * This register contains the sixty-sixth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg065 {
+       u32 u32;
+       struct cvmx_pciercx_cfg065_s {
+               u32 reserved_26_31 : 6;
+               u32 tpbes : 1;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pciercx_cfg065_cn52xx {
+               u32 reserved_21_31 : 11;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn52xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg065_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg065_cn61xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_21_23 : 3;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg065_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg065_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg065_cn70xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_pciercx_cfg065_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg065_s cn73xx;
+       struct cvmx_pciercx_cfg065_s cn78xx;
+       struct cvmx_pciercx_cfg065_s cn78xxp1;
+       struct cvmx_pciercx_cfg065_cn70xx cnf71xx;
+       struct cvmx_pciercx_cfg065_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg065 cvmx_pciercx_cfg065_t;
+
+/**
+ * cvmx_pcierc#_cfg066
+ *
+ * This register contains the sixty-seventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg066 {
+       u32 u32;
+       struct cvmx_pciercx_cfg066_s {
+               u32 reserved_26_31 : 6;
+               u32 tpbem : 1;
+               u32 uatombm : 1;
+               u32 reserved_23_23 : 1;
+               u32 uciem : 1;
+               u32 reserved_21_21 : 1;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pciercx_cfg066_cn52xx {
+               u32 reserved_21_31 : 11;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cn52xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg066_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg066_cn61xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombm : 1;
+               u32 reserved_21_23 : 3;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg066_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg066_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg066_cn70xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombm : 1;
+               u32 reserved_23_23 : 1;
+               u32 uciem : 1;
+               u32 reserved_21_21 : 1;
+               u32 urem : 1;
+               u32 ecrcem : 1;
+               u32 mtlpm : 1;
+               u32 rom : 1;
+               u32 ucm : 1;
+               u32 cam : 1;
+               u32 ctm : 1;
+               u32 fcpem : 1;
+               u32 ptlpm : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdem : 1;
+               u32 dlpem : 1;
+               u32 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_pciercx_cfg066_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg066_s cn73xx;
+       struct cvmx_pciercx_cfg066_s cn78xx;
+       struct cvmx_pciercx_cfg066_s cn78xxp1;
+       struct cvmx_pciercx_cfg066_cn70xx cnf71xx;
+       struct cvmx_pciercx_cfg066_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg066 cvmx_pciercx_cfg066_t;
+
+/**
+ * cvmx_pcierc#_cfg067
+ *
+ * This register contains the sixty-eighth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg067 {
+       u32 u32;
+       struct cvmx_pciercx_cfg067_s {
+               u32 reserved_26_31 : 6;
+               u32 tpbes : 1;
+               u32 uatombs : 1;
+               u32 reserved_21_23 : 3;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pciercx_cfg067_cn52xx {
+               u32 reserved_21_31 : 11;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn52xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg067_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg067_cn61xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_21_23 : 3;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn61xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg067_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg067_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg067_cn70xx {
+               u32 reserved_25_31 : 7;
+               u32 uatombs : 1;
+               u32 reserved_23_23 : 1;
+               u32 ucies : 1;
+               u32 reserved_21_21 : 1;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn70xx;
+       struct cvmx_pciercx_cfg067_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg067_cn73xx {
+               u32 reserved_26_31 : 6;
+               u32 tpbes : 1;
+               u32 uatombs : 1;
+               u32 unsuperr : 3;
+               u32 ures : 1;
+               u32 ecrces : 1;
+               u32 mtlps : 1;
+               u32 ros : 1;
+               u32 ucs : 1;
+               u32 cas : 1;
+               u32 cts : 1;
+               u32 fcpes : 1;
+               u32 ptlps : 1;
+               u32 reserved_6_11 : 6;
+               u32 sdes : 1;
+               u32 dlpes : 1;
+               u32 reserved_0_3 : 4;
+       } cn73xx;
+       struct cvmx_pciercx_cfg067_cn73xx cn78xx;
+       struct cvmx_pciercx_cfg067_cn73xx cn78xxp1;
+       struct cvmx_pciercx_cfg067_cn70xx cnf71xx;
+       struct cvmx_pciercx_cfg067_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg067 cvmx_pciercx_cfg067_t;
+
+/**
+ * cvmx_pcierc#_cfg068
+ *
+ * This register contains the sixty-ninth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg068 {
+       u32 u32;
+       struct cvmx_pciercx_cfg068_s {
+               u32 reserved_15_31 : 17;
+               u32 cies : 1;
+               u32 anfes : 1;
+               u32 rtts : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrs : 1;
+               u32 bdllps : 1;
+               u32 btlps : 1;
+               u32 reserved_1_5 : 5;
+               u32 res : 1;
+       } s;
+       struct cvmx_pciercx_cfg068_cn52xx {
+               u32 reserved_14_31 : 18;
+               u32 anfes : 1;
+               u32 rtts : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrs : 1;
+               u32 bdllps : 1;
+               u32 btlps : 1;
+               u32 reserved_1_5 : 5;
+               u32 res : 1;
+       } cn52xx;
+       struct cvmx_pciercx_cfg068_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg068_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg068_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg068_cn52xx cn61xx;
+       struct cvmx_pciercx_cfg068_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg068_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg068_cn52xx cn66xx;
+       struct cvmx_pciercx_cfg068_cn52xx cn68xx;
+       struct cvmx_pciercx_cfg068_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg068_s cn70xx;
+       struct cvmx_pciercx_cfg068_s cn70xxp1;
+       struct cvmx_pciercx_cfg068_s cn73xx;
+       struct cvmx_pciercx_cfg068_s cn78xx;
+       struct cvmx_pciercx_cfg068_s cn78xxp1;
+       struct cvmx_pciercx_cfg068_s cnf71xx;
+       struct cvmx_pciercx_cfg068_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg068 cvmx_pciercx_cfg068_t;
+
+/**
+ * cvmx_pcierc#_cfg069
+ *
+ * This register contains the seventieth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg069 {
+       u32 u32;
+       struct cvmx_pciercx_cfg069_s {
+               u32 reserved_15_31 : 17;
+               u32 ciem : 1;
+               u32 anfem : 1;
+               u32 rttm : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrm : 1;
+               u32 bdllpm : 1;
+               u32 btlpm : 1;
+               u32 reserved_1_5 : 5;
+               u32 rem : 1;
+       } s;
+       struct cvmx_pciercx_cfg069_cn52xx {
+               u32 reserved_14_31 : 18;
+               u32 anfem : 1;
+               u32 rttm : 1;
+               u32 reserved_9_11 : 3;
+               u32 rnrm : 1;
+               u32 bdllpm : 1;
+               u32 btlpm : 1;
+               u32 reserved_1_5 : 5;
+               u32 rem : 1;
+       } cn52xx;
+       struct cvmx_pciercx_cfg069_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg069_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg069_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg069_cn52xx cn61xx;
+       struct cvmx_pciercx_cfg069_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg069_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg069_cn52xx cn66xx;
+       struct cvmx_pciercx_cfg069_cn52xx cn68xx;
+       struct cvmx_pciercx_cfg069_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg069_s cn70xx;
+       struct cvmx_pciercx_cfg069_s cn70xxp1;
+       struct cvmx_pciercx_cfg069_s cn73xx;
+       struct cvmx_pciercx_cfg069_s cn78xx;
+       struct cvmx_pciercx_cfg069_s cn78xxp1;
+       struct cvmx_pciercx_cfg069_s cnf71xx;
+       struct cvmx_pciercx_cfg069_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg069 cvmx_pciercx_cfg069_t;
+
+/**
+ * cvmx_pcierc#_cfg070
+ *
+ * This register contains the seventy-first 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg070 {
+       u32 u32;
+       struct cvmx_pciercx_cfg070_s {
+               u32 reserved_12_31 : 20;
+               u32 tplp : 1;
+               u32 reserved_9_10 : 2;
+               u32 ce : 1;
+               u32 cc : 1;
+               u32 ge : 1;
+               u32 gc : 1;
+               u32 fep : 5;
+       } s;
+       struct cvmx_pciercx_cfg070_cn52xx {
+               u32 reserved_9_31 : 23;
+               u32 ce : 1;
+               u32 cc : 1;
+               u32 ge : 1;
+               u32 gc : 1;
+               u32 fep : 5;
+       } cn52xx;
+       struct cvmx_pciercx_cfg070_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg070_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg070_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg070_cn52xx cn61xx;
+       struct cvmx_pciercx_cfg070_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg070_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg070_cn52xx cn66xx;
+       struct cvmx_pciercx_cfg070_cn52xx cn68xx;
+       struct cvmx_pciercx_cfg070_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg070_cn52xx cn70xx;
+       struct cvmx_pciercx_cfg070_cn52xx cn70xxp1;
+       struct cvmx_pciercx_cfg070_s cn73xx;
+       struct cvmx_pciercx_cfg070_s cn78xx;
+       struct cvmx_pciercx_cfg070_s cn78xxp1;
+       struct cvmx_pciercx_cfg070_cn52xx cnf71xx;
+       struct cvmx_pciercx_cfg070_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg070 cvmx_pciercx_cfg070_t;
+
+/**
+ * cvmx_pcierc#_cfg071
+ *
+ * This register contains the seventy-second 32-bits of PCIe type 1 configuration space.  The
+ * header log registers collect the header for the TLP corresponding to a detected error.
+ */
+union cvmx_pciercx_cfg071 {
+       u32 u32;
+       struct cvmx_pciercx_cfg071_s {
+               u32 dword1 : 32;
+       } s;
+       struct cvmx_pciercx_cfg071_s cn52xx;
+       struct cvmx_pciercx_cfg071_s cn52xxp1;
+       struct cvmx_pciercx_cfg071_s cn56xx;
+       struct cvmx_pciercx_cfg071_s cn56xxp1;
+       struct cvmx_pciercx_cfg071_s cn61xx;
+       struct cvmx_pciercx_cfg071_s cn63xx;
+       struct cvmx_pciercx_cfg071_s cn63xxp1;
+       struct cvmx_pciercx_cfg071_s cn66xx;
+       struct cvmx_pciercx_cfg071_s cn68xx;
+       struct cvmx_pciercx_cfg071_s cn68xxp1;
+       struct cvmx_pciercx_cfg071_s cn70xx;
+       struct cvmx_pciercx_cfg071_s cn70xxp1;
+       struct cvmx_pciercx_cfg071_s cn73xx;
+       struct cvmx_pciercx_cfg071_s cn78xx;
+       struct cvmx_pciercx_cfg071_s cn78xxp1;
+       struct cvmx_pciercx_cfg071_s cnf71xx;
+       struct cvmx_pciercx_cfg071_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg071 cvmx_pciercx_cfg071_t;
+
+/**
+ * cvmx_pcierc#_cfg072
+ *
+ * This register contains the seventy-third 32-bits of PCIe type 1 configuration space.  The
+ * header log registers collect the header for the TLP corresponding to a detected error.
+ */
+union cvmx_pciercx_cfg072 {
+       u32 u32;
+       struct cvmx_pciercx_cfg072_s {
+               u32 dword2 : 32;
+       } s;
+       struct cvmx_pciercx_cfg072_s cn52xx;
+       struct cvmx_pciercx_cfg072_s cn52xxp1;
+       struct cvmx_pciercx_cfg072_s cn56xx;
+       struct cvmx_pciercx_cfg072_s cn56xxp1;
+       struct cvmx_pciercx_cfg072_s cn61xx;
+       struct cvmx_pciercx_cfg072_s cn63xx;
+       struct cvmx_pciercx_cfg072_s cn63xxp1;
+       struct cvmx_pciercx_cfg072_s cn66xx;
+       struct cvmx_pciercx_cfg072_s cn68xx;
+       struct cvmx_pciercx_cfg072_s cn68xxp1;
+       struct cvmx_pciercx_cfg072_s cn70xx;
+       struct cvmx_pciercx_cfg072_s cn70xxp1;
+       struct cvmx_pciercx_cfg072_s cn73xx;
+       struct cvmx_pciercx_cfg072_s cn78xx;
+       struct cvmx_pciercx_cfg072_s cn78xxp1;
+       struct cvmx_pciercx_cfg072_s cnf71xx;
+       struct cvmx_pciercx_cfg072_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg072 cvmx_pciercx_cfg072_t;
+
+/**
+ * cvmx_pcierc#_cfg073
+ *
+ * This register contains the seventy-fourth 32-bits of PCIe type 1 configuration space.  The
+ * header log registers collect the header for the TLP corresponding to a detected error.
+ */
+union cvmx_pciercx_cfg073 {
+       u32 u32;
+       struct cvmx_pciercx_cfg073_s {
+               u32 dword3 : 32;
+       } s;
+       struct cvmx_pciercx_cfg073_s cn52xx;
+       struct cvmx_pciercx_cfg073_s cn52xxp1;
+       struct cvmx_pciercx_cfg073_s cn56xx;
+       struct cvmx_pciercx_cfg073_s cn56xxp1;
+       struct cvmx_pciercx_cfg073_s cn61xx;
+       struct cvmx_pciercx_cfg073_s cn63xx;
+       struct cvmx_pciercx_cfg073_s cn63xxp1;
+       struct cvmx_pciercx_cfg073_s cn66xx;
+       struct cvmx_pciercx_cfg073_s cn68xx;
+       struct cvmx_pciercx_cfg073_s cn68xxp1;
+       struct cvmx_pciercx_cfg073_s cn70xx;
+       struct cvmx_pciercx_cfg073_s cn70xxp1;
+       struct cvmx_pciercx_cfg073_s cn73xx;
+       struct cvmx_pciercx_cfg073_s cn78xx;
+       struct cvmx_pciercx_cfg073_s cn78xxp1;
+       struct cvmx_pciercx_cfg073_s cnf71xx;
+       struct cvmx_pciercx_cfg073_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg073 cvmx_pciercx_cfg073_t;
+
+/**
+ * cvmx_pcierc#_cfg074
+ *
+ * This register contains the seventy-fifth 32-bits of PCIe type 1 configuration space.  The
+ * header log registers collect the header for the TLP corresponding to a detected error.
+ */
+union cvmx_pciercx_cfg074 {
+       u32 u32;
+       struct cvmx_pciercx_cfg074_s {
+               u32 dword4 : 32;
+       } s;
+       struct cvmx_pciercx_cfg074_s cn52xx;
+       struct cvmx_pciercx_cfg074_s cn52xxp1;
+       struct cvmx_pciercx_cfg074_s cn56xx;
+       struct cvmx_pciercx_cfg074_s cn56xxp1;
+       struct cvmx_pciercx_cfg074_s cn61xx;
+       struct cvmx_pciercx_cfg074_s cn63xx;
+       struct cvmx_pciercx_cfg074_s cn63xxp1;
+       struct cvmx_pciercx_cfg074_s cn66xx;
+       struct cvmx_pciercx_cfg074_s cn68xx;
+       struct cvmx_pciercx_cfg074_s cn68xxp1;
+       struct cvmx_pciercx_cfg074_s cn70xx;
+       struct cvmx_pciercx_cfg074_s cn70xxp1;
+       struct cvmx_pciercx_cfg074_s cn73xx;
+       struct cvmx_pciercx_cfg074_s cn78xx;
+       struct cvmx_pciercx_cfg074_s cn78xxp1;
+       struct cvmx_pciercx_cfg074_s cnf71xx;
+       struct cvmx_pciercx_cfg074_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg074 cvmx_pciercx_cfg074_t;
+
+/**
+ * cvmx_pcierc#_cfg075
+ *
+ * This register contains the seventy-sixth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg075 {
+       u32 u32;
+       struct cvmx_pciercx_cfg075_s {
+               u32 reserved_3_31 : 29;
+               u32 fere : 1;
+               u32 nfere : 1;
+               u32 cere : 1;
+       } s;
+       struct cvmx_pciercx_cfg075_s cn52xx;
+       struct cvmx_pciercx_cfg075_s cn52xxp1;
+       struct cvmx_pciercx_cfg075_s cn56xx;
+       struct cvmx_pciercx_cfg075_s cn56xxp1;
+       struct cvmx_pciercx_cfg075_s cn61xx;
+       struct cvmx_pciercx_cfg075_s cn63xx;
+       struct cvmx_pciercx_cfg075_s cn63xxp1;
+       struct cvmx_pciercx_cfg075_s cn66xx;
+       struct cvmx_pciercx_cfg075_s cn68xx;
+       struct cvmx_pciercx_cfg075_s cn68xxp1;
+       struct cvmx_pciercx_cfg075_s cn70xx;
+       struct cvmx_pciercx_cfg075_s cn70xxp1;
+       struct cvmx_pciercx_cfg075_s cn73xx;
+       struct cvmx_pciercx_cfg075_s cn78xx;
+       struct cvmx_pciercx_cfg075_s cn78xxp1;
+       struct cvmx_pciercx_cfg075_s cnf71xx;
+       struct cvmx_pciercx_cfg075_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg075 cvmx_pciercx_cfg075_t;
+
+/**
+ * cvmx_pcierc#_cfg076
+ *
+ * This register contains the seventy-seventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg076 {
+       u32 u32;
+       struct cvmx_pciercx_cfg076_s {
+               u32 aeimn : 5;
+               u32 reserved_7_26 : 20;
+               u32 femr : 1;
+               u32 nfemr : 1;
+               u32 fuf : 1;
+               u32 multi_efnfr : 1;
+               u32 efnfr : 1;
+               u32 multi_ecr : 1;
+               u32 ecr : 1;
+       } s;
+       struct cvmx_pciercx_cfg076_s cn52xx;
+       struct cvmx_pciercx_cfg076_s cn52xxp1;
+       struct cvmx_pciercx_cfg076_s cn56xx;
+       struct cvmx_pciercx_cfg076_s cn56xxp1;
+       struct cvmx_pciercx_cfg076_s cn61xx;
+       struct cvmx_pciercx_cfg076_s cn63xx;
+       struct cvmx_pciercx_cfg076_s cn63xxp1;
+       struct cvmx_pciercx_cfg076_s cn66xx;
+       struct cvmx_pciercx_cfg076_s cn68xx;
+       struct cvmx_pciercx_cfg076_s cn68xxp1;
+       struct cvmx_pciercx_cfg076_s cn70xx;
+       struct cvmx_pciercx_cfg076_s cn70xxp1;
+       struct cvmx_pciercx_cfg076_s cn73xx;
+       struct cvmx_pciercx_cfg076_s cn78xx;
+       struct cvmx_pciercx_cfg076_s cn78xxp1;
+       struct cvmx_pciercx_cfg076_s cnf71xx;
+       struct cvmx_pciercx_cfg076_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg076 cvmx_pciercx_cfg076_t;
+
+/**
+ * cvmx_pcierc#_cfg077
+ *
+ * This register contains the seventy-eighth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg077 {
+       u32 u32;
+       struct cvmx_pciercx_cfg077_s {
+               u32 efnfsi : 16;
+               u32 ecsi : 16;
+       } s;
+       struct cvmx_pciercx_cfg077_s cn52xx;
+       struct cvmx_pciercx_cfg077_s cn52xxp1;
+       struct cvmx_pciercx_cfg077_s cn56xx;
+       struct cvmx_pciercx_cfg077_s cn56xxp1;
+       struct cvmx_pciercx_cfg077_s cn61xx;
+       struct cvmx_pciercx_cfg077_s cn63xx;
+       struct cvmx_pciercx_cfg077_s cn63xxp1;
+       struct cvmx_pciercx_cfg077_s cn66xx;
+       struct cvmx_pciercx_cfg077_s cn68xx;
+       struct cvmx_pciercx_cfg077_s cn68xxp1;
+       struct cvmx_pciercx_cfg077_s cn70xx;
+       struct cvmx_pciercx_cfg077_s cn70xxp1;
+       struct cvmx_pciercx_cfg077_s cn73xx;
+       struct cvmx_pciercx_cfg077_s cn78xx;
+       struct cvmx_pciercx_cfg077_s cn78xxp1;
+       struct cvmx_pciercx_cfg077_s cnf71xx;
+       struct cvmx_pciercx_cfg077_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg077 cvmx_pciercx_cfg077_t;
+
+/**
+ * cvmx_pcierc#_cfg086
+ *
+ * This register contains the eighty-ninth 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg086 {
+       u32 u32;
+       struct cvmx_pciercx_cfg086_s {
+               u32 nco : 12;
+               u32 cv : 4;
+               u32 pcieec : 16;
+       } s;
+       struct cvmx_pciercx_cfg086_s cn73xx;
+       struct cvmx_pciercx_cfg086_s cn78xx;
+       struct cvmx_pciercx_cfg086_s cn78xxp1;
+       struct cvmx_pciercx_cfg086_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg086 cvmx_pciercx_cfg086_t;
+
+/**
+ * cvmx_pcierc#_cfg087
+ *
+ * This register contains the eighty-eighth 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg087 {
+       u32 u32;
+       struct cvmx_pciercx_cfg087_s {
+               u32 reserved_2_31 : 30;
+               u32 ler : 1;
+               u32 pe : 1;
+       } s;
+       struct cvmx_pciercx_cfg087_s cn73xx;
+       struct cvmx_pciercx_cfg087_s cn78xx;
+       struct cvmx_pciercx_cfg087_s cn78xxp1;
+       struct cvmx_pciercx_cfg087_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg087 cvmx_pciercx_cfg087_t;
+
+/**
+ * cvmx_pcierc#_cfg088
+ *
+ * This register contains the eighty-ninth 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg088 {
+       u32 u32;
+       struct cvmx_pciercx_cfg088_s {
+               u32 reserved_8_31 : 24;
+               u32 les : 8;
+       } s;
+       struct cvmx_pciercx_cfg088_s cn73xx;
+       struct cvmx_pciercx_cfg088_s cn78xx;
+       struct cvmx_pciercx_cfg088_s cn78xxp1;
+       struct cvmx_pciercx_cfg088_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg088 cvmx_pciercx_cfg088_t;
+
+/**
+ * cvmx_pcierc#_cfg089
+ *
+ * This register contains the ninetieth 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg089 {
+       u32 u32;
+       struct cvmx_pciercx_cfg089_s {
+               u32 reserved_31_31 : 1;
+               u32 l1urph : 3;
+               u32 l1utp : 4;
+               u32 reserved_23_23 : 1;
+               u32 l1drph : 3;
+               u32 l1ddtp : 4;
+               u32 reserved_15_15 : 1;
+               u32 l0urph : 3;
+               u32 l0utp : 4;
+               u32 reserved_7_7 : 1;
+               u32 l0drph : 3;
+               u32 l0dtp : 4;
+       } s;
+       struct cvmx_pciercx_cfg089_s cn73xx;
+       struct cvmx_pciercx_cfg089_s cn78xx;
+       struct cvmx_pciercx_cfg089_s cn78xxp1;
+       struct cvmx_pciercx_cfg089_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg089 cvmx_pciercx_cfg089_t;
+
+/**
+ * cvmx_pcierc#_cfg090
+ *
+ * This register contains the ninety-first 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg090 {
+       u32 u32;
+       struct cvmx_pciercx_cfg090_s {
+               u32 reserved_31_31 : 1;
+               u32 l3urph : 3;
+               u32 l3utp : 4;
+               u32 reserved_23_23 : 1;
+               u32 l3drph : 3;
+               u32 l3dtp : 4;
+               u32 reserved_15_15 : 1;
+               u32 l2urph : 3;
+               u32 l2utp : 4;
+               u32 reserved_7_7 : 1;
+               u32 l2drph : 3;
+               u32 l2dtp : 4;
+       } s;
+       struct cvmx_pciercx_cfg090_s cn73xx;
+       struct cvmx_pciercx_cfg090_s cn78xx;
+       struct cvmx_pciercx_cfg090_s cn78xxp1;
+       struct cvmx_pciercx_cfg090_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg090 cvmx_pciercx_cfg090_t;
+
+/**
+ * cvmx_pcierc#_cfg091
+ *
+ * This register contains the ninety-second 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg091 {
+       u32 u32;
+       struct cvmx_pciercx_cfg091_s {
+               u32 reserved_31_31 : 1;
+               u32 l5urph : 3;
+               u32 l5utp : 4;
+               u32 reserved_23_23 : 1;
+               u32 l5drph : 3;
+               u32 l5dtp : 4;
+               u32 reserved_15_15 : 1;
+               u32 l4urph : 3;
+               u32 l4utp : 4;
+               u32 reserved_7_7 : 1;
+               u32 l4drph : 3;
+               u32 l4dtp : 4;
+       } s;
+       struct cvmx_pciercx_cfg091_s cn73xx;
+       struct cvmx_pciercx_cfg091_s cn78xx;
+       struct cvmx_pciercx_cfg091_s cn78xxp1;
+       struct cvmx_pciercx_cfg091_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg091 cvmx_pciercx_cfg091_t;
+
+/**
+ * cvmx_pcierc#_cfg092
+ *
+ * This register contains the ninety-third 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg092 {
+       u32 u32;
+       struct cvmx_pciercx_cfg092_s {
+               u32 reserved_31_31 : 1;
+               u32 l7urph : 3;
+               u32 l7utp : 4;
+               u32 reserved_23_23 : 1;
+               u32 l7drph : 3;
+               u32 l7dtp : 4;
+               u32 reserved_15_15 : 1;
+               u32 l6urph : 3;
+               u32 l6utp : 4;
+               u32 reserved_7_7 : 1;
+               u32 l6drph : 3;
+               u32 l6dtp : 4;
+       } s;
+       struct cvmx_pciercx_cfg092_s cn73xx;
+       struct cvmx_pciercx_cfg092_s cn78xx;
+       struct cvmx_pciercx_cfg092_s cn78xxp1;
+       struct cvmx_pciercx_cfg092_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg092 cvmx_pciercx_cfg092_t;
+
+/**
+ * cvmx_pcierc#_cfg448
+ *
+ * This register contains the four hundred forty-ninth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg448 {
+       u32 u32;
+       struct cvmx_pciercx_cfg448_s {
+               u32 rtl : 16;
+               u32 rtltl : 16;
+       } s;
+       struct cvmx_pciercx_cfg448_s cn52xx;
+       struct cvmx_pciercx_cfg448_s cn52xxp1;
+       struct cvmx_pciercx_cfg448_s cn56xx;
+       struct cvmx_pciercx_cfg448_s cn56xxp1;
+       struct cvmx_pciercx_cfg448_s cn61xx;
+       struct cvmx_pciercx_cfg448_s cn63xx;
+       struct cvmx_pciercx_cfg448_s cn63xxp1;
+       struct cvmx_pciercx_cfg448_s cn66xx;
+       struct cvmx_pciercx_cfg448_s cn68xx;
+       struct cvmx_pciercx_cfg448_s cn68xxp1;
+       struct cvmx_pciercx_cfg448_s cn70xx;
+       struct cvmx_pciercx_cfg448_s cn70xxp1;
+       struct cvmx_pciercx_cfg448_s cn73xx;
+       struct cvmx_pciercx_cfg448_s cn78xx;
+       struct cvmx_pciercx_cfg448_s cn78xxp1;
+       struct cvmx_pciercx_cfg448_s cnf71xx;
+       struct cvmx_pciercx_cfg448_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg448 cvmx_pciercx_cfg448_t;
+
+/**
+ * cvmx_pcierc#_cfg449
+ *
+ * This register contains the four hundred fiftieth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg449 {
+       u32 u32;
+       struct cvmx_pciercx_cfg449_s {
+               u32 omr : 32;
+       } s;
+       struct cvmx_pciercx_cfg449_s cn52xx;
+       struct cvmx_pciercx_cfg449_s cn52xxp1;
+       struct cvmx_pciercx_cfg449_s cn56xx;
+       struct cvmx_pciercx_cfg449_s cn56xxp1;
+       struct cvmx_pciercx_cfg449_s cn61xx;
+       struct cvmx_pciercx_cfg449_s cn63xx;
+       struct cvmx_pciercx_cfg449_s cn63xxp1;
+       struct cvmx_pciercx_cfg449_s cn66xx;
+       struct cvmx_pciercx_cfg449_s cn68xx;
+       struct cvmx_pciercx_cfg449_s cn68xxp1;
+       struct cvmx_pciercx_cfg449_s cn70xx;
+       struct cvmx_pciercx_cfg449_s cn70xxp1;
+       struct cvmx_pciercx_cfg449_s cn73xx;
+       struct cvmx_pciercx_cfg449_s cn78xx;
+       struct cvmx_pciercx_cfg449_s cn78xxp1;
+       struct cvmx_pciercx_cfg449_s cnf71xx;
+       struct cvmx_pciercx_cfg449_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg449 cvmx_pciercx_cfg449_t;
+
+/**
+ * cvmx_pcierc#_cfg450
+ *
+ * This register contains the four hundred fifty-first 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg450 {
+       u32 u32;
+       struct cvmx_pciercx_cfg450_s {
+               u32 lpec : 8;
+               u32 reserved_22_23 : 2;
+               u32 link_state : 6;
+               u32 force_link : 1;
+               u32 reserved_8_14 : 7;
+               u32 link_num : 8;
+       } s;
+       struct cvmx_pciercx_cfg450_s cn52xx;
+       struct cvmx_pciercx_cfg450_s cn52xxp1;
+       struct cvmx_pciercx_cfg450_s cn56xx;
+       struct cvmx_pciercx_cfg450_s cn56xxp1;
+       struct cvmx_pciercx_cfg450_s cn61xx;
+       struct cvmx_pciercx_cfg450_s cn63xx;
+       struct cvmx_pciercx_cfg450_s cn63xxp1;
+       struct cvmx_pciercx_cfg450_s cn66xx;
+       struct cvmx_pciercx_cfg450_s cn68xx;
+       struct cvmx_pciercx_cfg450_s cn68xxp1;
+       struct cvmx_pciercx_cfg450_cn70xx {
+               u32 lpec : 8;
+               u32 reserved_22_23 : 2;
+               u32 link_state : 6;
+               u32 force_link : 1;
+               u32 reserved_12_14 : 3;
+               u32 link_cmd : 4;
+               u32 link_num : 8;
+       } cn70xx;
+       struct cvmx_pciercx_cfg450_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg450_cn73xx {
+               u32 lpec : 8;
+               u32 reserved_22_23 : 2;
+               u32 link_state : 6;
+               u32 force_link : 1;
+               u32 reserved_12_14 : 3;
+               u32 forced_ltssm : 4;
+               u32 link_num : 8;
+       } cn73xx;
+       struct cvmx_pciercx_cfg450_cn73xx cn78xx;
+       struct cvmx_pciercx_cfg450_cn73xx cn78xxp1;
+       struct cvmx_pciercx_cfg450_s cnf71xx;
+       struct cvmx_pciercx_cfg450_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg450 cvmx_pciercx_cfg450_t;
+
+/**
+ * cvmx_pcierc#_cfg451
+ *
+ * This register contains the four hundred fifty-second 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg451 {
+       u32 u32;
+       struct cvmx_pciercx_cfg451_s {
+               u32 reserved_31_31 : 1;
+               u32 easpml1 : 1;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 n_fts_cc : 8;
+               u32 n_fts : 8;
+               u32 ack_freq : 8;
+       } s;
+       struct cvmx_pciercx_cfg451_cn52xx {
+               u32 reserved_30_31 : 2;
+               u32 l1el : 3;
+               u32 l0el : 3;
+               u32 n_fts_cc : 8;
+               u32 n_fts : 8;
+               u32 ack_freq : 8;
+       } cn52xx;
+       struct cvmx_pciercx_cfg451_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg451_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg451_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg451_s cn61xx;
+       struct cvmx_pciercx_cfg451_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg451_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg451_s cn66xx;
+       struct cvmx_pciercx_cfg451_s cn68xx;
+       struct cvmx_pciercx_cfg451_s cn68xxp1;
+       struct cvmx_pciercx_cfg451_s cn70xx;
+       struct cvmx_pciercx_cfg451_s cn70xxp1;
+       struct cvmx_pciercx_cfg451_s cn73xx;
+       struct cvmx_pciercx_cfg451_s cn78xx;
+       struct cvmx_pciercx_cfg451_s cn78xxp1;
+       struct cvmx_pciercx_cfg451_s cnf71xx;
+       struct cvmx_pciercx_cfg451_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg451 cvmx_pciercx_cfg451_t;
+
+/**
+ * cvmx_pcierc#_cfg452
+ *
+ * This register contains the four hundred fifty-third 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg452 {
+       u32 u32;
+       struct cvmx_pciercx_cfg452_s {
+               u32 reserved_26_31 : 6;
+               u32 eccrc : 1;
+               u32 reserved_22_24 : 3;
+               u32 lme : 6;
+               u32 reserved_12_15 : 4;
+               u32 link_rate : 4;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } s;
+       struct cvmx_pciercx_cfg452_cn52xx {
+               u32 reserved_26_31 : 6;
+               u32 eccrc : 1;
+               u32 reserved_22_24 : 3;
+               u32 lme : 6;
+               u32 reserved_8_15 : 8;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } cn52xx;
+       struct cvmx_pciercx_cfg452_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg452_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg452_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg452_cn61xx {
+               u32 reserved_22_31 : 10;
+               u32 lme : 6;
+               u32 reserved_8_15 : 8;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } cn61xx;
+       struct cvmx_pciercx_cfg452_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg452_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg452_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg452_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg452_cn61xx cn68xxp1;
+       struct cvmx_pciercx_cfg452_cn70xx {
+               u32 reserved_22_31 : 10;
+               u32 lme : 6;
+               u32 reserved_12_15 : 4;
+               u32 link_rate : 4;
+               u32 flm : 1;
+               u32 reserved_6_6 : 1;
+               u32 dllle : 1;
+               u32 reserved_4_4 : 1;
+               u32 ra : 1;
+               u32 le : 1;
+               u32 sd : 1;
+               u32 omr : 1;
+       } cn70xx;
+       struct cvmx_pciercx_cfg452_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg452_cn70xx cn73xx;
+       struct cvmx_pciercx_cfg452_cn70xx cn78xx;
+       struct cvmx_pciercx_cfg452_cn70xx cn78xxp1;
+       struct cvmx_pciercx_cfg452_cn61xx cnf71xx;
+       struct cvmx_pciercx_cfg452_cn70xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg452 cvmx_pciercx_cfg452_t;
+
+/**
+ * cvmx_pcierc#_cfg453
+ *
+ * This register contains the four hundred fifty-fourth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg453 {
+       u32 u32;
+       struct cvmx_pciercx_cfg453_s {
+               u32 dlld : 1;
+               u32 reserved_26_30 : 5;
+               u32 ack_nak : 1;
+               u32 fcd : 1;
+               u32 ilst : 24;
+       } s;
+       struct cvmx_pciercx_cfg453_s cn52xx;
+       struct cvmx_pciercx_cfg453_s cn52xxp1;
+       struct cvmx_pciercx_cfg453_s cn56xx;
+       struct cvmx_pciercx_cfg453_s cn56xxp1;
+       struct cvmx_pciercx_cfg453_s cn61xx;
+       struct cvmx_pciercx_cfg453_s cn63xx;
+       struct cvmx_pciercx_cfg453_s cn63xxp1;
+       struct cvmx_pciercx_cfg453_s cn66xx;
+       struct cvmx_pciercx_cfg453_s cn68xx;
+       struct cvmx_pciercx_cfg453_s cn68xxp1;
+       struct cvmx_pciercx_cfg453_s cn70xx;
+       struct cvmx_pciercx_cfg453_s cn70xxp1;
+       struct cvmx_pciercx_cfg453_s cn73xx;
+       struct cvmx_pciercx_cfg453_s cn78xx;
+       struct cvmx_pciercx_cfg453_s cn78xxp1;
+       struct cvmx_pciercx_cfg453_s cnf71xx;
+       struct cvmx_pciercx_cfg453_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg453 cvmx_pciercx_cfg453_t;
+
+/**
+ * cvmx_pcierc#_cfg454
+ *
+ * This register contains the four hundred fifty-fifth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg454 {
+       u32 u32;
+       struct cvmx_pciercx_cfg454_s {
+               u32 cx_nfunc : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_11_13 : 3;
+               u32 nskps : 3;
+               u32 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pciercx_cfg454_cn52xx {
+               u32 reserved_29_31 : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_11_13 : 3;
+               u32 nskps : 3;
+               u32 reserved_4_7 : 4;
+               u32 ntss : 4;
+       } cn52xx;
+       struct cvmx_pciercx_cfg454_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg454_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg454_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg454_cn61xx {
+               u32 cx_nfunc : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_8_13 : 6;
+               u32 mfuncn : 8;
+       } cn61xx;
+       struct cvmx_pciercx_cfg454_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg454_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg454_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg454_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg454_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg454_cn70xx {
+               u32 reserved_24_31 : 8;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_8_13 : 6;
+               u32 mfuncn : 8;
+       } cn70xx;
+       struct cvmx_pciercx_cfg454_cn70xx cn70xxp1;
+       struct cvmx_pciercx_cfg454_cn73xx {
+               u32 reserved_29_31 : 3;
+               u32 tmfcwt : 5;
+               u32 tmanlt : 5;
+               u32 tmrt : 5;
+               u32 reserved_8_13 : 6;
+               u32 mfuncn : 8;
+       } cn73xx;
+       struct cvmx_pciercx_cfg454_cn73xx cn78xx;
+       struct cvmx_pciercx_cfg454_cn73xx cn78xxp1;
+       struct cvmx_pciercx_cfg454_cn61xx cnf71xx;
+       struct cvmx_pciercx_cfg454_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg454 cvmx_pciercx_cfg454_t;
+
+/**
+ * cvmx_pcierc#_cfg455
+ *
+ * This register contains the four hundred fifty-sixth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg455 {
+       u32 u32;
+       struct cvmx_pciercx_cfg455_s {
+               u32 m_cfg0_filt : 1;
+               u32 m_io_filt : 1;
+               u32 msg_ctrl : 1;
+               u32 m_cpl_ecrc_filt : 1;
+               u32 m_ecrc_filt : 1;
+               u32 m_cpl_len_err : 1;
+               u32 m_cpl_attr_err : 1;
+               u32 m_cpl_tc_err : 1;
+               u32 m_cpl_fun_err : 1;
+               u32 m_cpl_rid_err : 1;
+               u32 m_cpl_tag_err : 1;
+               u32 m_lk_filt : 1;
+               u32 m_cfg1_filt : 1;
+               u32 m_bar_match : 1;
+               u32 m_pois_filt : 1;
+               u32 m_fun : 1;
+               u32 dfcwt : 1;
+               u32 reserved_11_14 : 4;
+               u32 skpiv : 11;
+       } s;
+       struct cvmx_pciercx_cfg455_s cn52xx;
+       struct cvmx_pciercx_cfg455_s cn52xxp1;
+       struct cvmx_pciercx_cfg455_s cn56xx;
+       struct cvmx_pciercx_cfg455_s cn56xxp1;
+       struct cvmx_pciercx_cfg455_s cn61xx;
+       struct cvmx_pciercx_cfg455_s cn63xx;
+       struct cvmx_pciercx_cfg455_s cn63xxp1;
+       struct cvmx_pciercx_cfg455_s cn66xx;
+       struct cvmx_pciercx_cfg455_s cn68xx;
+       struct cvmx_pciercx_cfg455_s cn68xxp1;
+       struct cvmx_pciercx_cfg455_s cn70xx;
+       struct cvmx_pciercx_cfg455_s cn70xxp1;
+       struct cvmx_pciercx_cfg455_s cn73xx;
+       struct cvmx_pciercx_cfg455_s cn78xx;
+       struct cvmx_pciercx_cfg455_s cn78xxp1;
+       struct cvmx_pciercx_cfg455_s cnf71xx;
+       struct cvmx_pciercx_cfg455_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg455 cvmx_pciercx_cfg455_t;
+
+/**
+ * cvmx_pcierc#_cfg456
+ *
+ * This register contains the four hundred fifty-seventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg456 {
+       u32 u32;
+       struct cvmx_pciercx_cfg456_s {
+               u32 reserved_4_31 : 28;
+               u32 m_handle_flush : 1;
+               u32 m_dabort_4ucpl : 1;
+               u32 m_vend1_drp : 1;
+               u32 m_vend0_drp : 1;
+       } s;
+       struct cvmx_pciercx_cfg456_cn52xx {
+               u32 reserved_2_31 : 30;
+               u32 m_vend1_drp : 1;
+               u32 m_vend0_drp : 1;
+       } cn52xx;
+       struct cvmx_pciercx_cfg456_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg456_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg456_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg456_s cn61xx;
+       struct cvmx_pciercx_cfg456_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg456_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg456_s cn66xx;
+       struct cvmx_pciercx_cfg456_s cn68xx;
+       struct cvmx_pciercx_cfg456_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg456_s cn70xx;
+       struct cvmx_pciercx_cfg456_s cn70xxp1;
+       struct cvmx_pciercx_cfg456_s cn73xx;
+       struct cvmx_pciercx_cfg456_s cn78xx;
+       struct cvmx_pciercx_cfg456_s cn78xxp1;
+       struct cvmx_pciercx_cfg456_s cnf71xx;
+       struct cvmx_pciercx_cfg456_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg456 cvmx_pciercx_cfg456_t;
+
+/**
+ * cvmx_pcierc#_cfg458
+ *
+ * This register contains the four hundred fifty-ninth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg458 {
+       u32 u32;
+       struct cvmx_pciercx_cfg458_s {
+               u32 dbg_info_l32 : 32;
+       } s;
+       struct cvmx_pciercx_cfg458_s cn52xx;
+       struct cvmx_pciercx_cfg458_s cn52xxp1;
+       struct cvmx_pciercx_cfg458_s cn56xx;
+       struct cvmx_pciercx_cfg458_s cn56xxp1;
+       struct cvmx_pciercx_cfg458_s cn61xx;
+       struct cvmx_pciercx_cfg458_s cn63xx;
+       struct cvmx_pciercx_cfg458_s cn63xxp1;
+       struct cvmx_pciercx_cfg458_s cn66xx;
+       struct cvmx_pciercx_cfg458_s cn68xx;
+       struct cvmx_pciercx_cfg458_s cn68xxp1;
+       struct cvmx_pciercx_cfg458_s cn70xx;
+       struct cvmx_pciercx_cfg458_s cn70xxp1;
+       struct cvmx_pciercx_cfg458_s cn73xx;
+       struct cvmx_pciercx_cfg458_s cn78xx;
+       struct cvmx_pciercx_cfg458_s cn78xxp1;
+       struct cvmx_pciercx_cfg458_s cnf71xx;
+       struct cvmx_pciercx_cfg458_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg458 cvmx_pciercx_cfg458_t;
+
+/**
+ * cvmx_pcierc#_cfg459
+ *
+ * This register contains the four hundred sixtieth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg459 {
+       u32 u32;
+       struct cvmx_pciercx_cfg459_s {
+               u32 dbg_info_u32 : 32;
+       } s;
+       struct cvmx_pciercx_cfg459_s cn52xx;
+       struct cvmx_pciercx_cfg459_s cn52xxp1;
+       struct cvmx_pciercx_cfg459_s cn56xx;
+       struct cvmx_pciercx_cfg459_s cn56xxp1;
+       struct cvmx_pciercx_cfg459_s cn61xx;
+       struct cvmx_pciercx_cfg459_s cn63xx;
+       struct cvmx_pciercx_cfg459_s cn63xxp1;
+       struct cvmx_pciercx_cfg459_s cn66xx;
+       struct cvmx_pciercx_cfg459_s cn68xx;
+       struct cvmx_pciercx_cfg459_s cn68xxp1;
+       struct cvmx_pciercx_cfg459_s cn70xx;
+       struct cvmx_pciercx_cfg459_s cn70xxp1;
+       struct cvmx_pciercx_cfg459_s cn73xx;
+       struct cvmx_pciercx_cfg459_s cn78xx;
+       struct cvmx_pciercx_cfg459_s cn78xxp1;
+       struct cvmx_pciercx_cfg459_s cnf71xx;
+       struct cvmx_pciercx_cfg459_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg459 cvmx_pciercx_cfg459_t;
+
+/**
+ * cvmx_pcierc#_cfg460
+ *
+ * This register contains the four hundred sixty-first 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg460 {
+       u32 u32;
+       struct cvmx_pciercx_cfg460_s {
+               u32 reserved_20_31 : 12;
+               u32 tphfcc : 8;
+               u32 tpdfcc : 12;
+       } s;
+       struct cvmx_pciercx_cfg460_s cn52xx;
+       struct cvmx_pciercx_cfg460_s cn52xxp1;
+       struct cvmx_pciercx_cfg460_s cn56xx;
+       struct cvmx_pciercx_cfg460_s cn56xxp1;
+       struct cvmx_pciercx_cfg460_s cn61xx;
+       struct cvmx_pciercx_cfg460_s cn63xx;
+       struct cvmx_pciercx_cfg460_s cn63xxp1;
+       struct cvmx_pciercx_cfg460_s cn66xx;
+       struct cvmx_pciercx_cfg460_s cn68xx;
+       struct cvmx_pciercx_cfg460_s cn68xxp1;
+       struct cvmx_pciercx_cfg460_s cn70xx;
+       struct cvmx_pciercx_cfg460_s cn70xxp1;
+       struct cvmx_pciercx_cfg460_s cn73xx;
+       struct cvmx_pciercx_cfg460_s cn78xx;
+       struct cvmx_pciercx_cfg460_s cn78xxp1;
+       struct cvmx_pciercx_cfg460_s cnf71xx;
+       struct cvmx_pciercx_cfg460_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg460 cvmx_pciercx_cfg460_t;
+
+/**
+ * cvmx_pcierc#_cfg461
+ *
+ * This register contains the four hundred sixty-second 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg461 {
+       u32 u32;
+       struct cvmx_pciercx_cfg461_s {
+               u32 reserved_20_31 : 12;
+               u32 tchfcc : 8;
+               u32 tcdfcc : 12;
+       } s;
+       struct cvmx_pciercx_cfg461_s cn52xx;
+       struct cvmx_pciercx_cfg461_s cn52xxp1;
+       struct cvmx_pciercx_cfg461_s cn56xx;
+       struct cvmx_pciercx_cfg461_s cn56xxp1;
+       struct cvmx_pciercx_cfg461_s cn61xx;
+       struct cvmx_pciercx_cfg461_s cn63xx;
+       struct cvmx_pciercx_cfg461_s cn63xxp1;
+       struct cvmx_pciercx_cfg461_s cn66xx;
+       struct cvmx_pciercx_cfg461_s cn68xx;
+       struct cvmx_pciercx_cfg461_s cn68xxp1;
+       struct cvmx_pciercx_cfg461_s cn70xx;
+       struct cvmx_pciercx_cfg461_s cn70xxp1;
+       struct cvmx_pciercx_cfg461_s cn73xx;
+       struct cvmx_pciercx_cfg461_s cn78xx;
+       struct cvmx_pciercx_cfg461_s cn78xxp1;
+       struct cvmx_pciercx_cfg461_s cnf71xx;
+       struct cvmx_pciercx_cfg461_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg461 cvmx_pciercx_cfg461_t;
+
+/**
+ * cvmx_pcierc#_cfg462
+ *
+ * This register contains the four hundred sixty-third 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg462 {
+       u32 u32;
+       struct cvmx_pciercx_cfg462_s {
+               u32 reserved_20_31 : 12;
+               u32 tchfcc : 8;
+               u32 tcdfcc : 12;
+       } s;
+       struct cvmx_pciercx_cfg462_s cn52xx;
+       struct cvmx_pciercx_cfg462_s cn52xxp1;
+       struct cvmx_pciercx_cfg462_s cn56xx;
+       struct cvmx_pciercx_cfg462_s cn56xxp1;
+       struct cvmx_pciercx_cfg462_s cn61xx;
+       struct cvmx_pciercx_cfg462_s cn63xx;
+       struct cvmx_pciercx_cfg462_s cn63xxp1;
+       struct cvmx_pciercx_cfg462_s cn66xx;
+       struct cvmx_pciercx_cfg462_s cn68xx;
+       struct cvmx_pciercx_cfg462_s cn68xxp1;
+       struct cvmx_pciercx_cfg462_s cn70xx;
+       struct cvmx_pciercx_cfg462_s cn70xxp1;
+       struct cvmx_pciercx_cfg462_s cn73xx;
+       struct cvmx_pciercx_cfg462_s cn78xx;
+       struct cvmx_pciercx_cfg462_s cn78xxp1;
+       struct cvmx_pciercx_cfg462_s cnf71xx;
+       struct cvmx_pciercx_cfg462_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg462 cvmx_pciercx_cfg462_t;
+
+/**
+ * cvmx_pcierc#_cfg463
+ *
+ * This register contains the four hundred sixty-fourth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg463 {
+       u32 u32;
+       struct cvmx_pciercx_cfg463_s {
+               u32 fcltoe : 1;
+               u32 reserved_29_30 : 2;
+               u32 fcltov : 13;
+               u32 reserved_3_15 : 13;
+               u32 rqne : 1;
+               u32 trbne : 1;
+               u32 rtlpfccnr : 1;
+       } s;
+       struct cvmx_pciercx_cfg463_cn52xx {
+               u32 reserved_3_31 : 29;
+               u32 rqne : 1;
+               u32 trbne : 1;
+               u32 rtlpfccnr : 1;
+       } cn52xx;
+       struct cvmx_pciercx_cfg463_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg463_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg463_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg463_cn52xx cn61xx;
+       struct cvmx_pciercx_cfg463_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg463_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg463_cn52xx cn66xx;
+       struct cvmx_pciercx_cfg463_cn52xx cn68xx;
+       struct cvmx_pciercx_cfg463_cn52xx cn68xxp1;
+       struct cvmx_pciercx_cfg463_cn52xx cn70xx;
+       struct cvmx_pciercx_cfg463_cn52xx cn70xxp1;
+       struct cvmx_pciercx_cfg463_s cn73xx;
+       struct cvmx_pciercx_cfg463_s cn78xx;
+       struct cvmx_pciercx_cfg463_s cn78xxp1;
+       struct cvmx_pciercx_cfg463_cn52xx cnf71xx;
+       struct cvmx_pciercx_cfg463_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg463 cvmx_pciercx_cfg463_t;
+
+/**
+ * cvmx_pcierc#_cfg464
+ *
+ * This register contains the four hundred sixty-fifth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg464 {
+       u32 u32;
+       struct cvmx_pciercx_cfg464_s {
+               u32 wrr_vc3 : 8;
+               u32 wrr_vc2 : 8;
+               u32 wrr_vc1 : 8;
+               u32 wrr_vc0 : 8;
+       } s;
+       struct cvmx_pciercx_cfg464_s cn52xx;
+       struct cvmx_pciercx_cfg464_s cn52xxp1;
+       struct cvmx_pciercx_cfg464_s cn56xx;
+       struct cvmx_pciercx_cfg464_s cn56xxp1;
+       struct cvmx_pciercx_cfg464_s cn61xx;
+       struct cvmx_pciercx_cfg464_s cn63xx;
+       struct cvmx_pciercx_cfg464_s cn63xxp1;
+       struct cvmx_pciercx_cfg464_s cn66xx;
+       struct cvmx_pciercx_cfg464_s cn68xx;
+       struct cvmx_pciercx_cfg464_s cn68xxp1;
+       struct cvmx_pciercx_cfg464_s cn70xx;
+       struct cvmx_pciercx_cfg464_s cn70xxp1;
+       struct cvmx_pciercx_cfg464_s cn73xx;
+       struct cvmx_pciercx_cfg464_s cn78xx;
+       struct cvmx_pciercx_cfg464_s cn78xxp1;
+       struct cvmx_pciercx_cfg464_s cnf71xx;
+       struct cvmx_pciercx_cfg464_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg464 cvmx_pciercx_cfg464_t;
+
+/**
+ * cvmx_pcierc#_cfg465
+ *
+ * This register contains the four hundred sixty-sixth 32-bits of configuration space.
+ *
+ */
+union cvmx_pciercx_cfg465 {
+       u32 u32;
+       struct cvmx_pciercx_cfg465_s {
+               u32 wrr_vc7 : 8;
+               u32 wrr_vc6 : 8;
+               u32 wrr_vc5 : 8;
+               u32 wrr_vc4 : 8;
+       } s;
+       struct cvmx_pciercx_cfg465_s cn52xx;
+       struct cvmx_pciercx_cfg465_s cn52xxp1;
+       struct cvmx_pciercx_cfg465_s cn56xx;
+       struct cvmx_pciercx_cfg465_s cn56xxp1;
+       struct cvmx_pciercx_cfg465_s cn61xx;
+       struct cvmx_pciercx_cfg465_s cn63xx;
+       struct cvmx_pciercx_cfg465_s cn63xxp1;
+       struct cvmx_pciercx_cfg465_s cn66xx;
+       struct cvmx_pciercx_cfg465_s cn68xx;
+       struct cvmx_pciercx_cfg465_s cn68xxp1;
+       struct cvmx_pciercx_cfg465_s cn70xx;
+       struct cvmx_pciercx_cfg465_s cn70xxp1;
+       struct cvmx_pciercx_cfg465_s cn73xx;
+       struct cvmx_pciercx_cfg465_s cn78xx;
+       struct cvmx_pciercx_cfg465_s cn78xxp1;
+       struct cvmx_pciercx_cfg465_s cnf71xx;
+       struct cvmx_pciercx_cfg465_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg465 cvmx_pciercx_cfg465_t;
+
+/**
+ * cvmx_pcierc#_cfg466
+ *
+ * This register contains the four hundred sixty-seventh 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg466 {
+       u32 u32;
+       struct cvmx_pciercx_cfg466_s {
+               u32 rx_queue_order : 1;
+               u32 type_ordering : 1;
+               u32 reserved_24_29 : 6;
+               u32 queue_mode : 3;
+               u32 reserved_20_20 : 1;
+               u32 header_credits : 8;
+               u32 data_credits : 12;
+       } s;
+       struct cvmx_pciercx_cfg466_s cn52xx;
+       struct cvmx_pciercx_cfg466_s cn52xxp1;
+       struct cvmx_pciercx_cfg466_s cn56xx;
+       struct cvmx_pciercx_cfg466_s cn56xxp1;
+       struct cvmx_pciercx_cfg466_s cn61xx;
+       struct cvmx_pciercx_cfg466_s cn63xx;
+       struct cvmx_pciercx_cfg466_s cn63xxp1;
+       struct cvmx_pciercx_cfg466_s cn66xx;
+       struct cvmx_pciercx_cfg466_s cn68xx;
+       struct cvmx_pciercx_cfg466_s cn68xxp1;
+       struct cvmx_pciercx_cfg466_s cn70xx;
+       struct cvmx_pciercx_cfg466_s cn70xxp1;
+       struct cvmx_pciercx_cfg466_s cn73xx;
+       struct cvmx_pciercx_cfg466_s cn78xx;
+       struct cvmx_pciercx_cfg466_s cn78xxp1;
+       struct cvmx_pciercx_cfg466_s cnf71xx;
+       struct cvmx_pciercx_cfg466_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg466 cvmx_pciercx_cfg466_t;
+
+/**
+ * cvmx_pcierc#_cfg467
+ *
+ * This register contains the four hundred sixty-eighth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg467 {
+       u32 u32;
+       struct cvmx_pciercx_cfg467_s {
+               u32 reserved_24_31 : 8;
+               u32 queue_mode : 3;
+               u32 reserved_20_20 : 1;
+               u32 header_credits : 8;
+               u32 data_credits : 12;
+       } s;
+       struct cvmx_pciercx_cfg467_s cn52xx;
+       struct cvmx_pciercx_cfg467_s cn52xxp1;
+       struct cvmx_pciercx_cfg467_s cn56xx;
+       struct cvmx_pciercx_cfg467_s cn56xxp1;
+       struct cvmx_pciercx_cfg467_s cn61xx;
+       struct cvmx_pciercx_cfg467_s cn63xx;
+       struct cvmx_pciercx_cfg467_s cn63xxp1;
+       struct cvmx_pciercx_cfg467_s cn66xx;
+       struct cvmx_pciercx_cfg467_s cn68xx;
+       struct cvmx_pciercx_cfg467_s cn68xxp1;
+       struct cvmx_pciercx_cfg467_s cn70xx;
+       struct cvmx_pciercx_cfg467_s cn70xxp1;
+       struct cvmx_pciercx_cfg467_s cn73xx;
+       struct cvmx_pciercx_cfg467_s cn78xx;
+       struct cvmx_pciercx_cfg467_s cn78xxp1;
+       struct cvmx_pciercx_cfg467_s cnf71xx;
+       struct cvmx_pciercx_cfg467_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg467 cvmx_pciercx_cfg467_t;
+
+/**
+ * cvmx_pcierc#_cfg468
+ *
+ * This register contains the four hundred sixty-ninth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg468 {
+       u32 u32;
+       struct cvmx_pciercx_cfg468_s {
+               u32 reserved_24_31 : 8;
+               u32 queue_mode : 3;
+               u32 reserved_20_20 : 1;
+               u32 header_credits : 8;
+               u32 data_credits : 12;
+       } s;
+       struct cvmx_pciercx_cfg468_s cn52xx;
+       struct cvmx_pciercx_cfg468_s cn52xxp1;
+       struct cvmx_pciercx_cfg468_s cn56xx;
+       struct cvmx_pciercx_cfg468_s cn56xxp1;
+       struct cvmx_pciercx_cfg468_s cn61xx;
+       struct cvmx_pciercx_cfg468_s cn63xx;
+       struct cvmx_pciercx_cfg468_s cn63xxp1;
+       struct cvmx_pciercx_cfg468_s cn66xx;
+       struct cvmx_pciercx_cfg468_s cn68xx;
+       struct cvmx_pciercx_cfg468_s cn68xxp1;
+       struct cvmx_pciercx_cfg468_s cn70xx;
+       struct cvmx_pciercx_cfg468_s cn70xxp1;
+       struct cvmx_pciercx_cfg468_s cn73xx;
+       struct cvmx_pciercx_cfg468_s cn78xx;
+       struct cvmx_pciercx_cfg468_s cn78xxp1;
+       struct cvmx_pciercx_cfg468_s cnf71xx;
+       struct cvmx_pciercx_cfg468_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg468 cvmx_pciercx_cfg468_t;
+
+/**
+ * cvmx_pcierc#_cfg490
+ *
+ * PCIE_CFG490 = Four hundred ninety-first 32-bits of PCIE type 1 config space
+ * (VC0 Posted Buffer Depth)
+ */
+union cvmx_pciercx_cfg490 {
+       u32 u32;
+       struct cvmx_pciercx_cfg490_s {
+               u32 reserved_26_31 : 6;
+               u32 header_depth : 10;
+               u32 reserved_14_15 : 2;
+               u32 data_depth : 14;
+       } s;
+       struct cvmx_pciercx_cfg490_s cn52xx;
+       struct cvmx_pciercx_cfg490_s cn52xxp1;
+       struct cvmx_pciercx_cfg490_s cn56xx;
+       struct cvmx_pciercx_cfg490_s cn56xxp1;
+       struct cvmx_pciercx_cfg490_s cn61xx;
+       struct cvmx_pciercx_cfg490_s cn63xx;
+       struct cvmx_pciercx_cfg490_s cn63xxp1;
+       struct cvmx_pciercx_cfg490_s cn66xx;
+       struct cvmx_pciercx_cfg490_s cn68xx;
+       struct cvmx_pciercx_cfg490_s cn68xxp1;
+       struct cvmx_pciercx_cfg490_s cn70xx;
+       struct cvmx_pciercx_cfg490_s cn70xxp1;
+       struct cvmx_pciercx_cfg490_s cnf71xx;
+};
+
+typedef union cvmx_pciercx_cfg490 cvmx_pciercx_cfg490_t;
+
+/**
+ * cvmx_pcierc#_cfg491
+ *
+ * PCIE_CFG491 = Four hundred ninety-second 32-bits of PCIE type 1 config space
+ * (VC0 Non-Posted Buffer Depth)
+ */
+union cvmx_pciercx_cfg491 {
+       u32 u32;
+       struct cvmx_pciercx_cfg491_s {
+               u32 reserved_26_31 : 6;
+               u32 header_depth : 10;
+               u32 reserved_14_15 : 2;
+               u32 data_depth : 14;
+       } s;
+       struct cvmx_pciercx_cfg491_s cn52xx;
+       struct cvmx_pciercx_cfg491_s cn52xxp1;
+       struct cvmx_pciercx_cfg491_s cn56xx;
+       struct cvmx_pciercx_cfg491_s cn56xxp1;
+       struct cvmx_pciercx_cfg491_s cn61xx;
+       struct cvmx_pciercx_cfg491_s cn63xx;
+       struct cvmx_pciercx_cfg491_s cn63xxp1;
+       struct cvmx_pciercx_cfg491_s cn66xx;
+       struct cvmx_pciercx_cfg491_s cn68xx;
+       struct cvmx_pciercx_cfg491_s cn68xxp1;
+       struct cvmx_pciercx_cfg491_s cn70xx;
+       struct cvmx_pciercx_cfg491_s cn70xxp1;
+       struct cvmx_pciercx_cfg491_s cnf71xx;
+};
+
+typedef union cvmx_pciercx_cfg491 cvmx_pciercx_cfg491_t;
+
+/**
+ * cvmx_pcierc#_cfg492
+ *
+ * PCIE_CFG492 = Four hundred ninety-third 32-bits of PCIE type 1 config space
+ * (VC0 Completion Buffer Depth)
+ */
+union cvmx_pciercx_cfg492 {
+       u32 u32;
+       struct cvmx_pciercx_cfg492_s {
+               u32 reserved_26_31 : 6;
+               u32 header_depth : 10;
+               u32 reserved_14_15 : 2;
+               u32 data_depth : 14;
+       } s;
+       struct cvmx_pciercx_cfg492_s cn52xx;
+       struct cvmx_pciercx_cfg492_s cn52xxp1;
+       struct cvmx_pciercx_cfg492_s cn56xx;
+       struct cvmx_pciercx_cfg492_s cn56xxp1;
+       struct cvmx_pciercx_cfg492_s cn61xx;
+       struct cvmx_pciercx_cfg492_s cn63xx;
+       struct cvmx_pciercx_cfg492_s cn63xxp1;
+       struct cvmx_pciercx_cfg492_s cn66xx;
+       struct cvmx_pciercx_cfg492_s cn68xx;
+       struct cvmx_pciercx_cfg492_s cn68xxp1;
+       struct cvmx_pciercx_cfg492_s cn70xx;
+       struct cvmx_pciercx_cfg492_s cn70xxp1;
+       struct cvmx_pciercx_cfg492_s cnf71xx;
+};
+
+typedef union cvmx_pciercx_cfg492 cvmx_pciercx_cfg492_t;
+
+/**
+ * cvmx_pcierc#_cfg515
+ *
+ * This register contains the five hundred sixteenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg515 {
+       u32 u32;
+       struct cvmx_pciercx_cfg515_s {
+               u32 reserved_21_31 : 11;
+               u32 s_d_e : 1;
+               u32 ctcrb : 1;
+               u32 cpyts : 1;
+               u32 dsc : 1;
+               u32 reserved_8_16 : 9;
+               u32 n_fts : 8;
+       } s;
+       struct cvmx_pciercx_cfg515_cn61xx {
+               u32 reserved_21_31 : 11;
+               u32 s_d_e : 1;
+               u32 ctcrb : 1;
+               u32 cpyts : 1;
+               u32 dsc : 1;
+               u32 le : 9;
+               u32 n_fts : 8;
+       } cn61xx;
+       struct cvmx_pciercx_cfg515_cn61xx cn63xx;
+       struct cvmx_pciercx_cfg515_cn61xx cn63xxp1;
+       struct cvmx_pciercx_cfg515_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg515_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg515_cn61xx cn68xxp1;
+       struct cvmx_pciercx_cfg515_cn61xx cn70xx;
+       struct cvmx_pciercx_cfg515_cn61xx cn70xxp1;
+       struct cvmx_pciercx_cfg515_cn61xx cn73xx;
+       struct cvmx_pciercx_cfg515_cn78xx {
+               u32 reserved_21_31 : 11;
+               u32 s_d_e : 1;
+               u32 ctcrb : 1;
+               u32 cpyts : 1;
+               u32 dsc : 1;
+               u32 alaneflip : 1;
+               u32 pdetlane : 3;
+               u32 nlanes : 5;
+               u32 n_fts : 8;
+       } cn78xx;
+       struct cvmx_pciercx_cfg515_cn61xx cn78xxp1;
+       struct cvmx_pciercx_cfg515_cn61xx cnf71xx;
+       struct cvmx_pciercx_cfg515_cn78xx cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg515 cvmx_pciercx_cfg515_t;
+
+/**
+ * cvmx_pcierc#_cfg516
+ *
+ * This register contains the five hundred seventeenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg516 {
+       u32 u32;
+       struct cvmx_pciercx_cfg516_s {
+               u32 phy_stat : 32;
+       } s;
+       struct cvmx_pciercx_cfg516_s cn52xx;
+       struct cvmx_pciercx_cfg516_s cn52xxp1;
+       struct cvmx_pciercx_cfg516_s cn56xx;
+       struct cvmx_pciercx_cfg516_s cn56xxp1;
+       struct cvmx_pciercx_cfg516_s cn61xx;
+       struct cvmx_pciercx_cfg516_s cn63xx;
+       struct cvmx_pciercx_cfg516_s cn63xxp1;
+       struct cvmx_pciercx_cfg516_s cn66xx;
+       struct cvmx_pciercx_cfg516_s cn68xx;
+       struct cvmx_pciercx_cfg516_s cn68xxp1;
+       struct cvmx_pciercx_cfg516_s cn70xx;
+       struct cvmx_pciercx_cfg516_s cn70xxp1;
+       struct cvmx_pciercx_cfg516_s cn73xx;
+       struct cvmx_pciercx_cfg516_s cn78xx;
+       struct cvmx_pciercx_cfg516_s cn78xxp1;
+       struct cvmx_pciercx_cfg516_s cnf71xx;
+       struct cvmx_pciercx_cfg516_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg516 cvmx_pciercx_cfg516_t;
+
+/**
+ * cvmx_pcierc#_cfg517
+ *
+ * This register contains the five hundred eighteenth 32-bits of PCIe type 1 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg517 {
+       u32 u32;
+       struct cvmx_pciercx_cfg517_s {
+               u32 phy_ctrl : 32;
+       } s;
+       struct cvmx_pciercx_cfg517_s cn52xx;
+       struct cvmx_pciercx_cfg517_s cn52xxp1;
+       struct cvmx_pciercx_cfg517_s cn56xx;
+       struct cvmx_pciercx_cfg517_s cn56xxp1;
+       struct cvmx_pciercx_cfg517_s cn61xx;
+       struct cvmx_pciercx_cfg517_s cn63xx;
+       struct cvmx_pciercx_cfg517_s cn63xxp1;
+       struct cvmx_pciercx_cfg517_s cn66xx;
+       struct cvmx_pciercx_cfg517_s cn68xx;
+       struct cvmx_pciercx_cfg517_s cn68xxp1;
+       struct cvmx_pciercx_cfg517_s cn70xx;
+       struct cvmx_pciercx_cfg517_s cn70xxp1;
+       struct cvmx_pciercx_cfg517_s cn73xx;
+       struct cvmx_pciercx_cfg517_s cn78xx;
+       struct cvmx_pciercx_cfg517_s cn78xxp1;
+       struct cvmx_pciercx_cfg517_s cnf71xx;
+       struct cvmx_pciercx_cfg517_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg517 cvmx_pciercx_cfg517_t;
+
+/**
+ * cvmx_pcierc#_cfg548
+ *
+ * This register contains the five hundred forty-ninth 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg548 {
+       u32 u32;
+       struct cvmx_pciercx_cfg548_s {
+               u32 reserved_26_31 : 6;
+               u32 rss : 2;
+               u32 eiedd : 1;
+               u32 reserved_19_22 : 4;
+               u32 dcbd : 1;
+               u32 dtdd : 1;
+               u32 ed : 1;
+               u32 reserved_13_15 : 3;
+               u32 rxeq_ph01_en : 1;
+               u32 erd : 1;
+               u32 ecrd : 1;
+               u32 ep2p3d : 1;
+               u32 dsg3 : 1;
+               u32 reserved_1_7 : 7;
+               u32 grizdnc : 1;
+       } s;
+       struct cvmx_pciercx_cfg548_s cn73xx;
+       struct cvmx_pciercx_cfg548_s cn78xx;
+       struct cvmx_pciercx_cfg548_s cn78xxp1;
+       struct cvmx_pciercx_cfg548_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg548 cvmx_pciercx_cfg548_t;
+
+/**
+ * cvmx_pcierc#_cfg554
+ *
+ * This register contains the five hundred fifty-fifth 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg554 {
+       u32 u32;
+       struct cvmx_pciercx_cfg554_s {
+               u32 reserved_27_31 : 5;
+               u32 scefpm : 1;
+               u32 reserved_25_25 : 1;
+               u32 iif : 1;
+               u32 prv : 16;
+               u32 reserved_6_7 : 2;
+               u32 p23td : 1;
+               u32 bt : 1;
+               u32 fm : 4;
+       } s;
+       struct cvmx_pciercx_cfg554_cn73xx {
+               u32 reserved_25_31 : 7;
+               u32 iif : 1;
+               u32 prv : 16;
+               u32 reserved_6_7 : 2;
+               u32 p23td : 1;
+               u32 bt : 1;
+               u32 fm : 4;
+       } cn73xx;
+       struct cvmx_pciercx_cfg554_s cn78xx;
+       struct cvmx_pciercx_cfg554_s cn78xxp1;
+       struct cvmx_pciercx_cfg554_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg554 cvmx_pciercx_cfg554_t;
+
+/**
+ * cvmx_pcierc#_cfg558
+ *
+ * This register contains the five hundred fifty-ninth 32-bits of type 0 PCIe configuration space.
+ *
+ */
+union cvmx_pciercx_cfg558 {
+       u32 u32;
+       struct cvmx_pciercx_cfg558_s {
+               u32 ple : 1;
+               u32 rxstatus : 31;
+       } s;
+       struct cvmx_pciercx_cfg558_s cn73xx;
+       struct cvmx_pciercx_cfg558_s cn78xx;
+       struct cvmx_pciercx_cfg558_s cn78xxp1;
+       struct cvmx_pciercx_cfg558_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg558 cvmx_pciercx_cfg558_t;
+
+/**
+ * cvmx_pcierc#_cfg559
+ *
+ * This register contains the five hundred sixtieth 32-bits of PCIe type 0 configuration space.
+ *
+ */
+union cvmx_pciercx_cfg559 {
+       u32 u32;
+       struct cvmx_pciercx_cfg559_s {
+               u32 reserved_1_31 : 31;
+               u32 dbi_ro_wr_en : 1;
+       } s;
+       struct cvmx_pciercx_cfg559_s cn73xx;
+       struct cvmx_pciercx_cfg559_s cn78xx;
+       struct cvmx_pciercx_cfg559_s cn78xxp1;
+       struct cvmx_pciercx_cfg559_s cnf75xx;
+};
+
+typedef union cvmx_pciercx_cfg559 cvmx_pciercx_cfg559_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pcsx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pcsx-defs.h
new file mode 100644 (file)
index 0000000..e534b67
--- /dev/null
@@ -0,0 +1,1005 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pcsx.
+ */
+
+#ifndef __CVMX_PCSX_DEFS_H__
+#define __CVMX_PCSX_DEFS_H__
+
+static inline u64 CVMX_PCSX_ANX_ADV_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001010ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001010ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001010ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001010ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_ANX_EXT_ST_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001028ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001028ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001028ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001028ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_ANX_LP_ABIL_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001018ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001018ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001018ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001018ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_ANX_RESULTS_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001020ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001020ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001020ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001020ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_INTX_EN_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001088ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001088ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001088ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001088ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_INTX_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001080ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001080ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001080ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001080ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_LINKX_TIMER_COUNT_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001040ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001040ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001040ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001040ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_LOG_ANLX_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001090ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001090ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001090ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001090ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+#define CVMX_PCSX_MAC_CRDT_CNTX_REG(offset, block_id)                                              \
+       (0x00011800B00010B0ull + (((offset) & 3) + ((block_id) & 1) * 0x20000ull) * 1024)
+static inline u64 CVMX_PCSX_MISCX_CTL_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001078ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001078ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001078ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001078ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_MRX_CONTROL_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001000ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001000ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001000ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001000ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_MRX_STATUS_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001008ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001008ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001008ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001008ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_RXX_STATES_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001058ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001058ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001058ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001058ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_RXX_SYNC_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001050ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001050ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001050ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001050ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+#define CVMX_PCSX_SERDES_CRDT_CNTX_REG(offset, block_id)                                           \
+       (0x00011800B00010A0ull + (((offset) & 3) + ((block_id) & 1) * 0x20000ull) * 1024)
+static inline u64 CVMX_PCSX_SGMX_AN_ADV_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001068ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001068ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001068ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001068ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_SGMX_LP_ADV_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001070ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001070ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001070ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001070ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_TXX_STATES_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001060ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001060ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001060ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001060ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+static inline u64 CVMX_PCSX_TX_RXX_POLARITY_REG(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001048ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001048ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800B0001048ull + ((offset) + (block_id) * 0x4000ull) * 1024;
+       }
+       return 0x00011800B0001048ull + ((offset) + (block_id) * 0x20000ull) * 1024;
+}
+
+/**
+ * cvmx_pcs#_an#_adv_reg
+ *
+ * Bits [15:9] in the Status Register indicate ability to operate as per those signalling specification,
+ * when misc ctl reg MAC_PHY bit is set to MAC mode. Bits [15:9] will all, always read 1'b0, indicating
+ * that the chip cannot operate in the corresponding modes.
+ *
+ * Bit [4] RM_FLT is a don't care when the selected mode is SGMII.
+ *
+ *
+ *
+ * PCS_AN_ADV_REG = AN Advertisement Register4
+ */
+union cvmx_pcsx_anx_adv_reg {
+       u64 u64;
+       struct cvmx_pcsx_anx_adv_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 np : 1;
+               u64 reserved_14_14 : 1;
+               u64 rem_flt : 2;
+               u64 reserved_9_11 : 3;
+               u64 pause : 2;
+               u64 hfd : 1;
+               u64 fd : 1;
+               u64 reserved_0_4 : 5;
+       } s;
+       struct cvmx_pcsx_anx_adv_reg_s cn52xx;
+       struct cvmx_pcsx_anx_adv_reg_s cn52xxp1;
+       struct cvmx_pcsx_anx_adv_reg_s cn56xx;
+       struct cvmx_pcsx_anx_adv_reg_s cn56xxp1;
+       struct cvmx_pcsx_anx_adv_reg_s cn61xx;
+       struct cvmx_pcsx_anx_adv_reg_s cn63xx;
+       struct cvmx_pcsx_anx_adv_reg_s cn63xxp1;
+       struct cvmx_pcsx_anx_adv_reg_s cn66xx;
+       struct cvmx_pcsx_anx_adv_reg_s cn68xx;
+       struct cvmx_pcsx_anx_adv_reg_s cn68xxp1;
+       struct cvmx_pcsx_anx_adv_reg_s cn70xx;
+       struct cvmx_pcsx_anx_adv_reg_s cn70xxp1;
+       struct cvmx_pcsx_anx_adv_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_anx_adv_reg cvmx_pcsx_anx_adv_reg_t;
+
+/**
+ * cvmx_pcs#_an#_ext_st_reg
+ *
+ * as per IEEE802.3 Clause 22
+ *
+ */
+union cvmx_pcsx_anx_ext_st_reg {
+       u64 u64;
+       struct cvmx_pcsx_anx_ext_st_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 thou_xfd : 1;
+               u64 thou_xhd : 1;
+               u64 thou_tfd : 1;
+               u64 thou_thd : 1;
+               u64 reserved_0_11 : 12;
+       } s;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn52xx;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn52xxp1;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn56xx;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn56xxp1;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn61xx;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn63xx;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn63xxp1;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn66xx;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn68xx;
+       struct cvmx_pcsx_anx_ext_st_reg_s cn68xxp1;
+       struct cvmx_pcsx_anx_ext_st_reg_cn70xx {
+               u64 reserved_16_63 : 48;
+               u64 thou_xfd : 1;
+               u64 thou_xhd : 1;
+               u64 thou_tfd : 1;
+               u64 thou_thd : 1;
+               u64 reserved_11_0 : 12;
+       } cn70xx;
+       struct cvmx_pcsx_anx_ext_st_reg_cn70xx cn70xxp1;
+       struct cvmx_pcsx_anx_ext_st_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_anx_ext_st_reg cvmx_pcsx_anx_ext_st_reg_t;
+
+/**
+ * cvmx_pcs#_an#_lp_abil_reg
+ *
+ * as per IEEE802.3 Clause 37
+ *
+ */
+union cvmx_pcsx_anx_lp_abil_reg {
+       u64 u64;
+       struct cvmx_pcsx_anx_lp_abil_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 np : 1;
+               u64 ack : 1;
+               u64 rem_flt : 2;
+               u64 reserved_9_11 : 3;
+               u64 pause : 2;
+               u64 hfd : 1;
+               u64 fd : 1;
+               u64 reserved_0_4 : 5;
+       } s;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn52xx;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn52xxp1;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn56xx;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn56xxp1;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn61xx;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn63xx;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn63xxp1;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn66xx;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn68xx;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn68xxp1;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn70xx;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cn70xxp1;
+       struct cvmx_pcsx_anx_lp_abil_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_anx_lp_abil_reg cvmx_pcsx_anx_lp_abil_reg_t;
+
+/**
+ * cvmx_pcs#_an#_results_reg
+ *
+ * NOTE:
+ * an_results_reg is don't care when AN_OVRD is set to 1. If AN_OVRD=0 and AN_CPT=1
+ * the an_results_reg is valid.
+ */
+union cvmx_pcsx_anx_results_reg {
+       u64 u64;
+       struct cvmx_pcsx_anx_results_reg_s {
+               u64 reserved_7_63 : 57;
+               u64 pause : 2;
+               u64 spd : 2;
+               u64 an_cpt : 1;
+               u64 dup : 1;
+               u64 link_ok : 1;
+       } s;
+       struct cvmx_pcsx_anx_results_reg_s cn52xx;
+       struct cvmx_pcsx_anx_results_reg_s cn52xxp1;
+       struct cvmx_pcsx_anx_results_reg_s cn56xx;
+       struct cvmx_pcsx_anx_results_reg_s cn56xxp1;
+       struct cvmx_pcsx_anx_results_reg_s cn61xx;
+       struct cvmx_pcsx_anx_results_reg_s cn63xx;
+       struct cvmx_pcsx_anx_results_reg_s cn63xxp1;
+       struct cvmx_pcsx_anx_results_reg_s cn66xx;
+       struct cvmx_pcsx_anx_results_reg_s cn68xx;
+       struct cvmx_pcsx_anx_results_reg_s cn68xxp1;
+       struct cvmx_pcsx_anx_results_reg_s cn70xx;
+       struct cvmx_pcsx_anx_results_reg_s cn70xxp1;
+       struct cvmx_pcsx_anx_results_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_anx_results_reg cvmx_pcsx_anx_results_reg_t;
+
+/**
+ * cvmx_pcs#_int#_en_reg
+ *
+ * PCS Interrupt Enable Register
+ *
+ */
+union cvmx_pcsx_intx_en_reg {
+       u64 u64;
+       struct cvmx_pcsx_intx_en_reg_s {
+               u64 reserved_13_63 : 51;
+               u64 dbg_sync_en : 1;
+               u64 dup : 1;
+               u64 sync_bad_en : 1;
+               u64 an_bad_en : 1;
+               u64 rxlock_en : 1;
+               u64 rxbad_en : 1;
+               u64 rxerr_en : 1;
+               u64 txbad_en : 1;
+               u64 txfifo_en : 1;
+               u64 txfifu_en : 1;
+               u64 an_err_en : 1;
+               u64 xmit_en : 1;
+               u64 lnkspd_en : 1;
+       } s;
+       struct cvmx_pcsx_intx_en_reg_cn52xx {
+               u64 reserved_12_63 : 52;
+               u64 dup : 1;
+               u64 sync_bad_en : 1;
+               u64 an_bad_en : 1;
+               u64 rxlock_en : 1;
+               u64 rxbad_en : 1;
+               u64 rxerr_en : 1;
+               u64 txbad_en : 1;
+               u64 txfifo_en : 1;
+               u64 txfifu_en : 1;
+               u64 an_err_en : 1;
+               u64 xmit_en : 1;
+               u64 lnkspd_en : 1;
+       } cn52xx;
+       struct cvmx_pcsx_intx_en_reg_cn52xx cn52xxp1;
+       struct cvmx_pcsx_intx_en_reg_cn52xx cn56xx;
+       struct cvmx_pcsx_intx_en_reg_cn52xx cn56xxp1;
+       struct cvmx_pcsx_intx_en_reg_s cn61xx;
+       struct cvmx_pcsx_intx_en_reg_s cn63xx;
+       struct cvmx_pcsx_intx_en_reg_s cn63xxp1;
+       struct cvmx_pcsx_intx_en_reg_s cn66xx;
+       struct cvmx_pcsx_intx_en_reg_s cn68xx;
+       struct cvmx_pcsx_intx_en_reg_s cn68xxp1;
+       struct cvmx_pcsx_intx_en_reg_s cn70xx;
+       struct cvmx_pcsx_intx_en_reg_s cn70xxp1;
+       struct cvmx_pcsx_intx_en_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_intx_en_reg cvmx_pcsx_intx_en_reg_t;
+
+/**
+ * cvmx_pcs#_int#_reg
+ *
+ * PCS Interrupt Register
+ * NOTE: RXERR and TXERR conditions to be discussed with Dan before finalising
+ * DBG_SYNC interrupt fires when code group synchronization state machine makes a transition from
+ * SYNC_ACQUIRED_1 state to SYNC_ACQUIRED_2 state(See IEEE 802.3-2005 figure 37-9). It is an
+ * indication that a bad code group
+ * was received after code group synchronizaton was achieved. This interrupt should be disabled
+ * during normal link operation.
+ * Use it as a debug help feature only.
+ */
+union cvmx_pcsx_intx_reg {
+       u64 u64;
+       struct cvmx_pcsx_intx_reg_s {
+               u64 reserved_13_63 : 51;
+               u64 dbg_sync : 1;
+               u64 dup : 1;
+               u64 sync_bad : 1;
+               u64 an_bad : 1;
+               u64 rxlock : 1;
+               u64 rxbad : 1;
+               u64 rxerr : 1;
+               u64 txbad : 1;
+               u64 txfifo : 1;
+               u64 txfifu : 1;
+               u64 an_err : 1;
+               u64 xmit : 1;
+               u64 lnkspd : 1;
+       } s;
+       struct cvmx_pcsx_intx_reg_cn52xx {
+               u64 reserved_12_63 : 52;
+               u64 dup : 1;
+               u64 sync_bad : 1;
+               u64 an_bad : 1;
+               u64 rxlock : 1;
+               u64 rxbad : 1;
+               u64 rxerr : 1;
+               u64 txbad : 1;
+               u64 txfifo : 1;
+               u64 txfifu : 1;
+               u64 an_err : 1;
+               u64 xmit : 1;
+               u64 lnkspd : 1;
+       } cn52xx;
+       struct cvmx_pcsx_intx_reg_cn52xx cn52xxp1;
+       struct cvmx_pcsx_intx_reg_cn52xx cn56xx;
+       struct cvmx_pcsx_intx_reg_cn52xx cn56xxp1;
+       struct cvmx_pcsx_intx_reg_s cn61xx;
+       struct cvmx_pcsx_intx_reg_s cn63xx;
+       struct cvmx_pcsx_intx_reg_s cn63xxp1;
+       struct cvmx_pcsx_intx_reg_s cn66xx;
+       struct cvmx_pcsx_intx_reg_s cn68xx;
+       struct cvmx_pcsx_intx_reg_s cn68xxp1;
+       struct cvmx_pcsx_intx_reg_s cn70xx;
+       struct cvmx_pcsx_intx_reg_s cn70xxp1;
+       struct cvmx_pcsx_intx_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_intx_reg cvmx_pcsx_intx_reg_t;
+
+/**
+ * cvmx_pcs#_link#_timer_count_reg
+ *
+ * PCS_LINK_TIMER_COUNT_REG = 1.6ms nominal link timer register
+ *
+ */
+union cvmx_pcsx_linkx_timer_count_reg {
+       u64 u64;
+       struct cvmx_pcsx_linkx_timer_count_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 count : 16;
+       } s;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn52xx;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn52xxp1;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn56xx;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn56xxp1;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn61xx;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn63xx;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn63xxp1;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn66xx;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn68xx;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn68xxp1;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn70xx;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cn70xxp1;
+       struct cvmx_pcsx_linkx_timer_count_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_linkx_timer_count_reg cvmx_pcsx_linkx_timer_count_reg_t;
+
+/**
+ * cvmx_pcs#_log_anl#_reg
+ *
+ * PCS Logic Analyzer Register
+ * NOTE: Logic Analyzer is enabled with LA_EN for the specified PCS lane only. PKT_SZ is
+ * effective only when LA_EN=1
+ * For normal operation(sgmii or 1000Base-X), this bit must be 0.
+ * See pcsx.csr for xaui logic analyzer mode.
+ * For full description see document at .../rtl/pcs/readme_logic_analyzer.txt
+ */
+union cvmx_pcsx_log_anlx_reg {
+       u64 u64;
+       struct cvmx_pcsx_log_anlx_reg_s {
+               u64 reserved_4_63 : 60;
+               u64 lafifovfl : 1;
+               u64 la_en : 1;
+               u64 pkt_sz : 2;
+       } s;
+       struct cvmx_pcsx_log_anlx_reg_s cn52xx;
+       struct cvmx_pcsx_log_anlx_reg_s cn52xxp1;
+       struct cvmx_pcsx_log_anlx_reg_s cn56xx;
+       struct cvmx_pcsx_log_anlx_reg_s cn56xxp1;
+       struct cvmx_pcsx_log_anlx_reg_s cn61xx;
+       struct cvmx_pcsx_log_anlx_reg_s cn63xx;
+       struct cvmx_pcsx_log_anlx_reg_s cn63xxp1;
+       struct cvmx_pcsx_log_anlx_reg_s cn66xx;
+       struct cvmx_pcsx_log_anlx_reg_s cn68xx;
+       struct cvmx_pcsx_log_anlx_reg_s cn68xxp1;
+       struct cvmx_pcsx_log_anlx_reg_s cn70xx;
+       struct cvmx_pcsx_log_anlx_reg_s cn70xxp1;
+       struct cvmx_pcsx_log_anlx_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_log_anlx_reg cvmx_pcsx_log_anlx_reg_t;
+
+/**
+ * cvmx_pcs#_mac_crdt_cnt#_reg
+ *
+ * PCS MAC Credit Count
+ *
+ */
+union cvmx_pcsx_mac_crdt_cntx_reg {
+       u64 u64;
+       struct cvmx_pcsx_mac_crdt_cntx_reg_s {
+               u64 reserved_5_63 : 59;
+               u64 cnt : 5;
+       } s;
+       struct cvmx_pcsx_mac_crdt_cntx_reg_s cn70xx;
+       struct cvmx_pcsx_mac_crdt_cntx_reg_s cn70xxp1;
+};
+
+typedef union cvmx_pcsx_mac_crdt_cntx_reg cvmx_pcsx_mac_crdt_cntx_reg_t;
+
+/**
+ * cvmx_pcs#_misc#_ctl_reg
+ *
+ * SGMII Misc Control Register
+ * SGMII bit [12] is really a misnomer, it is a decode  of pi_qlm_cfg pins to indicate SGMII or
+ * 1000Base-X modes.
+ * Note: MODE bit
+ * When MODE=1,  1000Base-X mode is selected. Auto negotiation will follow IEEE 802.3 clause 37.
+ * When MODE=0,  SGMII mode is selected and the following note will apply.
+ * Repeat note from SGM_AN_ADV register
+ * NOTE: The SGMII AN Advertisement Register above will be sent during Auto Negotiation if the
+ * MAC_PHY mode bit in misc_ctl_reg
+ * is set (1=PHY mode). If the bit is not set (0=MAC mode), the tx_config_reg[14] becomes ACK bit
+ * and [0] is always 1.
+ * All other bits in tx_config_reg sent will be 0. The PHY dictates the Auto Negotiation results.
+ */
+union cvmx_pcsx_miscx_ctl_reg {
+       u64 u64;
+       struct cvmx_pcsx_miscx_ctl_reg_s {
+               u64 reserved_13_63 : 51;
+               u64 sgmii : 1;
+               u64 gmxeno : 1;
+               u64 loopbck2 : 1;
+               u64 mac_phy : 1;
+               u64 mode : 1;
+               u64 an_ovrd : 1;
+               u64 samp_pt : 7;
+       } s;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn52xx;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn52xxp1;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn56xx;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn56xxp1;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn61xx;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn63xx;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn63xxp1;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn66xx;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn68xx;
+       struct cvmx_pcsx_miscx_ctl_reg_s cn68xxp1;
+       struct cvmx_pcsx_miscx_ctl_reg_cn70xx {
+               u64 reserved_12_63 : 52;
+               u64 gmxeno : 1;
+               u64 loopbck2 : 1;
+               u64 mac_phy : 1;
+               u64 mode : 1;
+               u64 an_ovrd : 1;
+               u64 samp_pt : 7;
+       } cn70xx;
+       struct cvmx_pcsx_miscx_ctl_reg_cn70xx cn70xxp1;
+       struct cvmx_pcsx_miscx_ctl_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_miscx_ctl_reg cvmx_pcsx_miscx_ctl_reg_t;
+
+/**
+ * cvmx_pcs#_mr#_control_reg
+ *
+ * NOTE:
+ * Whenever AN_EN bit[12] is set, Auto negotiation is allowed to happen. The results
+ * of the auto negotiation process set the fields in the AN_RESULTS reg. When AN_EN is not set,
+ * AN_RESULTS reg is don't care. The effective SPD, DUP etc.. get their values
+ * from the pcs_mr_ctrl reg.
+ */
+union cvmx_pcsx_mrx_control_reg {
+       u64 u64;
+       struct cvmx_pcsx_mrx_control_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 reset : 1;
+               u64 loopbck1 : 1;
+               u64 spdlsb : 1;
+               u64 an_en : 1;
+               u64 pwr_dn : 1;
+               u64 reserved_10_10 : 1;
+               u64 rst_an : 1;
+               u64 dup : 1;
+               u64 coltst : 1;
+               u64 spdmsb : 1;
+               u64 uni : 1;
+               u64 reserved_0_4 : 5;
+       } s;
+       struct cvmx_pcsx_mrx_control_reg_s cn52xx;
+       struct cvmx_pcsx_mrx_control_reg_s cn52xxp1;
+       struct cvmx_pcsx_mrx_control_reg_s cn56xx;
+       struct cvmx_pcsx_mrx_control_reg_s cn56xxp1;
+       struct cvmx_pcsx_mrx_control_reg_s cn61xx;
+       struct cvmx_pcsx_mrx_control_reg_s cn63xx;
+       struct cvmx_pcsx_mrx_control_reg_s cn63xxp1;
+       struct cvmx_pcsx_mrx_control_reg_s cn66xx;
+       struct cvmx_pcsx_mrx_control_reg_s cn68xx;
+       struct cvmx_pcsx_mrx_control_reg_s cn68xxp1;
+       struct cvmx_pcsx_mrx_control_reg_s cn70xx;
+       struct cvmx_pcsx_mrx_control_reg_s cn70xxp1;
+       struct cvmx_pcsx_mrx_control_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_mrx_control_reg cvmx_pcsx_mrx_control_reg_t;
+
+/**
+ * cvmx_pcs#_mr#_status_reg
+ *
+ * Bits [15:9] in the Status Register indicate ability to operate as per those signalling
+ * specification,
+ * when misc ctl reg MAC_PHY bit is set to MAC mode. Bits [15:9] will all, always read 1'b0,
+ * indicating
+ * that the chip cannot operate in the corresponding modes.
+ * Bit [4] RM_FLT is a don't care when the selected mode is SGMII.
+ */
+union cvmx_pcsx_mrx_status_reg {
+       u64 u64;
+       struct cvmx_pcsx_mrx_status_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 hun_t4 : 1;
+               u64 hun_xfd : 1;
+               u64 hun_xhd : 1;
+               u64 ten_fd : 1;
+               u64 ten_hd : 1;
+               u64 hun_t2fd : 1;
+               u64 hun_t2hd : 1;
+               u64 ext_st : 1;
+               u64 reserved_7_7 : 1;
+               u64 prb_sup : 1;
+               u64 an_cpt : 1;
+               u64 rm_flt : 1;
+               u64 an_abil : 1;
+               u64 lnk_st : 1;
+               u64 reserved_1_1 : 1;
+               u64 extnd : 1;
+       } s;
+       struct cvmx_pcsx_mrx_status_reg_s cn52xx;
+       struct cvmx_pcsx_mrx_status_reg_s cn52xxp1;
+       struct cvmx_pcsx_mrx_status_reg_s cn56xx;
+       struct cvmx_pcsx_mrx_status_reg_s cn56xxp1;
+       struct cvmx_pcsx_mrx_status_reg_s cn61xx;
+       struct cvmx_pcsx_mrx_status_reg_s cn63xx;
+       struct cvmx_pcsx_mrx_status_reg_s cn63xxp1;
+       struct cvmx_pcsx_mrx_status_reg_s cn66xx;
+       struct cvmx_pcsx_mrx_status_reg_s cn68xx;
+       struct cvmx_pcsx_mrx_status_reg_s cn68xxp1;
+       struct cvmx_pcsx_mrx_status_reg_s cn70xx;
+       struct cvmx_pcsx_mrx_status_reg_s cn70xxp1;
+       struct cvmx_pcsx_mrx_status_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_mrx_status_reg cvmx_pcsx_mrx_status_reg_t;
+
+/**
+ * cvmx_pcs#_rx#_states_reg
+ *
+ * PCS_RX_STATES_REG = RX State Machines states register
+ *
+ */
+union cvmx_pcsx_rxx_states_reg {
+       u64 u64;
+       struct cvmx_pcsx_rxx_states_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 rx_bad : 1;
+               u64 rx_st : 5;
+               u64 sync_bad : 1;
+               u64 sync : 4;
+               u64 an_bad : 1;
+               u64 an_st : 4;
+       } s;
+       struct cvmx_pcsx_rxx_states_reg_s cn52xx;
+       struct cvmx_pcsx_rxx_states_reg_s cn52xxp1;
+       struct cvmx_pcsx_rxx_states_reg_s cn56xx;
+       struct cvmx_pcsx_rxx_states_reg_s cn56xxp1;
+       struct cvmx_pcsx_rxx_states_reg_s cn61xx;
+       struct cvmx_pcsx_rxx_states_reg_s cn63xx;
+       struct cvmx_pcsx_rxx_states_reg_s cn63xxp1;
+       struct cvmx_pcsx_rxx_states_reg_s cn66xx;
+       struct cvmx_pcsx_rxx_states_reg_s cn68xx;
+       struct cvmx_pcsx_rxx_states_reg_s cn68xxp1;
+       struct cvmx_pcsx_rxx_states_reg_s cn70xx;
+       struct cvmx_pcsx_rxx_states_reg_s cn70xxp1;
+       struct cvmx_pcsx_rxx_states_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_rxx_states_reg cvmx_pcsx_rxx_states_reg_t;
+
+/**
+ * cvmx_pcs#_rx#_sync_reg
+ *
+ * Note:
+ * r_tx_rx_polarity_reg bit [2] will show correct polarity needed on the link receive path after code grp synchronization is achieved.
+ *
+ *
+ *  PCS_RX_SYNC_REG = Code Group synchronization reg
+ */
+union cvmx_pcsx_rxx_sync_reg {
+       u64 u64;
+       struct cvmx_pcsx_rxx_sync_reg_s {
+               u64 reserved_2_63 : 62;
+               u64 sync : 1;
+               u64 bit_lock : 1;
+       } s;
+       struct cvmx_pcsx_rxx_sync_reg_s cn52xx;
+       struct cvmx_pcsx_rxx_sync_reg_s cn52xxp1;
+       struct cvmx_pcsx_rxx_sync_reg_s cn56xx;
+       struct cvmx_pcsx_rxx_sync_reg_s cn56xxp1;
+       struct cvmx_pcsx_rxx_sync_reg_s cn61xx;
+       struct cvmx_pcsx_rxx_sync_reg_s cn63xx;
+       struct cvmx_pcsx_rxx_sync_reg_s cn63xxp1;
+       struct cvmx_pcsx_rxx_sync_reg_s cn66xx;
+       struct cvmx_pcsx_rxx_sync_reg_s cn68xx;
+       struct cvmx_pcsx_rxx_sync_reg_s cn68xxp1;
+       struct cvmx_pcsx_rxx_sync_reg_s cn70xx;
+       struct cvmx_pcsx_rxx_sync_reg_s cn70xxp1;
+       struct cvmx_pcsx_rxx_sync_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_rxx_sync_reg cvmx_pcsx_rxx_sync_reg_t;
+
+/**
+ * cvmx_pcs#_serdes_crdt_cnt#_reg
+ *
+ * PCS SERDES Credit Count
+ *
+ */
+union cvmx_pcsx_serdes_crdt_cntx_reg {
+       u64 u64;
+       struct cvmx_pcsx_serdes_crdt_cntx_reg_s {
+               u64 reserved_5_63 : 59;
+               u64 cnt : 5;
+       } s;
+       struct cvmx_pcsx_serdes_crdt_cntx_reg_s cn70xx;
+       struct cvmx_pcsx_serdes_crdt_cntx_reg_s cn70xxp1;
+};
+
+typedef union cvmx_pcsx_serdes_crdt_cntx_reg cvmx_pcsx_serdes_crdt_cntx_reg_t;
+
+/**
+ * cvmx_pcs#_sgm#_an_adv_reg
+ *
+ * SGMII AN Advertisement Register (sent out as tx_config_reg)
+ * NOTE: The SGMII AN Advertisement Register above will be sent during Auto Negotiation if the
+ * MAC_PHY mode bit in misc_ctl_reg
+ * is set (1=PHY mode). If the bit is not set (0=MAC mode), the tx_config_reg[14] becomes ACK bit
+ * and [0] is always 1.
+ * All other bits in tx_config_reg sent will be 0. The PHY dictates the Auto Negotiation results.
+ */
+union cvmx_pcsx_sgmx_an_adv_reg {
+       u64 u64;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 link : 1;
+               u64 ack : 1;
+               u64 reserved_13_13 : 1;
+               u64 dup : 1;
+               u64 speed : 2;
+               u64 reserved_1_9 : 9;
+               u64 one : 1;
+       } s;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn52xx;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn52xxp1;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn56xx;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn56xxp1;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn61xx;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn63xx;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn63xxp1;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn66xx;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn68xx;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn68xxp1;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn70xx;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cn70xxp1;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_sgmx_an_adv_reg cvmx_pcsx_sgmx_an_adv_reg_t;
+
+/**
+ * cvmx_pcs#_sgm#_lp_adv_reg
+ *
+ * SGMII LP Advertisement Register (received as rx_config_reg)
+ *
+ */
+union cvmx_pcsx_sgmx_lp_adv_reg {
+       u64 u64;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s {
+               u64 reserved_16_63 : 48;
+               u64 link : 1;
+               u64 reserved_13_14 : 2;
+               u64 dup : 1;
+               u64 speed : 2;
+               u64 reserved_1_9 : 9;
+               u64 one : 1;
+       } s;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn52xx;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn52xxp1;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn56xx;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn56xxp1;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn61xx;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn63xx;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn63xxp1;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn66xx;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn68xx;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn68xxp1;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn70xx;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cn70xxp1;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_sgmx_lp_adv_reg cvmx_pcsx_sgmx_lp_adv_reg_t;
+
+/**
+ * cvmx_pcs#_tx#_states_reg
+ *
+ * PCS_TX_STATES_REG = TX State Machines states register
+ *
+ */
+union cvmx_pcsx_txx_states_reg {
+       u64 u64;
+       struct cvmx_pcsx_txx_states_reg_s {
+               u64 reserved_7_63 : 57;
+               u64 xmit : 2;
+               u64 tx_bad : 1;
+               u64 ord_st : 4;
+       } s;
+       struct cvmx_pcsx_txx_states_reg_s cn52xx;
+       struct cvmx_pcsx_txx_states_reg_s cn52xxp1;
+       struct cvmx_pcsx_txx_states_reg_s cn56xx;
+       struct cvmx_pcsx_txx_states_reg_s cn56xxp1;
+       struct cvmx_pcsx_txx_states_reg_s cn61xx;
+       struct cvmx_pcsx_txx_states_reg_s cn63xx;
+       struct cvmx_pcsx_txx_states_reg_s cn63xxp1;
+       struct cvmx_pcsx_txx_states_reg_s cn66xx;
+       struct cvmx_pcsx_txx_states_reg_s cn68xx;
+       struct cvmx_pcsx_txx_states_reg_s cn68xxp1;
+       struct cvmx_pcsx_txx_states_reg_s cn70xx;
+       struct cvmx_pcsx_txx_states_reg_s cn70xxp1;
+       struct cvmx_pcsx_txx_states_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_txx_states_reg cvmx_pcsx_txx_states_reg_t;
+
+/**
+ * cvmx_pcs#_tx_rx#_polarity_reg
+ *
+ * Note:
+ * r_tx_rx_polarity_reg bit [2] will show correct polarity needed on the link receive path after
+ * code grp synchronization is achieved.
+ */
+union cvmx_pcsx_tx_rxx_polarity_reg {
+       u64 u64;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s {
+               u64 reserved_4_63 : 60;
+               u64 rxovrd : 1;
+               u64 autorxpl : 1;
+               u64 rxplrt : 1;
+               u64 txplrt : 1;
+       } s;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn52xx;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn52xxp1;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn56xx;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn56xxp1;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn61xx;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn63xx;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn63xxp1;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn66xx;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn68xx;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn68xxp1;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn70xx;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cn70xxp1;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s cnf71xx;
+};
+
+typedef union cvmx_pcsx_tx_rxx_polarity_reg cvmx_pcsx_tx_rxx_polarity_reg_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pemx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pemx-defs.h
new file mode 100644 (file)
index 0000000..9ec7a4b
--- /dev/null
@@ -0,0 +1,2028 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pemx.
+ */
+
+#ifndef __CVMX_PEMX_DEFS_H__
+#define __CVMX_PEMX_DEFS_H__
+
+static inline u64 CVMX_PEMX_BAR1_INDEXX(unsigned long offset, unsigned long block_id)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000100ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000100ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C0000100ull + ((offset) + (block_id) * 0x200000ull) * 8;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C0000100ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000100ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000A8ull + ((offset) + (block_id) * 0x200000ull) * 8;
+       }
+       return 0x00011800C0000100ull + ((offset) + (block_id) * 0x200000ull) * 8;
+}
+
+static inline u64 CVMX_PEMX_BAR2_MASK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000B0ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000B0ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C00000B0ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C00000B0ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C10000B0ull + (offset) * 0x1000000ull - 16777216 * 1;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000130ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C00000B0ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_PEMX_BAR_CTL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000A8ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000A8ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C00000A8ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C00000A8ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C10000A8ull + (offset) * 0x1000000ull - 16777216 * 1;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000128ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C00000A8ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_PEMX_BIST_STATUS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000018ull + (offset) * 0x1000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000018ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000440ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C0000440ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C0000440ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C1000440ull + (offset) * 0x1000000ull - 16777216 * 1;
+       }
+       return 0x00011800C0000440ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_PEMX_BIST_STATUS2(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000420ull + (offset) * 0x1000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000440ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C0000420ull + (offset) * 0x1000000ull;
+}
+
+#define CVMX_PEMX_CFG(offset)          (0x00011800C0000410ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_CFG_RD(offset)       (0x00011800C0000030ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_CFG_WR(offset)       (0x00011800C0000028ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_CLK_EN(offset)       (0x00011800C0000400ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_CPL_LUT_VALID(offset) (0x00011800C0000098ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_CTL_STATUS(offset)   (0x00011800C0000000ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_CTL_STATUS2(offset)  (0x00011800C0000008ull + ((offset) & 3) * 0x1000000ull)
+static inline u64 CVMX_PEMX_DBG_INFO(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000D0ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000D0ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C00000D0ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C00000D0ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C10000D0ull + (offset) * 0x1000000ull - 16777216 * 1;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000008ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C00000D0ull + (offset) * 0x1000000ull;
+}
+
+#define CVMX_PEMX_DBG_INFO_EN(offset) (0x00011800C00000A0ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_DIAG_STATUS(offset) (0x00011800C0000020ull + ((offset) & 3) * 0x1000000ull)
+static inline u64 CVMX_PEMX_ECC_ENA(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000448ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C0000448ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C0000448ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C1000448ull + (offset) * 0x1000000ull - 16777216 * 1;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000C0ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C0000448ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_PEMX_ECC_SYND_CTRL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000450ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C0000450ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C0000450ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C1000450ull + (offset) * 0x1000000ull - 16777216 * 1;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000C8ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C0000450ull + (offset) * 0x1000000ull;
+}
+
+#define CVMX_PEMX_ECO(offset)               (0x00011800C0000010ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_FLR_GLBLCNT_CTL(offset)    (0x00011800C0000210ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_FLR_PF0_VF_STOPREQ(offset) (0x00011800C0000220ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_FLR_PF_STOPREQ(offset)     (0x00011800C0000218ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_FLR_STOPREQ_CTL(offset)    (0x00011800C0000238ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_FLR_ZOMBIE_CTL(offset)     (0x00011800C0000230ull + ((offset) & 3) * 0x1000000ull)
+static inline u64 CVMX_PEMX_INB_READ_CREDITS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000B8ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C00000B8ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C00000B8ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C00000B8ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C10000B8ull + (offset) * 0x1000000ull - 16777216 * 1;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000138ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C00000B8ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_PEMX_INT_ENB(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000410ull + (offset) * 0x1000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000430ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C0000410ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_PEMX_INT_ENB_INT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000418ull + (offset) * 0x1000000ull;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000438ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C0000418ull + (offset) * 0x1000000ull;
+}
+
+static inline u64 CVMX_PEMX_INT_SUM(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000428ull + (offset) * 0x1000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000428ull + (offset) * 0x1000000ull;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011800C0000428ull + (offset) * 0x1000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011800C0000428ull + (offset) * 0x1000000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C1000428ull + (offset) * 0x1000000ull - 16777216 * 1;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011800C0000408ull + (offset) * 0x1000000ull;
+       }
+       return 0x00011800C0000428ull + (offset) * 0x1000000ull;
+}
+
+#define CVMX_PEMX_ON(offset)            (0x00011800C0000420ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_P2N_BAR0_START(offset) (0x00011800C0000080ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_P2N_BAR1_START(offset) (0x00011800C0000088ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_P2N_BAR2_START(offset) (0x00011800C0000090ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_P2P_BARX_END(offset, block_id)                                                   \
+       (0x00011800C0000048ull + (((offset) & 3) + ((block_id) & 3) * 0x100000ull) * 16)
+#define CVMX_PEMX_P2P_BARX_START(offset, block_id)                                                 \
+       (0x00011800C0000040ull + (((offset) & 3) + ((block_id) & 3) * 0x100000ull) * 16)
+#define CVMX_PEMX_QLM(offset)        (0x00011800C0000418ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_SPI_CTL(offset)     (0x00011800C0000180ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_SPI_DATA(offset)    (0x00011800C0000188ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_STRAP(offset)              (0x00011800C0000408ull + ((offset) & 3) * 0x1000000ull)
+#define CVMX_PEMX_TLP_CREDITS(offset) (0x00011800C0000038ull + ((offset) & 3) * 0x1000000ull)
+
+/**
+ * cvmx_pem#_bar1_index#
+ *
+ * This register contains the address index and control bits for access to memory ranges of BAR1.
+ * The index is built from supplied address [25:22].
+ */
+union cvmx_pemx_bar1_indexx {
+       u64 u64;
+       struct cvmx_pemx_bar1_indexx_s {
+               u64 reserved_24_63 : 40;
+               u64 addr_idx : 20;
+               u64 ca : 1;
+               u64 end_swp : 2;
+               u64 addr_v : 1;
+       } s;
+       struct cvmx_pemx_bar1_indexx_cn61xx {
+               u64 reserved_20_63 : 44;
+               u64 addr_idx : 16;
+               u64 ca : 1;
+               u64 end_swp : 2;
+               u64 addr_v : 1;
+       } cn61xx;
+       struct cvmx_pemx_bar1_indexx_cn61xx cn63xx;
+       struct cvmx_pemx_bar1_indexx_cn61xx cn63xxp1;
+       struct cvmx_pemx_bar1_indexx_cn61xx cn66xx;
+       struct cvmx_pemx_bar1_indexx_cn61xx cn68xx;
+       struct cvmx_pemx_bar1_indexx_cn61xx cn68xxp1;
+       struct cvmx_pemx_bar1_indexx_s cn70xx;
+       struct cvmx_pemx_bar1_indexx_s cn70xxp1;
+       struct cvmx_pemx_bar1_indexx_s cn73xx;
+       struct cvmx_pemx_bar1_indexx_s cn78xx;
+       struct cvmx_pemx_bar1_indexx_s cn78xxp1;
+       struct cvmx_pemx_bar1_indexx_cn61xx cnf71xx;
+       struct cvmx_pemx_bar1_indexx_s cnf75xx;
+};
+
+typedef union cvmx_pemx_bar1_indexx cvmx_pemx_bar1_indexx_t;
+
+/**
+ * cvmx_pem#_bar2_mask
+ *
+ * This register contains the mask pattern that is ANDed with the address from the PCIe core for
+ * BAR2 hits. This allows the effective size of RC BAR2 to be shrunk. Must not be changed
+ * from its reset value in EP mode.
+ */
+union cvmx_pemx_bar2_mask {
+       u64 u64;
+       struct cvmx_pemx_bar2_mask_s {
+               u64 reserved_45_63 : 19;
+               u64 mask : 42;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_pemx_bar2_mask_cn61xx {
+               u64 reserved_38_63 : 26;
+               u64 mask : 35;
+               u64 reserved_0_2 : 3;
+       } cn61xx;
+       struct cvmx_pemx_bar2_mask_cn61xx cn66xx;
+       struct cvmx_pemx_bar2_mask_cn61xx cn68xx;
+       struct cvmx_pemx_bar2_mask_cn61xx cn68xxp1;
+       struct cvmx_pemx_bar2_mask_cn61xx cn70xx;
+       struct cvmx_pemx_bar2_mask_cn61xx cn70xxp1;
+       struct cvmx_pemx_bar2_mask_cn73xx {
+               u64 reserved_42_63 : 22;
+               u64 mask : 39;
+               u64 reserved_0_2 : 3;
+       } cn73xx;
+       struct cvmx_pemx_bar2_mask_s cn78xx;
+       struct cvmx_pemx_bar2_mask_cn73xx cn78xxp1;
+       struct cvmx_pemx_bar2_mask_cn61xx cnf71xx;
+       struct cvmx_pemx_bar2_mask_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_bar2_mask cvmx_pemx_bar2_mask_t;
+
+/**
+ * cvmx_pem#_bar_ctl
+ *
+ * This register contains control for BAR accesses.
+ *
+ */
+union cvmx_pemx_bar_ctl {
+       u64 u64;
+       struct cvmx_pemx_bar_ctl_s {
+               u64 reserved_7_63 : 57;
+               u64 bar1_siz : 3;
+               u64 bar2_enb : 1;
+               u64 bar2_esx : 2;
+               u64 bar2_cax : 1;
+       } s;
+       struct cvmx_pemx_bar_ctl_s cn61xx;
+       struct cvmx_pemx_bar_ctl_s cn63xx;
+       struct cvmx_pemx_bar_ctl_s cn63xxp1;
+       struct cvmx_pemx_bar_ctl_s cn66xx;
+       struct cvmx_pemx_bar_ctl_s cn68xx;
+       struct cvmx_pemx_bar_ctl_s cn68xxp1;
+       struct cvmx_pemx_bar_ctl_s cn70xx;
+       struct cvmx_pemx_bar_ctl_s cn70xxp1;
+       struct cvmx_pemx_bar_ctl_s cn73xx;
+       struct cvmx_pemx_bar_ctl_s cn78xx;
+       struct cvmx_pemx_bar_ctl_s cn78xxp1;
+       struct cvmx_pemx_bar_ctl_s cnf71xx;
+       struct cvmx_pemx_bar_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pemx_bar_ctl cvmx_pemx_bar_ctl_t;
+
+/**
+ * cvmx_pem#_bist_status
+ *
+ * This register contains results from BIST runs of PEM's memories.
+ *
+ */
+union cvmx_pemx_bist_status {
+       u64 u64;
+       struct cvmx_pemx_bist_status_s {
+               u64 reserved_16_63 : 48;
+               u64 retryc : 1;
+               u64 reserved_14_14 : 1;
+               u64 rqhdrb0 : 1;
+               u64 rqhdrb1 : 1;
+               u64 rqdatab0 : 1;
+               u64 rqdatab1 : 1;
+               u64 tlpn_d0 : 1;
+               u64 tlpn_d1 : 1;
+               u64 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pemx_bist_status_cn61xx {
+               u64 reserved_8_63 : 56;
+               u64 retry : 1;
+               u64 rqdata0 : 1;
+               u64 rqdata1 : 1;
+               u64 rqdata2 : 1;
+               u64 rqdata3 : 1;
+               u64 rqhdr1 : 1;
+               u64 rqhdr0 : 1;
+               u64 sot : 1;
+       } cn61xx;
+       struct cvmx_pemx_bist_status_cn61xx cn63xx;
+       struct cvmx_pemx_bist_status_cn61xx cn63xxp1;
+       struct cvmx_pemx_bist_status_cn61xx cn66xx;
+       struct cvmx_pemx_bist_status_cn61xx cn68xx;
+       struct cvmx_pemx_bist_status_cn61xx cn68xxp1;
+       struct cvmx_pemx_bist_status_cn70xx {
+               u64 reserved_6_63 : 58;
+               u64 retry : 1;
+               u64 sot : 1;
+               u64 rqhdr0 : 1;
+               u64 rqhdr1 : 1;
+               u64 rqdata0 : 1;
+               u64 rqdata1 : 1;
+       } cn70xx;
+       struct cvmx_pemx_bist_status_cn70xx cn70xxp1;
+       struct cvmx_pemx_bist_status_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 retryc : 1;
+               u64 sot : 1;
+               u64 rqhdrb0 : 1;
+               u64 rqhdrb1 : 1;
+               u64 rqdatab0 : 1;
+               u64 rqdatab1 : 1;
+               u64 tlpn_d0 : 1;
+               u64 tlpn_d1 : 1;
+               u64 tlpn_ctl : 1;
+               u64 tlpp_d0 : 1;
+               u64 tlpp_d1 : 1;
+               u64 tlpp_ctl : 1;
+               u64 tlpc_d0 : 1;
+               u64 tlpc_d1 : 1;
+               u64 tlpc_ctl : 1;
+               u64 m2s : 1;
+       } cn73xx;
+       struct cvmx_pemx_bist_status_cn73xx cn78xx;
+       struct cvmx_pemx_bist_status_cn73xx cn78xxp1;
+       struct cvmx_pemx_bist_status_cn61xx cnf71xx;
+       struct cvmx_pemx_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_bist_status cvmx_pemx_bist_status_t;
+
+/**
+ * cvmx_pem#_bist_status2
+ *
+ * "PEM#_BIST_STATUS2 = PEM BIST Status Register
+ * Results from BIST runs of PEM's memories."
+ */
+union cvmx_pemx_bist_status2 {
+       u64 u64;
+       struct cvmx_pemx_bist_status2_s {
+               u64 reserved_13_63 : 51;
+               u64 tlpn_d : 1;
+               u64 tlpn_ctl : 1;
+               u64 tlpp_d : 1;
+               u64 reserved_0_9 : 10;
+       } s;
+       struct cvmx_pemx_bist_status2_cn61xx {
+               u64 reserved_10_63 : 54;
+               u64 e2p_cpl : 1;
+               u64 e2p_n : 1;
+               u64 e2p_p : 1;
+               u64 peai_p2e : 1;
+               u64 pef_tpf1 : 1;
+               u64 pef_tpf0 : 1;
+               u64 pef_tnf : 1;
+               u64 pef_tcf1 : 1;
+               u64 pef_tc0 : 1;
+               u64 ppf : 1;
+       } cn61xx;
+       struct cvmx_pemx_bist_status2_cn61xx cn63xx;
+       struct cvmx_pemx_bist_status2_cn61xx cn63xxp1;
+       struct cvmx_pemx_bist_status2_cn61xx cn66xx;
+       struct cvmx_pemx_bist_status2_cn61xx cn68xx;
+       struct cvmx_pemx_bist_status2_cn61xx cn68xxp1;
+       struct cvmx_pemx_bist_status2_cn70xx {
+               u64 reserved_14_63 : 50;
+               u64 peai_p2e : 1;
+               u64 tlpn_d : 1;
+               u64 tlpn_ctl : 1;
+               u64 tlpp_d : 1;
+               u64 tlpp_ctl : 1;
+               u64 tlpc_d : 1;
+               u64 tlpc_ctl : 1;
+               u64 tlpan_d : 1;
+               u64 tlpan_ctl : 1;
+               u64 tlpap_d : 1;
+               u64 tlpap_ctl : 1;
+               u64 tlpac_d : 1;
+               u64 tlpac_ctl : 1;
+               u64 m2s : 1;
+       } cn70xx;
+       struct cvmx_pemx_bist_status2_cn70xx cn70xxp1;
+       struct cvmx_pemx_bist_status2_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pemx_bist_status2 cvmx_pemx_bist_status2_t;
+
+/**
+ * cvmx_pem#_cfg
+ *
+ * Configuration of the PCIe Application.
+ *
+ */
+union cvmx_pemx_cfg {
+       u64 u64;
+       struct cvmx_pemx_cfg_s {
+               u64 reserved_5_63 : 59;
+               u64 laneswap : 1;
+               u64 reserved_2_3 : 2;
+               u64 md : 2;
+       } s;
+       struct cvmx_pemx_cfg_cn70xx {
+               u64 reserved_5_63 : 59;
+               u64 laneswap : 1;
+               u64 hostmd : 1;
+               u64 md : 3;
+       } cn70xx;
+       struct cvmx_pemx_cfg_cn70xx cn70xxp1;
+       struct cvmx_pemx_cfg_cn73xx {
+               u64 reserved_5_63 : 59;
+               u64 laneswap : 1;
+               u64 lanes8 : 1;
+               u64 hostmd : 1;
+               u64 md : 2;
+       } cn73xx;
+       struct cvmx_pemx_cfg_cn73xx cn78xx;
+       struct cvmx_pemx_cfg_cn73xx cn78xxp1;
+       struct cvmx_pemx_cfg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_cfg cvmx_pemx_cfg_t;
+
+/**
+ * cvmx_pem#_cfg_rd
+ *
+ * This register allows read access to the configuration in the PCIe core.
+ *
+ */
+union cvmx_pemx_cfg_rd {
+       u64 u64;
+       struct cvmx_pemx_cfg_rd_s {
+               u64 data : 32;
+               u64 addr : 32;
+       } s;
+       struct cvmx_pemx_cfg_rd_s cn61xx;
+       struct cvmx_pemx_cfg_rd_s cn63xx;
+       struct cvmx_pemx_cfg_rd_s cn63xxp1;
+       struct cvmx_pemx_cfg_rd_s cn66xx;
+       struct cvmx_pemx_cfg_rd_s cn68xx;
+       struct cvmx_pemx_cfg_rd_s cn68xxp1;
+       struct cvmx_pemx_cfg_rd_s cn70xx;
+       struct cvmx_pemx_cfg_rd_s cn70xxp1;
+       struct cvmx_pemx_cfg_rd_s cn73xx;
+       struct cvmx_pemx_cfg_rd_s cn78xx;
+       struct cvmx_pemx_cfg_rd_s cn78xxp1;
+       struct cvmx_pemx_cfg_rd_s cnf71xx;
+       struct cvmx_pemx_cfg_rd_s cnf75xx;
+};
+
+typedef union cvmx_pemx_cfg_rd cvmx_pemx_cfg_rd_t;
+
+/**
+ * cvmx_pem#_cfg_wr
+ *
+ * This register allows write access to the configuration in the PCIe core.
+ *
+ */
+union cvmx_pemx_cfg_wr {
+       u64 u64;
+       struct cvmx_pemx_cfg_wr_s {
+               u64 data : 32;
+               u64 addr : 32;
+       } s;
+       struct cvmx_pemx_cfg_wr_s cn61xx;
+       struct cvmx_pemx_cfg_wr_s cn63xx;
+       struct cvmx_pemx_cfg_wr_s cn63xxp1;
+       struct cvmx_pemx_cfg_wr_s cn66xx;
+       struct cvmx_pemx_cfg_wr_s cn68xx;
+       struct cvmx_pemx_cfg_wr_s cn68xxp1;
+       struct cvmx_pemx_cfg_wr_s cn70xx;
+       struct cvmx_pemx_cfg_wr_s cn70xxp1;
+       struct cvmx_pemx_cfg_wr_s cn73xx;
+       struct cvmx_pemx_cfg_wr_s cn78xx;
+       struct cvmx_pemx_cfg_wr_s cn78xxp1;
+       struct cvmx_pemx_cfg_wr_s cnf71xx;
+       struct cvmx_pemx_cfg_wr_s cnf75xx;
+};
+
+typedef union cvmx_pemx_cfg_wr cvmx_pemx_cfg_wr_t;
+
+/**
+ * cvmx_pem#_clk_en
+ *
+ * This register contains the clock enable for ECLK and PCE_CLK.
+ *
+ */
+union cvmx_pemx_clk_en {
+       u64 u64;
+       struct cvmx_pemx_clk_en_s {
+               u64 reserved_2_63 : 62;
+               u64 pceclk_gate : 1;
+               u64 csclk_gate : 1;
+       } s;
+       struct cvmx_pemx_clk_en_s cn70xx;
+       struct cvmx_pemx_clk_en_s cn70xxp1;
+       struct cvmx_pemx_clk_en_s cn73xx;
+       struct cvmx_pemx_clk_en_s cn78xx;
+       struct cvmx_pemx_clk_en_s cn78xxp1;
+       struct cvmx_pemx_clk_en_s cnf75xx;
+};
+
+typedef union cvmx_pemx_clk_en cvmx_pemx_clk_en_t;
+
+/**
+ * cvmx_pem#_cpl_lut_valid
+ *
+ * This register specifies the bit set for an outstanding tag read.
+ *
+ */
+union cvmx_pemx_cpl_lut_valid {
+       u64 u64;
+       struct cvmx_pemx_cpl_lut_valid_s {
+               u64 tag : 64;
+       } s;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 tag : 32;
+       } cn61xx;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cn63xx;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cn63xxp1;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cn66xx;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cn68xx;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cn68xxp1;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cn70xx;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cn70xxp1;
+       struct cvmx_pemx_cpl_lut_valid_s cn73xx;
+       struct cvmx_pemx_cpl_lut_valid_s cn78xx;
+       struct cvmx_pemx_cpl_lut_valid_s cn78xxp1;
+       struct cvmx_pemx_cpl_lut_valid_cn61xx cnf71xx;
+       struct cvmx_pemx_cpl_lut_valid_s cnf75xx;
+};
+
+typedef union cvmx_pemx_cpl_lut_valid cvmx_pemx_cpl_lut_valid_t;
+
+/**
+ * cvmx_pem#_ctl_status
+ *
+ * This is a general control and status register of the PEM.
+ *
+ */
+union cvmx_pemx_ctl_status {
+       u64 u64;
+       struct cvmx_pemx_ctl_status_s {
+               u64 reserved_51_63 : 13;
+               u64 inv_dpar : 1;
+               u64 inv_hpar : 1;
+               u64 inv_rpar : 1;
+               u64 auto_sd : 1;
+               u64 dnum : 5;
+               u64 pbus : 8;
+               u64 reserved_32_33 : 2;
+               u64 cfg_rtry : 16;
+               u64 reserved_12_15 : 4;
+               u64 pm_xtoff : 1;
+               u64 pm_xpme : 1;
+               u64 ob_p_cmd : 1;
+               u64 reserved_7_8 : 2;
+               u64 nf_ecrc : 1;
+               u64 dly_one : 1;
+               u64 lnk_enb : 1;
+               u64 ro_ctlp : 1;
+               u64 fast_lm : 1;
+               u64 inv_ecrc : 1;
+               u64 inv_lcrc : 1;
+       } s;
+       struct cvmx_pemx_ctl_status_cn61xx {
+               u64 reserved_48_63 : 16;
+               u64 auto_sd : 1;
+               u64 dnum : 5;
+               u64 pbus : 8;
+               u64 reserved_32_33 : 2;
+               u64 cfg_rtry : 16;
+               u64 reserved_12_15 : 4;
+               u64 pm_xtoff : 1;
+               u64 pm_xpme : 1;
+               u64 ob_p_cmd : 1;
+               u64 reserved_7_8 : 2;
+               u64 nf_ecrc : 1;
+               u64 dly_one : 1;
+               u64 lnk_enb : 1;
+               u64 ro_ctlp : 1;
+               u64 fast_lm : 1;
+               u64 inv_ecrc : 1;
+               u64 inv_lcrc : 1;
+       } cn61xx;
+       struct cvmx_pemx_ctl_status_cn61xx cn63xx;
+       struct cvmx_pemx_ctl_status_cn61xx cn63xxp1;
+       struct cvmx_pemx_ctl_status_cn61xx cn66xx;
+       struct cvmx_pemx_ctl_status_cn61xx cn68xx;
+       struct cvmx_pemx_ctl_status_cn61xx cn68xxp1;
+       struct cvmx_pemx_ctl_status_s cn70xx;
+       struct cvmx_pemx_ctl_status_s cn70xxp1;
+       struct cvmx_pemx_ctl_status_cn73xx {
+               u64 reserved_51_63 : 13;
+               u64 inv_dpar : 1;
+               u64 reserved_48_49 : 2;
+               u64 auto_sd : 1;
+               u64 dnum : 5;
+               u64 pbus : 8;
+               u64 reserved_32_33 : 2;
+               u64 cfg_rtry : 16;
+               u64 reserved_12_15 : 4;
+               u64 pm_xtoff : 1;
+               u64 pm_xpme : 1;
+               u64 ob_p_cmd : 1;
+               u64 reserved_7_8 : 2;
+               u64 nf_ecrc : 1;
+               u64 dly_one : 1;
+               u64 lnk_enb : 1;
+               u64 ro_ctlp : 1;
+               u64 fast_lm : 1;
+               u64 inv_ecrc : 1;
+               u64 inv_lcrc : 1;
+       } cn73xx;
+       struct cvmx_pemx_ctl_status_cn73xx cn78xx;
+       struct cvmx_pemx_ctl_status_cn73xx cn78xxp1;
+       struct cvmx_pemx_ctl_status_cn61xx cnf71xx;
+       struct cvmx_pemx_ctl_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_ctl_status cvmx_pemx_ctl_status_t;
+
+/**
+ * cvmx_pem#_ctl_status2
+ *
+ * This register contains additional general control and status of the PEM.
+ *
+ */
+union cvmx_pemx_ctl_status2 {
+       u64 u64;
+       struct cvmx_pemx_ctl_status2_s {
+               u64 reserved_16_63 : 48;
+               u64 no_fwd_prg : 16;
+       } s;
+       struct cvmx_pemx_ctl_status2_s cn73xx;
+       struct cvmx_pemx_ctl_status2_s cn78xx;
+       struct cvmx_pemx_ctl_status2_s cn78xxp1;
+       struct cvmx_pemx_ctl_status2_s cnf75xx;
+};
+
+typedef union cvmx_pemx_ctl_status2 cvmx_pemx_ctl_status2_t;
+
+/**
+ * cvmx_pem#_dbg_info
+ *
+ * This is a debug information register of the PEM.
+ *
+ */
+union cvmx_pemx_dbg_info {
+       u64 u64;
+       struct cvmx_pemx_dbg_info_s {
+               u64 reserved_62_63 : 2;
+               u64 m2s_c_dbe : 1;
+               u64 m2s_c_sbe : 1;
+               u64 m2s_d_dbe : 1;
+               u64 m2s_d_sbe : 1;
+               u64 qhdr_b1_dbe : 1;
+               u64 qhdr_b1_sbe : 1;
+               u64 qhdr_b0_dbe : 1;
+               u64 qhdr_b0_sbe : 1;
+               u64 rtry_dbe : 1;
+               u64 rtry_sbe : 1;
+               u64 reserved_50_51 : 2;
+               u64 c_d1_dbe : 1;
+               u64 c_d1_sbe : 1;
+               u64 c_d0_dbe : 1;
+               u64 c_d0_sbe : 1;
+               u64 reserved_34_45 : 12;
+               u64 datq_pe : 1;
+               u64 reserved_31_32 : 2;
+               u64 ecrc_e : 1;
+               u64 rawwpp : 1;
+               u64 racpp : 1;
+               u64 ramtlp : 1;
+               u64 rarwdns : 1;
+               u64 caar : 1;
+               u64 racca : 1;
+               u64 racur : 1;
+               u64 rauc : 1;
+               u64 rqo : 1;
+               u64 fcuv : 1;
+               u64 rpe : 1;
+               u64 fcpvwt : 1;
+               u64 dpeoosd : 1;
+               u64 rtwdle : 1;
+               u64 rdwdle : 1;
+               u64 mre : 1;
+               u64 rte : 1;
+               u64 acto : 1;
+               u64 rvdm : 1;
+               u64 rumep : 1;
+               u64 rptamrc : 1;
+               u64 rpmerc : 1;
+               u64 rfemrc : 1;
+               u64 rnfemrc : 1;
+               u64 rcemrc : 1;
+               u64 rpoison : 1;
+               u64 recrce : 1;
+               u64 rtlplle : 1;
+               u64 rtlpmal : 1;
+               u64 spoison : 1;
+       } s;
+       struct cvmx_pemx_dbg_info_cn61xx {
+               u64 reserved_31_63 : 33;
+               u64 ecrc_e : 1;
+               u64 rawwpp : 1;
+               u64 racpp : 1;
+               u64 ramtlp : 1;
+               u64 rarwdns : 1;
+               u64 caar : 1;
+               u64 racca : 1;
+               u64 racur : 1;
+               u64 rauc : 1;
+               u64 rqo : 1;
+               u64 fcuv : 1;
+               u64 rpe : 1;
+               u64 fcpvwt : 1;
+               u64 dpeoosd : 1;
+               u64 rtwdle : 1;
+               u64 rdwdle : 1;
+               u64 mre : 1;
+               u64 rte : 1;
+               u64 acto : 1;
+               u64 rvdm : 1;
+               u64 rumep : 1;
+               u64 rptamrc : 1;
+               u64 rpmerc : 1;
+               u64 rfemrc : 1;
+               u64 rnfemrc : 1;
+               u64 rcemrc : 1;
+               u64 rpoison : 1;
+               u64 recrce : 1;
+               u64 rtlplle : 1;
+               u64 rtlpmal : 1;
+               u64 spoison : 1;
+       } cn61xx;
+       struct cvmx_pemx_dbg_info_cn61xx cn63xx;
+       struct cvmx_pemx_dbg_info_cn61xx cn63xxp1;
+       struct cvmx_pemx_dbg_info_cn61xx cn66xx;
+       struct cvmx_pemx_dbg_info_cn61xx cn68xx;
+       struct cvmx_pemx_dbg_info_cn61xx cn68xxp1;
+       struct cvmx_pemx_dbg_info_cn70xx {
+               u64 reserved_46_63 : 18;
+               u64 c_c_dbe : 1;
+               u64 c_c_sbe : 1;
+               u64 c_d_dbe : 1;
+               u64 c_d_sbe : 1;
+               u64 n_c_dbe : 1;
+               u64 n_c_sbe : 1;
+               u64 n_d_dbe : 1;
+               u64 n_d_sbe : 1;
+               u64 p_c_dbe : 1;
+               u64 p_c_sbe : 1;
+               u64 p_d_dbe : 1;
+               u64 p_d_sbe : 1;
+               u64 datq_pe : 1;
+               u64 hdrq_pe : 1;
+               u64 rtry_pe : 1;
+               u64 ecrc_e : 1;
+               u64 rawwpp : 1;
+               u64 racpp : 1;
+               u64 ramtlp : 1;
+               u64 rarwdns : 1;
+               u64 caar : 1;
+               u64 racca : 1;
+               u64 racur : 1;
+               u64 rauc : 1;
+               u64 rqo : 1;
+               u64 fcuv : 1;
+               u64 rpe : 1;
+               u64 fcpvwt : 1;
+               u64 dpeoosd : 1;
+               u64 rtwdle : 1;
+               u64 rdwdle : 1;
+               u64 mre : 1;
+               u64 rte : 1;
+               u64 acto : 1;
+               u64 rvdm : 1;
+               u64 rumep : 1;
+               u64 rptamrc : 1;
+               u64 rpmerc : 1;
+               u64 rfemrc : 1;
+               u64 rnfemrc : 1;
+               u64 rcemrc : 1;
+               u64 rpoison : 1;
+               u64 recrce : 1;
+               u64 rtlplle : 1;
+               u64 rtlpmal : 1;
+               u64 spoison : 1;
+       } cn70xx;
+       struct cvmx_pemx_dbg_info_cn70xx cn70xxp1;
+       struct cvmx_pemx_dbg_info_cn73xx {
+               u64 reserved_62_63 : 2;
+               u64 m2s_c_dbe : 1;
+               u64 m2s_c_sbe : 1;
+               u64 m2s_d_dbe : 1;
+               u64 m2s_d_sbe : 1;
+               u64 qhdr_b1_dbe : 1;
+               u64 qhdr_b1_sbe : 1;
+               u64 qhdr_b0_dbe : 1;
+               u64 qhdr_b0_sbe : 1;
+               u64 rtry_dbe : 1;
+               u64 rtry_sbe : 1;
+               u64 c_c_dbe : 1;
+               u64 c_c_sbe : 1;
+               u64 c_d1_dbe : 1;
+               u64 c_d1_sbe : 1;
+               u64 c_d0_dbe : 1;
+               u64 c_d0_sbe : 1;
+               u64 n_c_dbe : 1;
+               u64 n_c_sbe : 1;
+               u64 n_d1_dbe : 1;
+               u64 n_d1_sbe : 1;
+               u64 n_d0_dbe : 1;
+               u64 n_d0_sbe : 1;
+               u64 p_c_dbe : 1;
+               u64 p_c_sbe : 1;
+               u64 p_d1_dbe : 1;
+               u64 p_d1_sbe : 1;
+               u64 p_d0_dbe : 1;
+               u64 p_d0_sbe : 1;
+               u64 datq_pe : 1;
+               u64 bmd_e : 1;
+               u64 lofp : 1;
+               u64 ecrc_e : 1;
+               u64 rawwpp : 1;
+               u64 racpp : 1;
+               u64 ramtlp : 1;
+               u64 rarwdns : 1;
+               u64 caar : 1;
+               u64 racca : 1;
+               u64 racur : 1;
+               u64 rauc : 1;
+               u64 rqo : 1;
+               u64 fcuv : 1;
+               u64 rpe : 1;
+               u64 fcpvwt : 1;
+               u64 dpeoosd : 1;
+               u64 rtwdle : 1;
+               u64 rdwdle : 1;
+               u64 mre : 1;
+               u64 rte : 1;
+               u64 acto : 1;
+               u64 rvdm : 1;
+               u64 rumep : 1;
+               u64 rptamrc : 1;
+               u64 rpmerc : 1;
+               u64 rfemrc : 1;
+               u64 rnfemrc : 1;
+               u64 rcemrc : 1;
+               u64 rpoison : 1;
+               u64 recrce : 1;
+               u64 rtlplle : 1;
+               u64 rtlpmal : 1;
+               u64 spoison : 1;
+       } cn73xx;
+       struct cvmx_pemx_dbg_info_cn73xx cn78xx;
+       struct cvmx_pemx_dbg_info_cn78xxp1 {
+               u64 reserved_58_63 : 6;
+               u64 qhdr_b1_dbe : 1;
+               u64 qhdr_b1_sbe : 1;
+               u64 qhdr_b0_dbe : 1;
+               u64 qhdr_b0_sbe : 1;
+               u64 rtry_dbe : 1;
+               u64 rtry_sbe : 1;
+               u64 c_c_dbe : 1;
+               u64 c_c_sbe : 1;
+               u64 c_d1_dbe : 1;
+               u64 c_d1_sbe : 1;
+               u64 c_d0_dbe : 1;
+               u64 c_d0_sbe : 1;
+               u64 n_c_dbe : 1;
+               u64 n_c_sbe : 1;
+               u64 n_d1_dbe : 1;
+               u64 n_d1_sbe : 1;
+               u64 n_d0_dbe : 1;
+               u64 n_d0_sbe : 1;
+               u64 p_c_dbe : 1;
+               u64 p_c_sbe : 1;
+               u64 p_d1_dbe : 1;
+               u64 p_d1_sbe : 1;
+               u64 p_d0_dbe : 1;
+               u64 p_d0_sbe : 1;
+               u64 datq_pe : 1;
+               u64 reserved_32_32 : 1;
+               u64 lofp : 1;
+               u64 ecrc_e : 1;
+               u64 rawwpp : 1;
+               u64 racpp : 1;
+               u64 ramtlp : 1;
+               u64 rarwdns : 1;
+               u64 caar : 1;
+               u64 racca : 1;
+               u64 racur : 1;
+               u64 rauc : 1;
+               u64 rqo : 1;
+               u64 fcuv : 1;
+               u64 rpe : 1;
+               u64 fcpvwt : 1;
+               u64 dpeoosd : 1;
+               u64 rtwdle : 1;
+               u64 rdwdle : 1;
+               u64 mre : 1;
+               u64 rte : 1;
+               u64 acto : 1;
+               u64 rvdm : 1;
+               u64 rumep : 1;
+               u64 rptamrc : 1;
+               u64 rpmerc : 1;
+               u64 rfemrc : 1;
+               u64 rnfemrc : 1;
+               u64 rcemrc : 1;
+               u64 rpoison : 1;
+               u64 recrce : 1;
+               u64 rtlplle : 1;
+               u64 rtlpmal : 1;
+               u64 spoison : 1;
+       } cn78xxp1;
+       struct cvmx_pemx_dbg_info_cn61xx cnf71xx;
+       struct cvmx_pemx_dbg_info_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_dbg_info cvmx_pemx_dbg_info_t;
+
+/**
+ * cvmx_pem#_dbg_info_en
+ *
+ * "PEM#_DBG_INFO_EN = PEM Debug Information Enable
+ * Allows PEM_DBG_INFO to generate interrupts when cooresponding enable bit is set."
+ */
+union cvmx_pemx_dbg_info_en {
+       u64 u64;
+       struct cvmx_pemx_dbg_info_en_s {
+               u64 reserved_46_63 : 18;
+               u64 tpcdbe1 : 1;
+               u64 tpcsbe1 : 1;
+               u64 tpcdbe0 : 1;
+               u64 tpcsbe0 : 1;
+               u64 tnfdbe1 : 1;
+               u64 tnfsbe1 : 1;
+               u64 tnfdbe0 : 1;
+               u64 tnfsbe0 : 1;
+               u64 tpfdbe1 : 1;
+               u64 tpfsbe1 : 1;
+               u64 tpfdbe0 : 1;
+               u64 tpfsbe0 : 1;
+               u64 datq_pe : 1;
+               u64 hdrq_pe : 1;
+               u64 rtry_pe : 1;
+               u64 ecrc_e : 1;
+               u64 rawwpp : 1;
+               u64 racpp : 1;
+               u64 ramtlp : 1;
+               u64 rarwdns : 1;
+               u64 caar : 1;
+               u64 racca : 1;
+               u64 racur : 1;
+               u64 rauc : 1;
+               u64 rqo : 1;
+               u64 fcuv : 1;
+               u64 rpe : 1;
+               u64 fcpvwt : 1;
+               u64 dpeoosd : 1;
+               u64 rtwdle : 1;
+               u64 rdwdle : 1;
+               u64 mre : 1;
+               u64 rte : 1;
+               u64 acto : 1;
+               u64 rvdm : 1;
+               u64 rumep : 1;
+               u64 rptamrc : 1;
+               u64 rpmerc : 1;
+               u64 rfemrc : 1;
+               u64 rnfemrc : 1;
+               u64 rcemrc : 1;
+               u64 rpoison : 1;
+               u64 recrce : 1;
+               u64 rtlplle : 1;
+               u64 rtlpmal : 1;
+               u64 spoison : 1;
+       } s;
+       struct cvmx_pemx_dbg_info_en_cn61xx {
+               u64 reserved_31_63 : 33;
+               u64 ecrc_e : 1;
+               u64 rawwpp : 1;
+               u64 racpp : 1;
+               u64 ramtlp : 1;
+               u64 rarwdns : 1;
+               u64 caar : 1;
+               u64 racca : 1;
+               u64 racur : 1;
+               u64 rauc : 1;
+               u64 rqo : 1;
+               u64 fcuv : 1;
+               u64 rpe : 1;
+               u64 fcpvwt : 1;
+               u64 dpeoosd : 1;
+               u64 rtwdle : 1;
+               u64 rdwdle : 1;
+               u64 mre : 1;
+               u64 rte : 1;
+               u64 acto : 1;
+               u64 rvdm : 1;
+               u64 rumep : 1;
+               u64 rptamrc : 1;
+               u64 rpmerc : 1;
+               u64 rfemrc : 1;
+               u64 rnfemrc : 1;
+               u64 rcemrc : 1;
+               u64 rpoison : 1;
+               u64 recrce : 1;
+               u64 rtlplle : 1;
+               u64 rtlpmal : 1;
+               u64 spoison : 1;
+       } cn61xx;
+       struct cvmx_pemx_dbg_info_en_cn61xx cn63xx;
+       struct cvmx_pemx_dbg_info_en_cn61xx cn63xxp1;
+       struct cvmx_pemx_dbg_info_en_cn61xx cn66xx;
+       struct cvmx_pemx_dbg_info_en_cn61xx cn68xx;
+       struct cvmx_pemx_dbg_info_en_cn61xx cn68xxp1;
+       struct cvmx_pemx_dbg_info_en_s cn70xx;
+       struct cvmx_pemx_dbg_info_en_s cn70xxp1;
+       struct cvmx_pemx_dbg_info_en_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pemx_dbg_info_en cvmx_pemx_dbg_info_en_t;
+
+/**
+ * cvmx_pem#_diag_status
+ *
+ * This register contains selection control for the core diagnostic bus.
+ *
+ */
+union cvmx_pemx_diag_status {
+       u64 u64;
+       struct cvmx_pemx_diag_status_s {
+               u64 reserved_9_63 : 55;
+               u64 pwrdwn : 3;
+               u64 pm_dst : 3;
+               u64 pm_stat : 1;
+               u64 pm_en : 1;
+               u64 aux_en : 1;
+       } s;
+       struct cvmx_pemx_diag_status_cn61xx {
+               u64 reserved_4_63 : 60;
+               u64 pm_dst : 1;
+               u64 pm_stat : 1;
+               u64 pm_en : 1;
+               u64 aux_en : 1;
+       } cn61xx;
+       struct cvmx_pemx_diag_status_cn61xx cn63xx;
+       struct cvmx_pemx_diag_status_cn61xx cn63xxp1;
+       struct cvmx_pemx_diag_status_cn61xx cn66xx;
+       struct cvmx_pemx_diag_status_cn61xx cn68xx;
+       struct cvmx_pemx_diag_status_cn61xx cn68xxp1;
+       struct cvmx_pemx_diag_status_cn70xx {
+               u64 reserved_63_6 : 58;
+               u64 pm_dst : 3;
+               u64 pm_stat : 1;
+               u64 pm_en : 1;
+               u64 aux_en : 1;
+       } cn70xx;
+       struct cvmx_pemx_diag_status_cn70xx cn70xxp1;
+       struct cvmx_pemx_diag_status_cn73xx {
+               u64 reserved_63_9 : 55;
+               u64 pwrdwn : 3;
+               u64 pm_dst : 3;
+               u64 pm_stat : 1;
+               u64 pm_en : 1;
+               u64 aux_en : 1;
+       } cn73xx;
+       struct cvmx_pemx_diag_status_cn73xx cn78xx;
+       struct cvmx_pemx_diag_status_cn73xx cn78xxp1;
+       struct cvmx_pemx_diag_status_cn61xx cnf71xx;
+       struct cvmx_pemx_diag_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_diag_status cvmx_pemx_diag_status_t;
+
+/**
+ * cvmx_pem#_ecc_ena
+ *
+ * Contains enables for TLP FIFO ECC RAMs.
+ *
+ */
+union cvmx_pemx_ecc_ena {
+       u64 u64;
+       struct cvmx_pemx_ecc_ena_s {
+               u64 reserved_35_63 : 29;
+               u64 qhdr_b1_ena : 1;
+               u64 qhdr_b0_ena : 1;
+               u64 rtry_ena : 1;
+               u64 reserved_11_31 : 21;
+               u64 m2s_c_ena : 1;
+               u64 m2s_d_ena : 1;
+               u64 c_c_ena : 1;
+               u64 c_d1_ena : 1;
+               u64 c_d0_ena : 1;
+               u64 reserved_0_5 : 6;
+       } s;
+       struct cvmx_pemx_ecc_ena_cn70xx {
+               u64 reserved_6_63 : 58;
+               u64 tlp_nc_ena : 1;
+               u64 tlp_nd_ena : 1;
+               u64 tlp_pc_ena : 1;
+               u64 tlp_pd_ena : 1;
+               u64 tlp_cc_ena : 1;
+               u64 tlp_cd_ena : 1;
+       } cn70xx;
+       struct cvmx_pemx_ecc_ena_cn70xx cn70xxp1;
+       struct cvmx_pemx_ecc_ena_cn73xx {
+               u64 reserved_35_63 : 29;
+               u64 qhdr_b1_ena : 1;
+               u64 qhdr_b0_ena : 1;
+               u64 rtry_ena : 1;
+               u64 reserved_11_31 : 21;
+               u64 m2s_c_ena : 1;
+               u64 m2s_d_ena : 1;
+               u64 c_c_ena : 1;
+               u64 c_d1_ena : 1;
+               u64 c_d0_ena : 1;
+               u64 n_c_ena : 1;
+               u64 n_d1_ena : 1;
+               u64 n_d0_ena : 1;
+               u64 p_c_ena : 1;
+               u64 p_d1_ena : 1;
+               u64 p_d0_ena : 1;
+       } cn73xx;
+       struct cvmx_pemx_ecc_ena_cn73xx cn78xx;
+       struct cvmx_pemx_ecc_ena_cn78xxp1 {
+               u64 reserved_35_63 : 29;
+               u64 qhdr_b1_ena : 1;
+               u64 qhdr_b0_ena : 1;
+               u64 rtry_ena : 1;
+               u64 reserved_9_31 : 23;
+               u64 c_c_ena : 1;
+               u64 c_d1_ena : 1;
+               u64 c_d0_ena : 1;
+               u64 n_c_ena : 1;
+               u64 n_d1_ena : 1;
+               u64 n_d0_ena : 1;
+               u64 p_c_ena : 1;
+               u64 p_d1_ena : 1;
+               u64 p_d0_ena : 1;
+       } cn78xxp1;
+       struct cvmx_pemx_ecc_ena_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_ecc_ena cvmx_pemx_ecc_ena_t;
+
+/**
+ * cvmx_pem#_ecc_synd_ctrl
+ *
+ * This register contains syndrome control for TLP FIFO ECC RAMs.
+ *
+ */
+union cvmx_pemx_ecc_synd_ctrl {
+       u64 u64;
+       struct cvmx_pemx_ecc_synd_ctrl_s {
+               u64 reserved_38_63 : 26;
+               u64 qhdr_b1_syn : 2;
+               u64 qhdr_b0_syn : 2;
+               u64 rtry_syn : 2;
+               u64 reserved_22_31 : 10;
+               u64 m2s_c_syn : 2;
+               u64 m2s_d_syn : 2;
+               u64 c_c_syn : 2;
+               u64 c_d1_syn : 2;
+               u64 c_d0_syn : 2;
+               u64 reserved_0_11 : 12;
+       } s;
+       struct cvmx_pemx_ecc_synd_ctrl_cn70xx {
+               u64 reserved_12_63 : 52;
+               u64 tlp_nc_syn : 2;
+               u64 tlp_nd_syn : 2;
+               u64 tlp_pc_syn : 2;
+               u64 tlp_pd_syn : 2;
+               u64 tlp_cc_syn : 2;
+               u64 tlp_cd_syn : 2;
+       } cn70xx;
+       struct cvmx_pemx_ecc_synd_ctrl_cn70xx cn70xxp1;
+       struct cvmx_pemx_ecc_synd_ctrl_cn73xx {
+               u64 reserved_38_63 : 26;
+               u64 qhdr_b1_syn : 2;
+               u64 qhdr_b0_syn : 2;
+               u64 rtry_syn : 2;
+               u64 reserved_22_31 : 10;
+               u64 m2s_c_syn : 2;
+               u64 m2s_d_syn : 2;
+               u64 c_c_syn : 2;
+               u64 c_d1_syn : 2;
+               u64 c_d0_syn : 2;
+               u64 n_c_syn : 2;
+               u64 n_d1_syn : 2;
+               u64 n_d0_syn : 2;
+               u64 p_c_syn : 2;
+               u64 p_d1_syn : 2;
+               u64 p_d0_syn : 2;
+       } cn73xx;
+       struct cvmx_pemx_ecc_synd_ctrl_cn73xx cn78xx;
+       struct cvmx_pemx_ecc_synd_ctrl_cn78xxp1 {
+               u64 reserved_38_63 : 26;
+               u64 qhdr_b1_syn : 2;
+               u64 qhdr_b0_syn : 2;
+               u64 rtry_syn : 2;
+               u64 reserved_18_31 : 14;
+               u64 c_c_syn : 2;
+               u64 c_d1_syn : 2;
+               u64 c_d0_syn : 2;
+               u64 n_c_syn : 2;
+               u64 n_d1_syn : 2;
+               u64 n_d0_syn : 2;
+               u64 p_c_syn : 2;
+               u64 p_d1_syn : 2;
+               u64 p_d0_syn : 2;
+       } cn78xxp1;
+       struct cvmx_pemx_ecc_synd_ctrl_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_ecc_synd_ctrl cvmx_pemx_ecc_synd_ctrl_t;
+
+/**
+ * cvmx_pem#_eco
+ */
+union cvmx_pemx_eco {
+       u64 u64;
+       struct cvmx_pemx_eco_s {
+               u64 reserved_8_63 : 56;
+               u64 eco_rw : 8;
+       } s;
+       struct cvmx_pemx_eco_s cn73xx;
+       struct cvmx_pemx_eco_s cn78xx;
+       struct cvmx_pemx_eco_s cnf75xx;
+};
+
+typedef union cvmx_pemx_eco cvmx_pemx_eco_t;
+
+/**
+ * cvmx_pem#_flr_glblcnt_ctl
+ */
+union cvmx_pemx_flr_glblcnt_ctl {
+       u64 u64;
+       struct cvmx_pemx_flr_glblcnt_ctl_s {
+               u64 reserved_4_63 : 60;
+               u64 chge : 1;
+               u64 inc : 1;
+               u64 delta : 2;
+       } s;
+       struct cvmx_pemx_flr_glblcnt_ctl_s cn73xx;
+       struct cvmx_pemx_flr_glblcnt_ctl_s cn78xx;
+       struct cvmx_pemx_flr_glblcnt_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pemx_flr_glblcnt_ctl cvmx_pemx_flr_glblcnt_ctl_t;
+
+/**
+ * cvmx_pem#_flr_pf0_vf_stopreq
+ *
+ * Hardware automatically sets the STOPREQ bit for the VF when it enters a
+ * Function Level Reset (FLR).  Software is responsible for clearing the STOPREQ
+ * bit but must not do so prior to hardware taking down the FLR, which could be
+ * as long as 100ms.  It may be appropriate for software to wait longer before clearing
+ * STOPREQ, software may need to drain deep DPI queues for example.
+ * Whenever PEM receives a request mastered by CNXXXX over S2M (i.e. P or NP),
+ * when STOPREQ is set for the function, PEM will discard the outgoing request
+ * before sending it to the PCIe core.  If a NP, PEM will schedule an immediate
+ * SWI_RSP_ERROR completion for the request - no timeout is required.
+ *
+ * STOPREQ mimics the behavior of PCIEEPVF()_CFG001[ME] for outbound requests that will
+ * master the PCIe bus (P and NP).
+ *
+ * Note that STOPREQ will have no effect on completions returned by CNXXXX over the S2M,
+ * nor on M2S traffic.
+ */
+union cvmx_pemx_flr_pf0_vf_stopreq {
+       u64 u64;
+       struct cvmx_pemx_flr_pf0_vf_stopreq_s {
+               u64 vf_stopreq : 64;
+       } s;
+       struct cvmx_pemx_flr_pf0_vf_stopreq_s cn73xx;
+       struct cvmx_pemx_flr_pf0_vf_stopreq_s cn78xx;
+       struct cvmx_pemx_flr_pf0_vf_stopreq_s cnf75xx;
+};
+
+typedef union cvmx_pemx_flr_pf0_vf_stopreq cvmx_pemx_flr_pf0_vf_stopreq_t;
+
+/**
+ * cvmx_pem#_flr_pf_stopreq
+ *
+ * Hardware automatically sets the STOPREQ bit for the PF when it enters a
+ * Function Level Reset (FLR).  Software is responsible for clearing the STOPREQ
+ * bit but must not do so prior to hardware taking down the FLR, which could be
+ * as long as 100ms.  It may be appropriate for software to wait longer before clearing
+ * STOPREQ, software may need to drain deep DPI queues for example.
+ * Whenever PEM receives a PF or child VF request mastered by CNXXXX over S2M (i.e. P or NP),
+ * when STOPREQ is set for the function, PEM will discard the outgoing request
+ * before sending it to the PCIe core.  If a NP, PEM will schedule an immediate
+ * SWI_RSP_ERROR completion for the request - no timeout is required.
+ *
+ * STOPREQ mimics the behavior of PCIEEP()_CFG001[ME] for outbound requests that will
+ * master the PCIe bus (P and NP).
+ *
+ * STOPREQ will have no effect on completions returned by CNXXXX over the S2M,
+ * nor on M2S traffic.
+ *
+ * When a PF()_STOPREQ is set, none of the associated
+ * PEM()_FLR_PF()_VF_STOPREQ[VF_STOPREQ] will be set.
+ *
+ * STOPREQ is reset when the MAC is reset, and is not reset after a chip soft reset.
+ */
+union cvmx_pemx_flr_pf_stopreq {
+       u64 u64;
+       struct cvmx_pemx_flr_pf_stopreq_s {
+               u64 reserved_1_63 : 63;
+               u64 pf0_stopreq : 1;
+       } s;
+       struct cvmx_pemx_flr_pf_stopreq_s cn73xx;
+       struct cvmx_pemx_flr_pf_stopreq_s cn78xx;
+       struct cvmx_pemx_flr_pf_stopreq_s cnf75xx;
+};
+
+typedef union cvmx_pemx_flr_pf_stopreq cvmx_pemx_flr_pf_stopreq_t;
+
+/**
+ * cvmx_pem#_flr_stopreq_ctl
+ */
+union cvmx_pemx_flr_stopreq_ctl {
+       u64 u64;
+       struct cvmx_pemx_flr_stopreq_ctl_s {
+               u64 reserved_1_63 : 63;
+               u64 stopreqclr : 1;
+       } s;
+       struct cvmx_pemx_flr_stopreq_ctl_s cn78xx;
+       struct cvmx_pemx_flr_stopreq_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pemx_flr_stopreq_ctl cvmx_pemx_flr_stopreq_ctl_t;
+
+/**
+ * cvmx_pem#_flr_zombie_ctl
+ */
+union cvmx_pemx_flr_zombie_ctl {
+       u64 u64;
+       struct cvmx_pemx_flr_zombie_ctl_s {
+               u64 reserved_10_63 : 54;
+               u64 exp : 10;
+       } s;
+       struct cvmx_pemx_flr_zombie_ctl_s cn73xx;
+       struct cvmx_pemx_flr_zombie_ctl_s cn78xx;
+       struct cvmx_pemx_flr_zombie_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pemx_flr_zombie_ctl cvmx_pemx_flr_zombie_ctl_t;
+
+/**
+ * cvmx_pem#_inb_read_credits
+ *
+ * This register contains the number of in-flight read operations from PCIe core to SLI.
+ *
+ */
+union cvmx_pemx_inb_read_credits {
+       u64 u64;
+       struct cvmx_pemx_inb_read_credits_s {
+               u64 reserved_7_63 : 57;
+               u64 num : 7;
+       } s;
+       struct cvmx_pemx_inb_read_credits_cn61xx {
+               u64 reserved_6_63 : 58;
+               u64 num : 6;
+       } cn61xx;
+       struct cvmx_pemx_inb_read_credits_cn61xx cn66xx;
+       struct cvmx_pemx_inb_read_credits_cn61xx cn68xx;
+       struct cvmx_pemx_inb_read_credits_cn61xx cn70xx;
+       struct cvmx_pemx_inb_read_credits_cn61xx cn70xxp1;
+       struct cvmx_pemx_inb_read_credits_s cn73xx;
+       struct cvmx_pemx_inb_read_credits_s cn78xx;
+       struct cvmx_pemx_inb_read_credits_s cn78xxp1;
+       struct cvmx_pemx_inb_read_credits_cn61xx cnf71xx;
+       struct cvmx_pemx_inb_read_credits_s cnf75xx;
+};
+
+typedef union cvmx_pemx_inb_read_credits cvmx_pemx_inb_read_credits_t;
+
+/**
+ * cvmx_pem#_int_enb
+ *
+ * "PEM#_INT_ENB = PEM Interrupt Enable
+ * Enables interrupt conditions for the PEM to generate an RSL interrupt."
+ */
+union cvmx_pemx_int_enb {
+       u64 u64;
+       struct cvmx_pemx_int_enb_s {
+               u64 reserved_14_63 : 50;
+               u64 crs_dr : 1;
+               u64 crs_er : 1;
+               u64 rdlk : 1;
+               u64 exc : 1;
+               u64 un_bx : 1;
+               u64 un_b2 : 1;
+               u64 un_b1 : 1;
+               u64 up_bx : 1;
+               u64 up_b2 : 1;
+               u64 up_b1 : 1;
+               u64 pmem : 1;
+               u64 pmei : 1;
+               u64 se : 1;
+               u64 aeri : 1;
+       } s;
+       struct cvmx_pemx_int_enb_s cn61xx;
+       struct cvmx_pemx_int_enb_s cn63xx;
+       struct cvmx_pemx_int_enb_s cn63xxp1;
+       struct cvmx_pemx_int_enb_s cn66xx;
+       struct cvmx_pemx_int_enb_s cn68xx;
+       struct cvmx_pemx_int_enb_s cn68xxp1;
+       struct cvmx_pemx_int_enb_s cn70xx;
+       struct cvmx_pemx_int_enb_s cn70xxp1;
+       struct cvmx_pemx_int_enb_s cnf71xx;
+};
+
+typedef union cvmx_pemx_int_enb cvmx_pemx_int_enb_t;
+
+/**
+ * cvmx_pem#_int_enb_int
+ *
+ * "PEM#_INT_ENB_INT = PEM Interrupt Enable
+ * Enables interrupt conditions for the PEM to generate an RSL interrupt."
+ */
+union cvmx_pemx_int_enb_int {
+       u64 u64;
+       struct cvmx_pemx_int_enb_int_s {
+               u64 reserved_14_63 : 50;
+               u64 crs_dr : 1;
+               u64 crs_er : 1;
+               u64 rdlk : 1;
+               u64 exc : 1;
+               u64 un_bx : 1;
+               u64 un_b2 : 1;
+               u64 un_b1 : 1;
+               u64 up_bx : 1;
+               u64 up_b2 : 1;
+               u64 up_b1 : 1;
+               u64 pmem : 1;
+               u64 pmei : 1;
+               u64 se : 1;
+               u64 aeri : 1;
+       } s;
+       struct cvmx_pemx_int_enb_int_s cn61xx;
+       struct cvmx_pemx_int_enb_int_s cn63xx;
+       struct cvmx_pemx_int_enb_int_s cn63xxp1;
+       struct cvmx_pemx_int_enb_int_s cn66xx;
+       struct cvmx_pemx_int_enb_int_s cn68xx;
+       struct cvmx_pemx_int_enb_int_s cn68xxp1;
+       struct cvmx_pemx_int_enb_int_s cn70xx;
+       struct cvmx_pemx_int_enb_int_s cn70xxp1;
+       struct cvmx_pemx_int_enb_int_s cnf71xx;
+};
+
+typedef union cvmx_pemx_int_enb_int cvmx_pemx_int_enb_int_t;
+
+/**
+ * cvmx_pem#_int_sum
+ *
+ * This register contains the different interrupt summary bits of the PEM.
+ *
+ */
+union cvmx_pemx_int_sum {
+       u64 u64;
+       struct cvmx_pemx_int_sum_s {
+               u64 intd : 1;
+               u64 intc : 1;
+               u64 intb : 1;
+               u64 inta : 1;
+               u64 reserved_14_59 : 46;
+               u64 crs_dr : 1;
+               u64 crs_er : 1;
+               u64 rdlk : 1;
+               u64 exc : 1;
+               u64 un_bx : 1;
+               u64 un_b2 : 1;
+               u64 un_b1 : 1;
+               u64 up_bx : 1;
+               u64 up_b2 : 1;
+               u64 up_b1 : 1;
+               u64 pmem : 1;
+               u64 pmei : 1;
+               u64 se : 1;
+               u64 aeri : 1;
+       } s;
+       struct cvmx_pemx_int_sum_cn61xx {
+               u64 reserved_14_63 : 50;
+               u64 crs_dr : 1;
+               u64 crs_er : 1;
+               u64 rdlk : 1;
+               u64 exc : 1;
+               u64 un_bx : 1;
+               u64 un_b2 : 1;
+               u64 un_b1 : 1;
+               u64 up_bx : 1;
+               u64 up_b2 : 1;
+               u64 up_b1 : 1;
+               u64 pmem : 1;
+               u64 pmei : 1;
+               u64 se : 1;
+               u64 aeri : 1;
+       } cn61xx;
+       struct cvmx_pemx_int_sum_cn61xx cn63xx;
+       struct cvmx_pemx_int_sum_cn61xx cn63xxp1;
+       struct cvmx_pemx_int_sum_cn61xx cn66xx;
+       struct cvmx_pemx_int_sum_cn61xx cn68xx;
+       struct cvmx_pemx_int_sum_cn61xx cn68xxp1;
+       struct cvmx_pemx_int_sum_cn61xx cn70xx;
+       struct cvmx_pemx_int_sum_cn61xx cn70xxp1;
+       struct cvmx_pemx_int_sum_cn73xx {
+               u64 intd : 1;
+               u64 intc : 1;
+               u64 intb : 1;
+               u64 inta : 1;
+               u64 reserved_14_59 : 46;
+               u64 crs_dr : 1;
+               u64 crs_er : 1;
+               u64 rdlk : 1;
+               u64 reserved_10_10 : 1;
+               u64 un_bx : 1;
+               u64 un_b2 : 1;
+               u64 un_b1 : 1;
+               u64 up_bx : 1;
+               u64 up_b2 : 1;
+               u64 up_b1 : 1;
+               u64 reserved_3_3 : 1;
+               u64 pmei : 1;
+               u64 se : 1;
+               u64 aeri : 1;
+       } cn73xx;
+       struct cvmx_pemx_int_sum_cn73xx cn78xx;
+       struct cvmx_pemx_int_sum_cn73xx cn78xxp1;
+       struct cvmx_pemx_int_sum_cn61xx cnf71xx;
+       struct cvmx_pemx_int_sum_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_int_sum cvmx_pemx_int_sum_t;
+
+/**
+ * cvmx_pem#_on
+ *
+ * This register indicates that PEM is configured and ready.
+ *
+ */
+union cvmx_pemx_on {
+       u64 u64;
+       struct cvmx_pemx_on_s {
+               u64 reserved_2_63 : 62;
+               u64 pemoor : 1;
+               u64 pemon : 1;
+       } s;
+       struct cvmx_pemx_on_s cn70xx;
+       struct cvmx_pemx_on_s cn70xxp1;
+       struct cvmx_pemx_on_s cn73xx;
+       struct cvmx_pemx_on_s cn78xx;
+       struct cvmx_pemx_on_s cn78xxp1;
+       struct cvmx_pemx_on_s cnf75xx;
+};
+
+typedef union cvmx_pemx_on cvmx_pemx_on_t;
+
+/**
+ * cvmx_pem#_p2n_bar0_start
+ *
+ * This register specifies the starting address for memory requests that are to be forwarded to
+ * the SLI in RC mode.
+ */
+union cvmx_pemx_p2n_bar0_start {
+       u64 u64;
+       struct cvmx_pemx_p2n_bar0_start_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx {
+               u64 addr : 50;
+               u64 reserved_0_13 : 14;
+       } cn61xx;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cn63xx;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cn63xxp1;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cn66xx;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cn68xx;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cn68xxp1;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cn70xx;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cn70xxp1;
+       struct cvmx_pemx_p2n_bar0_start_cn73xx {
+               u64 addr : 41;
+               u64 reserved_0_22 : 23;
+       } cn73xx;
+       struct cvmx_pemx_p2n_bar0_start_cn73xx cn78xx;
+       struct cvmx_pemx_p2n_bar0_start_cn78xxp1 {
+               u64 addr : 49;
+               u64 reserved_0_14 : 15;
+       } cn78xxp1;
+       struct cvmx_pemx_p2n_bar0_start_cn61xx cnf71xx;
+       struct cvmx_pemx_p2n_bar0_start_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_p2n_bar0_start cvmx_pemx_p2n_bar0_start_t;
+
+/**
+ * cvmx_pem#_p2n_bar1_start
+ *
+ * This register specifies the starting address for memory requests that are to be forwarded to
+ * the SLI in RC mode.
+ */
+union cvmx_pemx_p2n_bar1_start {
+       u64 u64;
+       struct cvmx_pemx_p2n_bar1_start_s {
+               u64 addr : 38;
+               u64 reserved_0_25 : 26;
+       } s;
+       struct cvmx_pemx_p2n_bar1_start_s cn61xx;
+       struct cvmx_pemx_p2n_bar1_start_s cn63xx;
+       struct cvmx_pemx_p2n_bar1_start_s cn63xxp1;
+       struct cvmx_pemx_p2n_bar1_start_s cn66xx;
+       struct cvmx_pemx_p2n_bar1_start_s cn68xx;
+       struct cvmx_pemx_p2n_bar1_start_s cn68xxp1;
+       struct cvmx_pemx_p2n_bar1_start_s cn70xx;
+       struct cvmx_pemx_p2n_bar1_start_s cn70xxp1;
+       struct cvmx_pemx_p2n_bar1_start_s cn73xx;
+       struct cvmx_pemx_p2n_bar1_start_s cn78xx;
+       struct cvmx_pemx_p2n_bar1_start_s cn78xxp1;
+       struct cvmx_pemx_p2n_bar1_start_s cnf71xx;
+       struct cvmx_pemx_p2n_bar1_start_s cnf75xx;
+};
+
+typedef union cvmx_pemx_p2n_bar1_start cvmx_pemx_p2n_bar1_start_t;
+
+/**
+ * cvmx_pem#_p2n_bar2_start
+ *
+ * This register specifies the starting address for memory requests that are to be forwarded to
+ * the SLI in RC mode.
+ */
+union cvmx_pemx_p2n_bar2_start {
+       u64 u64;
+       struct cvmx_pemx_p2n_bar2_start_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx {
+               u64 addr : 23;
+               u64 reserved_0_40 : 41;
+       } cn61xx;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cn63xx;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cn63xxp1;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cn66xx;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cn68xx;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cn68xxp1;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cn70xx;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cn70xxp1;
+       struct cvmx_pemx_p2n_bar2_start_cn73xx {
+               u64 addr : 19;
+               u64 reserved_0_44 : 45;
+       } cn73xx;
+       struct cvmx_pemx_p2n_bar2_start_cn73xx cn78xx;
+       struct cvmx_pemx_p2n_bar2_start_cn73xx cn78xxp1;
+       struct cvmx_pemx_p2n_bar2_start_cn61xx cnf71xx;
+       struct cvmx_pemx_p2n_bar2_start_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_p2n_bar2_start cvmx_pemx_p2n_bar2_start_t;
+
+/**
+ * cvmx_pem#_p2p_bar#_end
+ *
+ * This register specifies the ending address for memory requests that are to be forwarded to the
+ * PCIe peer port.
+ */
+union cvmx_pemx_p2p_barx_end {
+       u64 u64;
+       struct cvmx_pemx_p2p_barx_end_s {
+               u64 addr : 52;
+               u64 reserved_0_11 : 12;
+       } s;
+       struct cvmx_pemx_p2p_barx_end_s cn63xx;
+       struct cvmx_pemx_p2p_barx_end_s cn63xxp1;
+       struct cvmx_pemx_p2p_barx_end_s cn66xx;
+       struct cvmx_pemx_p2p_barx_end_s cn68xx;
+       struct cvmx_pemx_p2p_barx_end_s cn68xxp1;
+       struct cvmx_pemx_p2p_barx_end_s cn73xx;
+       struct cvmx_pemx_p2p_barx_end_s cn78xx;
+       struct cvmx_pemx_p2p_barx_end_s cn78xxp1;
+       struct cvmx_pemx_p2p_barx_end_s cnf75xx;
+};
+
+typedef union cvmx_pemx_p2p_barx_end cvmx_pemx_p2p_barx_end_t;
+
+/**
+ * cvmx_pem#_p2p_bar#_start
+ *
+ * This register specifies the starting address for memory requests that are to be forwarded to
+ * the PCIe peer port.
+ */
+union cvmx_pemx_p2p_barx_start {
+       u64 u64;
+       struct cvmx_pemx_p2p_barx_start_s {
+               u64 addr : 52;
+               u64 reserved_2_11 : 10;
+               u64 dst : 2;
+       } s;
+       struct cvmx_pemx_p2p_barx_start_cn63xx {
+               u64 addr : 52;
+               u64 reserved_0_11 : 12;
+       } cn63xx;
+       struct cvmx_pemx_p2p_barx_start_cn63xx cn63xxp1;
+       struct cvmx_pemx_p2p_barx_start_cn63xx cn66xx;
+       struct cvmx_pemx_p2p_barx_start_cn63xx cn68xx;
+       struct cvmx_pemx_p2p_barx_start_cn63xx cn68xxp1;
+       struct cvmx_pemx_p2p_barx_start_s cn73xx;
+       struct cvmx_pemx_p2p_barx_start_s cn78xx;
+       struct cvmx_pemx_p2p_barx_start_s cn78xxp1;
+       struct cvmx_pemx_p2p_barx_start_s cnf75xx;
+};
+
+typedef union cvmx_pemx_p2p_barx_start cvmx_pemx_p2p_barx_start_t;
+
+/**
+ * cvmx_pem#_qlm
+ *
+ * This register configures the PEM3 QLM.
+ *
+ */
+union cvmx_pemx_qlm {
+       u64 u64;
+       struct cvmx_pemx_qlm_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pemx_qlm_cn73xx {
+               u64 reserved_1_63 : 63;
+               u64 pemdlmsel : 1;
+       } cn73xx;
+       struct cvmx_pemx_qlm_cn78xx {
+               u64 reserved_1_63 : 63;
+               u64 pem3qlm : 1;
+       } cn78xx;
+       struct cvmx_pemx_qlm_cn78xx cn78xxp1;
+       struct cvmx_pemx_qlm_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_qlm cvmx_pemx_qlm_t;
+
+/**
+ * cvmx_pem#_spi_ctl
+ *
+ * PEM#_SPI_CTL register.
+ *
+ */
+union cvmx_pemx_spi_ctl {
+       u64 u64;
+       struct cvmx_pemx_spi_ctl_s {
+               u64 reserved_14_63 : 50;
+               u64 start_busy : 1;
+               u64 tvalid : 1;
+               u64 cmd : 3;
+               u64 adr : 9;
+       } s;
+       struct cvmx_pemx_spi_ctl_s cn70xx;
+       struct cvmx_pemx_spi_ctl_s cn70xxp1;
+       struct cvmx_pemx_spi_ctl_s cn73xx;
+       struct cvmx_pemx_spi_ctl_s cn78xx;
+       struct cvmx_pemx_spi_ctl_s cn78xxp1;
+       struct cvmx_pemx_spi_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pemx_spi_ctl cvmx_pemx_spi_ctl_t;
+
+/**
+ * cvmx_pem#_spi_data
+ *
+ * This register contains the most recently read or written SPI data and is unpredictable upon
+ * power-up. Is valid after a PEM()_SPI_CTL[CMD]=READ/RDSR when hardware clears
+ * PEM()_SPI_CTL[START_BUSY]. Is written after a PEM()_SPI_CTL[CMD]=WRITE/WRSR
+ * when hardware clears PEM()_SPI_CTL[START_BUSY].
+ */
+union cvmx_pemx_spi_data {
+       u64 u64;
+       struct cvmx_pemx_spi_data_s {
+               u64 preamble : 16;
+               u64 reserved_45_47 : 3;
+               u64 cs2 : 1;
+               u64 adr : 12;
+               u64 data : 32;
+       } s;
+       struct cvmx_pemx_spi_data_s cn70xx;
+       struct cvmx_pemx_spi_data_s cn70xxp1;
+       struct cvmx_pemx_spi_data_s cn73xx;
+       struct cvmx_pemx_spi_data_s cn78xx;
+       struct cvmx_pemx_spi_data_s cn78xxp1;
+       struct cvmx_pemx_spi_data_s cnf75xx;
+};
+
+typedef union cvmx_pemx_spi_data cvmx_pemx_spi_data_t;
+
+/**
+ * cvmx_pem#_strap
+ *
+ * "Below are in pesc_csr
+ * The input strapping pins"
+ */
+union cvmx_pemx_strap {
+       u64 u64;
+       struct cvmx_pemx_strap_s {
+               u64 reserved_5_63 : 59;
+               u64 miopem2dlm5sel : 1;
+               u64 pilaneswap : 1;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_pemx_strap_cn70xx {
+               u64 reserved_4_63 : 60;
+               u64 pilaneswap : 1;
+               u64 pimode : 3;
+       } cn70xx;
+       struct cvmx_pemx_strap_cn70xx cn70xxp1;
+       struct cvmx_pemx_strap_cn73xx {
+               u64 reserved_5_63 : 59;
+               u64 miopem2dlm5sel : 1;
+               u64 pilaneswap : 1;
+               u64 pilanes8 : 1;
+               u64 pimode : 2;
+       } cn73xx;
+       struct cvmx_pemx_strap_cn78xx {
+               u64 reserved_4_63 : 60;
+               u64 pilaneswap : 1;
+               u64 pilanes8 : 1;
+               u64 pimode : 2;
+       } cn78xx;
+       struct cvmx_pemx_strap_cn78xx cn78xxp1;
+       struct cvmx_pemx_strap_cnf75xx {
+               u64 reserved_5_63 : 59;
+               u64 miopem2dlm5sel : 1;
+               u64 pilaneswap : 1;
+               u64 pilanes4 : 1;
+               u64 pimode : 2;
+       } cnf75xx;
+};
+
+typedef union cvmx_pemx_strap cvmx_pemx_strap_t;
+
+/**
+ * cvmx_pem#_tlp_credits
+ *
+ * This register specifies the number of credits for use in moving TLPs. When this register is
+ * written, the credit values are reset to the register value. A write to this register should
+ * take place before traffic flow starts.
+ */
+union cvmx_pemx_tlp_credits {
+       u64 u64;
+       struct cvmx_pemx_tlp_credits_s {
+               u64 reserved_56_63 : 8;
+               u64 peai_ppf : 8;
+               u64 pem_cpl : 8;
+               u64 pem_np : 8;
+               u64 pem_p : 8;
+               u64 sli_cpl : 8;
+               u64 sli_np : 8;
+               u64 sli_p : 8;
+       } s;
+       struct cvmx_pemx_tlp_credits_cn61xx {
+               u64 reserved_56_63 : 8;
+               u64 peai_ppf : 8;
+               u64 reserved_24_47 : 24;
+               u64 sli_cpl : 8;
+               u64 sli_np : 8;
+               u64 sli_p : 8;
+       } cn61xx;
+       struct cvmx_pemx_tlp_credits_s cn63xx;
+       struct cvmx_pemx_tlp_credits_s cn63xxp1;
+       struct cvmx_pemx_tlp_credits_s cn66xx;
+       struct cvmx_pemx_tlp_credits_s cn68xx;
+       struct cvmx_pemx_tlp_credits_s cn68xxp1;
+       struct cvmx_pemx_tlp_credits_cn61xx cn70xx;
+       struct cvmx_pemx_tlp_credits_cn61xx cn70xxp1;
+       struct cvmx_pemx_tlp_credits_cn73xx {
+               u64 reserved_48_63 : 16;
+               u64 pem_cpl : 8;
+               u64 pem_np : 8;
+               u64 pem_p : 8;
+               u64 sli_cpl : 8;
+               u64 sli_np : 8;
+               u64 sli_p : 8;
+       } cn73xx;
+       struct cvmx_pemx_tlp_credits_cn73xx cn78xx;
+       struct cvmx_pemx_tlp_credits_cn73xx cn78xxp1;
+       struct cvmx_pemx_tlp_credits_cn61xx cnf71xx;
+       struct cvmx_pemx_tlp_credits_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pemx_tlp_credits cvmx_pemx_tlp_credits_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pexp-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pexp-defs.h
new file mode 100644 (file)
index 0000000..333c2ca
--- /dev/null
@@ -0,0 +1,1382 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) definitions for
+ * OCTEON PEXP.
+ */
+
+#ifndef __CVMX_PEXP_DEFS_H__
+#define __CVMX_PEXP_DEFS_H__
+
+#define CVMX_PEXP_NPEI_BAR1_INDEXX(offset)     (0x00011F0000008000ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_BIST_STATUS             (0x00011F0000008580ull)
+#define CVMX_PEXP_NPEI_BIST_STATUS2            (0x00011F0000008680ull)
+#define CVMX_PEXP_NPEI_CTL_PORT0               (0x00011F0000008250ull)
+#define CVMX_PEXP_NPEI_CTL_PORT1               (0x00011F0000008260ull)
+#define CVMX_PEXP_NPEI_CTL_STATUS              (0x00011F0000008570ull)
+#define CVMX_PEXP_NPEI_CTL_STATUS2             (0x00011F000000BC00ull)
+#define CVMX_PEXP_NPEI_DATA_OUT_CNT            (0x00011F00000085F0ull)
+#define CVMX_PEXP_NPEI_DBG_DATA                        (0x00011F0000008510ull)
+#define CVMX_PEXP_NPEI_DBG_SELECT              (0x00011F0000008500ull)
+#define CVMX_PEXP_NPEI_DMA0_INT_LEVEL          (0x00011F00000085C0ull)
+#define CVMX_PEXP_NPEI_DMA1_INT_LEVEL          (0x00011F00000085D0ull)
+#define CVMX_PEXP_NPEI_DMAX_COUNTS(offset)     (0x00011F0000008450ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_NPEI_DMAX_DBELL(offset)      (0x00011F00000083B0ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_NPEI_DMAX_IBUFF_SADDR(offset) (0x00011F0000008400ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_NPEI_DMAX_NADDR(offset)      (0x00011F00000084A0ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_NPEI_DMA_CNTS                        (0x00011F00000085E0ull)
+#define CVMX_PEXP_NPEI_DMA_CONTROL             (0x00011F00000083A0ull)
+#define CVMX_PEXP_NPEI_DMA_PCIE_REQ_NUM                (0x00011F00000085B0ull)
+#define CVMX_PEXP_NPEI_DMA_STATE1              (0x00011F00000086C0ull)
+#define CVMX_PEXP_NPEI_DMA_STATE1_P1           (0x00011F0000008680ull)
+#define CVMX_PEXP_NPEI_DMA_STATE2              (0x00011F00000086D0ull)
+#define CVMX_PEXP_NPEI_DMA_STATE2_P1           (0x00011F0000008690ull)
+#define CVMX_PEXP_NPEI_DMA_STATE3_P1           (0x00011F00000086A0ull)
+#define CVMX_PEXP_NPEI_DMA_STATE4_P1           (0x00011F00000086B0ull)
+#define CVMX_PEXP_NPEI_DMA_STATE5_P1           (0x00011F00000086C0ull)
+#define CVMX_PEXP_NPEI_INT_A_ENB               (0x00011F0000008560ull)
+#define CVMX_PEXP_NPEI_INT_A_ENB2              (0x00011F000000BCE0ull)
+#define CVMX_PEXP_NPEI_INT_A_SUM               (0x00011F0000008550ull)
+#define CVMX_PEXP_NPEI_INT_ENB                 (0x00011F0000008540ull)
+#define CVMX_PEXP_NPEI_INT_ENB2                        (0x00011F000000BCD0ull)
+#define CVMX_PEXP_NPEI_INT_INFO                        (0x00011F0000008590ull)
+#define CVMX_PEXP_NPEI_INT_SUM                 (0x00011F0000008530ull)
+#define CVMX_PEXP_NPEI_INT_SUM2                        (0x00011F000000BCC0ull)
+#define CVMX_PEXP_NPEI_LAST_WIN_RDATA0         (0x00011F0000008600ull)
+#define CVMX_PEXP_NPEI_LAST_WIN_RDATA1         (0x00011F0000008610ull)
+#define CVMX_PEXP_NPEI_MEM_ACCESS_CTL          (0x00011F00000084F0ull)
+#define CVMX_PEXP_NPEI_MEM_ACCESS_SUBIDX(offset)                                                   \
+       (0x00011F0000008280ull + ((offset) & 31) * 16 - 16 * 12)
+#define CVMX_PEXP_NPEI_MSI_ENB0                              (0x00011F000000BC50ull)
+#define CVMX_PEXP_NPEI_MSI_ENB1                              (0x00011F000000BC60ull)
+#define CVMX_PEXP_NPEI_MSI_ENB2                              (0x00011F000000BC70ull)
+#define CVMX_PEXP_NPEI_MSI_ENB3                              (0x00011F000000BC80ull)
+#define CVMX_PEXP_NPEI_MSI_RCV0                              (0x00011F000000BC10ull)
+#define CVMX_PEXP_NPEI_MSI_RCV1                              (0x00011F000000BC20ull)
+#define CVMX_PEXP_NPEI_MSI_RCV2                              (0x00011F000000BC30ull)
+#define CVMX_PEXP_NPEI_MSI_RCV3                              (0x00011F000000BC40ull)
+#define CVMX_PEXP_NPEI_MSI_RD_MAP                    (0x00011F000000BCA0ull)
+#define CVMX_PEXP_NPEI_MSI_W1C_ENB0                  (0x00011F000000BCF0ull)
+#define CVMX_PEXP_NPEI_MSI_W1C_ENB1                  (0x00011F000000BD00ull)
+#define CVMX_PEXP_NPEI_MSI_W1C_ENB2                  (0x00011F000000BD10ull)
+#define CVMX_PEXP_NPEI_MSI_W1C_ENB3                  (0x00011F000000BD20ull)
+#define CVMX_PEXP_NPEI_MSI_W1S_ENB0                  (0x00011F000000BD30ull)
+#define CVMX_PEXP_NPEI_MSI_W1S_ENB1                  (0x00011F000000BD40ull)
+#define CVMX_PEXP_NPEI_MSI_W1S_ENB2                  (0x00011F000000BD50ull)
+#define CVMX_PEXP_NPEI_MSI_W1S_ENB3                  (0x00011F000000BD60ull)
+#define CVMX_PEXP_NPEI_MSI_WR_MAP                    (0x00011F000000BC90ull)
+#define CVMX_PEXP_NPEI_PCIE_CREDIT_CNT               (0x00011F000000BD70ull)
+#define CVMX_PEXP_NPEI_PCIE_MSI_RCV                  (0x00011F000000BCB0ull)
+#define CVMX_PEXP_NPEI_PCIE_MSI_RCV_B1               (0x00011F0000008650ull)
+#define CVMX_PEXP_NPEI_PCIE_MSI_RCV_B2               (0x00011F0000008660ull)
+#define CVMX_PEXP_NPEI_PCIE_MSI_RCV_B3               (0x00011F0000008670ull)
+#define CVMX_PEXP_NPEI_PKTX_CNTS(offset)             (0x00011F000000A400ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_INSTR_BADDR(offset)              (0x00011F000000A800ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_INSTR_BAOFF_DBELL(offset) (0x00011F000000AC00ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_INSTR_FIFO_RSIZE(offset)  (0x00011F000000B000ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_INSTR_HEADER(offset)      (0x00011F000000B400ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_IN_BP(offset)            (0x00011F000000B800ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_SLIST_BADDR(offset)              (0x00011F0000009400ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_SLIST_BAOFF_DBELL(offset) (0x00011F0000009800ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKTX_SLIST_FIFO_RSIZE(offset)  (0x00011F0000009C00ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKT_CNT_INT                   (0x00011F0000009110ull)
+#define CVMX_PEXP_NPEI_PKT_CNT_INT_ENB               (0x00011F0000009130ull)
+#define CVMX_PEXP_NPEI_PKT_DATA_OUT_ES               (0x00011F00000090B0ull)
+#define CVMX_PEXP_NPEI_PKT_DATA_OUT_NS               (0x00011F00000090A0ull)
+#define CVMX_PEXP_NPEI_PKT_DATA_OUT_ROR                      (0x00011F0000009090ull)
+#define CVMX_PEXP_NPEI_PKT_DPADDR                    (0x00011F0000009080ull)
+#define CVMX_PEXP_NPEI_PKT_INPUT_CONTROL             (0x00011F0000009150ull)
+#define CVMX_PEXP_NPEI_PKT_INSTR_ENB                 (0x00011F0000009000ull)
+#define CVMX_PEXP_NPEI_PKT_INSTR_RD_SIZE             (0x00011F0000009190ull)
+#define CVMX_PEXP_NPEI_PKT_INSTR_SIZE                (0x00011F0000009020ull)
+#define CVMX_PEXP_NPEI_PKT_INT_LEVELS                (0x00011F0000009100ull)
+#define CVMX_PEXP_NPEI_PKT_IN_BP                     (0x00011F00000086B0ull)
+#define CVMX_PEXP_NPEI_PKT_IN_DONEX_CNTS(offset)      (0x00011F000000A000ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_NPEI_PKT_IN_INSTR_COUNTS           (0x00011F00000086A0ull)
+#define CVMX_PEXP_NPEI_PKT_IN_PCIE_PORT                      (0x00011F00000091A0ull)
+#define CVMX_PEXP_NPEI_PKT_IPTR                              (0x00011F0000009070ull)
+#define CVMX_PEXP_NPEI_PKT_OUTPUT_WMARK                      (0x00011F0000009160ull)
+#define CVMX_PEXP_NPEI_PKT_OUT_BMODE                 (0x00011F00000090D0ull)
+#define CVMX_PEXP_NPEI_PKT_OUT_ENB                   (0x00011F0000009010ull)
+#define CVMX_PEXP_NPEI_PKT_PCIE_PORT                 (0x00011F00000090E0ull)
+#define CVMX_PEXP_NPEI_PKT_PORT_IN_RST               (0x00011F0000008690ull)
+#define CVMX_PEXP_NPEI_PKT_SLIST_ES                  (0x00011F0000009050ull)
+#define CVMX_PEXP_NPEI_PKT_SLIST_ID_SIZE             (0x00011F0000009180ull)
+#define CVMX_PEXP_NPEI_PKT_SLIST_NS                  (0x00011F0000009040ull)
+#define CVMX_PEXP_NPEI_PKT_SLIST_ROR                 (0x00011F0000009030ull)
+#define CVMX_PEXP_NPEI_PKT_TIME_INT                  (0x00011F0000009120ull)
+#define CVMX_PEXP_NPEI_PKT_TIME_INT_ENB                      (0x00011F0000009140ull)
+#define CVMX_PEXP_NPEI_RSL_INT_BLOCKS                (0x00011F0000008520ull)
+#define CVMX_PEXP_NPEI_SCRATCH_1                     (0x00011F0000008270ull)
+#define CVMX_PEXP_NPEI_STATE1                        (0x00011F0000008620ull)
+#define CVMX_PEXP_NPEI_STATE2                        (0x00011F0000008630ull)
+#define CVMX_PEXP_NPEI_STATE3                        (0x00011F0000008640ull)
+#define CVMX_PEXP_NPEI_WINDOW_CTL                    (0x00011F0000008380ull)
+#define CVMX_PEXP_NQM_VFX_ACQ(offset)                (0x0001450000000030ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_AQA(offset)                (0x0001450000000024ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_ASQ(offset)                (0x0001450000000028ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_CAP(offset)                (0x0001450000000000ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_CC(offset)                 (0x0001450000000014ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_CQX_HDBL(offset, block_id)                                               \
+       (0x0001450000001004ull + (((offset) & 31) + ((block_id) & 2047) * 0x4000ull) * 8)
+#define CVMX_PEXP_NQM_VFX_CSTS(offset)    (0x000145000000001Cull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_INTMC(offset)           (0x0001450000000010ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_INTMS(offset)           (0x000145000000000Cull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_MSIX_PBA(offset) (0x0001450000010200ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_NSSR(offset)    (0x0001450000000020ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_NQM_VFX_SQX_TDBL(offset, block_id)                                               \
+       (0x0001450000001000ull + (((offset) & 31) + ((block_id) & 2047) * 0x4000ull) * 8)
+#define CVMX_PEXP_NQM_VFX_VECX_MSIX_ADDR(offset, block_id)                                         \
+       (0x0001450000010000ull + (((offset) & 31) + ((block_id) & 2047) * 0x2000ull) * 16)
+#define CVMX_PEXP_NQM_VFX_VECX_MSIX_CTL(offset, block_id)                                          \
+       (0x0001450000010008ull + (((offset) & 31) + ((block_id) & 2047) * 0x2000ull) * 16)
+#define CVMX_PEXP_NQM_VFX_VS(offset)            (0x0001450000000008ull + ((offset) & 2047) * 0x20000ull)
+#define CVMX_PEXP_SLITB_MSIXX_TABLE_ADDR(offset) (0x00011F0000004000ull + ((offset) & 127) * 16)
+#define CVMX_PEXP_SLITB_MSIXX_TABLE_DATA(offset) (0x00011F0000004008ull + ((offset) & 127) * 16)
+#define CVMX_PEXP_SLITB_MSIX_MACX_PFX_TABLE_ADDR(offset, block_id)                                 \
+       (0x00011F0000002000ull + ((offset) & 1) * 4096 + ((block_id) & 3) * 0x10ull)
+#define CVMX_PEXP_SLITB_MSIX_MACX_PFX_TABLE_DATA(offset, block_id)                                 \
+       (0x00011F0000002008ull + ((offset) & 1) * 4096 + ((block_id) & 3) * 0x10ull)
+#define CVMX_PEXP_SLITB_PFX_PKT_CNT_INT(offset)         (0x00011F0000008000ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_SLITB_PFX_PKT_INT(offset)     (0x00011F0000008300ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_SLITB_PFX_PKT_IN_INT(offset)  (0x00011F0000008200ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_SLITB_PFX_PKT_RING_RST(offset) (0x00011F0000008400ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_SLITB_PFX_PKT_TIME_INT(offset) (0x00011F0000008100ull + ((offset) & 7) * 16)
+#define CVMX_PEXP_SLITB_PKTX_PF_VF_MBOX_SIGX(offset, block_id)                                     \
+       (0x00011F0000011000ull + (((offset) & 1) + ((block_id) & 127) * 0x4000ull) * 8)
+#define CVMX_PEXP_SLI_BIST_STATUS CVMX_PEXP_SLI_BIST_STATUS_FUNC()
+static inline u64 CVMX_PEXP_SLI_BIST_STATUS_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010580ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010580ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028580ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028580ull;
+       }
+       return 0x00011F0000028580ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_CTL_PORTX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010050ull + (offset) * 16;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010050ull + (offset) * 16;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010050ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000106E0ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000286E0ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000286E0ull + (offset) * 16;
+       }
+       return 0x00011F00000286E0ull + (offset) * 16;
+}
+
+#define CVMX_PEXP_SLI_CTL_STATUS CVMX_PEXP_SLI_CTL_STATUS_FUNC()
+static inline u64 CVMX_PEXP_SLI_CTL_STATUS_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010570ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010570ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028570ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028570ull;
+       }
+       return 0x00011F0000028570ull;
+}
+
+#define CVMX_PEXP_SLI_DATA_OUT_CNT CVMX_PEXP_SLI_DATA_OUT_CNT_FUNC()
+static inline u64 CVMX_PEXP_SLI_DATA_OUT_CNT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000105F0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000105F0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000285F0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000285F0ull;
+       }
+       return 0x00011F00000285F0ull;
+}
+
+#define CVMX_PEXP_SLI_DBG_DATA  (0x00011F0000010310ull)
+#define CVMX_PEXP_SLI_DBG_SELECT (0x00011F0000010300ull)
+static inline u64 CVMX_PEXP_SLI_DMAX_CNT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010400ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028400ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028400ull + (offset) * 16;
+       }
+       return 0x00011F0000028400ull + (offset) * 16;
+}
+
+static inline u64 CVMX_PEXP_SLI_DMAX_INT_LEVEL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000103E0ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000103E0ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000283E0ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000283E0ull + (offset) * 16;
+       }
+       return 0x00011F00000283E0ull + (offset) * 16;
+}
+
+static inline u64 CVMX_PEXP_SLI_DMAX_TIM(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010420ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010420ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028420ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028420ull + (offset) * 16;
+       }
+       return 0x00011F0000028420ull + (offset) * 16;
+}
+
+#define CVMX_PEXP_SLI_INT_ENB_CIU          (0x00011F0000013CD0ull)
+#define CVMX_PEXP_SLI_INT_ENB_PORTX(offset) (0x00011F0000010340ull + ((offset) & 3) * 16)
+#define CVMX_PEXP_SLI_INT_SUM              (0x00011F0000010330ull)
+#define CVMX_PEXP_SLI_LAST_WIN_RDATA0      (0x00011F0000010600ull)
+#define CVMX_PEXP_SLI_LAST_WIN_RDATA1      (0x00011F0000010610ull)
+#define CVMX_PEXP_SLI_LAST_WIN_RDATA2      (0x00011F00000106C0ull)
+#define CVMX_PEXP_SLI_LAST_WIN_RDATA3      (0x00011F00000106D0ull)
+#define CVMX_PEXP_SLI_MACX_PFX_DMA_VF_INT(offset, block_id)                                        \
+       (0x00011F0000027280ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_DMA_VF_INT_ENB(offset, block_id)                                    \
+       (0x00011F0000027500ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_FLR_VF_INT(offset, block_id)                                        \
+       (0x00011F0000027400ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_INT_ENB(offset, block_id)                                           \
+       (0x00011F0000027080ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_INT_SUM(offset, block_id)                                           \
+       (0x00011F0000027000ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_MBOX_INT(offset, block_id)                                          \
+       (0x00011F0000027380ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_PKT_VF_INT(offset, block_id)                                        \
+       (0x00011F0000027300ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_PKT_VF_INT_ENB(offset, block_id)                                    \
+       (0x00011F0000027580ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_PP_VF_INT(offset, block_id)                                         \
+       (0x00011F0000027200ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MACX_PFX_PP_VF_INT_ENB(offset, block_id)                                     \
+       (0x00011F0000027480ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_MAC_CREDIT_CNT CVMX_PEXP_SLI_MAC_CREDIT_CNT_FUNC()
+static inline u64 CVMX_PEXP_SLI_MAC_CREDIT_CNT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013D70ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013D70ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023D70ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023D70ull;
+       }
+       return 0x00011F0000023D70ull;
+}
+
+#define CVMX_PEXP_SLI_MAC_CREDIT_CNT2 CVMX_PEXP_SLI_MAC_CREDIT_CNT2_FUNC()
+static inline u64 CVMX_PEXP_SLI_MAC_CREDIT_CNT2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013E10ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013E10ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023E10ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023E10ull;
+       }
+       return 0x00011F0000023E10ull;
+}
+
+#define CVMX_PEXP_SLI_MEM_ACCESS_CTL CVMX_PEXP_SLI_MEM_ACCESS_CTL_FUNC()
+static inline u64 CVMX_PEXP_SLI_MEM_ACCESS_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000102F0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000102F0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000282F0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000282F0ull;
+       }
+       return 0x00011F00000282F0ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_MEM_ACCESS_SUBIDX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000100E0ull + (offset) * 16 - 16 * 12;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000100E0ull + (offset) * 16 - 16 * 12;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000280E0ull + (offset) * 16 - 16 * 12;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000280E0ull + (offset) * 16 - 16 * 12;
+       }
+       return 0x00011F00000280E0ull + (offset) * 16 - 16 * 12;
+}
+
+#define CVMX_PEXP_SLI_MEM_CTL CVMX_PEXP_SLI_MEM_CTL_FUNC()
+static inline u64 CVMX_PEXP_SLI_MEM_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000105E0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000285E0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000285E0ull;
+       }
+       return 0x00011F00000285E0ull;
+}
+
+#define CVMX_PEXP_SLI_MEM_INT_SUM CVMX_PEXP_SLI_MEM_INT_SUM_FUNC()
+static inline u64 CVMX_PEXP_SLI_MEM_INT_SUM_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000105D0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000285D0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000285D0ull;
+       }
+       return 0x00011F00000285D0ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_MSIXX_TABLE_ADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000016000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000000000ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000000000ull + (offset) * 16;
+       }
+       return 0x00011F0000000000ull + (offset) * 16;
+}
+
+static inline u64 CVMX_PEXP_SLI_MSIXX_TABLE_DATA(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000016008ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000000008ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000000008ull + (offset) * 16;
+       }
+       return 0x00011F0000000008ull + (offset) * 16;
+}
+
+#define CVMX_PEXP_SLI_MSIX_MACX_PF_TABLE_ADDR(offset) (0x00011F0000017C00ull + ((offset) & 3) * 16)
+#define CVMX_PEXP_SLI_MSIX_MACX_PF_TABLE_DATA(offset) (0x00011F0000017C08ull + ((offset) & 3) * 16)
+#define CVMX_PEXP_SLI_MSIX_PBA0                              CVMX_PEXP_SLI_MSIX_PBA0_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSIX_PBA0_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000017000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000001000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000001000ull;
+       }
+       return 0x00011F0000001000ull;
+}
+
+#define CVMX_PEXP_SLI_MSIX_PBA1 CVMX_PEXP_SLI_MSIX_PBA1_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSIX_PBA1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000017010ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000001008ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000001008ull;
+       }
+       return 0x00011F0000001008ull;
+}
+
+#define CVMX_PEXP_SLI_MSI_ENB0 (0x00011F0000013C50ull)
+#define CVMX_PEXP_SLI_MSI_ENB1 (0x00011F0000013C60ull)
+#define CVMX_PEXP_SLI_MSI_ENB2 (0x00011F0000013C70ull)
+#define CVMX_PEXP_SLI_MSI_ENB3 (0x00011F0000013C80ull)
+#define CVMX_PEXP_SLI_MSI_RCV0 CVMX_PEXP_SLI_MSI_RCV0_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSI_RCV0_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013C10ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013C10ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023C10ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023C10ull;
+       }
+       return 0x00011F0000023C10ull;
+}
+
+#define CVMX_PEXP_SLI_MSI_RCV1 CVMX_PEXP_SLI_MSI_RCV1_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSI_RCV1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013C20ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013C20ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023C20ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023C20ull;
+       }
+       return 0x00011F0000023C20ull;
+}
+
+#define CVMX_PEXP_SLI_MSI_RCV2 CVMX_PEXP_SLI_MSI_RCV2_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSI_RCV2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013C30ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013C30ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023C30ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023C30ull;
+       }
+       return 0x00011F0000023C30ull;
+}
+
+#define CVMX_PEXP_SLI_MSI_RCV3 CVMX_PEXP_SLI_MSI_RCV3_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSI_RCV3_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013C40ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013C40ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023C40ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023C40ull;
+       }
+       return 0x00011F0000023C40ull;
+}
+
+#define CVMX_PEXP_SLI_MSI_RD_MAP CVMX_PEXP_SLI_MSI_RD_MAP_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSI_RD_MAP_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013CA0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013CA0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023CA0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023CA0ull;
+       }
+       return 0x00011F0000023CA0ull;
+}
+
+#define CVMX_PEXP_SLI_MSI_W1C_ENB0 (0x00011F0000013CF0ull)
+#define CVMX_PEXP_SLI_MSI_W1C_ENB1 (0x00011F0000013D00ull)
+#define CVMX_PEXP_SLI_MSI_W1C_ENB2 (0x00011F0000013D10ull)
+#define CVMX_PEXP_SLI_MSI_W1C_ENB3 (0x00011F0000013D20ull)
+#define CVMX_PEXP_SLI_MSI_W1S_ENB0 (0x00011F0000013D30ull)
+#define CVMX_PEXP_SLI_MSI_W1S_ENB1 (0x00011F0000013D40ull)
+#define CVMX_PEXP_SLI_MSI_W1S_ENB2 (0x00011F0000013D50ull)
+#define CVMX_PEXP_SLI_MSI_W1S_ENB3 (0x00011F0000013D60ull)
+#define CVMX_PEXP_SLI_MSI_WR_MAP   CVMX_PEXP_SLI_MSI_WR_MAP_FUNC()
+static inline u64 CVMX_PEXP_SLI_MSI_WR_MAP_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013C90ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013C90ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023C90ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023C90ull;
+       }
+       return 0x00011F0000023C90ull;
+}
+
+#define CVMX_PEXP_SLI_PCIE_MSI_RCV CVMX_PEXP_SLI_PCIE_MSI_RCV_FUNC()
+static inline u64 CVMX_PEXP_SLI_PCIE_MSI_RCV_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013CB0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013CB0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023CB0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023CB0ull;
+       }
+       return 0x00011F0000023CB0ull;
+}
+
+#define CVMX_PEXP_SLI_PCIE_MSI_RCV_B1 CVMX_PEXP_SLI_PCIE_MSI_RCV_B1_FUNC()
+static inline u64 CVMX_PEXP_SLI_PCIE_MSI_RCV_B1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010650ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010650ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028650ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028650ull;
+       }
+       return 0x00011F0000028650ull;
+}
+
+#define CVMX_PEXP_SLI_PCIE_MSI_RCV_B2 CVMX_PEXP_SLI_PCIE_MSI_RCV_B2_FUNC()
+static inline u64 CVMX_PEXP_SLI_PCIE_MSI_RCV_B2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010660ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010660ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028660ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028660ull;
+       }
+       return 0x00011F0000028660ull;
+}
+
+#define CVMX_PEXP_SLI_PCIE_MSI_RCV_B3 CVMX_PEXP_SLI_PCIE_MSI_RCV_B3_FUNC()
+static inline u64 CVMX_PEXP_SLI_PCIE_MSI_RCV_B3_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010670ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010670ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028670ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028670ull;
+       }
+       return 0x00011F0000028670ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_PKTX_CNTS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000012400ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000012400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000100B0ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000100B0ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F00000100B0ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_PEXP_SLI_PKTX_ERROR_INFO(offset) (0x00011F00000100C0ull + ((offset) & 63) * 0x20000ull)
+static inline u64 CVMX_PEXP_SLI_PKTX_INPUT_CONTROL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000014000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010000ull + (offset) * 0x20000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010000ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010000ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_PKTX_INSTR_BADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000012800ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000012800ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010010ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010010ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010010ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_PKTX_INSTR_BAOFF_DBELL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000012C00ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000012C00ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010020ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010020ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010020ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_PKTX_INSTR_FIFO_RSIZE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013000ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010030ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010030ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010030ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_PEXP_SLI_PKTX_INSTR_HEADER(offset) (0x00011F0000013400ull + ((offset) & 31) * 16)
+static inline u64 CVMX_PEXP_SLI_PKTX_INT_LEVELS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000014400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000100A0ull + (offset) * 0x20000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000100A0ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F00000100A0ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_PEXP_SLI_PKTX_IN_BP(offset)    (0x00011F0000013800ull + ((offset) & 31) * 16)
+#define CVMX_PEXP_SLI_PKTX_MBOX_INT(offset) (0x00011F0000010210ull + ((offset) & 63) * 0x20000ull)
+static inline u64 CVMX_PEXP_SLI_PKTX_OUTPUT_CONTROL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000014800ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010050ull + (offset) * 0x20000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010050ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010050ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_PKTX_OUT_SIZE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010C00ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010C00ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010060ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010060ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010060ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_PEXP_SLI_PKTX_PF_VF_MBOX_SIGX(offset, block_id)                                       \
+       (0x00011F0000010200ull + (((offset) & 1) + ((block_id) & 63) * 0x4000ull) * 8)
+static inline u64 CVMX_PEXP_SLI_PKTX_SLIST_BADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000011400ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010070ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010070ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010070ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_PKTX_SLIST_BAOFF_DBELL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000011800ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011800ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010080ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010080ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010080ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_PEXP_SLI_PKTX_SLIST_FIFO_RSIZE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000011C00ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011C00ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010090ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010090ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010090ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_PEXP_SLI_PKTX_VF_INT_SUM(offset) (0x00011F00000100D0ull + ((offset) & 63) * 0x20000ull)
+#define CVMX_PEXP_SLI_PKTX_VF_SIG(offset)     (0x00011F0000014C00ull + ((offset) & 63) * 16)
+#define CVMX_PEXP_SLI_PKT_BIST_STATUS        (0x00011F0000029220ull)
+#define CVMX_PEXP_SLI_PKT_CNT_INT            CVMX_PEXP_SLI_PKT_CNT_INT_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_CNT_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000011130ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011130ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000029130ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000029130ull;
+       }
+       return 0x00011F0000029130ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_CNT_INT_ENB  (0x00011F0000011150ull)
+#define CVMX_PEXP_SLI_PKT_CTL          (0x00011F0000011220ull)
+#define CVMX_PEXP_SLI_PKT_DATA_OUT_ES  (0x00011F00000110B0ull)
+#define CVMX_PEXP_SLI_PKT_DATA_OUT_NS  (0x00011F00000110A0ull)
+#define CVMX_PEXP_SLI_PKT_DATA_OUT_ROR (0x00011F0000011090ull)
+#define CVMX_PEXP_SLI_PKT_DPADDR       (0x00011F0000011080ull)
+#define CVMX_PEXP_SLI_PKT_GBL_CONTROL  (0x00011F0000029210ull)
+#define CVMX_PEXP_SLI_PKT_INPUT_CONTROL (0x00011F0000011170ull)
+#define CVMX_PEXP_SLI_PKT_INSTR_ENB    (0x00011F0000011000ull)
+#define CVMX_PEXP_SLI_PKT_INSTR_RD_SIZE (0x00011F00000111A0ull)
+#define CVMX_PEXP_SLI_PKT_INSTR_SIZE   (0x00011F0000011020ull)
+#define CVMX_PEXP_SLI_PKT_INT          CVMX_PEXP_SLI_PKT_INT_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011160ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000029160ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000029160ull;
+       }
+       return 0x00011F0000029160ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_INT_LEVELS (0x00011F0000011120ull)
+#define CVMX_PEXP_SLI_PKT_IN_BP             (0x00011F0000011210ull)
+static inline u64 CVMX_PEXP_SLI_PKT_IN_DONEX_CNTS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000012000ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000012000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000010040ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010040ull + (offset) * 0x20000ull;
+       }
+       return 0x00011F0000010040ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_IN_INSTR_COUNTS CVMX_PEXP_SLI_PKT_IN_INSTR_COUNTS_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_IN_INSTR_COUNTS_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000011200ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011200ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000029200ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000029200ull;
+       }
+       return 0x00011F0000029200ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_IN_INT CVMX_PEXP_SLI_PKT_IN_INT_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_IN_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011150ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000029150ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000029150ull;
+       }
+       return 0x00011F0000029150ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_IN_JABBER    (0x00011F0000029170ull)
+#define CVMX_PEXP_SLI_PKT_IN_PCIE_PORT (0x00011F00000111B0ull)
+#define CVMX_PEXP_SLI_PKT_IPTR        (0x00011F0000011070ull)
+#define CVMX_PEXP_SLI_PKT_MAC0_SIG0    (0x00011F0000011300ull)
+#define CVMX_PEXP_SLI_PKT_MAC0_SIG1    (0x00011F0000011310ull)
+#define CVMX_PEXP_SLI_PKT_MAC1_SIG0    (0x00011F0000011320ull)
+#define CVMX_PEXP_SLI_PKT_MAC1_SIG1    (0x00011F0000011330ull)
+#define CVMX_PEXP_SLI_PKT_MACX_PFX_RINFO(offset, block_id)                                         \
+       (0x00011F0000029030ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_PEXP_SLI_PKT_MACX_RINFO(offset) (0x00011F0000011030ull + ((offset) & 3) * 16)
+#define CVMX_PEXP_SLI_PKT_MEM_CTL           CVMX_PEXP_SLI_PKT_MEM_CTL_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_MEM_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011120ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000029120ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000029120ull;
+       }
+       return 0x00011F0000029120ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_OUTPUT_WMARK CVMX_PEXP_SLI_PKT_OUTPUT_WMARK_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_OUTPUT_WMARK_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000011180ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011180ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000029180ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000029180ull;
+       }
+       return 0x00011F0000029180ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_OUT_BMODE     (0x00011F00000110D0ull)
+#define CVMX_PEXP_SLI_PKT_OUT_BP_EN     (0x00011F0000011240ull)
+#define CVMX_PEXP_SLI_PKT_OUT_BP_EN2_W1C (0x00011F0000029290ull)
+#define CVMX_PEXP_SLI_PKT_OUT_BP_EN2_W1S (0x00011F0000029270ull)
+#define CVMX_PEXP_SLI_PKT_OUT_BP_EN_W1C         (0x00011F0000029280ull)
+#define CVMX_PEXP_SLI_PKT_OUT_BP_EN_W1S         (0x00011F0000029260ull)
+#define CVMX_PEXP_SLI_PKT_OUT_ENB       (0x00011F0000011010ull)
+#define CVMX_PEXP_SLI_PKT_PCIE_PORT     (0x00011F00000110E0ull)
+#define CVMX_PEXP_SLI_PKT_PKIND_VALID   (0x00011F0000029190ull)
+#define CVMX_PEXP_SLI_PKT_PORT_IN_RST   (0x00011F00000111F0ull)
+#define CVMX_PEXP_SLI_PKT_RING_RST      CVMX_PEXP_SLI_PKT_RING_RST_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_RING_RST_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000111E0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000291E0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000291E0ull;
+       }
+       return 0x00011F00000291E0ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_SLIST_ES  (0x00011F0000011050ull)
+#define CVMX_PEXP_SLI_PKT_SLIST_NS  (0x00011F0000011040ull)
+#define CVMX_PEXP_SLI_PKT_SLIST_ROR (0x00011F0000011030ull)
+#define CVMX_PEXP_SLI_PKT_TIME_INT  CVMX_PEXP_SLI_PKT_TIME_INT_FUNC()
+static inline u64 CVMX_PEXP_SLI_PKT_TIME_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000011140ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000011140ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000029140ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000029140ull;
+       }
+       return 0x00011F0000029140ull;
+}
+
+#define CVMX_PEXP_SLI_PKT_TIME_INT_ENB   (0x00011F0000011160ull)
+#define CVMX_PEXP_SLI_PORTX_PKIND(offset) (0x00011F0000010800ull + ((offset) & 31) * 16)
+static inline u64 CVMX_PEXP_SLI_S2M_PORTX_CTL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013D80ull + (offset) * 16;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013D80ull + (offset) * 16;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000013D80ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000013D80ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000023D80ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000023D80ull + (offset) * 16;
+       }
+       return 0x00011F0000023D80ull + (offset) * 16;
+}
+
+#define CVMX_PEXP_SLI_SCRATCH_1 CVMX_PEXP_SLI_SCRATCH_1_FUNC()
+static inline u64 CVMX_PEXP_SLI_SCRATCH_1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000103C0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000103C0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000283C0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000283C0ull;
+       }
+       return 0x00011F00000283C0ull;
+}
+
+#define CVMX_PEXP_SLI_SCRATCH_2 CVMX_PEXP_SLI_SCRATCH_2_FUNC()
+static inline u64 CVMX_PEXP_SLI_SCRATCH_2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000103D0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000103D0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000283D0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000283D0ull;
+       }
+       return 0x00011F00000283D0ull;
+}
+
+#define CVMX_PEXP_SLI_STATE1 CVMX_PEXP_SLI_STATE1_FUNC()
+static inline u64 CVMX_PEXP_SLI_STATE1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010620ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010620ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028620ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028620ull;
+       }
+       return 0x00011F0000028620ull;
+}
+
+#define CVMX_PEXP_SLI_STATE2 CVMX_PEXP_SLI_STATE2_FUNC()
+static inline u64 CVMX_PEXP_SLI_STATE2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010630ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010630ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028630ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028630ull;
+       }
+       return 0x00011F0000028630ull;
+}
+
+#define CVMX_PEXP_SLI_STATE3 CVMX_PEXP_SLI_STATE3_FUNC()
+static inline u64 CVMX_PEXP_SLI_STATE3_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000010640ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000010640ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000028640ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000028640ull;
+       }
+       return 0x00011F0000028640ull;
+}
+
+#define CVMX_PEXP_SLI_TX_PIPE   (0x00011F0000011230ull)
+#define CVMX_PEXP_SLI_WINDOW_CTL CVMX_PEXP_SLI_WINDOW_CTL_FUNC()
+static inline u64 CVMX_PEXP_SLI_WINDOW_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000102E0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F00000102E0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F00000282E0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F00000282E0ull;
+       }
+       return 0x00011F00000282E0ull;
+}
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pip-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pip-defs.h
new file mode 100644 (file)
index 0000000..574e80b
--- /dev/null
@@ -0,0 +1,3040 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pip.
+ */
+
+#ifndef __CVMX_PIP_DEFS_H__
+#define __CVMX_PIP_DEFS_H__
+
+#define CVMX_PIP_ALT_SKIP_CFGX(offset)      (0x00011800A0002A00ull + ((offset) & 3) * 8)
+#define CVMX_PIP_BCK_PRS                    (0x00011800A0000038ull)
+#define CVMX_PIP_BIST_STATUS                (0x00011800A0000000ull)
+#define CVMX_PIP_BSEL_EXT_CFGX(offset)      (0x00011800A0002800ull + ((offset) & 3) * 16)
+#define CVMX_PIP_BSEL_EXT_POSX(offset)      (0x00011800A0002808ull + ((offset) & 3) * 16)
+#define CVMX_PIP_BSEL_TBL_ENTX(offset)      (0x00011800A0003000ull + ((offset) & 511) * 8)
+#define CVMX_PIP_CLKEN                      (0x00011800A0000040ull)
+#define CVMX_PIP_CRC_CTLX(offset)           (0x00011800A0000040ull + ((offset) & 1) * 8)
+#define CVMX_PIP_CRC_IVX(offset)            (0x00011800A0000050ull + ((offset) & 1) * 8)
+#define CVMX_PIP_DEC_IPSECX(offset)         (0x00011800A0000080ull + ((offset) & 3) * 8)
+#define CVMX_PIP_DSA_SRC_GRP                (0x00011800A0000190ull)
+#define CVMX_PIP_DSA_VID_GRP                (0x00011800A0000198ull)
+#define CVMX_PIP_FRM_LEN_CHKX(offset)       (0x00011800A0000180ull + ((offset) & 1) * 8)
+#define CVMX_PIP_GBL_CFG                    (0x00011800A0000028ull)
+#define CVMX_PIP_GBL_CTL                    (0x00011800A0000020ull)
+#define CVMX_PIP_HG_PRI_QOS                 (0x00011800A00001A0ull)
+#define CVMX_PIP_INT_EN                             (0x00011800A0000010ull)
+#define CVMX_PIP_INT_REG                    (0x00011800A0000008ull)
+#define CVMX_PIP_IP_OFFSET                  (0x00011800A0000060ull)
+#define CVMX_PIP_PRI_TBLX(offset)           (0x00011800A0004000ull + ((offset) & 255) * 8)
+#define CVMX_PIP_PRT_CFGBX(offset)          (0x00011800A0008000ull + ((offset) & 63) * 8)
+#define CVMX_PIP_PRT_CFGX(offset)           (0x00011800A0000200ull + ((offset) & 63) * 8)
+#define CVMX_PIP_PRT_TAGX(offset)           (0x00011800A0000400ull + ((offset) & 63) * 8)
+#define CVMX_PIP_QOS_DIFFX(offset)          (0x00011800A0000600ull + ((offset) & 63) * 8)
+#define CVMX_PIP_QOS_VLANX(offset)          (0x00011800A00000C0ull + ((offset) & 7) * 8)
+#define CVMX_PIP_QOS_WATCHX(offset)         (0x00011800A0000100ull + ((offset) & 7) * 8)
+#define CVMX_PIP_RAW_WORD                   (0x00011800A00000B0ull)
+#define CVMX_PIP_SFT_RST                    (0x00011800A0000030ull)
+#define CVMX_PIP_STAT0_PRTX(offset)         (0x00011800A0000800ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT0_X(offset)            (0x00011800A0040000ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT10_PRTX(offset)        (0x00011800A0001480ull + ((offset) & 63) * 16)
+#define CVMX_PIP_STAT10_X(offset)           (0x00011800A0040050ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT11_PRTX(offset)        (0x00011800A0001488ull + ((offset) & 63) * 16)
+#define CVMX_PIP_STAT11_X(offset)           (0x00011800A0040058ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT1_PRTX(offset)         (0x00011800A0000808ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT1_X(offset)            (0x00011800A0040008ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT2_PRTX(offset)         (0x00011800A0000810ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT2_X(offset)            (0x00011800A0040010ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT3_PRTX(offset)         (0x00011800A0000818ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT3_X(offset)            (0x00011800A0040018ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT4_PRTX(offset)         (0x00011800A0000820ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT4_X(offset)            (0x00011800A0040020ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT5_PRTX(offset)         (0x00011800A0000828ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT5_X(offset)            (0x00011800A0040028ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT6_PRTX(offset)         (0x00011800A0000830ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT6_X(offset)            (0x00011800A0040030ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT7_PRTX(offset)         (0x00011800A0000838ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT7_X(offset)            (0x00011800A0040038ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT8_PRTX(offset)         (0x00011800A0000840ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT8_X(offset)            (0x00011800A0040040ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT9_PRTX(offset)         (0x00011800A0000848ull + ((offset) & 63) * 80)
+#define CVMX_PIP_STAT9_X(offset)            (0x00011800A0040048ull + ((offset) & 63) * 128)
+#define CVMX_PIP_STAT_CTL                   (0x00011800A0000018ull)
+#define CVMX_PIP_STAT_INB_ERRSX(offset)             (0x00011800A0001A10ull + ((offset) & 63) * 32)
+#define CVMX_PIP_STAT_INB_ERRS_PKNDX(offset) (0x00011800A0020010ull + ((offset) & 63) * 32)
+#define CVMX_PIP_STAT_INB_OCTSX(offset)             (0x00011800A0001A08ull + ((offset) & 63) * 32)
+#define CVMX_PIP_STAT_INB_OCTS_PKNDX(offset) (0x00011800A0020008ull + ((offset) & 63) * 32)
+#define CVMX_PIP_STAT_INB_PKTSX(offset)             (0x00011800A0001A00ull + ((offset) & 63) * 32)
+#define CVMX_PIP_STAT_INB_PKTS_PKNDX(offset) (0x00011800A0020000ull + ((offset) & 63) * 32)
+#define CVMX_PIP_SUB_PKIND_FCSX(offset)             (0x00011800A0080000ull)
+#define CVMX_PIP_TAG_INCX(offset)           (0x00011800A0001800ull + ((offset) & 63) * 8)
+#define CVMX_PIP_TAG_MASK                   (0x00011800A0000070ull)
+#define CVMX_PIP_TAG_SECRET                 (0x00011800A0000068ull)
+#define CVMX_PIP_TODO_ENTRY                 (0x00011800A0000078ull)
+#define CVMX_PIP_VLAN_ETYPESX(offset)       (0x00011800A00001C0ull + ((offset) & 1) * 8)
+#define CVMX_PIP_XSTAT0_PRTX(offset)        (0x00011800A0002000ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT10_PRTX(offset)       (0x00011800A0001700ull + ((offset) & 63) * 16 - 16 * 40)
+#define CVMX_PIP_XSTAT11_PRTX(offset)       (0x00011800A0001708ull + ((offset) & 63) * 16 - 16 * 40)
+#define CVMX_PIP_XSTAT1_PRTX(offset)        (0x00011800A0002008ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT2_PRTX(offset)        (0x00011800A0002010ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT3_PRTX(offset)        (0x00011800A0002018ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT4_PRTX(offset)        (0x00011800A0002020ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT5_PRTX(offset)        (0x00011800A0002028ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT6_PRTX(offset)        (0x00011800A0002030ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT7_PRTX(offset)        (0x00011800A0002038ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT8_PRTX(offset)        (0x00011800A0002040ull + ((offset) & 63) * 80 - 80 * 40)
+#define CVMX_PIP_XSTAT9_PRTX(offset)        (0x00011800A0002048ull + ((offset) & 63) * 80 - 80 * 40)
+
+/**
+ * cvmx_pip_alt_skip_cfg#
+ *
+ * Notes:
+ * The actual SKIP I determined by HW is based on the packet contents.  BIT0 and
+ * BIT1 make up a two value value that the selects the skip value as follows.
+ *
+ *    lookup_value = LEN ? ( packet_in_bits[BIT1], packet_in_bits[BIT0] ) : ( 0, packet_in_bits[BIT0] );
+ *    SKIP I       = lookup_value == 3 ? SKIP3 :
+ *                   lookup_value == 2 ? SKIP2 :
+ *                   lookup_value == 1 ? SKIP1 :
+ *                   PIP_PRT_CFG<pknd>[SKIP];
+ */
+union cvmx_pip_alt_skip_cfgx {
+       u64 u64;
+       struct cvmx_pip_alt_skip_cfgx_s {
+               u64 reserved_57_63 : 7;
+               u64 len : 1;
+               u64 reserved_46_55 : 10;
+               u64 bit1 : 6;
+               u64 reserved_38_39 : 2;
+               u64 bit0 : 6;
+               u64 reserved_23_31 : 9;
+               u64 skip3 : 7;
+               u64 reserved_15_15 : 1;
+               u64 skip2 : 7;
+               u64 reserved_7_7 : 1;
+               u64 skip1 : 7;
+       } s;
+       struct cvmx_pip_alt_skip_cfgx_s cn61xx;
+       struct cvmx_pip_alt_skip_cfgx_s cn66xx;
+       struct cvmx_pip_alt_skip_cfgx_s cn68xx;
+       struct cvmx_pip_alt_skip_cfgx_s cn70xx;
+       struct cvmx_pip_alt_skip_cfgx_s cn70xxp1;
+       struct cvmx_pip_alt_skip_cfgx_s cnf71xx;
+};
+
+typedef union cvmx_pip_alt_skip_cfgx cvmx_pip_alt_skip_cfgx_t;
+
+/**
+ * cvmx_pip_bck_prs
+ *
+ * When to assert backpressure based on the todo list filling up
+ *
+ */
+union cvmx_pip_bck_prs {
+       u64 u64;
+       struct cvmx_pip_bck_prs_s {
+               u64 bckprs : 1;
+               u64 reserved_13_62 : 50;
+               u64 hiwater : 5;
+               u64 reserved_5_7 : 3;
+               u64 lowater : 5;
+       } s;
+       struct cvmx_pip_bck_prs_s cn38xx;
+       struct cvmx_pip_bck_prs_s cn38xxp2;
+       struct cvmx_pip_bck_prs_s cn56xx;
+       struct cvmx_pip_bck_prs_s cn56xxp1;
+       struct cvmx_pip_bck_prs_s cn58xx;
+       struct cvmx_pip_bck_prs_s cn58xxp1;
+       struct cvmx_pip_bck_prs_s cn61xx;
+       struct cvmx_pip_bck_prs_s cn63xx;
+       struct cvmx_pip_bck_prs_s cn63xxp1;
+       struct cvmx_pip_bck_prs_s cn66xx;
+       struct cvmx_pip_bck_prs_s cn68xx;
+       struct cvmx_pip_bck_prs_s cn68xxp1;
+       struct cvmx_pip_bck_prs_s cn70xx;
+       struct cvmx_pip_bck_prs_s cn70xxp1;
+       struct cvmx_pip_bck_prs_s cnf71xx;
+};
+
+typedef union cvmx_pip_bck_prs cvmx_pip_bck_prs_t;
+
+/**
+ * cvmx_pip_bist_status
+ *
+ * PIP_BIST_STATUS = PIP's BIST Results
+ *
+ */
+union cvmx_pip_bist_status {
+       u64 u64;
+       struct cvmx_pip_bist_status_s {
+               u64 reserved_22_63 : 42;
+               u64 bist : 22;
+       } s;
+       struct cvmx_pip_bist_status_cn30xx {
+               u64 reserved_18_63 : 46;
+               u64 bist : 18;
+       } cn30xx;
+       struct cvmx_pip_bist_status_cn30xx cn31xx;
+       struct cvmx_pip_bist_status_cn30xx cn38xx;
+       struct cvmx_pip_bist_status_cn30xx cn38xxp2;
+       struct cvmx_pip_bist_status_cn50xx {
+               u64 reserved_17_63 : 47;
+               u64 bist : 17;
+       } cn50xx;
+       struct cvmx_pip_bist_status_cn30xx cn52xx;
+       struct cvmx_pip_bist_status_cn30xx cn52xxp1;
+       struct cvmx_pip_bist_status_cn30xx cn56xx;
+       struct cvmx_pip_bist_status_cn30xx cn56xxp1;
+       struct cvmx_pip_bist_status_cn30xx cn58xx;
+       struct cvmx_pip_bist_status_cn30xx cn58xxp1;
+       struct cvmx_pip_bist_status_cn61xx {
+               u64 reserved_20_63 : 44;
+               u64 bist : 20;
+       } cn61xx;
+       struct cvmx_pip_bist_status_cn30xx cn63xx;
+       struct cvmx_pip_bist_status_cn30xx cn63xxp1;
+       struct cvmx_pip_bist_status_cn61xx cn66xx;
+       struct cvmx_pip_bist_status_s cn68xx;
+       struct cvmx_pip_bist_status_cn61xx cn68xxp1;
+       struct cvmx_pip_bist_status_cn61xx cn70xx;
+       struct cvmx_pip_bist_status_cn61xx cn70xxp1;
+       struct cvmx_pip_bist_status_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pip_bist_status cvmx_pip_bist_status_t;
+
+/**
+ * cvmx_pip_bsel_ext_cfg#
+ *
+ * tag, offset, and skip values to be used when using the corresponding extractor.
+ *
+ */
+union cvmx_pip_bsel_ext_cfgx {
+       u64 u64;
+       struct cvmx_pip_bsel_ext_cfgx_s {
+               u64 reserved_56_63 : 8;
+               u64 upper_tag : 16;
+               u64 tag : 8;
+               u64 reserved_25_31 : 7;
+               u64 offset : 9;
+               u64 reserved_7_15 : 9;
+               u64 skip : 7;
+       } s;
+       struct cvmx_pip_bsel_ext_cfgx_s cn61xx;
+       struct cvmx_pip_bsel_ext_cfgx_s cn68xx;
+       struct cvmx_pip_bsel_ext_cfgx_s cn70xx;
+       struct cvmx_pip_bsel_ext_cfgx_s cn70xxp1;
+       struct cvmx_pip_bsel_ext_cfgx_s cnf71xx;
+};
+
+typedef union cvmx_pip_bsel_ext_cfgx cvmx_pip_bsel_ext_cfgx_t;
+
+/**
+ * cvmx_pip_bsel_ext_pos#
+ *
+ * bit positions and valids to be used when using the corresponding extractor.
+ *
+ */
+union cvmx_pip_bsel_ext_posx {
+       u64 u64;
+       struct cvmx_pip_bsel_ext_posx_s {
+               u64 pos7_val : 1;
+               u64 pos7 : 7;
+               u64 pos6_val : 1;
+               u64 pos6 : 7;
+               u64 pos5_val : 1;
+               u64 pos5 : 7;
+               u64 pos4_val : 1;
+               u64 pos4 : 7;
+               u64 pos3_val : 1;
+               u64 pos3 : 7;
+               u64 pos2_val : 1;
+               u64 pos2 : 7;
+               u64 pos1_val : 1;
+               u64 pos1 : 7;
+               u64 pos0_val : 1;
+               u64 pos0 : 7;
+       } s;
+       struct cvmx_pip_bsel_ext_posx_s cn61xx;
+       struct cvmx_pip_bsel_ext_posx_s cn68xx;
+       struct cvmx_pip_bsel_ext_posx_s cn70xx;
+       struct cvmx_pip_bsel_ext_posx_s cn70xxp1;
+       struct cvmx_pip_bsel_ext_posx_s cnf71xx;
+};
+
+typedef union cvmx_pip_bsel_ext_posx cvmx_pip_bsel_ext_posx_t;
+
+/**
+ * cvmx_pip_bsel_tbl_ent#
+ *
+ * PIP_BSEL_TBL_ENTX = Entry for the extractor table
+ *
+ */
+union cvmx_pip_bsel_tbl_entx {
+       u64 u64;
+       struct cvmx_pip_bsel_tbl_entx_s {
+               u64 tag_en : 1;
+               u64 grp_en : 1;
+               u64 tt_en : 1;
+               u64 qos_en : 1;
+               u64 reserved_40_59 : 20;
+               u64 tag : 8;
+               u64 reserved_22_31 : 10;
+               u64 grp : 6;
+               u64 reserved_10_15 : 6;
+               u64 tt : 2;
+               u64 reserved_3_7 : 5;
+               u64 qos : 3;
+       } s;
+       struct cvmx_pip_bsel_tbl_entx_cn61xx {
+               u64 tag_en : 1;
+               u64 grp_en : 1;
+               u64 tt_en : 1;
+               u64 qos_en : 1;
+               u64 reserved_40_59 : 20;
+               u64 tag : 8;
+               u64 reserved_20_31 : 12;
+               u64 grp : 4;
+               u64 reserved_10_15 : 6;
+               u64 tt : 2;
+               u64 reserved_3_7 : 5;
+               u64 qos : 3;
+       } cn61xx;
+       struct cvmx_pip_bsel_tbl_entx_s cn68xx;
+       struct cvmx_pip_bsel_tbl_entx_cn61xx cn70xx;
+       struct cvmx_pip_bsel_tbl_entx_cn61xx cn70xxp1;
+       struct cvmx_pip_bsel_tbl_entx_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pip_bsel_tbl_entx cvmx_pip_bsel_tbl_entx_t;
+
+/**
+ * cvmx_pip_clken
+ */
+union cvmx_pip_clken {
+       u64 u64;
+       struct cvmx_pip_clken_s {
+               u64 reserved_1_63 : 63;
+               u64 clken : 1;
+       } s;
+       struct cvmx_pip_clken_s cn61xx;
+       struct cvmx_pip_clken_s cn63xx;
+       struct cvmx_pip_clken_s cn63xxp1;
+       struct cvmx_pip_clken_s cn66xx;
+       struct cvmx_pip_clken_s cn68xx;
+       struct cvmx_pip_clken_s cn68xxp1;
+       struct cvmx_pip_clken_s cn70xx;
+       struct cvmx_pip_clken_s cn70xxp1;
+       struct cvmx_pip_clken_s cnf71xx;
+};
+
+typedef union cvmx_pip_clken cvmx_pip_clken_t;
+
+/**
+ * cvmx_pip_crc_ctl#
+ *
+ * PIP_CRC_CTL = PIP CRC Control Register
+ *
+ * Controls datapath reflection when calculating CRC
+ */
+union cvmx_pip_crc_ctlx {
+       u64 u64;
+       struct cvmx_pip_crc_ctlx_s {
+               u64 reserved_2_63 : 62;
+               u64 invres : 1;
+               u64 reflect : 1;
+       } s;
+       struct cvmx_pip_crc_ctlx_s cn38xx;
+       struct cvmx_pip_crc_ctlx_s cn38xxp2;
+       struct cvmx_pip_crc_ctlx_s cn58xx;
+       struct cvmx_pip_crc_ctlx_s cn58xxp1;
+};
+
+typedef union cvmx_pip_crc_ctlx cvmx_pip_crc_ctlx_t;
+
+/**
+ * cvmx_pip_crc_iv#
+ *
+ * PIP_CRC_IV = PIP CRC IV Register
+ *
+ * Determines the IV used by the CRC algorithm
+ *
+ * Notes:
+ * * PIP_CRC_IV
+ * PIP_CRC_IV controls the initial state of the CRC algorithm.  Octane can
+ * support a wide range of CRC algorithms and as such, the IV must be
+ * carefully constructed to meet the specific algorithm.  The code below
+ * determines the value to program into Octane based on the algorthim's IV
+ * and width.  In the case of Octane, the width should always be 32.
+ *
+ * PIP_CRC_IV0 sets the IV for ports 0-15 while PIP_CRC_IV1 sets the IV for
+ * ports 16-31.
+ *
+ *  unsigned octane_crc_iv(unsigned algorithm_iv, unsigned poly, unsigned w)
+ *  [
+ *    int i;
+ *    int doit;
+ *    unsigned int current_val = algorithm_iv;
+ *
+ *    for(i = 0; i < w; i++) [
+ *      doit = current_val & 0x1;
+ *
+ *      if(doit) current_val ^= poly;
+ *      assert(!(current_val & 0x1));
+ *
+ *      current_val = (current_val >> 1) | (doit << (w-1));
+ *    ]
+ *
+ *    return current_val;
+ *  ]
+ */
+union cvmx_pip_crc_ivx {
+       u64 u64;
+       struct cvmx_pip_crc_ivx_s {
+               u64 reserved_32_63 : 32;
+               u64 iv : 32;
+       } s;
+       struct cvmx_pip_crc_ivx_s cn38xx;
+       struct cvmx_pip_crc_ivx_s cn38xxp2;
+       struct cvmx_pip_crc_ivx_s cn58xx;
+       struct cvmx_pip_crc_ivx_s cn58xxp1;
+};
+
+typedef union cvmx_pip_crc_ivx cvmx_pip_crc_ivx_t;
+
+/**
+ * cvmx_pip_dec_ipsec#
+ *
+ * PIP sets the dec_ipsec based on TCP or UDP destination port.
+ *
+ */
+union cvmx_pip_dec_ipsecx {
+       u64 u64;
+       struct cvmx_pip_dec_ipsecx_s {
+               u64 reserved_18_63 : 46;
+               u64 tcp : 1;
+               u64 udp : 1;
+               u64 dprt : 16;
+       } s;
+       struct cvmx_pip_dec_ipsecx_s cn30xx;
+       struct cvmx_pip_dec_ipsecx_s cn31xx;
+       struct cvmx_pip_dec_ipsecx_s cn38xx;
+       struct cvmx_pip_dec_ipsecx_s cn38xxp2;
+       struct cvmx_pip_dec_ipsecx_s cn50xx;
+       struct cvmx_pip_dec_ipsecx_s cn52xx;
+       struct cvmx_pip_dec_ipsecx_s cn52xxp1;
+       struct cvmx_pip_dec_ipsecx_s cn56xx;
+       struct cvmx_pip_dec_ipsecx_s cn56xxp1;
+       struct cvmx_pip_dec_ipsecx_s cn58xx;
+       struct cvmx_pip_dec_ipsecx_s cn58xxp1;
+       struct cvmx_pip_dec_ipsecx_s cn61xx;
+       struct cvmx_pip_dec_ipsecx_s cn63xx;
+       struct cvmx_pip_dec_ipsecx_s cn63xxp1;
+       struct cvmx_pip_dec_ipsecx_s cn66xx;
+       struct cvmx_pip_dec_ipsecx_s cn68xx;
+       struct cvmx_pip_dec_ipsecx_s cn68xxp1;
+       struct cvmx_pip_dec_ipsecx_s cn70xx;
+       struct cvmx_pip_dec_ipsecx_s cn70xxp1;
+       struct cvmx_pip_dec_ipsecx_s cnf71xx;
+};
+
+typedef union cvmx_pip_dec_ipsecx cvmx_pip_dec_ipsecx_t;
+
+/**
+ * cvmx_pip_dsa_src_grp
+ */
+union cvmx_pip_dsa_src_grp {
+       u64 u64;
+       struct cvmx_pip_dsa_src_grp_s {
+               u64 map15 : 4;
+               u64 map14 : 4;
+               u64 map13 : 4;
+               u64 map12 : 4;
+               u64 map11 : 4;
+               u64 map10 : 4;
+               u64 map9 : 4;
+               u64 map8 : 4;
+               u64 map7 : 4;
+               u64 map6 : 4;
+               u64 map5 : 4;
+               u64 map4 : 4;
+               u64 map3 : 4;
+               u64 map2 : 4;
+               u64 map1 : 4;
+               u64 map0 : 4;
+       } s;
+       struct cvmx_pip_dsa_src_grp_s cn52xx;
+       struct cvmx_pip_dsa_src_grp_s cn52xxp1;
+       struct cvmx_pip_dsa_src_grp_s cn56xx;
+       struct cvmx_pip_dsa_src_grp_s cn61xx;
+       struct cvmx_pip_dsa_src_grp_s cn63xx;
+       struct cvmx_pip_dsa_src_grp_s cn63xxp1;
+       struct cvmx_pip_dsa_src_grp_s cn66xx;
+       struct cvmx_pip_dsa_src_grp_s cn68xx;
+       struct cvmx_pip_dsa_src_grp_s cn68xxp1;
+       struct cvmx_pip_dsa_src_grp_s cn70xx;
+       struct cvmx_pip_dsa_src_grp_s cn70xxp1;
+       struct cvmx_pip_dsa_src_grp_s cnf71xx;
+};
+
+typedef union cvmx_pip_dsa_src_grp cvmx_pip_dsa_src_grp_t;
+
+/**
+ * cvmx_pip_dsa_vid_grp
+ */
+union cvmx_pip_dsa_vid_grp {
+       u64 u64;
+       struct cvmx_pip_dsa_vid_grp_s {
+               u64 map15 : 4;
+               u64 map14 : 4;
+               u64 map13 : 4;
+               u64 map12 : 4;
+               u64 map11 : 4;
+               u64 map10 : 4;
+               u64 map9 : 4;
+               u64 map8 : 4;
+               u64 map7 : 4;
+               u64 map6 : 4;
+               u64 map5 : 4;
+               u64 map4 : 4;
+               u64 map3 : 4;
+               u64 map2 : 4;
+               u64 map1 : 4;
+               u64 map0 : 4;
+       } s;
+       struct cvmx_pip_dsa_vid_grp_s cn52xx;
+       struct cvmx_pip_dsa_vid_grp_s cn52xxp1;
+       struct cvmx_pip_dsa_vid_grp_s cn56xx;
+       struct cvmx_pip_dsa_vid_grp_s cn61xx;
+       struct cvmx_pip_dsa_vid_grp_s cn63xx;
+       struct cvmx_pip_dsa_vid_grp_s cn63xxp1;
+       struct cvmx_pip_dsa_vid_grp_s cn66xx;
+       struct cvmx_pip_dsa_vid_grp_s cn68xx;
+       struct cvmx_pip_dsa_vid_grp_s cn68xxp1;
+       struct cvmx_pip_dsa_vid_grp_s cn70xx;
+       struct cvmx_pip_dsa_vid_grp_s cn70xxp1;
+       struct cvmx_pip_dsa_vid_grp_s cnf71xx;
+};
+
+typedef union cvmx_pip_dsa_vid_grp cvmx_pip_dsa_vid_grp_t;
+
+/**
+ * cvmx_pip_frm_len_chk#
+ *
+ * Notes:
+ * PIP_FRM_LEN_CHK0 is used for packets on packet interface0, PCI, PCI RAW, and PKO loopback ports.
+ * PIP_FRM_LEN_CHK1 is unused.
+ */
+union cvmx_pip_frm_len_chkx {
+       u64 u64;
+       struct cvmx_pip_frm_len_chkx_s {
+               u64 reserved_32_63 : 32;
+               u64 maxlen : 16;
+               u64 minlen : 16;
+       } s;
+       struct cvmx_pip_frm_len_chkx_s cn50xx;
+       struct cvmx_pip_frm_len_chkx_s cn52xx;
+       struct cvmx_pip_frm_len_chkx_s cn52xxp1;
+       struct cvmx_pip_frm_len_chkx_s cn56xx;
+       struct cvmx_pip_frm_len_chkx_s cn56xxp1;
+       struct cvmx_pip_frm_len_chkx_s cn61xx;
+       struct cvmx_pip_frm_len_chkx_s cn63xx;
+       struct cvmx_pip_frm_len_chkx_s cn63xxp1;
+       struct cvmx_pip_frm_len_chkx_s cn66xx;
+       struct cvmx_pip_frm_len_chkx_s cn68xx;
+       struct cvmx_pip_frm_len_chkx_s cn68xxp1;
+       struct cvmx_pip_frm_len_chkx_s cn70xx;
+       struct cvmx_pip_frm_len_chkx_s cn70xxp1;
+       struct cvmx_pip_frm_len_chkx_s cnf71xx;
+};
+
+typedef union cvmx_pip_frm_len_chkx cvmx_pip_frm_len_chkx_t;
+
+/**
+ * cvmx_pip_gbl_cfg
+ *
+ * Global config information that applies to all ports.
+ *
+ */
+union cvmx_pip_gbl_cfg {
+       u64 u64;
+       struct cvmx_pip_gbl_cfg_s {
+               u64 reserved_19_63 : 45;
+               u64 tag_syn : 1;
+               u64 ip6_udp : 1;
+               u64 max_l2 : 1;
+               u64 reserved_11_15 : 5;
+               u64 raw_shf : 3;
+               u64 reserved_3_7 : 5;
+               u64 nip_shf : 3;
+       } s;
+       struct cvmx_pip_gbl_cfg_s cn30xx;
+       struct cvmx_pip_gbl_cfg_s cn31xx;
+       struct cvmx_pip_gbl_cfg_s cn38xx;
+       struct cvmx_pip_gbl_cfg_s cn38xxp2;
+       struct cvmx_pip_gbl_cfg_s cn50xx;
+       struct cvmx_pip_gbl_cfg_s cn52xx;
+       struct cvmx_pip_gbl_cfg_s cn52xxp1;
+       struct cvmx_pip_gbl_cfg_s cn56xx;
+       struct cvmx_pip_gbl_cfg_s cn56xxp1;
+       struct cvmx_pip_gbl_cfg_s cn58xx;
+       struct cvmx_pip_gbl_cfg_s cn58xxp1;
+       struct cvmx_pip_gbl_cfg_s cn61xx;
+       struct cvmx_pip_gbl_cfg_s cn63xx;
+       struct cvmx_pip_gbl_cfg_s cn63xxp1;
+       struct cvmx_pip_gbl_cfg_s cn66xx;
+       struct cvmx_pip_gbl_cfg_s cn68xx;
+       struct cvmx_pip_gbl_cfg_s cn68xxp1;
+       struct cvmx_pip_gbl_cfg_s cn70xx;
+       struct cvmx_pip_gbl_cfg_s cn70xxp1;
+       struct cvmx_pip_gbl_cfg_s cnf71xx;
+};
+
+typedef union cvmx_pip_gbl_cfg cvmx_pip_gbl_cfg_t;
+
+/**
+ * cvmx_pip_gbl_ctl
+ *
+ * Global control information.  These are the global checker enables for
+ * IPv4/IPv6 and TCP/UDP parsing.  The enables effect all ports.
+ */
+union cvmx_pip_gbl_ctl {
+       u64 u64;
+       struct cvmx_pip_gbl_ctl_s {
+               u64 reserved_29_63 : 35;
+               u64 egrp_dis : 1;
+               u64 ihmsk_dis : 1;
+               u64 dsa_grp_tvid : 1;
+               u64 dsa_grp_scmd : 1;
+               u64 dsa_grp_sid : 1;
+               u64 reserved_21_23 : 3;
+               u64 ring_en : 1;
+               u64 reserved_17_19 : 3;
+               u64 ignrs : 1;
+               u64 vs_wqe : 1;
+               u64 vs_qos : 1;
+               u64 l2_mal : 1;
+               u64 tcp_flag : 1;
+               u64 l4_len : 1;
+               u64 l4_chk : 1;
+               u64 l4_prt : 1;
+               u64 l4_mal : 1;
+               u64 reserved_6_7 : 2;
+               u64 ip6_eext : 2;
+               u64 ip4_opts : 1;
+               u64 ip_hop : 1;
+               u64 ip_mal : 1;
+               u64 ip_chk : 1;
+       } s;
+       struct cvmx_pip_gbl_ctl_cn30xx {
+               u64 reserved_17_63 : 47;
+               u64 ignrs : 1;
+               u64 vs_wqe : 1;
+               u64 vs_qos : 1;
+               u64 l2_mal : 1;
+               u64 tcp_flag : 1;
+               u64 l4_len : 1;
+               u64 l4_chk : 1;
+               u64 l4_prt : 1;
+               u64 l4_mal : 1;
+               u64 reserved_6_7 : 2;
+               u64 ip6_eext : 2;
+               u64 ip4_opts : 1;
+               u64 ip_hop : 1;
+               u64 ip_mal : 1;
+               u64 ip_chk : 1;
+       } cn30xx;
+       struct cvmx_pip_gbl_ctl_cn30xx cn31xx;
+       struct cvmx_pip_gbl_ctl_cn30xx cn38xx;
+       struct cvmx_pip_gbl_ctl_cn30xx cn38xxp2;
+       struct cvmx_pip_gbl_ctl_cn30xx cn50xx;
+       struct cvmx_pip_gbl_ctl_cn52xx {
+               u64 reserved_27_63 : 37;
+               u64 dsa_grp_tvid : 1;
+               u64 dsa_grp_scmd : 1;
+               u64 dsa_grp_sid : 1;
+               u64 reserved_21_23 : 3;
+               u64 ring_en : 1;
+               u64 reserved_17_19 : 3;
+               u64 ignrs : 1;
+               u64 vs_wqe : 1;
+               u64 vs_qos : 1;
+               u64 l2_mal : 1;
+               u64 tcp_flag : 1;
+               u64 l4_len : 1;
+               u64 l4_chk : 1;
+               u64 l4_prt : 1;
+               u64 l4_mal : 1;
+               u64 reserved_6_7 : 2;
+               u64 ip6_eext : 2;
+               u64 ip4_opts : 1;
+               u64 ip_hop : 1;
+               u64 ip_mal : 1;
+               u64 ip_chk : 1;
+       } cn52xx;
+       struct cvmx_pip_gbl_ctl_cn52xx cn52xxp1;
+       struct cvmx_pip_gbl_ctl_cn52xx cn56xx;
+       struct cvmx_pip_gbl_ctl_cn56xxp1 {
+               u64 reserved_21_63 : 43;
+               u64 ring_en : 1;
+               u64 reserved_17_19 : 3;
+               u64 ignrs : 1;
+               u64 vs_wqe : 1;
+               u64 vs_qos : 1;
+               u64 l2_mal : 1;
+               u64 tcp_flag : 1;
+               u64 l4_len : 1;
+               u64 l4_chk : 1;
+               u64 l4_prt : 1;
+               u64 l4_mal : 1;
+               u64 reserved_6_7 : 2;
+               u64 ip6_eext : 2;
+               u64 ip4_opts : 1;
+               u64 ip_hop : 1;
+               u64 ip_mal : 1;
+               u64 ip_chk : 1;
+       } cn56xxp1;
+       struct cvmx_pip_gbl_ctl_cn30xx cn58xx;
+       struct cvmx_pip_gbl_ctl_cn30xx cn58xxp1;
+       struct cvmx_pip_gbl_ctl_cn61xx {
+               u64 reserved_28_63 : 36;
+               u64 ihmsk_dis : 1;
+               u64 dsa_grp_tvid : 1;
+               u64 dsa_grp_scmd : 1;
+               u64 dsa_grp_sid : 1;
+               u64 reserved_21_23 : 3;
+               u64 ring_en : 1;
+               u64 reserved_17_19 : 3;
+               u64 ignrs : 1;
+               u64 vs_wqe : 1;
+               u64 vs_qos : 1;
+               u64 l2_mal : 1;
+               u64 tcp_flag : 1;
+               u64 l4_len : 1;
+               u64 l4_chk : 1;
+               u64 l4_prt : 1;
+               u64 l4_mal : 1;
+               u64 reserved_6_7 : 2;
+               u64 ip6_eext : 2;
+               u64 ip4_opts : 1;
+               u64 ip_hop : 1;
+               u64 ip_mal : 1;
+               u64 ip_chk : 1;
+       } cn61xx;
+       struct cvmx_pip_gbl_ctl_cn61xx cn63xx;
+       struct cvmx_pip_gbl_ctl_cn61xx cn63xxp1;
+       struct cvmx_pip_gbl_ctl_cn61xx cn66xx;
+       struct cvmx_pip_gbl_ctl_cn68xx {
+               u64 reserved_29_63 : 35;
+               u64 egrp_dis : 1;
+               u64 ihmsk_dis : 1;
+               u64 dsa_grp_tvid : 1;
+               u64 dsa_grp_scmd : 1;
+               u64 dsa_grp_sid : 1;
+               u64 reserved_17_23 : 7;
+               u64 ignrs : 1;
+               u64 vs_wqe : 1;
+               u64 vs_qos : 1;
+               u64 l2_mal : 1;
+               u64 tcp_flag : 1;
+               u64 l4_len : 1;
+               u64 l4_chk : 1;
+               u64 l4_prt : 1;
+               u64 l4_mal : 1;
+               u64 reserved_6_7 : 2;
+               u64 ip6_eext : 2;
+               u64 ip4_opts : 1;
+               u64 ip_hop : 1;
+               u64 ip_mal : 1;
+               u64 ip_chk : 1;
+       } cn68xx;
+       struct cvmx_pip_gbl_ctl_cn68xxp1 {
+               u64 reserved_28_63 : 36;
+               u64 ihmsk_dis : 1;
+               u64 dsa_grp_tvid : 1;
+               u64 dsa_grp_scmd : 1;
+               u64 dsa_grp_sid : 1;
+               u64 reserved_17_23 : 7;
+               u64 ignrs : 1;
+               u64 vs_wqe : 1;
+               u64 vs_qos : 1;
+               u64 l2_mal : 1;
+               u64 tcp_flag : 1;
+               u64 l4_len : 1;
+               u64 l4_chk : 1;
+               u64 l4_prt : 1;
+               u64 l4_mal : 1;
+               u64 reserved_6_7 : 2;
+               u64 ip6_eext : 2;
+               u64 ip4_opts : 1;
+               u64 ip_hop : 1;
+               u64 ip_mal : 1;
+               u64 ip_chk : 1;
+       } cn68xxp1;
+       struct cvmx_pip_gbl_ctl_cn61xx cn70xx;
+       struct cvmx_pip_gbl_ctl_cn61xx cn70xxp1;
+       struct cvmx_pip_gbl_ctl_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pip_gbl_ctl cvmx_pip_gbl_ctl_t;
+
+/**
+ * cvmx_pip_hg_pri_qos
+ *
+ * Notes:
+ * This register controls accesses to the HG_QOS_TABLE.  To write an entry of
+ * the table, write PIP_HG_PRI_QOS with PRI=table address, QOS=priority level,
+ * UP_QOS=1.  To read an entry of the table, write PIP_HG_PRI_QOS with
+ * PRI=table address, QOS=dont_carepriority level, UP_QOS=0 and then read
+ * PIP_HG_PRI_QOS.  The table data will be in PIP_HG_PRI_QOS[QOS].
+ */
+union cvmx_pip_hg_pri_qos {
+       u64 u64;
+       struct cvmx_pip_hg_pri_qos_s {
+               u64 reserved_13_63 : 51;
+               u64 up_qos : 1;
+               u64 reserved_11_11 : 1;
+               u64 qos : 3;
+               u64 reserved_6_7 : 2;
+               u64 pri : 6;
+       } s;
+       struct cvmx_pip_hg_pri_qos_s cn52xx;
+       struct cvmx_pip_hg_pri_qos_s cn52xxp1;
+       struct cvmx_pip_hg_pri_qos_s cn56xx;
+       struct cvmx_pip_hg_pri_qos_s cn61xx;
+       struct cvmx_pip_hg_pri_qos_s cn63xx;
+       struct cvmx_pip_hg_pri_qos_s cn63xxp1;
+       struct cvmx_pip_hg_pri_qos_s cn66xx;
+       struct cvmx_pip_hg_pri_qos_s cn70xx;
+       struct cvmx_pip_hg_pri_qos_s cn70xxp1;
+       struct cvmx_pip_hg_pri_qos_s cnf71xx;
+};
+
+typedef union cvmx_pip_hg_pri_qos cvmx_pip_hg_pri_qos_t;
+
+/**
+ * cvmx_pip_int_en
+ *
+ * Determines if hardward should raise an interrupt to software
+ * when an exception event occurs.
+ */
+union cvmx_pip_int_en {
+       u64 u64;
+       struct cvmx_pip_int_en_s {
+               u64 reserved_13_63 : 51;
+               u64 punyerr : 1;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } s;
+       struct cvmx_pip_int_en_cn30xx {
+               u64 reserved_9_63 : 55;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } cn30xx;
+       struct cvmx_pip_int_en_cn30xx cn31xx;
+       struct cvmx_pip_int_en_cn30xx cn38xx;
+       struct cvmx_pip_int_en_cn30xx cn38xxp2;
+       struct cvmx_pip_int_en_cn50xx {
+               u64 reserved_12_63 : 52;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 reserved_1_1 : 1;
+               u64 pktdrp : 1;
+       } cn50xx;
+       struct cvmx_pip_int_en_cn52xx {
+               u64 reserved_13_63 : 51;
+               u64 punyerr : 1;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 reserved_1_1 : 1;
+               u64 pktdrp : 1;
+       } cn52xx;
+       struct cvmx_pip_int_en_cn52xx cn52xxp1;
+       struct cvmx_pip_int_en_s cn56xx;
+       struct cvmx_pip_int_en_cn56xxp1 {
+               u64 reserved_12_63 : 52;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } cn56xxp1;
+       struct cvmx_pip_int_en_cn58xx {
+               u64 reserved_13_63 : 51;
+               u64 punyerr : 1;
+               u64 reserved_9_11 : 3;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } cn58xx;
+       struct cvmx_pip_int_en_cn30xx cn58xxp1;
+       struct cvmx_pip_int_en_s cn61xx;
+       struct cvmx_pip_int_en_s cn63xx;
+       struct cvmx_pip_int_en_s cn63xxp1;
+       struct cvmx_pip_int_en_s cn66xx;
+       struct cvmx_pip_int_en_s cn68xx;
+       struct cvmx_pip_int_en_s cn68xxp1;
+       struct cvmx_pip_int_en_s cn70xx;
+       struct cvmx_pip_int_en_s cn70xxp1;
+       struct cvmx_pip_int_en_s cnf71xx;
+};
+
+typedef union cvmx_pip_int_en cvmx_pip_int_en_t;
+
+/**
+ * cvmx_pip_int_reg
+ *
+ * Any exception event that occurs is captured in the PIP_INT_REG.
+ * PIP_INT_REG will set the exception bit regardless of the value
+ * of PIP_INT_EN.  PIP_INT_EN only controls if an interrupt is
+ * raised to software.
+ */
+union cvmx_pip_int_reg {
+       u64 u64;
+       struct cvmx_pip_int_reg_s {
+               u64 reserved_13_63 : 51;
+               u64 punyerr : 1;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } s;
+       struct cvmx_pip_int_reg_cn30xx {
+               u64 reserved_9_63 : 55;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } cn30xx;
+       struct cvmx_pip_int_reg_cn30xx cn31xx;
+       struct cvmx_pip_int_reg_cn30xx cn38xx;
+       struct cvmx_pip_int_reg_cn30xx cn38xxp2;
+       struct cvmx_pip_int_reg_cn50xx {
+               u64 reserved_12_63 : 52;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 reserved_1_1 : 1;
+               u64 pktdrp : 1;
+       } cn50xx;
+       struct cvmx_pip_int_reg_cn52xx {
+               u64 reserved_13_63 : 51;
+               u64 punyerr : 1;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 reserved_1_1 : 1;
+               u64 pktdrp : 1;
+       } cn52xx;
+       struct cvmx_pip_int_reg_cn52xx cn52xxp1;
+       struct cvmx_pip_int_reg_s cn56xx;
+       struct cvmx_pip_int_reg_cn56xxp1 {
+               u64 reserved_12_63 : 52;
+               u64 lenerr : 1;
+               u64 maxerr : 1;
+               u64 minerr : 1;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } cn56xxp1;
+       struct cvmx_pip_int_reg_cn58xx {
+               u64 reserved_13_63 : 51;
+               u64 punyerr : 1;
+               u64 reserved_9_11 : 3;
+               u64 beperr : 1;
+               u64 feperr : 1;
+               u64 todoovr : 1;
+               u64 skprunt : 1;
+               u64 badtag : 1;
+               u64 prtnxa : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } cn58xx;
+       struct cvmx_pip_int_reg_cn30xx cn58xxp1;
+       struct cvmx_pip_int_reg_s cn61xx;
+       struct cvmx_pip_int_reg_s cn63xx;
+       struct cvmx_pip_int_reg_s cn63xxp1;
+       struct cvmx_pip_int_reg_s cn66xx;
+       struct cvmx_pip_int_reg_s cn68xx;
+       struct cvmx_pip_int_reg_s cn68xxp1;
+       struct cvmx_pip_int_reg_s cn70xx;
+       struct cvmx_pip_int_reg_s cn70xxp1;
+       struct cvmx_pip_int_reg_s cnf71xx;
+};
+
+typedef union cvmx_pip_int_reg cvmx_pip_int_reg_t;
+
+/**
+ * cvmx_pip_ip_offset
+ *
+ * An 8-byte offset to find the start of the IP header in the data portion of IP workQ entires
+ *
+ */
+union cvmx_pip_ip_offset {
+       u64 u64;
+       struct cvmx_pip_ip_offset_s {
+               u64 reserved_3_63 : 61;
+               u64 offset : 3;
+       } s;
+       struct cvmx_pip_ip_offset_s cn30xx;
+       struct cvmx_pip_ip_offset_s cn31xx;
+       struct cvmx_pip_ip_offset_s cn38xx;
+       struct cvmx_pip_ip_offset_s cn38xxp2;
+       struct cvmx_pip_ip_offset_s cn50xx;
+       struct cvmx_pip_ip_offset_s cn52xx;
+       struct cvmx_pip_ip_offset_s cn52xxp1;
+       struct cvmx_pip_ip_offset_s cn56xx;
+       struct cvmx_pip_ip_offset_s cn56xxp1;
+       struct cvmx_pip_ip_offset_s cn58xx;
+       struct cvmx_pip_ip_offset_s cn58xxp1;
+       struct cvmx_pip_ip_offset_s cn61xx;
+       struct cvmx_pip_ip_offset_s cn63xx;
+       struct cvmx_pip_ip_offset_s cn63xxp1;
+       struct cvmx_pip_ip_offset_s cn66xx;
+       struct cvmx_pip_ip_offset_s cn68xx;
+       struct cvmx_pip_ip_offset_s cn68xxp1;
+       struct cvmx_pip_ip_offset_s cn70xx;
+       struct cvmx_pip_ip_offset_s cn70xxp1;
+       struct cvmx_pip_ip_offset_s cnf71xx;
+};
+
+typedef union cvmx_pip_ip_offset cvmx_pip_ip_offset_t;
+
+/**
+ * cvmx_pip_pri_tbl#
+ *
+ * Notes:
+ * The priority level from HiGig header is as follows
+ *
+ * HiGig/HiGig+ PRI = [1'b0, CNG[1:0], COS[2:0]]
+ * HiGig2       PRI = [DP[1:0], TC[3:0]]
+ *
+ * DSA          PRI = WORD0[15:13]
+ *
+ * VLAN         PRI = VLAN[15:13]
+ *
+ * DIFFSERV         = IP.TOS/CLASS<7:2>
+ */
+union cvmx_pip_pri_tblx {
+       u64 u64;
+       struct cvmx_pip_pri_tblx_s {
+               u64 diff2_padd : 8;
+               u64 hg2_padd : 8;
+               u64 vlan2_padd : 8;
+               u64 reserved_38_39 : 2;
+               u64 diff2_bpid : 6;
+               u64 reserved_30_31 : 2;
+               u64 hg2_bpid : 6;
+               u64 reserved_22_23 : 2;
+               u64 vlan2_bpid : 6;
+               u64 reserved_11_15 : 5;
+               u64 diff2_qos : 3;
+               u64 reserved_7_7 : 1;
+               u64 hg2_qos : 3;
+               u64 reserved_3_3 : 1;
+               u64 vlan2_qos : 3;
+       } s;
+       struct cvmx_pip_pri_tblx_s cn68xx;
+       struct cvmx_pip_pri_tblx_s cn68xxp1;
+};
+
+typedef union cvmx_pip_pri_tblx cvmx_pip_pri_tblx_t;
+
+/**
+ * cvmx_pip_prt_cfg#
+ *
+ * PIP_PRT_CFGX = Per port config information
+ *
+ */
+union cvmx_pip_prt_cfgx {
+       u64 u64;
+       struct cvmx_pip_prt_cfgx_s {
+               u64 reserved_55_63 : 9;
+               u64 ih_pri : 1;
+               u64 len_chk_sel : 1;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 lenerr_en : 1;
+               u64 maxerr_en : 1;
+               u64 minerr_en : 1;
+               u64 grp_wat_47 : 4;
+               u64 qos_wat_47 : 4;
+               u64 reserved_37_39 : 3;
+               u64 rawdrp : 1;
+               u64 tag_inc : 2;
+               u64 dyn_rs : 1;
+               u64 inst_hdr : 1;
+               u64 grp_wat : 4;
+               u64 hg_qos : 1;
+               u64 qos : 3;
+               u64 qos_wat : 4;
+               u64 qos_vsel : 1;
+               u64 qos_vod : 1;
+               u64 qos_diff : 1;
+               u64 qos_vlan : 1;
+               u64 reserved_13_15 : 3;
+               u64 crc_en : 1;
+               u64 higig_en : 1;
+               u64 dsa_en : 1;
+               cvmx_pip_port_parse_mode_t mode : 2;
+               u64 reserved_7_7 : 1;
+               u64 skip : 7;
+       } s;
+       struct cvmx_pip_prt_cfgx_cn30xx {
+               u64 reserved_37_63 : 27;
+               u64 rawdrp : 1;
+               u64 tag_inc : 2;
+               u64 dyn_rs : 1;
+               u64 inst_hdr : 1;
+               u64 grp_wat : 4;
+               u64 reserved_27_27 : 1;
+               u64 qos : 3;
+               u64 qos_wat : 4;
+               u64 reserved_18_19 : 2;
+               u64 qos_diff : 1;
+               u64 qos_vlan : 1;
+               u64 reserved_10_15 : 6;
+               cvmx_pip_port_parse_mode_t mode : 2;
+               u64 reserved_7_7 : 1;
+               u64 skip : 7;
+       } cn30xx;
+       struct cvmx_pip_prt_cfgx_cn30xx cn31xx;
+       struct cvmx_pip_prt_cfgx_cn38xx {
+               u64 reserved_37_63 : 27;
+               u64 rawdrp : 1;
+               u64 tag_inc : 2;
+               u64 dyn_rs : 1;
+               u64 inst_hdr : 1;
+               u64 grp_wat : 4;
+               u64 reserved_27_27 : 1;
+               u64 qos : 3;
+               u64 qos_wat : 4;
+               u64 reserved_18_19 : 2;
+               u64 qos_diff : 1;
+               u64 qos_vlan : 1;
+               u64 reserved_13_15 : 3;
+               u64 crc_en : 1;
+               u64 reserved_10_11 : 2;
+               cvmx_pip_port_parse_mode_t mode : 2;
+               u64 reserved_7_7 : 1;
+               u64 skip : 7;
+       } cn38xx;
+       struct cvmx_pip_prt_cfgx_cn38xx cn38xxp2;
+       struct cvmx_pip_prt_cfgx_cn50xx {
+               u64 reserved_53_63 : 11;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 lenerr_en : 1;
+               u64 maxerr_en : 1;
+               u64 minerr_en : 1;
+               u64 grp_wat_47 : 4;
+               u64 qos_wat_47 : 4;
+               u64 reserved_37_39 : 3;
+               u64 rawdrp : 1;
+               u64 tag_inc : 2;
+               u64 dyn_rs : 1;
+               u64 inst_hdr : 1;
+               u64 grp_wat : 4;
+               u64 reserved_27_27 : 1;
+               u64 qos : 3;
+               u64 qos_wat : 4;
+               u64 reserved_19_19 : 1;
+               u64 qos_vod : 1;
+               u64 qos_diff : 1;
+               u64 qos_vlan : 1;
+               u64 reserved_13_15 : 3;
+               u64 crc_en : 1;
+               u64 reserved_10_11 : 2;
+               cvmx_pip_port_parse_mode_t mode : 2;
+               u64 reserved_7_7 : 1;
+               u64 skip : 7;
+       } cn50xx;
+       struct cvmx_pip_prt_cfgx_cn52xx {
+               u64 reserved_53_63 : 11;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 lenerr_en : 1;
+               u64 maxerr_en : 1;
+               u64 minerr_en : 1;
+               u64 grp_wat_47 : 4;
+               u64 qos_wat_47 : 4;
+               u64 reserved_37_39 : 3;
+               u64 rawdrp : 1;
+               u64 tag_inc : 2;
+               u64 dyn_rs : 1;
+               u64 inst_hdr : 1;
+               u64 grp_wat : 4;
+               u64 hg_qos : 1;
+               u64 qos : 3;
+               u64 qos_wat : 4;
+               u64 qos_vsel : 1;
+               u64 qos_vod : 1;
+               u64 qos_diff : 1;
+               u64 qos_vlan : 1;
+               u64 reserved_13_15 : 3;
+               u64 crc_en : 1;
+               u64 higig_en : 1;
+               u64 dsa_en : 1;
+               cvmx_pip_port_parse_mode_t mode : 2;
+               u64 reserved_7_7 : 1;
+               u64 skip : 7;
+       } cn52xx;
+       struct cvmx_pip_prt_cfgx_cn52xx cn52xxp1;
+       struct cvmx_pip_prt_cfgx_cn52xx cn56xx;
+       struct cvmx_pip_prt_cfgx_cn50xx cn56xxp1;
+       struct cvmx_pip_prt_cfgx_cn58xx {
+               u64 reserved_37_63 : 27;
+               u64 rawdrp : 1;
+               u64 tag_inc : 2;
+               u64 dyn_rs : 1;
+               u64 inst_hdr : 1;
+               u64 grp_wat : 4;
+               u64 reserved_27_27 : 1;
+               u64 qos : 3;
+               u64 qos_wat : 4;
+               u64 reserved_19_19 : 1;
+               u64 qos_vod : 1;
+               u64 qos_diff : 1;
+               u64 qos_vlan : 1;
+               u64 reserved_13_15 : 3;
+               u64 crc_en : 1;
+               u64 reserved_10_11 : 2;
+               cvmx_pip_port_parse_mode_t mode : 2;
+               u64 reserved_7_7 : 1;
+               u64 skip : 7;
+       } cn58xx;
+       struct cvmx_pip_prt_cfgx_cn58xx cn58xxp1;
+       struct cvmx_pip_prt_cfgx_cn52xx cn61xx;
+       struct cvmx_pip_prt_cfgx_cn52xx cn63xx;
+       struct cvmx_pip_prt_cfgx_cn52xx cn63xxp1;
+       struct cvmx_pip_prt_cfgx_cn52xx cn66xx;
+       struct cvmx_pip_prt_cfgx_cn68xx {
+               u64 reserved_55_63 : 9;
+               u64 ih_pri : 1;
+               u64 len_chk_sel : 1;
+               u64 pad_len : 1;
+               u64 vlan_len : 1;
+               u64 lenerr_en : 1;
+               u64 maxerr_en : 1;
+               u64 minerr_en : 1;
+               u64 grp_wat_47 : 4;
+               u64 qos_wat_47 : 4;
+               u64 reserved_37_39 : 3;
+               u64 rawdrp : 1;
+               u64 tag_inc : 2;
+               u64 dyn_rs : 1;
+               u64 inst_hdr : 1;
+               u64 grp_wat : 4;
+               u64 hg_qos : 1;
+               u64 qos : 3;
+               u64 qos_wat : 4;
+               u64 reserved_19_19 : 1;
+               u64 qos_vod : 1;
+               u64 qos_diff : 1;
+               u64 qos_vlan : 1;
+               u64 reserved_13_15 : 3;
+               u64 crc_en : 1;
+               u64 higig_en : 1;
+               u64 dsa_en : 1;
+               cvmx_pip_port_parse_mode_t mode : 2;
+               u64 reserved_7_7 : 1;
+               u64 skip : 7;
+       } cn68xx;
+       struct cvmx_pip_prt_cfgx_cn68xx cn68xxp1;
+       struct cvmx_pip_prt_cfgx_cn52xx cn70xx;
+       struct cvmx_pip_prt_cfgx_cn52xx cn70xxp1;
+       struct cvmx_pip_prt_cfgx_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pip_prt_cfgx cvmx_pip_prt_cfgx_t;
+
+/**
+ * cvmx_pip_prt_cfgb#
+ *
+ * Notes:
+ * PIP_PRT_CFGB* does not exist prior to pass 1.2.
+ *
+ */
+union cvmx_pip_prt_cfgbx {
+       u64 u64;
+       struct cvmx_pip_prt_cfgbx_s {
+               u64 reserved_39_63 : 25;
+               u64 alt_skp_sel : 2;
+               u64 alt_skp_en : 1;
+               u64 reserved_35_35 : 1;
+               u64 bsel_num : 2;
+               u64 bsel_en : 1;
+               u64 reserved_24_31 : 8;
+               u64 base : 8;
+               u64 reserved_6_15 : 10;
+               u64 bpid : 6;
+       } s;
+       struct cvmx_pip_prt_cfgbx_cn61xx {
+               u64 reserved_39_63 : 25;
+               u64 alt_skp_sel : 2;
+               u64 alt_skp_en : 1;
+               u64 reserved_35_35 : 1;
+               u64 bsel_num : 2;
+               u64 bsel_en : 1;
+               u64 reserved_0_31 : 32;
+       } cn61xx;
+       struct cvmx_pip_prt_cfgbx_cn66xx {
+               u64 reserved_39_63 : 25;
+               u64 alt_skp_sel : 2;
+               u64 alt_skp_en : 1;
+               u64 reserved_0_35 : 36;
+       } cn66xx;
+       struct cvmx_pip_prt_cfgbx_s cn68xx;
+       struct cvmx_pip_prt_cfgbx_cn68xxp1 {
+               u64 reserved_24_63 : 40;
+               u64 base : 8;
+               u64 reserved_6_15 : 10;
+               u64 bpid : 6;
+       } cn68xxp1;
+       struct cvmx_pip_prt_cfgbx_cn61xx cn70xx;
+       struct cvmx_pip_prt_cfgbx_cn61xx cn70xxp1;
+       struct cvmx_pip_prt_cfgbx_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pip_prt_cfgbx cvmx_pip_prt_cfgbx_t;
+
+/**
+ * cvmx_pip_prt_tag#
+ *
+ * PIP_PRT_TAGX = Per port config information
+ *
+ */
+union cvmx_pip_prt_tagx {
+       u64 u64;
+       struct cvmx_pip_prt_tagx_s {
+               u64 reserved_54_63 : 10;
+               u64 portadd_en : 1;
+               u64 inc_hwchk : 1;
+               u64 reserved_50_51 : 2;
+               u64 grptagbase_msb : 2;
+               u64 reserved_46_47 : 2;
+               u64 grptagmask_msb : 2;
+               u64 reserved_42_43 : 2;
+               u64 grp_msb : 2;
+               u64 grptagbase : 4;
+               u64 grptagmask : 4;
+               u64 grptag : 1;
+               u64 grptag_mskip : 1;
+               u64 tag_mode : 2;
+               u64 inc_vs : 2;
+               u64 inc_vlan : 1;
+               u64 inc_prt_flag : 1;
+               u64 ip6_dprt_flag : 1;
+               u64 ip4_dprt_flag : 1;
+               u64 ip6_sprt_flag : 1;
+               u64 ip4_sprt_flag : 1;
+               u64 ip6_nxth_flag : 1;
+               u64 ip4_pctl_flag : 1;
+               u64 ip6_dst_flag : 1;
+               u64 ip4_dst_flag : 1;
+               u64 ip6_src_flag : 1;
+               u64 ip4_src_flag : 1;
+               cvmx_pow_tag_type_t tcp6_tag_type : 2;
+               cvmx_pow_tag_type_t tcp4_tag_type : 2;
+               cvmx_pow_tag_type_t ip6_tag_type : 2;
+               cvmx_pow_tag_type_t ip4_tag_type : 2;
+               cvmx_pow_tag_type_t non_tag_type : 2;
+               u64 grp : 4;
+       } s;
+       struct cvmx_pip_prt_tagx_cn30xx {
+               u64 reserved_40_63 : 24;
+               u64 grptagbase : 4;
+               u64 grptagmask : 4;
+               u64 grptag : 1;
+               u64 reserved_30_30 : 1;
+               u64 tag_mode : 2;
+               u64 inc_vs : 2;
+               u64 inc_vlan : 1;
+               u64 inc_prt_flag : 1;
+               u64 ip6_dprt_flag : 1;
+               u64 ip4_dprt_flag : 1;
+               u64 ip6_sprt_flag : 1;
+               u64 ip4_sprt_flag : 1;
+               u64 ip6_nxth_flag : 1;
+               u64 ip4_pctl_flag : 1;
+               u64 ip6_dst_flag : 1;
+               u64 ip4_dst_flag : 1;
+               u64 ip6_src_flag : 1;
+               u64 ip4_src_flag : 1;
+               cvmx_pow_tag_type_t tcp6_tag_type : 2;
+               cvmx_pow_tag_type_t tcp4_tag_type : 2;
+               cvmx_pow_tag_type_t ip6_tag_type : 2;
+               cvmx_pow_tag_type_t ip4_tag_type : 2;
+               cvmx_pow_tag_type_t non_tag_type : 2;
+               u64 grp : 4;
+       } cn30xx;
+       struct cvmx_pip_prt_tagx_cn30xx cn31xx;
+       struct cvmx_pip_prt_tagx_cn30xx cn38xx;
+       struct cvmx_pip_prt_tagx_cn30xx cn38xxp2;
+       struct cvmx_pip_prt_tagx_cn50xx {
+               u64 reserved_40_63 : 24;
+               u64 grptagbase : 4;
+               u64 grptagmask : 4;
+               u64 grptag : 1;
+               u64 grptag_mskip : 1;
+               u64 tag_mode : 2;
+               u64 inc_vs : 2;
+               u64 inc_vlan : 1;
+               u64 inc_prt_flag : 1;
+               u64 ip6_dprt_flag : 1;
+               u64 ip4_dprt_flag : 1;
+               u64 ip6_sprt_flag : 1;
+               u64 ip4_sprt_flag : 1;
+               u64 ip6_nxth_flag : 1;
+               u64 ip4_pctl_flag : 1;
+               u64 ip6_dst_flag : 1;
+               u64 ip4_dst_flag : 1;
+               u64 ip6_src_flag : 1;
+               u64 ip4_src_flag : 1;
+               cvmx_pow_tag_type_t tcp6_tag_type : 2;
+               cvmx_pow_tag_type_t tcp4_tag_type : 2;
+               cvmx_pow_tag_type_t ip6_tag_type : 2;
+               cvmx_pow_tag_type_t ip4_tag_type : 2;
+               cvmx_pow_tag_type_t non_tag_type : 2;
+               u64 grp : 4;
+       } cn50xx;
+       struct cvmx_pip_prt_tagx_cn50xx cn52xx;
+       struct cvmx_pip_prt_tagx_cn50xx cn52xxp1;
+       struct cvmx_pip_prt_tagx_cn50xx cn56xx;
+       struct cvmx_pip_prt_tagx_cn50xx cn56xxp1;
+       struct cvmx_pip_prt_tagx_cn30xx cn58xx;
+       struct cvmx_pip_prt_tagx_cn30xx cn58xxp1;
+       struct cvmx_pip_prt_tagx_cn50xx cn61xx;
+       struct cvmx_pip_prt_tagx_cn50xx cn63xx;
+       struct cvmx_pip_prt_tagx_cn50xx cn63xxp1;
+       struct cvmx_pip_prt_tagx_cn50xx cn66xx;
+       struct cvmx_pip_prt_tagx_s cn68xx;
+       struct cvmx_pip_prt_tagx_s cn68xxp1;
+       struct cvmx_pip_prt_tagx_cn50xx cn70xx;
+       struct cvmx_pip_prt_tagx_cn50xx cn70xxp1;
+       struct cvmx_pip_prt_tagx_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pip_prt_tagx cvmx_pip_prt_tagx_t;
+
+/**
+ * cvmx_pip_qos_diff#
+ *
+ * PIP_QOS_DIFFX = QOS Diffserv Tables
+ *
+ */
+union cvmx_pip_qos_diffx {
+       u64 u64;
+       struct cvmx_pip_qos_diffx_s {
+               u64 reserved_3_63 : 61;
+               u64 qos : 3;
+       } s;
+       struct cvmx_pip_qos_diffx_s cn30xx;
+       struct cvmx_pip_qos_diffx_s cn31xx;
+       struct cvmx_pip_qos_diffx_s cn38xx;
+       struct cvmx_pip_qos_diffx_s cn38xxp2;
+       struct cvmx_pip_qos_diffx_s cn50xx;
+       struct cvmx_pip_qos_diffx_s cn52xx;
+       struct cvmx_pip_qos_diffx_s cn52xxp1;
+       struct cvmx_pip_qos_diffx_s cn56xx;
+       struct cvmx_pip_qos_diffx_s cn56xxp1;
+       struct cvmx_pip_qos_diffx_s cn58xx;
+       struct cvmx_pip_qos_diffx_s cn58xxp1;
+       struct cvmx_pip_qos_diffx_s cn61xx;
+       struct cvmx_pip_qos_diffx_s cn63xx;
+       struct cvmx_pip_qos_diffx_s cn63xxp1;
+       struct cvmx_pip_qos_diffx_s cn66xx;
+       struct cvmx_pip_qos_diffx_s cn70xx;
+       struct cvmx_pip_qos_diffx_s cn70xxp1;
+       struct cvmx_pip_qos_diffx_s cnf71xx;
+};
+
+typedef union cvmx_pip_qos_diffx cvmx_pip_qos_diffx_t;
+
+/**
+ * cvmx_pip_qos_vlan#
+ *
+ * If the PIP indentifies a packet is DSA/VLAN tagged, then the QOS
+ * can be set based on the DSA/VLAN user priority.  These eight register
+ * comprise the QOS values for all DSA/VLAN user priority values.
+ */
+union cvmx_pip_qos_vlanx {
+       u64 u64;
+       struct cvmx_pip_qos_vlanx_s {
+               u64 reserved_7_63 : 57;
+               u64 qos1 : 3;
+               u64 reserved_3_3 : 1;
+               u64 qos : 3;
+       } s;
+       struct cvmx_pip_qos_vlanx_cn30xx {
+               u64 reserved_3_63 : 61;
+               u64 qos : 3;
+       } cn30xx;
+       struct cvmx_pip_qos_vlanx_cn30xx cn31xx;
+       struct cvmx_pip_qos_vlanx_cn30xx cn38xx;
+       struct cvmx_pip_qos_vlanx_cn30xx cn38xxp2;
+       struct cvmx_pip_qos_vlanx_cn30xx cn50xx;
+       struct cvmx_pip_qos_vlanx_s cn52xx;
+       struct cvmx_pip_qos_vlanx_s cn52xxp1;
+       struct cvmx_pip_qos_vlanx_s cn56xx;
+       struct cvmx_pip_qos_vlanx_cn30xx cn56xxp1;
+       struct cvmx_pip_qos_vlanx_cn30xx cn58xx;
+       struct cvmx_pip_qos_vlanx_cn30xx cn58xxp1;
+       struct cvmx_pip_qos_vlanx_s cn61xx;
+       struct cvmx_pip_qos_vlanx_s cn63xx;
+       struct cvmx_pip_qos_vlanx_s cn63xxp1;
+       struct cvmx_pip_qos_vlanx_s cn66xx;
+       struct cvmx_pip_qos_vlanx_s cn70xx;
+       struct cvmx_pip_qos_vlanx_s cn70xxp1;
+       struct cvmx_pip_qos_vlanx_s cnf71xx;
+};
+
+typedef union cvmx_pip_qos_vlanx cvmx_pip_qos_vlanx_t;
+
+/**
+ * cvmx_pip_qos_watch#
+ *
+ * Sets up the Configuration CSRs for the four QOS Watchers.
+ * Each Watcher can be set to look for a specific protocol,
+ * TCP/UDP destination port, or Ethertype to override the
+ * default QOS value.
+ */
+union cvmx_pip_qos_watchx {
+       u64 u64;
+       struct cvmx_pip_qos_watchx_s {
+               u64 reserved_48_63 : 16;
+               u64 mask : 16;
+               u64 reserved_30_31 : 2;
+               u64 grp : 6;
+               u64 reserved_23_23 : 1;
+               u64 qos : 3;
+               u64 reserved_16_19 : 4;
+               u64 match_value : 16;
+       } s;
+       struct cvmx_pip_qos_watchx_cn30xx {
+               u64 reserved_48_63 : 16;
+               u64 mask : 16;
+               u64 reserved_28_31 : 4;
+               u64 grp : 4;
+               u64 reserved_23_23 : 1;
+               u64 qos : 3;
+               u64 reserved_18_19 : 2;
+
+               cvmx_pip_qos_watch_types match_type : 2;
+               u64 match_value : 16;
+       } cn30xx;
+       struct cvmx_pip_qos_watchx_cn30xx cn31xx;
+       struct cvmx_pip_qos_watchx_cn30xx cn38xx;
+       struct cvmx_pip_qos_watchx_cn30xx cn38xxp2;
+       struct cvmx_pip_qos_watchx_cn50xx {
+               u64 reserved_48_63 : 16;
+               u64 mask : 16;
+               u64 reserved_28_31 : 4;
+               u64 grp : 4;
+               u64 reserved_23_23 : 1;
+               u64 qos : 3;
+               u64 reserved_19_19 : 1;
+
+               cvmx_pip_qos_watch_types match_type : 3;
+               u64 match_value : 16;
+       } cn50xx;
+       struct cvmx_pip_qos_watchx_cn50xx cn52xx;
+       struct cvmx_pip_qos_watchx_cn50xx cn52xxp1;
+       struct cvmx_pip_qos_watchx_cn50xx cn56xx;
+       struct cvmx_pip_qos_watchx_cn50xx cn56xxp1;
+       struct cvmx_pip_qos_watchx_cn30xx cn58xx;
+       struct cvmx_pip_qos_watchx_cn30xx cn58xxp1;
+       struct cvmx_pip_qos_watchx_cn50xx cn61xx;
+       struct cvmx_pip_qos_watchx_cn50xx cn63xx;
+       struct cvmx_pip_qos_watchx_cn50xx cn63xxp1;
+       struct cvmx_pip_qos_watchx_cn50xx cn66xx;
+       struct cvmx_pip_qos_watchx_cn68xx {
+               u64 reserved_48_63 : 16;
+               u64 mask : 16;
+               u64 reserved_30_31 : 2;
+               u64 grp : 6;
+               u64 reserved_23_23 : 1;
+               u64 qos : 3;
+               u64 reserved_19_19 : 1;
+
+               cvmx_pip_qos_watch_types match_type : 3;
+               u64 match_value : 16;
+       } cn68xx;
+       struct cvmx_pip_qos_watchx_cn68xx cn68xxp1;
+       struct cvmx_pip_qos_watchx_cn70xx {
+               u64 reserved_48_63 : 16;
+               u64 mask : 16;
+               u64 reserved_28_31 : 4;
+               u64 grp : 4;
+               u64 reserved_23_23 : 1;
+               u64 qos : 3;
+               u64 reserved_19_19 : 1;
+               u64 typ : 3;
+               u64 match_value : 16;
+       } cn70xx;
+       struct cvmx_pip_qos_watchx_cn70xx cn70xxp1;
+       struct cvmx_pip_qos_watchx_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pip_qos_watchx cvmx_pip_qos_watchx_t;
+
+/**
+ * cvmx_pip_raw_word
+ *
+ * The RAW Word2 to be inserted into the workQ entry of RAWFULL packets.
+ *
+ */
+union cvmx_pip_raw_word {
+       u64 u64;
+       struct cvmx_pip_raw_word_s {
+               u64 reserved_56_63 : 8;
+               u64 word : 56;
+       } s;
+       struct cvmx_pip_raw_word_s cn30xx;
+       struct cvmx_pip_raw_word_s cn31xx;
+       struct cvmx_pip_raw_word_s cn38xx;
+       struct cvmx_pip_raw_word_s cn38xxp2;
+       struct cvmx_pip_raw_word_s cn50xx;
+       struct cvmx_pip_raw_word_s cn52xx;
+       struct cvmx_pip_raw_word_s cn52xxp1;
+       struct cvmx_pip_raw_word_s cn56xx;
+       struct cvmx_pip_raw_word_s cn56xxp1;
+       struct cvmx_pip_raw_word_s cn58xx;
+       struct cvmx_pip_raw_word_s cn58xxp1;
+       struct cvmx_pip_raw_word_s cn61xx;
+       struct cvmx_pip_raw_word_s cn63xx;
+       struct cvmx_pip_raw_word_s cn63xxp1;
+       struct cvmx_pip_raw_word_s cn66xx;
+       struct cvmx_pip_raw_word_s cn68xx;
+       struct cvmx_pip_raw_word_s cn68xxp1;
+       struct cvmx_pip_raw_word_s cn70xx;
+       struct cvmx_pip_raw_word_s cn70xxp1;
+       struct cvmx_pip_raw_word_s cnf71xx;
+};
+
+typedef union cvmx_pip_raw_word cvmx_pip_raw_word_t;
+
+/**
+ * cvmx_pip_sft_rst
+ *
+ * When written to a '1', resets the pip block
+ *
+ */
+union cvmx_pip_sft_rst {
+       u64 u64;
+       struct cvmx_pip_sft_rst_s {
+               u64 reserved_1_63 : 63;
+               u64 rst : 1;
+       } s;
+       struct cvmx_pip_sft_rst_s cn30xx;
+       struct cvmx_pip_sft_rst_s cn31xx;
+       struct cvmx_pip_sft_rst_s cn38xx;
+       struct cvmx_pip_sft_rst_s cn50xx;
+       struct cvmx_pip_sft_rst_s cn52xx;
+       struct cvmx_pip_sft_rst_s cn52xxp1;
+       struct cvmx_pip_sft_rst_s cn56xx;
+       struct cvmx_pip_sft_rst_s cn56xxp1;
+       struct cvmx_pip_sft_rst_s cn58xx;
+       struct cvmx_pip_sft_rst_s cn58xxp1;
+       struct cvmx_pip_sft_rst_s cn61xx;
+       struct cvmx_pip_sft_rst_s cn63xx;
+       struct cvmx_pip_sft_rst_s cn63xxp1;
+       struct cvmx_pip_sft_rst_s cn66xx;
+       struct cvmx_pip_sft_rst_s cn68xx;
+       struct cvmx_pip_sft_rst_s cn68xxp1;
+       struct cvmx_pip_sft_rst_s cn70xx;
+       struct cvmx_pip_sft_rst_s cn70xxp1;
+       struct cvmx_pip_sft_rst_s cnf71xx;
+};
+
+typedef union cvmx_pip_sft_rst cvmx_pip_sft_rst_t;
+
+/**
+ * cvmx_pip_stat0_#
+ *
+ * PIP Statistics Counters
+ *
+ * Note: special stat counter behavior
+ *
+ * 1) Read and write operations must arbitrate for the statistics resources
+ *     along with the packet engines which are incrementing the counters.
+ *     In order to not drop packet information, the packet HW is always a
+ *     higher priority and the CSR requests will only be satisified when
+ *     there are idle cycles.  This can potentially cause long delays if the
+ *     system becomes full.
+ *
+ * 2) stat counters can be cleared in two ways.  If PIP_STAT_CTL[RDCLR] is
+ *     set, then all read accesses will clear the register.  In addition,
+ *     any write to a stats register will also reset the register to zero.
+ *     Please note that the clearing operations must obey rule \#1 above.
+ *
+ * 3) all counters are wrapping - software must ensure they are read periodically
+ *
+ * 4) The counters accumulate statistics for packets that are sent to PKI.  If
+ *    PTP_MODE is enabled, the 8B timestamp is prepended to the packet.  This
+ *    additional 8B of data is captured in the octet counts.
+ *
+ * 5) X represents either the packet's port-kind or backpressure ID as
+ *    determined by PIP_STAT_CTL[MODE]
+ * PIP_STAT0_X = PIP_STAT_DRP_PKTS / PIP_STAT_DRP_OCTS
+ */
+union cvmx_pip_stat0_x {
+       u64 u64;
+       struct cvmx_pip_stat0_x_s {
+               u64 drp_pkts : 32;
+               u64 drp_octs : 32;
+       } s;
+       struct cvmx_pip_stat0_x_s cn68xx;
+       struct cvmx_pip_stat0_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat0_x cvmx_pip_stat0_x_t;
+
+/**
+ * cvmx_pip_stat0_prt#
+ *
+ * "PIP Statistics Counters
+ * Note: special stat counter behavior
+ * 1) Read and write operations must arbitrate for the statistics resources
+ * along with the packet engines which are incrementing the counters.
+ * In order to not drop packet information, the packet HW is always a
+ * higher priority and the CSR requests will only be satisified when
+ * there are idle cycles.  This can potentially cause long delays if the
+ * system becomes full.
+ * 2) stat counters can be cleared in two ways.  If PIP_STAT_CTL[RDCLR] is
+ * set, then all read accesses will clear the register.  In addition,
+ * any write to a stats register will also reset the register to zero.
+ * Please note that the clearing operations must obey rule \#1 above.
+ * 3) all counters are wrapping - software must ensure they are read periodically
+ * 4) The counters accumulate statistics for packets that are sent to PKI.  If
+ * PTP_MODE is enabled, the 8B timestamp is prepended to the packet.  This
+ * additional 8B of data is captured in the octet counts.
+ * PIP_STAT0_PRT = PIP_STAT_DRP_PKTS / PIP_STAT_DRP_OCTS"
+ */
+union cvmx_pip_stat0_prtx {
+       u64 u64;
+       struct cvmx_pip_stat0_prtx_s {
+               u64 drp_pkts : 32;
+               u64 drp_octs : 32;
+       } s;
+       struct cvmx_pip_stat0_prtx_s cn30xx;
+       struct cvmx_pip_stat0_prtx_s cn31xx;
+       struct cvmx_pip_stat0_prtx_s cn38xx;
+       struct cvmx_pip_stat0_prtx_s cn38xxp2;
+       struct cvmx_pip_stat0_prtx_s cn50xx;
+       struct cvmx_pip_stat0_prtx_s cn52xx;
+       struct cvmx_pip_stat0_prtx_s cn52xxp1;
+       struct cvmx_pip_stat0_prtx_s cn56xx;
+       struct cvmx_pip_stat0_prtx_s cn56xxp1;
+       struct cvmx_pip_stat0_prtx_s cn58xx;
+       struct cvmx_pip_stat0_prtx_s cn58xxp1;
+       struct cvmx_pip_stat0_prtx_s cn61xx;
+       struct cvmx_pip_stat0_prtx_s cn63xx;
+       struct cvmx_pip_stat0_prtx_s cn63xxp1;
+       struct cvmx_pip_stat0_prtx_s cn66xx;
+       struct cvmx_pip_stat0_prtx_s cn70xx;
+       struct cvmx_pip_stat0_prtx_s cn70xxp1;
+       struct cvmx_pip_stat0_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat0_prtx cvmx_pip_stat0_prtx_t;
+
+/**
+ * cvmx_pip_stat10_#
+ *
+ * PIP_STAT10_X = PIP_STAT_L2_MCAST / PIP_STAT_L2_BCAST
+ *
+ */
+union cvmx_pip_stat10_x {
+       u64 u64;
+       struct cvmx_pip_stat10_x_s {
+               u64 bcast : 32;
+               u64 mcast : 32;
+       } s;
+       struct cvmx_pip_stat10_x_s cn68xx;
+       struct cvmx_pip_stat10_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat10_x cvmx_pip_stat10_x_t;
+
+/**
+ * cvmx_pip_stat10_prt#
+ *
+ * PIP_STAT10_PRTX = PIP_STAT_L2_MCAST / PIP_STAT_L2_BCAST
+ *
+ */
+union cvmx_pip_stat10_prtx {
+       u64 u64;
+       struct cvmx_pip_stat10_prtx_s {
+               u64 bcast : 32;
+               u64 mcast : 32;
+       } s;
+       struct cvmx_pip_stat10_prtx_s cn52xx;
+       struct cvmx_pip_stat10_prtx_s cn52xxp1;
+       struct cvmx_pip_stat10_prtx_s cn56xx;
+       struct cvmx_pip_stat10_prtx_s cn56xxp1;
+       struct cvmx_pip_stat10_prtx_s cn61xx;
+       struct cvmx_pip_stat10_prtx_s cn63xx;
+       struct cvmx_pip_stat10_prtx_s cn63xxp1;
+       struct cvmx_pip_stat10_prtx_s cn66xx;
+       struct cvmx_pip_stat10_prtx_s cn70xx;
+       struct cvmx_pip_stat10_prtx_s cn70xxp1;
+       struct cvmx_pip_stat10_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat10_prtx cvmx_pip_stat10_prtx_t;
+
+/**
+ * cvmx_pip_stat11_#
+ *
+ * PIP_STAT11_X = PIP_STAT_L3_MCAST / PIP_STAT_L3_BCAST
+ *
+ */
+union cvmx_pip_stat11_x {
+       u64 u64;
+       struct cvmx_pip_stat11_x_s {
+               u64 bcast : 32;
+               u64 mcast : 32;
+       } s;
+       struct cvmx_pip_stat11_x_s cn68xx;
+       struct cvmx_pip_stat11_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat11_x cvmx_pip_stat11_x_t;
+
+/**
+ * cvmx_pip_stat11_prt#
+ *
+ * PIP_STAT11_PRTX = PIP_STAT_L3_MCAST / PIP_STAT_L3_BCAST
+ *
+ */
+union cvmx_pip_stat11_prtx {
+       u64 u64;
+       struct cvmx_pip_stat11_prtx_s {
+               u64 bcast : 32;
+               u64 mcast : 32;
+       } s;
+       struct cvmx_pip_stat11_prtx_s cn52xx;
+       struct cvmx_pip_stat11_prtx_s cn52xxp1;
+       struct cvmx_pip_stat11_prtx_s cn56xx;
+       struct cvmx_pip_stat11_prtx_s cn56xxp1;
+       struct cvmx_pip_stat11_prtx_s cn61xx;
+       struct cvmx_pip_stat11_prtx_s cn63xx;
+       struct cvmx_pip_stat11_prtx_s cn63xxp1;
+       struct cvmx_pip_stat11_prtx_s cn66xx;
+       struct cvmx_pip_stat11_prtx_s cn70xx;
+       struct cvmx_pip_stat11_prtx_s cn70xxp1;
+       struct cvmx_pip_stat11_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat11_prtx cvmx_pip_stat11_prtx_t;
+
+/**
+ * cvmx_pip_stat1_#
+ *
+ * PIP_STAT1_X = PIP_STAT_OCTS
+ *
+ */
+union cvmx_pip_stat1_x {
+       u64 u64;
+       struct cvmx_pip_stat1_x_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_pip_stat1_x_s cn68xx;
+       struct cvmx_pip_stat1_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat1_x cvmx_pip_stat1_x_t;
+
+/**
+ * cvmx_pip_stat1_prt#
+ *
+ * PIP_STAT1_PRTX = PIP_STAT_OCTS
+ *
+ */
+union cvmx_pip_stat1_prtx {
+       u64 u64;
+       struct cvmx_pip_stat1_prtx_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_pip_stat1_prtx_s cn30xx;
+       struct cvmx_pip_stat1_prtx_s cn31xx;
+       struct cvmx_pip_stat1_prtx_s cn38xx;
+       struct cvmx_pip_stat1_prtx_s cn38xxp2;
+       struct cvmx_pip_stat1_prtx_s cn50xx;
+       struct cvmx_pip_stat1_prtx_s cn52xx;
+       struct cvmx_pip_stat1_prtx_s cn52xxp1;
+       struct cvmx_pip_stat1_prtx_s cn56xx;
+       struct cvmx_pip_stat1_prtx_s cn56xxp1;
+       struct cvmx_pip_stat1_prtx_s cn58xx;
+       struct cvmx_pip_stat1_prtx_s cn58xxp1;
+       struct cvmx_pip_stat1_prtx_s cn61xx;
+       struct cvmx_pip_stat1_prtx_s cn63xx;
+       struct cvmx_pip_stat1_prtx_s cn63xxp1;
+       struct cvmx_pip_stat1_prtx_s cn66xx;
+       struct cvmx_pip_stat1_prtx_s cn70xx;
+       struct cvmx_pip_stat1_prtx_s cn70xxp1;
+       struct cvmx_pip_stat1_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat1_prtx cvmx_pip_stat1_prtx_t;
+
+/**
+ * cvmx_pip_stat2_#
+ *
+ * PIP_STAT2_X = PIP_STAT_PKTS     / PIP_STAT_RAW
+ *
+ */
+union cvmx_pip_stat2_x {
+       u64 u64;
+       struct cvmx_pip_stat2_x_s {
+               u64 pkts : 32;
+               u64 raw : 32;
+       } s;
+       struct cvmx_pip_stat2_x_s cn68xx;
+       struct cvmx_pip_stat2_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat2_x cvmx_pip_stat2_x_t;
+
+/**
+ * cvmx_pip_stat2_prt#
+ *
+ * PIP_STAT2_PRTX = PIP_STAT_PKTS     / PIP_STAT_RAW
+ *
+ */
+union cvmx_pip_stat2_prtx {
+       u64 u64;
+       struct cvmx_pip_stat2_prtx_s {
+               u64 pkts : 32;
+               u64 raw : 32;
+       } s;
+       struct cvmx_pip_stat2_prtx_s cn30xx;
+       struct cvmx_pip_stat2_prtx_s cn31xx;
+       struct cvmx_pip_stat2_prtx_s cn38xx;
+       struct cvmx_pip_stat2_prtx_s cn38xxp2;
+       struct cvmx_pip_stat2_prtx_s cn50xx;
+       struct cvmx_pip_stat2_prtx_s cn52xx;
+       struct cvmx_pip_stat2_prtx_s cn52xxp1;
+       struct cvmx_pip_stat2_prtx_s cn56xx;
+       struct cvmx_pip_stat2_prtx_s cn56xxp1;
+       struct cvmx_pip_stat2_prtx_s cn58xx;
+       struct cvmx_pip_stat2_prtx_s cn58xxp1;
+       struct cvmx_pip_stat2_prtx_s cn61xx;
+       struct cvmx_pip_stat2_prtx_s cn63xx;
+       struct cvmx_pip_stat2_prtx_s cn63xxp1;
+       struct cvmx_pip_stat2_prtx_s cn66xx;
+       struct cvmx_pip_stat2_prtx_s cn70xx;
+       struct cvmx_pip_stat2_prtx_s cn70xxp1;
+       struct cvmx_pip_stat2_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat2_prtx cvmx_pip_stat2_prtx_t;
+
+/**
+ * cvmx_pip_stat3_#
+ *
+ * PIP_STAT3_X = PIP_STAT_BCST     / PIP_STAT_MCST
+ *
+ */
+union cvmx_pip_stat3_x {
+       u64 u64;
+       struct cvmx_pip_stat3_x_s {
+               u64 bcst : 32;
+               u64 mcst : 32;
+       } s;
+       struct cvmx_pip_stat3_x_s cn68xx;
+       struct cvmx_pip_stat3_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat3_x cvmx_pip_stat3_x_t;
+
+/**
+ * cvmx_pip_stat3_prt#
+ *
+ * PIP_STAT3_PRTX = PIP_STAT_BCST     / PIP_STAT_MCST
+ *
+ */
+union cvmx_pip_stat3_prtx {
+       u64 u64;
+       struct cvmx_pip_stat3_prtx_s {
+               u64 bcst : 32;
+               u64 mcst : 32;
+       } s;
+       struct cvmx_pip_stat3_prtx_s cn30xx;
+       struct cvmx_pip_stat3_prtx_s cn31xx;
+       struct cvmx_pip_stat3_prtx_s cn38xx;
+       struct cvmx_pip_stat3_prtx_s cn38xxp2;
+       struct cvmx_pip_stat3_prtx_s cn50xx;
+       struct cvmx_pip_stat3_prtx_s cn52xx;
+       struct cvmx_pip_stat3_prtx_s cn52xxp1;
+       struct cvmx_pip_stat3_prtx_s cn56xx;
+       struct cvmx_pip_stat3_prtx_s cn56xxp1;
+       struct cvmx_pip_stat3_prtx_s cn58xx;
+       struct cvmx_pip_stat3_prtx_s cn58xxp1;
+       struct cvmx_pip_stat3_prtx_s cn61xx;
+       struct cvmx_pip_stat3_prtx_s cn63xx;
+       struct cvmx_pip_stat3_prtx_s cn63xxp1;
+       struct cvmx_pip_stat3_prtx_s cn66xx;
+       struct cvmx_pip_stat3_prtx_s cn70xx;
+       struct cvmx_pip_stat3_prtx_s cn70xxp1;
+       struct cvmx_pip_stat3_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat3_prtx cvmx_pip_stat3_prtx_t;
+
+/**
+ * cvmx_pip_stat4_#
+ *
+ * PIP_STAT4_X = PIP_STAT_HIST1    / PIP_STAT_HIST0
+ *
+ */
+union cvmx_pip_stat4_x {
+       u64 u64;
+       struct cvmx_pip_stat4_x_s {
+               u64 h65to127 : 32;
+               u64 h64 : 32;
+       } s;
+       struct cvmx_pip_stat4_x_s cn68xx;
+       struct cvmx_pip_stat4_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat4_x cvmx_pip_stat4_x_t;
+
+/**
+ * cvmx_pip_stat4_prt#
+ *
+ * PIP_STAT4_PRTX = PIP_STAT_HIST1    / PIP_STAT_HIST0
+ *
+ */
+union cvmx_pip_stat4_prtx {
+       u64 u64;
+       struct cvmx_pip_stat4_prtx_s {
+               u64 h65to127 : 32;
+               u64 h64 : 32;
+       } s;
+       struct cvmx_pip_stat4_prtx_s cn30xx;
+       struct cvmx_pip_stat4_prtx_s cn31xx;
+       struct cvmx_pip_stat4_prtx_s cn38xx;
+       struct cvmx_pip_stat4_prtx_s cn38xxp2;
+       struct cvmx_pip_stat4_prtx_s cn50xx;
+       struct cvmx_pip_stat4_prtx_s cn52xx;
+       struct cvmx_pip_stat4_prtx_s cn52xxp1;
+       struct cvmx_pip_stat4_prtx_s cn56xx;
+       struct cvmx_pip_stat4_prtx_s cn56xxp1;
+       struct cvmx_pip_stat4_prtx_s cn58xx;
+       struct cvmx_pip_stat4_prtx_s cn58xxp1;
+       struct cvmx_pip_stat4_prtx_s cn61xx;
+       struct cvmx_pip_stat4_prtx_s cn63xx;
+       struct cvmx_pip_stat4_prtx_s cn63xxp1;
+       struct cvmx_pip_stat4_prtx_s cn66xx;
+       struct cvmx_pip_stat4_prtx_s cn70xx;
+       struct cvmx_pip_stat4_prtx_s cn70xxp1;
+       struct cvmx_pip_stat4_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat4_prtx cvmx_pip_stat4_prtx_t;
+
+/**
+ * cvmx_pip_stat5_#
+ *
+ * PIP_STAT5_X = PIP_STAT_HIST3    / PIP_STAT_HIST2
+ *
+ */
+union cvmx_pip_stat5_x {
+       u64 u64;
+       struct cvmx_pip_stat5_x_s {
+               u64 h256to511 : 32;
+               u64 h128to255 : 32;
+       } s;
+       struct cvmx_pip_stat5_x_s cn68xx;
+       struct cvmx_pip_stat5_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat5_x cvmx_pip_stat5_x_t;
+
+/**
+ * cvmx_pip_stat5_prt#
+ *
+ * PIP_STAT5_PRTX = PIP_STAT_HIST3    / PIP_STAT_HIST2
+ *
+ */
+union cvmx_pip_stat5_prtx {
+       u64 u64;
+       struct cvmx_pip_stat5_prtx_s {
+               u64 h256to511 : 32;
+               u64 h128to255 : 32;
+       } s;
+       struct cvmx_pip_stat5_prtx_s cn30xx;
+       struct cvmx_pip_stat5_prtx_s cn31xx;
+       struct cvmx_pip_stat5_prtx_s cn38xx;
+       struct cvmx_pip_stat5_prtx_s cn38xxp2;
+       struct cvmx_pip_stat5_prtx_s cn50xx;
+       struct cvmx_pip_stat5_prtx_s cn52xx;
+       struct cvmx_pip_stat5_prtx_s cn52xxp1;
+       struct cvmx_pip_stat5_prtx_s cn56xx;
+       struct cvmx_pip_stat5_prtx_s cn56xxp1;
+       struct cvmx_pip_stat5_prtx_s cn58xx;
+       struct cvmx_pip_stat5_prtx_s cn58xxp1;
+       struct cvmx_pip_stat5_prtx_s cn61xx;
+       struct cvmx_pip_stat5_prtx_s cn63xx;
+       struct cvmx_pip_stat5_prtx_s cn63xxp1;
+       struct cvmx_pip_stat5_prtx_s cn66xx;
+       struct cvmx_pip_stat5_prtx_s cn70xx;
+       struct cvmx_pip_stat5_prtx_s cn70xxp1;
+       struct cvmx_pip_stat5_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat5_prtx cvmx_pip_stat5_prtx_t;
+
+/**
+ * cvmx_pip_stat6_#
+ *
+ * PIP_STAT6_X = PIP_STAT_HIST5    / PIP_STAT_HIST4
+ *
+ */
+union cvmx_pip_stat6_x {
+       u64 u64;
+       struct cvmx_pip_stat6_x_s {
+               u64 h1024to1518 : 32;
+               u64 h512to1023 : 32;
+       } s;
+       struct cvmx_pip_stat6_x_s cn68xx;
+       struct cvmx_pip_stat6_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat6_x cvmx_pip_stat6_x_t;
+
+/**
+ * cvmx_pip_stat6_prt#
+ *
+ * PIP_STAT6_PRTX = PIP_STAT_HIST5    / PIP_STAT_HIST4
+ *
+ */
+union cvmx_pip_stat6_prtx {
+       u64 u64;
+       struct cvmx_pip_stat6_prtx_s {
+               u64 h1024to1518 : 32;
+               u64 h512to1023 : 32;
+       } s;
+       struct cvmx_pip_stat6_prtx_s cn30xx;
+       struct cvmx_pip_stat6_prtx_s cn31xx;
+       struct cvmx_pip_stat6_prtx_s cn38xx;
+       struct cvmx_pip_stat6_prtx_s cn38xxp2;
+       struct cvmx_pip_stat6_prtx_s cn50xx;
+       struct cvmx_pip_stat6_prtx_s cn52xx;
+       struct cvmx_pip_stat6_prtx_s cn52xxp1;
+       struct cvmx_pip_stat6_prtx_s cn56xx;
+       struct cvmx_pip_stat6_prtx_s cn56xxp1;
+       struct cvmx_pip_stat6_prtx_s cn58xx;
+       struct cvmx_pip_stat6_prtx_s cn58xxp1;
+       struct cvmx_pip_stat6_prtx_s cn61xx;
+       struct cvmx_pip_stat6_prtx_s cn63xx;
+       struct cvmx_pip_stat6_prtx_s cn63xxp1;
+       struct cvmx_pip_stat6_prtx_s cn66xx;
+       struct cvmx_pip_stat6_prtx_s cn70xx;
+       struct cvmx_pip_stat6_prtx_s cn70xxp1;
+       struct cvmx_pip_stat6_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat6_prtx cvmx_pip_stat6_prtx_t;
+
+/**
+ * cvmx_pip_stat7_#
+ *
+ * PIP_STAT7_X = PIP_STAT_FCS      / PIP_STAT_HIST6
+ *
+ */
+union cvmx_pip_stat7_x {
+       u64 u64;
+       struct cvmx_pip_stat7_x_s {
+               u64 fcs : 32;
+               u64 h1519 : 32;
+       } s;
+       struct cvmx_pip_stat7_x_s cn68xx;
+       struct cvmx_pip_stat7_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat7_x cvmx_pip_stat7_x_t;
+
+/**
+ * cvmx_pip_stat7_prt#
+ *
+ * PIP_STAT7_PRTX = PIP_STAT_FCS      / PIP_STAT_HIST6
+ *
+ *
+ * Notes:
+ * DPI does not check FCS, therefore FCS will never increment on DPI ports 32-35
+ * sRIO does not check FCS, therefore FCS will never increment on sRIO ports 40-47
+ */
+union cvmx_pip_stat7_prtx {
+       u64 u64;
+       struct cvmx_pip_stat7_prtx_s {
+               u64 fcs : 32;
+               u64 h1519 : 32;
+       } s;
+       struct cvmx_pip_stat7_prtx_s cn30xx;
+       struct cvmx_pip_stat7_prtx_s cn31xx;
+       struct cvmx_pip_stat7_prtx_s cn38xx;
+       struct cvmx_pip_stat7_prtx_s cn38xxp2;
+       struct cvmx_pip_stat7_prtx_s cn50xx;
+       struct cvmx_pip_stat7_prtx_s cn52xx;
+       struct cvmx_pip_stat7_prtx_s cn52xxp1;
+       struct cvmx_pip_stat7_prtx_s cn56xx;
+       struct cvmx_pip_stat7_prtx_s cn56xxp1;
+       struct cvmx_pip_stat7_prtx_s cn58xx;
+       struct cvmx_pip_stat7_prtx_s cn58xxp1;
+       struct cvmx_pip_stat7_prtx_s cn61xx;
+       struct cvmx_pip_stat7_prtx_s cn63xx;
+       struct cvmx_pip_stat7_prtx_s cn63xxp1;
+       struct cvmx_pip_stat7_prtx_s cn66xx;
+       struct cvmx_pip_stat7_prtx_s cn70xx;
+       struct cvmx_pip_stat7_prtx_s cn70xxp1;
+       struct cvmx_pip_stat7_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat7_prtx cvmx_pip_stat7_prtx_t;
+
+/**
+ * cvmx_pip_stat8_#
+ *
+ * PIP_STAT8_X = PIP_STAT_FRAG     / PIP_STAT_UNDER
+ *
+ */
+union cvmx_pip_stat8_x {
+       u64 u64;
+       struct cvmx_pip_stat8_x_s {
+               u64 frag : 32;
+               u64 undersz : 32;
+       } s;
+       struct cvmx_pip_stat8_x_s cn68xx;
+       struct cvmx_pip_stat8_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat8_x cvmx_pip_stat8_x_t;
+
+/**
+ * cvmx_pip_stat8_prt#
+ *
+ * PIP_STAT8_PRTX = PIP_STAT_FRAG     / PIP_STAT_UNDER
+ *
+ *
+ * Notes:
+ * DPI does not check FCS, therefore FRAG will never increment on DPI ports 32-35
+ * sRIO does not check FCS, therefore FRAG will never increment on sRIO ports 40-47
+ */
+union cvmx_pip_stat8_prtx {
+       u64 u64;
+       struct cvmx_pip_stat8_prtx_s {
+               u64 frag : 32;
+               u64 undersz : 32;
+       } s;
+       struct cvmx_pip_stat8_prtx_s cn30xx;
+       struct cvmx_pip_stat8_prtx_s cn31xx;
+       struct cvmx_pip_stat8_prtx_s cn38xx;
+       struct cvmx_pip_stat8_prtx_s cn38xxp2;
+       struct cvmx_pip_stat8_prtx_s cn50xx;
+       struct cvmx_pip_stat8_prtx_s cn52xx;
+       struct cvmx_pip_stat8_prtx_s cn52xxp1;
+       struct cvmx_pip_stat8_prtx_s cn56xx;
+       struct cvmx_pip_stat8_prtx_s cn56xxp1;
+       struct cvmx_pip_stat8_prtx_s cn58xx;
+       struct cvmx_pip_stat8_prtx_s cn58xxp1;
+       struct cvmx_pip_stat8_prtx_s cn61xx;
+       struct cvmx_pip_stat8_prtx_s cn63xx;
+       struct cvmx_pip_stat8_prtx_s cn63xxp1;
+       struct cvmx_pip_stat8_prtx_s cn66xx;
+       struct cvmx_pip_stat8_prtx_s cn70xx;
+       struct cvmx_pip_stat8_prtx_s cn70xxp1;
+       struct cvmx_pip_stat8_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat8_prtx cvmx_pip_stat8_prtx_t;
+
+/**
+ * cvmx_pip_stat9_#
+ *
+ * PIP_STAT9_X = PIP_STAT_JABBER   / PIP_STAT_OVER
+ *
+ */
+union cvmx_pip_stat9_x {
+       u64 u64;
+       struct cvmx_pip_stat9_x_s {
+               u64 jabber : 32;
+               u64 oversz : 32;
+       } s;
+       struct cvmx_pip_stat9_x_s cn68xx;
+       struct cvmx_pip_stat9_x_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat9_x cvmx_pip_stat9_x_t;
+
+/**
+ * cvmx_pip_stat9_prt#
+ *
+ * PIP_STAT9_PRTX = PIP_STAT_JABBER   / PIP_STAT_OVER
+ *
+ *
+ * Notes:
+ * DPI does not check FCS, therefore JABBER will never increment on DPI ports 32-35
+ * sRIO does not check FCS, therefore JABBER will never increment on sRIO ports 40-47 due to FCS errors
+ * sRIO does use the JABBER opcode to communicate sRIO error, therefore JABBER can increment under the sRIO error conditions
+ */
+union cvmx_pip_stat9_prtx {
+       u64 u64;
+       struct cvmx_pip_stat9_prtx_s {
+               u64 jabber : 32;
+               u64 oversz : 32;
+       } s;
+       struct cvmx_pip_stat9_prtx_s cn30xx;
+       struct cvmx_pip_stat9_prtx_s cn31xx;
+       struct cvmx_pip_stat9_prtx_s cn38xx;
+       struct cvmx_pip_stat9_prtx_s cn38xxp2;
+       struct cvmx_pip_stat9_prtx_s cn50xx;
+       struct cvmx_pip_stat9_prtx_s cn52xx;
+       struct cvmx_pip_stat9_prtx_s cn52xxp1;
+       struct cvmx_pip_stat9_prtx_s cn56xx;
+       struct cvmx_pip_stat9_prtx_s cn56xxp1;
+       struct cvmx_pip_stat9_prtx_s cn58xx;
+       struct cvmx_pip_stat9_prtx_s cn58xxp1;
+       struct cvmx_pip_stat9_prtx_s cn61xx;
+       struct cvmx_pip_stat9_prtx_s cn63xx;
+       struct cvmx_pip_stat9_prtx_s cn63xxp1;
+       struct cvmx_pip_stat9_prtx_s cn66xx;
+       struct cvmx_pip_stat9_prtx_s cn70xx;
+       struct cvmx_pip_stat9_prtx_s cn70xxp1;
+       struct cvmx_pip_stat9_prtx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat9_prtx cvmx_pip_stat9_prtx_t;
+
+/**
+ * cvmx_pip_stat_ctl
+ *
+ * Controls how the PIP statistics counters are handled.
+ *
+ */
+union cvmx_pip_stat_ctl {
+       u64 u64;
+       struct cvmx_pip_stat_ctl_s {
+               u64 reserved_9_63 : 55;
+               u64 mode : 1;
+               u64 reserved_1_7 : 7;
+               u64 rdclr : 1;
+       } s;
+       struct cvmx_pip_stat_ctl_cn30xx {
+               u64 reserved_1_63 : 63;
+               u64 rdclr : 1;
+       } cn30xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn31xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn38xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn38xxp2;
+       struct cvmx_pip_stat_ctl_cn30xx cn50xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn52xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn52xxp1;
+       struct cvmx_pip_stat_ctl_cn30xx cn56xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn56xxp1;
+       struct cvmx_pip_stat_ctl_cn30xx cn58xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn58xxp1;
+       struct cvmx_pip_stat_ctl_cn30xx cn61xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn63xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn63xxp1;
+       struct cvmx_pip_stat_ctl_cn30xx cn66xx;
+       struct cvmx_pip_stat_ctl_s cn68xx;
+       struct cvmx_pip_stat_ctl_s cn68xxp1;
+       struct cvmx_pip_stat_ctl_cn30xx cn70xx;
+       struct cvmx_pip_stat_ctl_cn30xx cn70xxp1;
+       struct cvmx_pip_stat_ctl_cn30xx cnf71xx;
+};
+
+typedef union cvmx_pip_stat_ctl cvmx_pip_stat_ctl_t;
+
+/**
+ * cvmx_pip_stat_inb_errs#
+ *
+ * Inbound stats collect all data sent to PIP from all packet interfaces.
+ * Its the raw counts of everything that comes into the block.  The counts
+ * will reflect all error packets and packets dropped by the PKI RED engine.
+ * These counts are intended for system debug, but could convey useful
+ * information in production systems.
+ */
+union cvmx_pip_stat_inb_errsx {
+       u64 u64;
+       struct cvmx_pip_stat_inb_errsx_s {
+               u64 reserved_16_63 : 48;
+               u64 errs : 16;
+       } s;
+       struct cvmx_pip_stat_inb_errsx_s cn30xx;
+       struct cvmx_pip_stat_inb_errsx_s cn31xx;
+       struct cvmx_pip_stat_inb_errsx_s cn38xx;
+       struct cvmx_pip_stat_inb_errsx_s cn38xxp2;
+       struct cvmx_pip_stat_inb_errsx_s cn50xx;
+       struct cvmx_pip_stat_inb_errsx_s cn52xx;
+       struct cvmx_pip_stat_inb_errsx_s cn52xxp1;
+       struct cvmx_pip_stat_inb_errsx_s cn56xx;
+       struct cvmx_pip_stat_inb_errsx_s cn56xxp1;
+       struct cvmx_pip_stat_inb_errsx_s cn58xx;
+       struct cvmx_pip_stat_inb_errsx_s cn58xxp1;
+       struct cvmx_pip_stat_inb_errsx_s cn61xx;
+       struct cvmx_pip_stat_inb_errsx_s cn63xx;
+       struct cvmx_pip_stat_inb_errsx_s cn63xxp1;
+       struct cvmx_pip_stat_inb_errsx_s cn66xx;
+       struct cvmx_pip_stat_inb_errsx_s cn70xx;
+       struct cvmx_pip_stat_inb_errsx_s cn70xxp1;
+       struct cvmx_pip_stat_inb_errsx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat_inb_errsx cvmx_pip_stat_inb_errsx_t;
+
+/**
+ * cvmx_pip_stat_inb_errs_pknd#
+ *
+ * PIP_STAT_INB_ERRS_PKNDX = Inbound error packets received by PIP per pkind
+ *
+ * Inbound stats collect all data sent to PIP from all packet interfaces.
+ * Its the raw counts of everything that comes into the block.  The counts
+ * will reflect all error packets and packets dropped by the PKI RED engine.
+ * These counts are intended for system debug, but could convey useful
+ * information in production systems.
+ */
+union cvmx_pip_stat_inb_errs_pkndx {
+       u64 u64;
+       struct cvmx_pip_stat_inb_errs_pkndx_s {
+               u64 reserved_16_63 : 48;
+               u64 errs : 16;
+       } s;
+       struct cvmx_pip_stat_inb_errs_pkndx_s cn68xx;
+       struct cvmx_pip_stat_inb_errs_pkndx_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat_inb_errs_pkndx cvmx_pip_stat_inb_errs_pkndx_t;
+
+/**
+ * cvmx_pip_stat_inb_octs#
+ *
+ * Inbound stats collect all data sent to PIP from all packet interfaces.
+ * Its the raw counts of everything that comes into the block.  The counts
+ * will reflect all error packets and packets dropped by the PKI RED engine.
+ * These counts are intended for system debug, but could convey useful
+ * information in production systems. The OCTS will include the bytes from
+ * timestamp fields in PTP_MODE.
+ */
+union cvmx_pip_stat_inb_octsx {
+       u64 u64;
+       struct cvmx_pip_stat_inb_octsx_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_pip_stat_inb_octsx_s cn30xx;
+       struct cvmx_pip_stat_inb_octsx_s cn31xx;
+       struct cvmx_pip_stat_inb_octsx_s cn38xx;
+       struct cvmx_pip_stat_inb_octsx_s cn38xxp2;
+       struct cvmx_pip_stat_inb_octsx_s cn50xx;
+       struct cvmx_pip_stat_inb_octsx_s cn52xx;
+       struct cvmx_pip_stat_inb_octsx_s cn52xxp1;
+       struct cvmx_pip_stat_inb_octsx_s cn56xx;
+       struct cvmx_pip_stat_inb_octsx_s cn56xxp1;
+       struct cvmx_pip_stat_inb_octsx_s cn58xx;
+       struct cvmx_pip_stat_inb_octsx_s cn58xxp1;
+       struct cvmx_pip_stat_inb_octsx_s cn61xx;
+       struct cvmx_pip_stat_inb_octsx_s cn63xx;
+       struct cvmx_pip_stat_inb_octsx_s cn63xxp1;
+       struct cvmx_pip_stat_inb_octsx_s cn66xx;
+       struct cvmx_pip_stat_inb_octsx_s cn70xx;
+       struct cvmx_pip_stat_inb_octsx_s cn70xxp1;
+       struct cvmx_pip_stat_inb_octsx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat_inb_octsx cvmx_pip_stat_inb_octsx_t;
+
+/**
+ * cvmx_pip_stat_inb_octs_pknd#
+ *
+ * PIP_STAT_INB_OCTS_PKNDX = Inbound octets received by PIP per pkind
+ *
+ * Inbound stats collect all data sent to PIP from all packet interfaces.
+ * Its the raw counts of everything that comes into the block.  The counts
+ * will reflect all error packets and packets dropped by the PKI RED engine.
+ * These counts are intended for system debug, but could convey useful
+ * information in production systems. The OCTS will include the bytes from
+ * timestamp fields in PTP_MODE.
+ */
+union cvmx_pip_stat_inb_octs_pkndx {
+       u64 u64;
+       struct cvmx_pip_stat_inb_octs_pkndx_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_pip_stat_inb_octs_pkndx_s cn68xx;
+       struct cvmx_pip_stat_inb_octs_pkndx_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat_inb_octs_pkndx cvmx_pip_stat_inb_octs_pkndx_t;
+
+/**
+ * cvmx_pip_stat_inb_pkts#
+ *
+ * Inbound stats collect all data sent to PIP from all packet interfaces.
+ * Its the raw counts of everything that comes into the block.  The counts
+ * will reflect all error packets and packets dropped by the PKI RED engine.
+ * These counts are intended for system debug, but could convey useful
+ * information in production systems.
+ */
+union cvmx_pip_stat_inb_pktsx {
+       u64 u64;
+       struct cvmx_pip_stat_inb_pktsx_s {
+               u64 reserved_32_63 : 32;
+               u64 pkts : 32;
+       } s;
+       struct cvmx_pip_stat_inb_pktsx_s cn30xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn31xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn38xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn38xxp2;
+       struct cvmx_pip_stat_inb_pktsx_s cn50xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn52xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn52xxp1;
+       struct cvmx_pip_stat_inb_pktsx_s cn56xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn56xxp1;
+       struct cvmx_pip_stat_inb_pktsx_s cn58xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn58xxp1;
+       struct cvmx_pip_stat_inb_pktsx_s cn61xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn63xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn63xxp1;
+       struct cvmx_pip_stat_inb_pktsx_s cn66xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn70xx;
+       struct cvmx_pip_stat_inb_pktsx_s cn70xxp1;
+       struct cvmx_pip_stat_inb_pktsx_s cnf71xx;
+};
+
+typedef union cvmx_pip_stat_inb_pktsx cvmx_pip_stat_inb_pktsx_t;
+
+/**
+ * cvmx_pip_stat_inb_pkts_pknd#
+ *
+ * PIP_STAT_INB_PKTS_PKNDX = Inbound packets received by PIP per pkind
+ *
+ * Inbound stats collect all data sent to PIP from all packet interfaces.
+ * Its the raw counts of everything that comes into the block.  The counts
+ * will reflect all error packets and packets dropped by the PKI RED engine.
+ * These counts are intended for system debug, but could convey useful
+ * information in production systems.
+ */
+union cvmx_pip_stat_inb_pkts_pkndx {
+       u64 u64;
+       struct cvmx_pip_stat_inb_pkts_pkndx_s {
+               u64 reserved_32_63 : 32;
+               u64 pkts : 32;
+       } s;
+       struct cvmx_pip_stat_inb_pkts_pkndx_s cn68xx;
+       struct cvmx_pip_stat_inb_pkts_pkndx_s cn68xxp1;
+};
+
+typedef union cvmx_pip_stat_inb_pkts_pkndx cvmx_pip_stat_inb_pkts_pkndx_t;
+
+/**
+ * cvmx_pip_sub_pkind_fcs#
+ */
+union cvmx_pip_sub_pkind_fcsx {
+       u64 u64;
+       struct cvmx_pip_sub_pkind_fcsx_s {
+               u64 port_bit : 64;
+       } s;
+       struct cvmx_pip_sub_pkind_fcsx_s cn68xx;
+       struct cvmx_pip_sub_pkind_fcsx_s cn68xxp1;
+};
+
+typedef union cvmx_pip_sub_pkind_fcsx cvmx_pip_sub_pkind_fcsx_t;
+
+/**
+ * cvmx_pip_tag_inc#
+ *
+ * # $PIP_TAG_INCX = 0x300+X X=(0..63) RegType=(RSL) RtlReg=(pip_tag_inc_csr_direct_TestbuilderTask)
+ *
+ */
+union cvmx_pip_tag_incx {
+       u64 u64;
+       struct cvmx_pip_tag_incx_s {
+               u64 reserved_8_63 : 56;
+               u64 en : 8;
+       } s;
+       struct cvmx_pip_tag_incx_s cn30xx;
+       struct cvmx_pip_tag_incx_s cn31xx;
+       struct cvmx_pip_tag_incx_s cn38xx;
+       struct cvmx_pip_tag_incx_s cn38xxp2;
+       struct cvmx_pip_tag_incx_s cn50xx;
+       struct cvmx_pip_tag_incx_s cn52xx;
+       struct cvmx_pip_tag_incx_s cn52xxp1;
+       struct cvmx_pip_tag_incx_s cn56xx;
+       struct cvmx_pip_tag_incx_s cn56xxp1;
+       struct cvmx_pip_tag_incx_s cn58xx;
+       struct cvmx_pip_tag_incx_s cn58xxp1;
+       struct cvmx_pip_tag_incx_s cn61xx;
+       struct cvmx_pip_tag_incx_s cn63xx;
+       struct cvmx_pip_tag_incx_s cn63xxp1;
+       struct cvmx_pip_tag_incx_s cn66xx;
+       struct cvmx_pip_tag_incx_s cn68xx;
+       struct cvmx_pip_tag_incx_s cn68xxp1;
+       struct cvmx_pip_tag_incx_s cn70xx;
+       struct cvmx_pip_tag_incx_s cn70xxp1;
+       struct cvmx_pip_tag_incx_s cnf71xx;
+};
+
+typedef union cvmx_pip_tag_incx cvmx_pip_tag_incx_t;
+
+/**
+ * cvmx_pip_tag_mask
+ *
+ * PIP_TAG_MASK = Mask bit in the tag generation
+ *
+ */
+union cvmx_pip_tag_mask {
+       u64 u64;
+       struct cvmx_pip_tag_mask_s {
+               u64 reserved_16_63 : 48;
+               u64 mask : 16;
+       } s;
+       struct cvmx_pip_tag_mask_s cn30xx;
+       struct cvmx_pip_tag_mask_s cn31xx;
+       struct cvmx_pip_tag_mask_s cn38xx;
+       struct cvmx_pip_tag_mask_s cn38xxp2;
+       struct cvmx_pip_tag_mask_s cn50xx;
+       struct cvmx_pip_tag_mask_s cn52xx;
+       struct cvmx_pip_tag_mask_s cn52xxp1;
+       struct cvmx_pip_tag_mask_s cn56xx;
+       struct cvmx_pip_tag_mask_s cn56xxp1;
+       struct cvmx_pip_tag_mask_s cn58xx;
+       struct cvmx_pip_tag_mask_s cn58xxp1;
+       struct cvmx_pip_tag_mask_s cn61xx;
+       struct cvmx_pip_tag_mask_s cn63xx;
+       struct cvmx_pip_tag_mask_s cn63xxp1;
+       struct cvmx_pip_tag_mask_s cn66xx;
+       struct cvmx_pip_tag_mask_s cn68xx;
+       struct cvmx_pip_tag_mask_s cn68xxp1;
+       struct cvmx_pip_tag_mask_s cn70xx;
+       struct cvmx_pip_tag_mask_s cn70xxp1;
+       struct cvmx_pip_tag_mask_s cnf71xx;
+};
+
+typedef union cvmx_pip_tag_mask cvmx_pip_tag_mask_t;
+
+/**
+ * cvmx_pip_tag_secret
+ *
+ * The source and destination IV's provide a mechanism for each Octeon to be unique.
+ *
+ */
+union cvmx_pip_tag_secret {
+       u64 u64;
+       struct cvmx_pip_tag_secret_s {
+               u64 reserved_32_63 : 32;
+               u64 dst : 16;
+               u64 src : 16;
+       } s;
+       struct cvmx_pip_tag_secret_s cn30xx;
+       struct cvmx_pip_tag_secret_s cn31xx;
+       struct cvmx_pip_tag_secret_s cn38xx;
+       struct cvmx_pip_tag_secret_s cn38xxp2;
+       struct cvmx_pip_tag_secret_s cn50xx;
+       struct cvmx_pip_tag_secret_s cn52xx;
+       struct cvmx_pip_tag_secret_s cn52xxp1;
+       struct cvmx_pip_tag_secret_s cn56xx;
+       struct cvmx_pip_tag_secret_s cn56xxp1;
+       struct cvmx_pip_tag_secret_s cn58xx;
+       struct cvmx_pip_tag_secret_s cn58xxp1;
+       struct cvmx_pip_tag_secret_s cn61xx;
+       struct cvmx_pip_tag_secret_s cn63xx;
+       struct cvmx_pip_tag_secret_s cn63xxp1;
+       struct cvmx_pip_tag_secret_s cn66xx;
+       struct cvmx_pip_tag_secret_s cn68xx;
+       struct cvmx_pip_tag_secret_s cn68xxp1;
+       struct cvmx_pip_tag_secret_s cn70xx;
+       struct cvmx_pip_tag_secret_s cn70xxp1;
+       struct cvmx_pip_tag_secret_s cnf71xx;
+};
+
+typedef union cvmx_pip_tag_secret cvmx_pip_tag_secret_t;
+
+/**
+ * cvmx_pip_todo_entry
+ *
+ * Summary of the current packet that has completed and waiting to be processed
+ *
+ */
+union cvmx_pip_todo_entry {
+       u64 u64;
+       struct cvmx_pip_todo_entry_s {
+               u64 val : 1;
+               u64 reserved_62_62 : 1;
+               u64 entry : 62;
+       } s;
+       struct cvmx_pip_todo_entry_s cn30xx;
+       struct cvmx_pip_todo_entry_s cn31xx;
+       struct cvmx_pip_todo_entry_s cn38xx;
+       struct cvmx_pip_todo_entry_s cn38xxp2;
+       struct cvmx_pip_todo_entry_s cn50xx;
+       struct cvmx_pip_todo_entry_s cn52xx;
+       struct cvmx_pip_todo_entry_s cn52xxp1;
+       struct cvmx_pip_todo_entry_s cn56xx;
+       struct cvmx_pip_todo_entry_s cn56xxp1;
+       struct cvmx_pip_todo_entry_s cn58xx;
+       struct cvmx_pip_todo_entry_s cn58xxp1;
+       struct cvmx_pip_todo_entry_s cn61xx;
+       struct cvmx_pip_todo_entry_s cn63xx;
+       struct cvmx_pip_todo_entry_s cn63xxp1;
+       struct cvmx_pip_todo_entry_s cn66xx;
+       struct cvmx_pip_todo_entry_s cn68xx;
+       struct cvmx_pip_todo_entry_s cn68xxp1;
+       struct cvmx_pip_todo_entry_s cn70xx;
+       struct cvmx_pip_todo_entry_s cn70xxp1;
+       struct cvmx_pip_todo_entry_s cnf71xx;
+};
+
+typedef union cvmx_pip_todo_entry cvmx_pip_todo_entry_t;
+
+/**
+ * cvmx_pip_vlan_etypes#
+ */
+union cvmx_pip_vlan_etypesx {
+       u64 u64;
+       struct cvmx_pip_vlan_etypesx_s {
+               u64 type3 : 16;
+               u64 type2 : 16;
+               u64 type1 : 16;
+               u64 type0 : 16;
+       } s;
+       struct cvmx_pip_vlan_etypesx_s cn61xx;
+       struct cvmx_pip_vlan_etypesx_s cn66xx;
+       struct cvmx_pip_vlan_etypesx_s cn68xx;
+       struct cvmx_pip_vlan_etypesx_s cn70xx;
+       struct cvmx_pip_vlan_etypesx_s cn70xxp1;
+       struct cvmx_pip_vlan_etypesx_s cnf71xx;
+};
+
+typedef union cvmx_pip_vlan_etypesx cvmx_pip_vlan_etypesx_t;
+
+/**
+ * cvmx_pip_xstat0_prt#
+ *
+ * PIP_XSTAT0_PRT = PIP_XSTAT_DRP_PKTS / PIP_XSTAT_DRP_OCTS
+ *
+ */
+union cvmx_pip_xstat0_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat0_prtx_s {
+               u64 drp_pkts : 32;
+               u64 drp_octs : 32;
+       } s;
+       struct cvmx_pip_xstat0_prtx_s cn63xx;
+       struct cvmx_pip_xstat0_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat0_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat0_prtx cvmx_pip_xstat0_prtx_t;
+
+/**
+ * cvmx_pip_xstat10_prt#
+ *
+ * PIP_XSTAT10_PRTX = PIP_XSTAT_L2_MCAST / PIP_XSTAT_L2_BCAST
+ *
+ */
+union cvmx_pip_xstat10_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat10_prtx_s {
+               u64 bcast : 32;
+               u64 mcast : 32;
+       } s;
+       struct cvmx_pip_xstat10_prtx_s cn63xx;
+       struct cvmx_pip_xstat10_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat10_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat10_prtx cvmx_pip_xstat10_prtx_t;
+
+/**
+ * cvmx_pip_xstat11_prt#
+ *
+ * PIP_XSTAT11_PRTX = PIP_XSTAT_L3_MCAST / PIP_XSTAT_L3_BCAST
+ *
+ */
+union cvmx_pip_xstat11_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat11_prtx_s {
+               u64 bcast : 32;
+               u64 mcast : 32;
+       } s;
+       struct cvmx_pip_xstat11_prtx_s cn63xx;
+       struct cvmx_pip_xstat11_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat11_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat11_prtx cvmx_pip_xstat11_prtx_t;
+
+/**
+ * cvmx_pip_xstat1_prt#
+ *
+ * PIP_XSTAT1_PRTX = PIP_XSTAT_OCTS
+ *
+ */
+union cvmx_pip_xstat1_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat1_prtx_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_pip_xstat1_prtx_s cn63xx;
+       struct cvmx_pip_xstat1_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat1_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat1_prtx cvmx_pip_xstat1_prtx_t;
+
+/**
+ * cvmx_pip_xstat2_prt#
+ *
+ * PIP_XSTAT2_PRTX = PIP_XSTAT_PKTS     / PIP_XSTAT_RAW
+ *
+ */
+union cvmx_pip_xstat2_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat2_prtx_s {
+               u64 pkts : 32;
+               u64 raw : 32;
+       } s;
+       struct cvmx_pip_xstat2_prtx_s cn63xx;
+       struct cvmx_pip_xstat2_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat2_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat2_prtx cvmx_pip_xstat2_prtx_t;
+
+/**
+ * cvmx_pip_xstat3_prt#
+ *
+ * PIP_XSTAT3_PRTX = PIP_XSTAT_BCST     / PIP_XSTAT_MCST
+ *
+ */
+union cvmx_pip_xstat3_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat3_prtx_s {
+               u64 bcst : 32;
+               u64 mcst : 32;
+       } s;
+       struct cvmx_pip_xstat3_prtx_s cn63xx;
+       struct cvmx_pip_xstat3_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat3_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat3_prtx cvmx_pip_xstat3_prtx_t;
+
+/**
+ * cvmx_pip_xstat4_prt#
+ *
+ * PIP_XSTAT4_PRTX = PIP_XSTAT_HIST1    / PIP_XSTAT_HIST0
+ *
+ */
+union cvmx_pip_xstat4_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat4_prtx_s {
+               u64 h65to127 : 32;
+               u64 h64 : 32;
+       } s;
+       struct cvmx_pip_xstat4_prtx_s cn63xx;
+       struct cvmx_pip_xstat4_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat4_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat4_prtx cvmx_pip_xstat4_prtx_t;
+
+/**
+ * cvmx_pip_xstat5_prt#
+ *
+ * PIP_XSTAT5_PRTX = PIP_XSTAT_HIST3    / PIP_XSTAT_HIST2
+ *
+ */
+union cvmx_pip_xstat5_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat5_prtx_s {
+               u64 h256to511 : 32;
+               u64 h128to255 : 32;
+       } s;
+       struct cvmx_pip_xstat5_prtx_s cn63xx;
+       struct cvmx_pip_xstat5_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat5_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat5_prtx cvmx_pip_xstat5_prtx_t;
+
+/**
+ * cvmx_pip_xstat6_prt#
+ *
+ * PIP_XSTAT6_PRTX = PIP_XSTAT_HIST5    / PIP_XSTAT_HIST4
+ *
+ */
+union cvmx_pip_xstat6_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat6_prtx_s {
+               u64 h1024to1518 : 32;
+               u64 h512to1023 : 32;
+       } s;
+       struct cvmx_pip_xstat6_prtx_s cn63xx;
+       struct cvmx_pip_xstat6_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat6_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat6_prtx cvmx_pip_xstat6_prtx_t;
+
+/**
+ * cvmx_pip_xstat7_prt#
+ *
+ * PIP_XSTAT7_PRTX = PIP_XSTAT_FCS      / PIP_XSTAT_HIST6
+ *
+ *
+ * Notes:
+ * DPI does not check FCS, therefore FCS will never increment on DPI ports 32-35
+ * sRIO does not check FCS, therefore FCS will never increment on sRIO ports 40-47
+ */
+union cvmx_pip_xstat7_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat7_prtx_s {
+               u64 fcs : 32;
+               u64 h1519 : 32;
+       } s;
+       struct cvmx_pip_xstat7_prtx_s cn63xx;
+       struct cvmx_pip_xstat7_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat7_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat7_prtx cvmx_pip_xstat7_prtx_t;
+
+/**
+ * cvmx_pip_xstat8_prt#
+ *
+ * PIP_XSTAT8_PRTX = PIP_XSTAT_FRAG     / PIP_XSTAT_UNDER
+ *
+ *
+ * Notes:
+ * DPI does not check FCS, therefore FRAG will never increment on DPI ports 32-35
+ * sRIO does not check FCS, therefore FRAG will never increment on sRIO ports 40-47
+ */
+union cvmx_pip_xstat8_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat8_prtx_s {
+               u64 frag : 32;
+               u64 undersz : 32;
+       } s;
+       struct cvmx_pip_xstat8_prtx_s cn63xx;
+       struct cvmx_pip_xstat8_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat8_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat8_prtx cvmx_pip_xstat8_prtx_t;
+
+/**
+ * cvmx_pip_xstat9_prt#
+ *
+ * PIP_XSTAT9_PRTX = PIP_XSTAT_JABBER   / PIP_XSTAT_OVER
+ *
+ *
+ * Notes:
+ * DPI does not check FCS, therefore JABBER will never increment on DPI ports 32-35
+ * sRIO does not check FCS, therefore JABBER will never increment on sRIO ports 40-47 due to FCS errors
+ * sRIO does use the JABBER opcode to communicate sRIO error, therefore JABBER can increment under the sRIO error conditions
+ */
+union cvmx_pip_xstat9_prtx {
+       u64 u64;
+       struct cvmx_pip_xstat9_prtx_s {
+               u64 jabber : 32;
+               u64 oversz : 32;
+       } s;
+       struct cvmx_pip_xstat9_prtx_s cn63xx;
+       struct cvmx_pip_xstat9_prtx_s cn63xxp1;
+       struct cvmx_pip_xstat9_prtx_s cn66xx;
+};
+
+typedef union cvmx_pip_xstat9_prtx cvmx_pip_xstat9_prtx_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pip.h b/arch/mips/mach-octeon/include/mach/cvmx-pip.h
new file mode 100644 (file)
index 0000000..013f533
--- /dev/null
@@ -0,0 +1,1080 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Packet Input Processing unit.
+ */
+
+#ifndef __CVMX_PIP_H__
+#define __CVMX_PIP_H__
+
+#include "cvmx-wqe.h"
+#include "cvmx-pki.h"
+#include "cvmx-helper-pki.h"
+
+#include "cvmx-helper.h"
+#include "cvmx-helper-util.h"
+#include "cvmx-pki-resources.h"
+
+#define CVMX_PIP_NUM_INPUT_PORTS 46
+#define CVMX_PIP_NUM_WATCHERS   8
+
+/*
+ * Encodes the different error and exception codes
+ */
+typedef enum {
+       CVMX_PIP_L4_NO_ERR = 0ull,
+       /*        1  = TCP (UDP) packet not long enough to cover TCP (UDP) header */
+       CVMX_PIP_L4_MAL_ERR = 1ull,
+       /*        2  = TCP/UDP checksum failure */
+       CVMX_PIP_CHK_ERR = 2ull,
+       /*        3  = TCP/UDP length check (TCP/UDP length does not match IP length) */
+       CVMX_PIP_L4_LENGTH_ERR = 3ull,
+       /*        4  = illegal TCP/UDP port (either source or dest port is zero) */
+       CVMX_PIP_BAD_PRT_ERR = 4ull,
+       /*        8  = TCP flags = FIN only */
+       CVMX_PIP_TCP_FLG8_ERR = 8ull,
+       /*        9  = TCP flags = 0 */
+       CVMX_PIP_TCP_FLG9_ERR = 9ull,
+       /*        10 = TCP flags = FIN+RST+* */
+       CVMX_PIP_TCP_FLG10_ERR = 10ull,
+       /*        11 = TCP flags = SYN+URG+* */
+       CVMX_PIP_TCP_FLG11_ERR = 11ull,
+       /*        12 = TCP flags = SYN+RST+* */
+       CVMX_PIP_TCP_FLG12_ERR = 12ull,
+       /*        13 = TCP flags = SYN+FIN+* */
+       CVMX_PIP_TCP_FLG13_ERR = 13ull
+} cvmx_pip_l4_err_t;
+
+typedef enum {
+       CVMX_PIP_IP_NO_ERR = 0ull,
+       /*        1 = not IPv4 or IPv6 */
+       CVMX_PIP_NOT_IP = 1ull,
+       /*        2 = IPv4 header checksum violation */
+       CVMX_PIP_IPV4_HDR_CHK = 2ull,
+       /*        3 = malformed (packet not long enough to cover IP hdr) */
+       CVMX_PIP_IP_MAL_HDR = 3ull,
+       /*        4 = malformed (packet not long enough to cover len in IP hdr) */
+       CVMX_PIP_IP_MAL_PKT = 4ull,
+       /*        5 = TTL / hop count equal zero */
+       CVMX_PIP_TTL_HOP = 5ull,
+       /*        6 = IPv4 options / IPv6 early extension headers */
+       CVMX_PIP_OPTS = 6ull
+} cvmx_pip_ip_exc_t;
+
+/**
+ * NOTES
+ *       late collision (data received before collision)
+ *            late collisions cannot be detected by the receiver
+ *            they would appear as JAM bits which would appear as bad FCS
+ *            or carrier extend error which is CVMX_PIP_EXTEND_ERR
+ */
+typedef enum {
+       /**
+        * No error
+        */
+       CVMX_PIP_RX_NO_ERR = 0ull,
+
+       CVMX_PIP_PARTIAL_ERR =
+               1ull, /* RGM+SPI            1 = partially received packet (buffering/bandwidth not adequate) */
+       CVMX_PIP_JABBER_ERR =
+               2ull, /* RGM+SPI            2 = receive packet too large and truncated */
+       CVMX_PIP_OVER_FCS_ERR =
+               3ull, /* RGM                3 = max frame error (pkt len > max frame len) (with FCS error) */
+       CVMX_PIP_OVER_ERR =
+               4ull, /* RGM+SPI            4 = max frame error (pkt len > max frame len) */
+       CVMX_PIP_ALIGN_ERR =
+               5ull, /* RGM                5 = nibble error (data not byte multiple - 100M and 10M only) */
+       CVMX_PIP_UNDER_FCS_ERR =
+               6ull, /* RGM                6 = min frame error (pkt len < min frame len) (with FCS error) */
+       CVMX_PIP_GMX_FCS_ERR = 7ull, /* RGM                7 = FCS error */
+       CVMX_PIP_UNDER_ERR =
+               8ull, /* RGM+SPI            8 = min frame error (pkt len < min frame len) */
+       CVMX_PIP_EXTEND_ERR = 9ull, /* RGM                9 = Frame carrier extend error */
+       CVMX_PIP_TERMINATE_ERR =
+               9ull, /* XAUI               9 = Packet was terminated with an idle cycle */
+       CVMX_PIP_LENGTH_ERR =
+               10ull, /* RGM               10 = length mismatch (len did not match len in L2 length/type) */
+       CVMX_PIP_DAT_ERR =
+               11ull, /* RGM               11 = Frame error (some or all data bits marked err) */
+       CVMX_PIP_DIP_ERR = 11ull, /*     SPI           11 = DIP4 error */
+       CVMX_PIP_SKIP_ERR =
+               12ull, /* RGM               12 = packet was not large enough to pass the skipper - no inspection could occur */
+       CVMX_PIP_NIBBLE_ERR =
+               13ull, /* RGM               13 = studder error (data not repeated - 100M and 10M only) */
+       CVMX_PIP_PIP_FCS = 16L, /* RGM+SPI           16 = FCS error */
+       CVMX_PIP_PIP_SKIP_ERR =
+               17L, /* RGM+SPI+PCI       17 = packet was not large enough to pass the skipper - no inspection could occur */
+       CVMX_PIP_PIP_L2_MAL_HDR =
+               18L, /* RGM+SPI+PCI       18 = malformed l2 (packet not long enough to cover L2 hdr) */
+       CVMX_PIP_PUNY_ERR =
+               47L /* SGMII             47 = PUNY error (packet was 4B or less when FCS stripping is enabled) */
+       /* NOTES
+        *       xx = late collision (data received before collision)
+        *            late collisions cannot be detected by the receiver
+        *            they would appear as JAM bits which would appear as bad FCS
+        *            or carrier extend error which is CVMX_PIP_EXTEND_ERR
+        */
+} cvmx_pip_rcv_err_t;
+
+/**
+ * This defines the err_code field errors in the work Q entry
+ */
+typedef union {
+       cvmx_pip_l4_err_t l4_err;
+       cvmx_pip_ip_exc_t ip_exc;
+       cvmx_pip_rcv_err_t rcv_err;
+} cvmx_pip_err_t;
+
+/**
+ * Status statistics for a port
+ */
+typedef struct {
+       u64 dropped_octets;
+       u64 dropped_packets;
+       u64 pci_raw_packets;
+       u64 octets;
+       u64 packets;
+       u64 multicast_packets;
+       u64 broadcast_packets;
+       u64 len_64_packets;
+       u64 len_65_127_packets;
+       u64 len_128_255_packets;
+       u64 len_256_511_packets;
+       u64 len_512_1023_packets;
+       u64 len_1024_1518_packets;
+       u64 len_1519_max_packets;
+       u64 fcs_align_err_packets;
+       u64 runt_packets;
+       u64 runt_crc_packets;
+       u64 oversize_packets;
+       u64 oversize_crc_packets;
+       u64 inb_packets;
+       u64 inb_octets;
+       u64 inb_errors;
+       u64 mcast_l2_red_packets;
+       u64 bcast_l2_red_packets;
+       u64 mcast_l3_red_packets;
+       u64 bcast_l3_red_packets;
+} cvmx_pip_port_status_t;
+
+/**
+ * Definition of the PIP custom header that can be prepended
+ * to a packet by external hardware.
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 rawfull : 1;
+               u64 reserved0 : 5;
+               cvmx_pip_port_parse_mode_t parse_mode : 2;
+               u64 reserved1 : 1;
+               u64 skip_len : 7;
+               u64 grpext : 2;
+               u64 nqos : 1;
+               u64 ngrp : 1;
+               u64 ntt : 1;
+               u64 ntag : 1;
+               u64 qos : 3;
+               u64 grp : 4;
+               u64 rs : 1;
+               cvmx_pow_tag_type_t tag_type : 2;
+               u64 tag : 32;
+       } s;
+} cvmx_pip_pkt_inst_hdr_t;
+
+enum cvmx_pki_pcam_match {
+       CVMX_PKI_PCAM_MATCH_IP,
+       CVMX_PKI_PCAM_MATCH_IPV4,
+       CVMX_PKI_PCAM_MATCH_IPV6,
+       CVMX_PKI_PCAM_MATCH_TCP
+};
+
+/* CSR typedefs have been moved to cvmx-pip-defs.h */
+static inline int cvmx_pip_config_watcher(int index, int type, u16 match, u16 mask, int grp,
+                                         int qos)
+{
+       if (index >= CVMX_PIP_NUM_WATCHERS) {
+               debug("ERROR: pip watcher %d is > than supported\n", index);
+               return -1;
+       }
+       if (octeon_has_feature(OCTEON_FEATURE_PKI)) {
+               /* store in software for now, only when the watcher is enabled program the entry*/
+               if (type == CVMX_PIP_QOS_WATCH_PROTNH) {
+                       qos_watcher[index].field = CVMX_PKI_PCAM_TERM_L3_FLAGS;
+                       qos_watcher[index].data = (u32)(match << 16);
+                       qos_watcher[index].data_mask = (u32)(mask << 16);
+                       qos_watcher[index].advance = 0;
+               } else if (type == CVMX_PIP_QOS_WATCH_TCP) {
+                       qos_watcher[index].field = CVMX_PKI_PCAM_TERM_L4_PORT;
+                       qos_watcher[index].data = 0x060000;
+                       qos_watcher[index].data |= (u32)match;
+                       qos_watcher[index].data_mask = (u32)(mask);
+                       qos_watcher[index].advance = 0;
+               } else if (type == CVMX_PIP_QOS_WATCH_UDP) {
+                       qos_watcher[index].field = CVMX_PKI_PCAM_TERM_L4_PORT;
+                       qos_watcher[index].data = 0x110000;
+                       qos_watcher[index].data |= (u32)match;
+                       qos_watcher[index].data_mask = (u32)(mask);
+                       qos_watcher[index].advance = 0;
+               } else if (type == 0x4 /*CVMX_PIP_QOS_WATCH_ETHERTYPE*/) {
+                       qos_watcher[index].field = CVMX_PKI_PCAM_TERM_ETHTYPE0;
+                       if (match == 0x8100) {
+                               debug("ERROR: default vlan entry already exist, cant set watcher\n");
+                               return -1;
+                       }
+                       qos_watcher[index].data = (u32)(match << 16);
+                       qos_watcher[index].data_mask = (u32)(mask << 16);
+                       qos_watcher[index].advance = 4;
+               } else {
+                       debug("ERROR: Unsupported watcher type %d\n", type);
+                       return -1;
+               }
+               if (grp >= 32) {
+                       debug("ERROR: grp %d out of range for backward compat 78xx\n", grp);
+                       return -1;
+               }
+               qos_watcher[index].sso_grp = (u8)(grp << 3 | qos);
+               qos_watcher[index].configured = 1;
+       } else {
+               /* Implement it later */
+       }
+       return 0;
+}
+
+static inline int __cvmx_pip_set_tag_type(int node, int style, int tag_type, int field)
+{
+       struct cvmx_pki_style_config style_cfg;
+       int style_num;
+       int pcam_offset;
+       int bank;
+       struct cvmx_pki_pcam_input pcam_input;
+       struct cvmx_pki_pcam_action pcam_action;
+
+       /* All other style parameters remain same except tag type */
+       cvmx_pki_read_style_config(node, style, CVMX_PKI_CLUSTER_ALL, &style_cfg);
+       style_cfg.parm_cfg.tag_type = (enum cvmx_sso_tag_type)tag_type;
+       style_num = cvmx_pki_style_alloc(node, -1);
+       if (style_num < 0) {
+               debug("ERROR: style not available to set tag type\n");
+               return -1;
+       }
+       cvmx_pki_write_style_config(node, style_num, CVMX_PKI_CLUSTER_ALL, &style_cfg);
+       memset(&pcam_input, 0, sizeof(pcam_input));
+       memset(&pcam_action, 0, sizeof(pcam_action));
+       pcam_input.style = style;
+       pcam_input.style_mask = 0xff;
+       if (field == CVMX_PKI_PCAM_MATCH_IP) {
+               pcam_input.field = CVMX_PKI_PCAM_TERM_ETHTYPE0;
+               pcam_input.field_mask = 0xff;
+               pcam_input.data = 0x08000000;
+               pcam_input.data_mask = 0xffff0000;
+               pcam_action.pointer_advance = 4;
+               /* legacy will write to all clusters*/
+               bank = 0;
+               pcam_offset = cvmx_pki_pcam_entry_alloc(node, CVMX_PKI_FIND_AVAL_ENTRY, bank,
+                                                       CVMX_PKI_CLUSTER_ALL);
+               if (pcam_offset < 0) {
+                       debug("ERROR: pcam entry not available to enable qos watcher\n");
+                       cvmx_pki_style_free(node, style_num);
+                       return -1;
+               }
+               pcam_action.parse_mode_chg = CVMX_PKI_PARSE_NO_CHG;
+               pcam_action.layer_type_set = CVMX_PKI_LTYPE_E_NONE;
+               pcam_action.style_add = (u8)(style_num - style);
+               cvmx_pki_pcam_write_entry(node, pcam_offset, CVMX_PKI_CLUSTER_ALL, pcam_input,
+                                         pcam_action);
+               field = CVMX_PKI_PCAM_MATCH_IPV6;
+       }
+       if (field == CVMX_PKI_PCAM_MATCH_IPV4) {
+               pcam_input.field = CVMX_PKI_PCAM_TERM_ETHTYPE0;
+               pcam_input.field_mask = 0xff;
+               pcam_input.data = 0x08000000;
+               pcam_input.data_mask = 0xffff0000;
+               pcam_action.pointer_advance = 4;
+       } else if (field == CVMX_PKI_PCAM_MATCH_IPV6) {
+               pcam_input.field = CVMX_PKI_PCAM_TERM_ETHTYPE0;
+               pcam_input.field_mask = 0xff;
+               pcam_input.data = 0x86dd00000;
+               pcam_input.data_mask = 0xffff0000;
+               pcam_action.pointer_advance = 4;
+       } else if (field == CVMX_PKI_PCAM_MATCH_TCP) {
+               pcam_input.field = CVMX_PKI_PCAM_TERM_L4_PORT;
+               pcam_input.field_mask = 0xff;
+               pcam_input.data = 0x60000;
+               pcam_input.data_mask = 0xff0000;
+               pcam_action.pointer_advance = 0;
+       }
+       pcam_action.parse_mode_chg = CVMX_PKI_PARSE_NO_CHG;
+       pcam_action.layer_type_set = CVMX_PKI_LTYPE_E_NONE;
+       pcam_action.style_add = (u8)(style_num - style);
+       bank = pcam_input.field & 0x01;
+       pcam_offset = cvmx_pki_pcam_entry_alloc(node, CVMX_PKI_FIND_AVAL_ENTRY, bank,
+                                               CVMX_PKI_CLUSTER_ALL);
+       if (pcam_offset < 0) {
+               debug("ERROR: pcam entry not available to enable qos watcher\n");
+               cvmx_pki_style_free(node, style_num);
+               return -1;
+       }
+       cvmx_pki_pcam_write_entry(node, pcam_offset, CVMX_PKI_CLUSTER_ALL, pcam_input, pcam_action);
+       return style_num;
+}
+
+/* Only for legacy internal use */
+static inline int __cvmx_pip_enable_watcher_78xx(int node, int index, int style)
+{
+       struct cvmx_pki_style_config style_cfg;
+       struct cvmx_pki_qpg_config qpg_cfg;
+       struct cvmx_pki_pcam_input pcam_input;
+       struct cvmx_pki_pcam_action pcam_action;
+       int style_num;
+       int qpg_offset;
+       int pcam_offset;
+       int bank;
+
+       if (!qos_watcher[index].configured) {
+               debug("ERROR: qos watcher %d should be configured before enable\n", index);
+               return -1;
+       }
+       /* All other style parameters remain same except grp and qos and qps base */
+       cvmx_pki_read_style_config(node, style, CVMX_PKI_CLUSTER_ALL, &style_cfg);
+       cvmx_pki_read_qpg_entry(node, style_cfg.parm_cfg.qpg_base, &qpg_cfg);
+       qpg_cfg.qpg_base = CVMX_PKI_FIND_AVAL_ENTRY;
+       qpg_cfg.grp_ok = qos_watcher[index].sso_grp;
+       qpg_cfg.grp_bad = qos_watcher[index].sso_grp;
+       qpg_offset = cvmx_helper_pki_set_qpg_entry(node, &qpg_cfg);
+       if (qpg_offset == -1) {
+               debug("Warning: no new qpg entry available to enable watcher\n");
+               return -1;
+       }
+       /* try to reserve the style, if it is not configured already, reserve
+          and configure it */
+       style_cfg.parm_cfg.qpg_base = qpg_offset;
+       style_num = cvmx_pki_style_alloc(node, -1);
+       if (style_num < 0) {
+               debug("ERROR: style not available to enable qos watcher\n");
+               cvmx_pki_qpg_entry_free(node, qpg_offset, 1);
+               return -1;
+       }
+       cvmx_pki_write_style_config(node, style_num, CVMX_PKI_CLUSTER_ALL, &style_cfg);
+       /* legacy will write to all clusters*/
+       bank = qos_watcher[index].field & 0x01;
+       pcam_offset = cvmx_pki_pcam_entry_alloc(node, CVMX_PKI_FIND_AVAL_ENTRY, bank,
+                                               CVMX_PKI_CLUSTER_ALL);
+       if (pcam_offset < 0) {
+               debug("ERROR: pcam entry not available to enable qos watcher\n");
+               cvmx_pki_style_free(node, style_num);
+               cvmx_pki_qpg_entry_free(node, qpg_offset, 1);
+               return -1;
+       }
+       memset(&pcam_input, 0, sizeof(pcam_input));
+       memset(&pcam_action, 0, sizeof(pcam_action));
+       pcam_input.style = style;
+       pcam_input.style_mask = 0xff;
+       pcam_input.field = qos_watcher[index].field;
+       pcam_input.field_mask = 0xff;
+       pcam_input.data = qos_watcher[index].data;
+       pcam_input.data_mask = qos_watcher[index].data_mask;
+       pcam_action.parse_mode_chg = CVMX_PKI_PARSE_NO_CHG;
+       pcam_action.layer_type_set = CVMX_PKI_LTYPE_E_NONE;
+       pcam_action.style_add = (u8)(style_num - style);
+       pcam_action.pointer_advance = qos_watcher[index].advance;
+       cvmx_pki_pcam_write_entry(node, pcam_offset, CVMX_PKI_CLUSTER_ALL, pcam_input, pcam_action);
+       return 0;
+}
+
+/**
+ * Configure an ethernet input port
+ *
+ * @param ipd_port Port number to configure
+ * @param port_cfg Port hardware configuration
+ * @param port_tag_cfg Port POW tagging configuration
+ */
+static inline void cvmx_pip_config_port(u64 ipd_port, cvmx_pip_prt_cfgx_t port_cfg,
+                                       cvmx_pip_prt_tagx_t port_tag_cfg)
+{
+       struct cvmx_pki_qpg_config qpg_cfg;
+       int qpg_offset;
+       u8 tcp_tag = 0xff;
+       u8 ip_tag = 0xaa;
+       int style, nstyle, n4style, n6style;
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKI)) {
+               struct cvmx_pki_port_config pki_prt_cfg;
+               struct cvmx_xport xp = cvmx_helper_ipd_port_to_xport(ipd_port);
+
+               cvmx_pki_get_port_config(ipd_port, &pki_prt_cfg);
+               style = pki_prt_cfg.pkind_cfg.initial_style;
+               if (port_cfg.s.ih_pri || port_cfg.s.vlan_len || port_cfg.s.pad_len)
+                       debug("Warning: 78xx: use different config for this option\n");
+               pki_prt_cfg.style_cfg.parm_cfg.minmax_sel = port_cfg.s.len_chk_sel;
+               pki_prt_cfg.style_cfg.parm_cfg.lenerr_en = port_cfg.s.lenerr_en;
+               pki_prt_cfg.style_cfg.parm_cfg.maxerr_en = port_cfg.s.maxerr_en;
+               pki_prt_cfg.style_cfg.parm_cfg.minerr_en = port_cfg.s.minerr_en;
+               pki_prt_cfg.style_cfg.parm_cfg.fcs_chk = port_cfg.s.crc_en;
+               if (port_cfg.s.grp_wat || port_cfg.s.qos_wat || port_cfg.s.grp_wat_47 ||
+                   port_cfg.s.qos_wat_47) {
+                       u8 group_mask = (u8)(port_cfg.s.grp_wat | (u8)(port_cfg.s.grp_wat_47 << 4));
+                       u8 qos_mask = (u8)(port_cfg.s.qos_wat | (u8)(port_cfg.s.qos_wat_47 << 4));
+                       int i;
+
+                       for (i = 0; i < CVMX_PIP_NUM_WATCHERS; i++) {
+                               if ((group_mask & (1 << i)) || (qos_mask & (1 << i)))
+                                       __cvmx_pip_enable_watcher_78xx(xp.node, i, style);
+                       }
+               }
+               if (port_tag_cfg.s.tag_mode) {
+                       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                               cvmx_printf("Warning: mask tag is not supported in 78xx pass1\n");
+                       else {
+                       }
+                       /* need to implement for 78xx*/
+               }
+               if (port_cfg.s.tag_inc)
+                       debug("Warning: 78xx uses differnet method for tag generation\n");
+               pki_prt_cfg.style_cfg.parm_cfg.rawdrp = port_cfg.s.rawdrp;
+               pki_prt_cfg.pkind_cfg.parse_en.inst_hdr = port_cfg.s.inst_hdr;
+               if (port_cfg.s.hg_qos)
+                       pki_prt_cfg.style_cfg.parm_cfg.qpg_qos = CVMX_PKI_QPG_QOS_HIGIG;
+               else if (port_cfg.s.qos_vlan)
+                       pki_prt_cfg.style_cfg.parm_cfg.qpg_qos = CVMX_PKI_QPG_QOS_VLAN;
+               else if (port_cfg.s.qos_diff)
+                       pki_prt_cfg.style_cfg.parm_cfg.qpg_qos = CVMX_PKI_QPG_QOS_DIFFSERV;
+               if (port_cfg.s.qos_vod)
+                       debug("Warning: 78xx needs pcam entries installed to achieve qos_vod\n");
+               if (port_cfg.s.qos) {
+                       cvmx_pki_read_qpg_entry(xp.node, pki_prt_cfg.style_cfg.parm_cfg.qpg_base,
+                                               &qpg_cfg);
+                       qpg_cfg.qpg_base = CVMX_PKI_FIND_AVAL_ENTRY;
+                       qpg_cfg.grp_ok |= port_cfg.s.qos;
+                       qpg_cfg.grp_bad |= port_cfg.s.qos;
+                       qpg_offset = cvmx_helper_pki_set_qpg_entry(xp.node, &qpg_cfg);
+                       if (qpg_offset == -1)
+                               debug("Warning: no new qpg entry available, will not modify qos\n");
+                       else
+                               pki_prt_cfg.style_cfg.parm_cfg.qpg_base = qpg_offset;
+               }
+               if (port_tag_cfg.s.grp != pki_dflt_sso_grp[xp.node].group) {
+                       cvmx_pki_read_qpg_entry(xp.node, pki_prt_cfg.style_cfg.parm_cfg.qpg_base,
+                                               &qpg_cfg);
+                       qpg_cfg.qpg_base = CVMX_PKI_FIND_AVAL_ENTRY;
+                       qpg_cfg.grp_ok |= (u8)(port_tag_cfg.s.grp << 3);
+                       qpg_cfg.grp_bad |= (u8)(port_tag_cfg.s.grp << 3);
+                       qpg_offset = cvmx_helper_pki_set_qpg_entry(xp.node, &qpg_cfg);
+                       if (qpg_offset == -1)
+                               debug("Warning: no new qpg entry available, will not modify group\n");
+                       else
+                               pki_prt_cfg.style_cfg.parm_cfg.qpg_base = qpg_offset;
+               }
+               pki_prt_cfg.pkind_cfg.parse_en.dsa_en = port_cfg.s.dsa_en;
+               pki_prt_cfg.pkind_cfg.parse_en.hg_en = port_cfg.s.higig_en;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.layer_c_src =
+                       port_tag_cfg.s.ip6_src_flag | port_tag_cfg.s.ip4_src_flag;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.layer_c_dst =
+                       port_tag_cfg.s.ip6_dst_flag | port_tag_cfg.s.ip4_dst_flag;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.ip_prot_nexthdr =
+                       port_tag_cfg.s.ip6_nxth_flag | port_tag_cfg.s.ip4_pctl_flag;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.layer_d_src =
+                       port_tag_cfg.s.ip6_sprt_flag | port_tag_cfg.s.ip4_sprt_flag;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.layer_d_dst =
+                       port_tag_cfg.s.ip6_dprt_flag | port_tag_cfg.s.ip4_dprt_flag;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.input_port = port_tag_cfg.s.inc_prt_flag;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.first_vlan = port_tag_cfg.s.inc_vlan;
+               pki_prt_cfg.style_cfg.tag_cfg.tag_fields.second_vlan = port_tag_cfg.s.inc_vs;
+
+               if (port_tag_cfg.s.tcp6_tag_type == port_tag_cfg.s.tcp4_tag_type)
+                       tcp_tag = port_tag_cfg.s.tcp6_tag_type;
+               if (port_tag_cfg.s.ip6_tag_type == port_tag_cfg.s.ip4_tag_type)
+                       ip_tag = port_tag_cfg.s.ip6_tag_type;
+               pki_prt_cfg.style_cfg.parm_cfg.tag_type =
+                       (enum cvmx_sso_tag_type)port_tag_cfg.s.non_tag_type;
+               if (tcp_tag == ip_tag && tcp_tag == port_tag_cfg.s.non_tag_type)
+                       pki_prt_cfg.style_cfg.parm_cfg.tag_type = (enum cvmx_sso_tag_type)tcp_tag;
+               else if (tcp_tag == ip_tag) {
+                       /* allocate and copy style */
+                       /* modify tag type */
+                       /*pcam entry for ip6 && ip4 match*/
+                       /* default is non tag type */
+                       __cvmx_pip_set_tag_type(xp.node, style, ip_tag, CVMX_PKI_PCAM_MATCH_IP);
+               } else if (ip_tag == port_tag_cfg.s.non_tag_type) {
+                       /* allocate and copy style */
+                       /* modify tag type */
+                       /*pcam entry for tcp6 & tcp4 match*/
+                       /* default is non tag type */
+                       __cvmx_pip_set_tag_type(xp.node, style, tcp_tag, CVMX_PKI_PCAM_MATCH_TCP);
+               } else {
+                       if (ip_tag != 0xaa) {
+                               nstyle = __cvmx_pip_set_tag_type(xp.node, style, ip_tag,
+                                                                CVMX_PKI_PCAM_MATCH_IP);
+                               if (tcp_tag != 0xff)
+                                       __cvmx_pip_set_tag_type(xp.node, nstyle, tcp_tag,
+                                                               CVMX_PKI_PCAM_MATCH_TCP);
+                               else {
+                                       n4style = __cvmx_pip_set_tag_type(xp.node, nstyle, ip_tag,
+                                                                         CVMX_PKI_PCAM_MATCH_IPV4);
+                                       __cvmx_pip_set_tag_type(xp.node, n4style,
+                                                               port_tag_cfg.s.tcp4_tag_type,
+                                                               CVMX_PKI_PCAM_MATCH_TCP);
+                                       n6style = __cvmx_pip_set_tag_type(xp.node, nstyle, ip_tag,
+                                                                         CVMX_PKI_PCAM_MATCH_IPV6);
+                                       __cvmx_pip_set_tag_type(xp.node, n6style,
+                                                               port_tag_cfg.s.tcp6_tag_type,
+                                                               CVMX_PKI_PCAM_MATCH_TCP);
+                               }
+                       } else {
+                               n4style = __cvmx_pip_set_tag_type(xp.node, style,
+                                                                 port_tag_cfg.s.ip4_tag_type,
+                                                                 CVMX_PKI_PCAM_MATCH_IPV4);
+                               n6style = __cvmx_pip_set_tag_type(xp.node, style,
+                                                                 port_tag_cfg.s.ip6_tag_type,
+                                                                 CVMX_PKI_PCAM_MATCH_IPV6);
+                               if (tcp_tag != 0xff) {
+                                       __cvmx_pip_set_tag_type(xp.node, n4style, tcp_tag,
+                                                               CVMX_PKI_PCAM_MATCH_TCP);
+                                       __cvmx_pip_set_tag_type(xp.node, n6style, tcp_tag,
+                                                               CVMX_PKI_PCAM_MATCH_TCP);
+                               } else {
+                                       __cvmx_pip_set_tag_type(xp.node, n4style,
+                                                               port_tag_cfg.s.tcp4_tag_type,
+                                                               CVMX_PKI_PCAM_MATCH_TCP);
+                                       __cvmx_pip_set_tag_type(xp.node, n6style,
+                                                               port_tag_cfg.s.tcp6_tag_type,
+                                                               CVMX_PKI_PCAM_MATCH_TCP);
+                               }
+                       }
+               }
+               pki_prt_cfg.style_cfg.parm_cfg.qpg_dis_padd = !port_tag_cfg.s.portadd_en;
+
+               if (port_cfg.s.mode == 0x1)
+                       pki_prt_cfg.pkind_cfg.initial_parse_mode = CVMX_PKI_PARSE_LA_TO_LG;
+               else if (port_cfg.s.mode == 0x2)
+                       pki_prt_cfg.pkind_cfg.initial_parse_mode = CVMX_PKI_PARSE_LC_TO_LG;
+               else
+                       pki_prt_cfg.pkind_cfg.initial_parse_mode = CVMX_PKI_PARSE_NOTHING;
+               /* This is only for backward compatibility, not all the parameters are supported in 78xx */
+               cvmx_pki_set_port_config(ipd_port, &pki_prt_cfg);
+       } else {
+               if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+                       int interface, index, pknd;
+
+                       interface = cvmx_helper_get_interface_num(ipd_port);
+                       index = cvmx_helper_get_interface_index_num(ipd_port);
+                       pknd = cvmx_helper_get_pknd(interface, index);
+
+                       ipd_port = pknd; /* overload port_num with pknd */
+               }
+               csr_wr(CVMX_PIP_PRT_CFGX(ipd_port), port_cfg.u64);
+               csr_wr(CVMX_PIP_PRT_TAGX(ipd_port), port_tag_cfg.u64);
+       }
+}
+
+/**
+ * Configure the VLAN priority to QoS queue mapping.
+ *
+ * @param vlan_priority
+ *               VLAN priority (0-7)
+ * @param qos    QoS queue for packets matching this watcher
+ */
+static inline void cvmx_pip_config_vlan_qos(u64 vlan_priority, u64 qos)
+{
+       if (!octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               cvmx_pip_qos_vlanx_t pip_qos_vlanx;
+
+               pip_qos_vlanx.u64 = 0;
+               pip_qos_vlanx.s.qos = qos;
+               csr_wr(CVMX_PIP_QOS_VLANX(vlan_priority), pip_qos_vlanx.u64);
+       }
+}
+
+/**
+ * Configure the Diffserv to QoS queue mapping.
+ *
+ * @param diffserv Diffserv field value (0-63)
+ * @param qos      QoS queue for packets matching this watcher
+ */
+static inline void cvmx_pip_config_diffserv_qos(u64 diffserv, u64 qos)
+{
+       if (!octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               cvmx_pip_qos_diffx_t pip_qos_diffx;
+
+               pip_qos_diffx.u64 = 0;
+               pip_qos_diffx.s.qos = qos;
+               csr_wr(CVMX_PIP_QOS_DIFFX(diffserv), pip_qos_diffx.u64);
+       }
+}
+
+/**
+ * Get the status counters for a port for older non PKI chips.
+ *
+ * @param port_num Port number (ipd_port) to get statistics for.
+ * @param clear    Set to 1 to clear the counters after they are read
+ * @param status   Where to put the results.
+ */
+static inline void cvmx_pip_get_port_stats(u64 port_num, u64 clear, cvmx_pip_port_status_t *status)
+{
+       cvmx_pip_stat_ctl_t pip_stat_ctl;
+       cvmx_pip_stat0_prtx_t stat0;
+       cvmx_pip_stat1_prtx_t stat1;
+       cvmx_pip_stat2_prtx_t stat2;
+       cvmx_pip_stat3_prtx_t stat3;
+       cvmx_pip_stat4_prtx_t stat4;
+       cvmx_pip_stat5_prtx_t stat5;
+       cvmx_pip_stat6_prtx_t stat6;
+       cvmx_pip_stat7_prtx_t stat7;
+       cvmx_pip_stat8_prtx_t stat8;
+       cvmx_pip_stat9_prtx_t stat9;
+       cvmx_pip_stat10_x_t stat10;
+       cvmx_pip_stat11_x_t stat11;
+       cvmx_pip_stat_inb_pktsx_t pip_stat_inb_pktsx;
+       cvmx_pip_stat_inb_octsx_t pip_stat_inb_octsx;
+       cvmx_pip_stat_inb_errsx_t pip_stat_inb_errsx;
+       int interface = cvmx_helper_get_interface_num(port_num);
+       int index = cvmx_helper_get_interface_index_num(port_num);
+
+       pip_stat_ctl.u64 = 0;
+       pip_stat_ctl.s.rdclr = clear;
+       csr_wr(CVMX_PIP_STAT_CTL, pip_stat_ctl.u64);
+
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               int pknd = cvmx_helper_get_pknd(interface, index);
+               /*
+                * PIP_STAT_CTL[MODE] 0 means pkind.
+                */
+               stat0.u64 = csr_rd(CVMX_PIP_STAT0_X(pknd));
+               stat1.u64 = csr_rd(CVMX_PIP_STAT1_X(pknd));
+               stat2.u64 = csr_rd(CVMX_PIP_STAT2_X(pknd));
+               stat3.u64 = csr_rd(CVMX_PIP_STAT3_X(pknd));
+               stat4.u64 = csr_rd(CVMX_PIP_STAT4_X(pknd));
+               stat5.u64 = csr_rd(CVMX_PIP_STAT5_X(pknd));
+               stat6.u64 = csr_rd(CVMX_PIP_STAT6_X(pknd));
+               stat7.u64 = csr_rd(CVMX_PIP_STAT7_X(pknd));
+               stat8.u64 = csr_rd(CVMX_PIP_STAT8_X(pknd));
+               stat9.u64 = csr_rd(CVMX_PIP_STAT9_X(pknd));
+               stat10.u64 = csr_rd(CVMX_PIP_STAT10_X(pknd));
+               stat11.u64 = csr_rd(CVMX_PIP_STAT11_X(pknd));
+       } else {
+               if (port_num >= 40) {
+                       stat0.u64 = csr_rd(CVMX_PIP_XSTAT0_PRTX(port_num));
+                       stat1.u64 = csr_rd(CVMX_PIP_XSTAT1_PRTX(port_num));
+                       stat2.u64 = csr_rd(CVMX_PIP_XSTAT2_PRTX(port_num));
+                       stat3.u64 = csr_rd(CVMX_PIP_XSTAT3_PRTX(port_num));
+                       stat4.u64 = csr_rd(CVMX_PIP_XSTAT4_PRTX(port_num));
+                       stat5.u64 = csr_rd(CVMX_PIP_XSTAT5_PRTX(port_num));
+                       stat6.u64 = csr_rd(CVMX_PIP_XSTAT6_PRTX(port_num));
+                       stat7.u64 = csr_rd(CVMX_PIP_XSTAT7_PRTX(port_num));
+                       stat8.u64 = csr_rd(CVMX_PIP_XSTAT8_PRTX(port_num));
+                       stat9.u64 = csr_rd(CVMX_PIP_XSTAT9_PRTX(port_num));
+                       if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) {
+                               stat10.u64 = csr_rd(CVMX_PIP_XSTAT10_PRTX(port_num));
+                               stat11.u64 = csr_rd(CVMX_PIP_XSTAT11_PRTX(port_num));
+                       }
+               } else {
+                       stat0.u64 = csr_rd(CVMX_PIP_STAT0_PRTX(port_num));
+                       stat1.u64 = csr_rd(CVMX_PIP_STAT1_PRTX(port_num));
+                       stat2.u64 = csr_rd(CVMX_PIP_STAT2_PRTX(port_num));
+                       stat3.u64 = csr_rd(CVMX_PIP_STAT3_PRTX(port_num));
+                       stat4.u64 = csr_rd(CVMX_PIP_STAT4_PRTX(port_num));
+                       stat5.u64 = csr_rd(CVMX_PIP_STAT5_PRTX(port_num));
+                       stat6.u64 = csr_rd(CVMX_PIP_STAT6_PRTX(port_num));
+                       stat7.u64 = csr_rd(CVMX_PIP_STAT7_PRTX(port_num));
+                       stat8.u64 = csr_rd(CVMX_PIP_STAT8_PRTX(port_num));
+                       stat9.u64 = csr_rd(CVMX_PIP_STAT9_PRTX(port_num));
+                       if (OCTEON_IS_OCTEON2() || OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+                               stat10.u64 = csr_rd(CVMX_PIP_STAT10_PRTX(port_num));
+                               stat11.u64 = csr_rd(CVMX_PIP_STAT11_PRTX(port_num));
+                       }
+               }
+       }
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               int pknd = cvmx_helper_get_pknd(interface, index);
+
+               pip_stat_inb_pktsx.u64 = csr_rd(CVMX_PIP_STAT_INB_PKTS_PKNDX(pknd));
+               pip_stat_inb_octsx.u64 = csr_rd(CVMX_PIP_STAT_INB_OCTS_PKNDX(pknd));
+               pip_stat_inb_errsx.u64 = csr_rd(CVMX_PIP_STAT_INB_ERRS_PKNDX(pknd));
+       } else {
+               pip_stat_inb_pktsx.u64 = csr_rd(CVMX_PIP_STAT_INB_PKTSX(port_num));
+               pip_stat_inb_octsx.u64 = csr_rd(CVMX_PIP_STAT_INB_OCTSX(port_num));
+               pip_stat_inb_errsx.u64 = csr_rd(CVMX_PIP_STAT_INB_ERRSX(port_num));
+       }
+
+       status->dropped_octets = stat0.s.drp_octs;
+       status->dropped_packets = stat0.s.drp_pkts;
+       status->octets = stat1.s.octs;
+       status->pci_raw_packets = stat2.s.raw;
+       status->packets = stat2.s.pkts;
+       status->multicast_packets = stat3.s.mcst;
+       status->broadcast_packets = stat3.s.bcst;
+       status->len_64_packets = stat4.s.h64;
+       status->len_65_127_packets = stat4.s.h65to127;
+       status->len_128_255_packets = stat5.s.h128to255;
+       status->len_256_511_packets = stat5.s.h256to511;
+       status->len_512_1023_packets = stat6.s.h512to1023;
+       status->len_1024_1518_packets = stat6.s.h1024to1518;
+       status->len_1519_max_packets = stat7.s.h1519;
+       status->fcs_align_err_packets = stat7.s.fcs;
+       status->runt_packets = stat8.s.undersz;
+       status->runt_crc_packets = stat8.s.frag;
+       status->oversize_packets = stat9.s.oversz;
+       status->oversize_crc_packets = stat9.s.jabber;
+       if (OCTEON_IS_OCTEON2() || OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               status->mcast_l2_red_packets = stat10.s.mcast;
+               status->bcast_l2_red_packets = stat10.s.bcast;
+               status->mcast_l3_red_packets = stat11.s.mcast;
+               status->bcast_l3_red_packets = stat11.s.bcast;
+       }
+       status->inb_packets = pip_stat_inb_pktsx.s.pkts;
+       status->inb_octets = pip_stat_inb_octsx.s.octs;
+       status->inb_errors = pip_stat_inb_errsx.s.errs;
+}
+
+/**
+ * Get the status counters for a port.
+ *
+ * @param port_num Port number (ipd_port) to get statistics for.
+ * @param clear    Set to 1 to clear the counters after they are read
+ * @param status   Where to put the results.
+ */
+static inline void cvmx_pip_get_port_status(u64 port_num, u64 clear, cvmx_pip_port_status_t *status)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_PKI)) {
+               unsigned int node = cvmx_get_node_num();
+
+               cvmx_pki_get_port_stats(node, port_num, (struct cvmx_pki_port_stats *)status);
+       } else {
+               cvmx_pip_get_port_stats(port_num, clear, status);
+       }
+}
+
+/**
+ * Configure the hardware CRC engine
+ *
+ * @param interface Interface to configure (0 or 1)
+ * @param invert_result
+ *                 Invert the result of the CRC
+ * @param reflect  Reflect
+ * @param initialization_vector
+ *                 CRC initialization vector
+ */
+static inline void cvmx_pip_config_crc(u64 interface, u64 invert_result, u64 reflect,
+                                      u32 initialization_vector)
+{
+       /* Only CN38XX & CN58XX */
+}
+
+/**
+ * Clear all bits in a tag mask. This should be called on
+ * startup before any calls to cvmx_pip_tag_mask_set. Each bit
+ * set in the final mask represent a byte used in the packet for
+ * tag generation.
+ *
+ * @param mask_index Which tag mask to clear (0..3)
+ */
+static inline void cvmx_pip_tag_mask_clear(u64 mask_index)
+{
+       u64 index;
+       cvmx_pip_tag_incx_t pip_tag_incx;
+
+       pip_tag_incx.u64 = 0;
+       pip_tag_incx.s.en = 0;
+       for (index = mask_index * 16; index < (mask_index + 1) * 16; index++)
+               csr_wr(CVMX_PIP_TAG_INCX(index), pip_tag_incx.u64);
+}
+
+/**
+ * Sets a range of bits in the tag mask. The tag mask is used
+ * when the cvmx_pip_port_tag_cfg_t tag_mode is non zero.
+ * There are four separate masks that can be configured.
+ *
+ * @param mask_index Which tag mask to modify (0..3)
+ * @param offset     Offset into the bitmask to set bits at. Use the GCC macro
+ *                   offsetof() to determine the offsets into packet headers.
+ *                   For example, offsetof(ethhdr, protocol) returns the offset
+ *                   of the ethernet protocol field.  The bitmask selects which bytes
+ *                   to include the the tag, with bit offset X selecting byte at offset X
+ *                   from the beginning of the packet data.
+ * @param len        Number of bytes to include. Usually this is the sizeof()
+ *                   the field.
+ */
+static inline void cvmx_pip_tag_mask_set(u64 mask_index, u64 offset, u64 len)
+{
+       while (len--) {
+               cvmx_pip_tag_incx_t pip_tag_incx;
+               u64 index = mask_index * 16 + offset / 8;
+
+               pip_tag_incx.u64 = csr_rd(CVMX_PIP_TAG_INCX(index));
+               pip_tag_incx.s.en |= 0x80 >> (offset & 0x7);
+               csr_wr(CVMX_PIP_TAG_INCX(index), pip_tag_incx.u64);
+               offset++;
+       }
+}
+
+/**
+ * Set byte count for Max-Sized and Min Sized frame check.
+ *
+ * @param interface   Which interface to set the limit
+ * @param max_size    Byte count for Max-Size frame check
+ */
+static inline void cvmx_pip_set_frame_check(int interface, u32 max_size)
+{
+       cvmx_pip_frm_len_chkx_t frm_len;
+
+       /* max_size and min_size are passed as 0, reset to default values. */
+       if (max_size < 1536)
+               max_size = 1536;
+
+       /* On CN68XX frame check is enabled for a pkind n and
+          PIP_PRT_CFG[len_chk_sel] selects which set of
+          MAXLEN/MINLEN to use. */
+       if (octeon_has_feature(OCTEON_FEATURE_PKND)) {
+               int port;
+               int num_ports = cvmx_helper_ports_on_interface(interface);
+
+               for (port = 0; port < num_ports; port++) {
+                       if (octeon_has_feature(OCTEON_FEATURE_PKI)) {
+                               int ipd_port;
+
+                               ipd_port = cvmx_helper_get_ipd_port(interface, port);
+                               cvmx_pki_set_max_frm_len(ipd_port, max_size);
+                       } else {
+                               int pknd;
+                               int sel;
+                               cvmx_pip_prt_cfgx_t config;
+
+                               pknd = cvmx_helper_get_pknd(interface, port);
+                               config.u64 = csr_rd(CVMX_PIP_PRT_CFGX(pknd));
+                               sel = config.s.len_chk_sel;
+                               frm_len.u64 = csr_rd(CVMX_PIP_FRM_LEN_CHKX(sel));
+                               frm_len.s.maxlen = max_size;
+                               csr_wr(CVMX_PIP_FRM_LEN_CHKX(sel), frm_len.u64);
+                       }
+               }
+       }
+       /* on cn6xxx and cn7xxx models, PIP_FRM_LEN_CHK0 applies to
+        *     all incoming traffic */
+       else if (OCTEON_IS_OCTEON2() || OCTEON_IS_MODEL(OCTEON_CN70XX)) {
+               frm_len.u64 = csr_rd(CVMX_PIP_FRM_LEN_CHKX(0));
+               frm_len.s.maxlen = max_size;
+               csr_wr(CVMX_PIP_FRM_LEN_CHKX(0), frm_len.u64);
+       }
+}
+
+/**
+ * Initialize Bit Select Extractor config. Their are 8 bit positions and valids
+ * to be used when using the corresponding extractor.
+ *
+ * @param bit     Bit Select Extractor to use
+ * @param pos     Which position to update
+ * @param val     The value to update the position with
+ */
+static inline void cvmx_pip_set_bsel_pos(int bit, int pos, int val)
+{
+       cvmx_pip_bsel_ext_posx_t bsel_pos;
+
+       /* The bit select extractor is available in CN61XX and CN68XX pass2.0 onwards. */
+       if (!octeon_has_feature(OCTEON_FEATURE_BIT_EXTRACTOR))
+               return;
+
+       if (bit < 0 || bit > 3) {
+               debug("ERROR: cvmx_pip_set_bsel_pos: Invalid Bit-Select Extractor (%d) passed\n",
+                     bit);
+               return;
+       }
+
+       bsel_pos.u64 = csr_rd(CVMX_PIP_BSEL_EXT_POSX(bit));
+       switch (pos) {
+       case 0:
+               bsel_pos.s.pos0_val = 1;
+               bsel_pos.s.pos0 = val & 0x7f;
+               break;
+       case 1:
+               bsel_pos.s.pos1_val = 1;
+               bsel_pos.s.pos1 = val & 0x7f;
+               break;
+       case 2:
+               bsel_pos.s.pos2_val = 1;
+               bsel_pos.s.pos2 = val & 0x7f;
+               break;
+       case 3:
+               bsel_pos.s.pos3_val = 1;
+               bsel_pos.s.pos3 = val & 0x7f;
+               break;
+       case 4:
+               bsel_pos.s.pos4_val = 1;
+               bsel_pos.s.pos4 = val & 0x7f;
+               break;
+       case 5:
+               bsel_pos.s.pos5_val = 1;
+               bsel_pos.s.pos5 = val & 0x7f;
+               break;
+       case 6:
+               bsel_pos.s.pos6_val = 1;
+               bsel_pos.s.pos6 = val & 0x7f;
+               break;
+       case 7:
+               bsel_pos.s.pos7_val = 1;
+               bsel_pos.s.pos7 = val & 0x7f;
+               break;
+       default:
+               debug("Warning: cvmx_pip_set_bsel_pos: Invalid pos(%d)\n", pos);
+               break;
+       }
+       csr_wr(CVMX_PIP_BSEL_EXT_POSX(bit), bsel_pos.u64);
+}
+
+/**
+ * Initialize offset and skip values to use by bit select extractor.
+
+ * @param bit  Bit Select Extractor to use
+ * @param offset       Offset to add to extractor mem addr to get final address
+ *                     to lookup table.
+ * @param skip         Number of bytes to skip from start of packet 0-64
+ */
+static inline void cvmx_pip_bsel_config(int bit, int offset, int skip)
+{
+       cvmx_pip_bsel_ext_cfgx_t bsel_cfg;
+
+       /* The bit select extractor is available in CN61XX and CN68XX pass2.0 onwards. */
+       if (!octeon_has_feature(OCTEON_FEATURE_BIT_EXTRACTOR))
+               return;
+
+       bsel_cfg.u64 = csr_rd(CVMX_PIP_BSEL_EXT_CFGX(bit));
+       bsel_cfg.s.offset = offset;
+       bsel_cfg.s.skip = skip;
+       csr_wr(CVMX_PIP_BSEL_EXT_CFGX(bit), bsel_cfg.u64);
+}
+
+/**
+ * Get the entry for the Bit Select Extractor Table.
+ * @param work   pointer to work queue entry
+ * @return       Index of the Bit Select Extractor Table
+ */
+static inline int cvmx_pip_get_bsel_table_index(cvmx_wqe_t *work)
+{
+       int bit = cvmx_wqe_get_port(work) & 0x3;
+       /* Get the Bit select table index. */
+       int index;
+       int y;
+       cvmx_pip_bsel_ext_cfgx_t bsel_cfg;
+       cvmx_pip_bsel_ext_posx_t bsel_pos;
+
+       /* The bit select extractor is available in CN61XX and CN68XX pass2.0 onwards. */
+       if (!octeon_has_feature(OCTEON_FEATURE_BIT_EXTRACTOR))
+               return -1;
+
+       bsel_cfg.u64 = csr_rd(CVMX_PIP_BSEL_EXT_CFGX(bit));
+       bsel_pos.u64 = csr_rd(CVMX_PIP_BSEL_EXT_POSX(bit));
+
+       for (y = 0; y < 8; y++) {
+               char *ptr = (char *)cvmx_phys_to_ptr(work->packet_ptr.s.addr);
+               int bit_loc = 0;
+               int bit;
+
+               ptr += bsel_cfg.s.skip;
+               switch (y) {
+               case 0:
+                       ptr += (bsel_pos.s.pos0 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos0 & 0x3);
+                       break;
+               case 1:
+                       ptr += (bsel_pos.s.pos1 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos1 & 0x3);
+                       break;
+               case 2:
+                       ptr += (bsel_pos.s.pos2 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos2 & 0x3);
+                       break;
+               case 3:
+                       ptr += (bsel_pos.s.pos3 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos3 & 0x3);
+                       break;
+               case 4:
+                       ptr += (bsel_pos.s.pos4 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos4 & 0x3);
+                       break;
+               case 5:
+                       ptr += (bsel_pos.s.pos5 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos5 & 0x3);
+                       break;
+               case 6:
+                       ptr += (bsel_pos.s.pos6 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos6 & 0x3);
+                       break;
+               case 7:
+                       ptr += (bsel_pos.s.pos7 >> 3);
+                       bit_loc = 7 - (bsel_pos.s.pos7 & 0x3);
+                       break;
+               }
+               bit = (*ptr >> bit_loc) & 1;
+               index |= bit << y;
+       }
+       index += bsel_cfg.s.offset;
+       index &= 0x1ff;
+       return index;
+}
+
+static inline int cvmx_pip_get_bsel_qos(cvmx_wqe_t *work)
+{
+       int index = cvmx_pip_get_bsel_table_index(work);
+       cvmx_pip_bsel_tbl_entx_t bsel_tbl;
+
+       /* The bit select extractor is available in CN61XX and CN68XX pass2.0 onwards. */
+       if (!octeon_has_feature(OCTEON_FEATURE_BIT_EXTRACTOR))
+               return -1;
+
+       bsel_tbl.u64 = csr_rd(CVMX_PIP_BSEL_TBL_ENTX(index));
+
+       return bsel_tbl.s.qos;
+}
+
+static inline int cvmx_pip_get_bsel_grp(cvmx_wqe_t *work)
+{
+       int index = cvmx_pip_get_bsel_table_index(work);
+       cvmx_pip_bsel_tbl_entx_t bsel_tbl;
+
+       /* The bit select extractor is available in CN61XX and CN68XX pass2.0 onwards. */
+       if (!octeon_has_feature(OCTEON_FEATURE_BIT_EXTRACTOR))
+               return -1;
+
+       bsel_tbl.u64 = csr_rd(CVMX_PIP_BSEL_TBL_ENTX(index));
+
+       return bsel_tbl.s.grp;
+}
+
+static inline int cvmx_pip_get_bsel_tt(cvmx_wqe_t *work)
+{
+       int index = cvmx_pip_get_bsel_table_index(work);
+       cvmx_pip_bsel_tbl_entx_t bsel_tbl;
+
+       /* The bit select extractor is available in CN61XX and CN68XX pass2.0 onwards. */
+       if (!octeon_has_feature(OCTEON_FEATURE_BIT_EXTRACTOR))
+               return -1;
+
+       bsel_tbl.u64 = csr_rd(CVMX_PIP_BSEL_TBL_ENTX(index));
+
+       return bsel_tbl.s.tt;
+}
+
+static inline int cvmx_pip_get_bsel_tag(cvmx_wqe_t *work)
+{
+       int index = cvmx_pip_get_bsel_table_index(work);
+       int port = cvmx_wqe_get_port(work);
+       int bit = port & 0x3;
+       int upper_tag = 0;
+       cvmx_pip_bsel_tbl_entx_t bsel_tbl;
+       cvmx_pip_bsel_ext_cfgx_t bsel_cfg;
+       cvmx_pip_prt_tagx_t prt_tag;
+
+       /* The bit select extractor is available in CN61XX and CN68XX pass2.0 onwards. */
+       if (!octeon_has_feature(OCTEON_FEATURE_BIT_EXTRACTOR))
+               return -1;
+
+       bsel_tbl.u64 = csr_rd(CVMX_PIP_BSEL_TBL_ENTX(index));
+       bsel_cfg.u64 = csr_rd(CVMX_PIP_BSEL_EXT_CFGX(bit));
+
+       prt_tag.u64 = csr_rd(CVMX_PIP_PRT_TAGX(port));
+       if (prt_tag.s.inc_prt_flag == 0)
+               upper_tag = bsel_cfg.s.upper_tag;
+       return bsel_tbl.s.tag | ((bsel_cfg.s.tag << 8) & 0xff00) | ((upper_tag << 16) & 0xffff0000);
+}
+
+#endif /*  __CVMX_PIP_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pki-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pki-defs.h
new file mode 100644 (file)
index 0000000..4465872
--- /dev/null
@@ -0,0 +1,2353 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pki.
+ */
+
+#ifndef __CVMX_PKI_DEFS_H__
+#define __CVMX_PKI_DEFS_H__
+
+#define CVMX_PKI_ACTIVE0            (0x0001180044000220ull)
+#define CVMX_PKI_ACTIVE1            (0x0001180044000230ull)
+#define CVMX_PKI_ACTIVE2            (0x0001180044000240ull)
+#define CVMX_PKI_AURAX_CFG(offset)   (0x0001180044900000ull + ((offset) & 1023) * 8)
+#define CVMX_PKI_BIST_STATUS0       (0x0001180044000080ull)
+#define CVMX_PKI_BIST_STATUS1       (0x0001180044000088ull)
+#define CVMX_PKI_BIST_STATUS2       (0x0001180044000090ull)
+#define CVMX_PKI_BPIDX_STATE(offset) (0x0001180044B00000ull + ((offset) & 1023) * 8)
+#define CVMX_PKI_BUF_CTL            (0x0001180044000100ull)
+#define CVMX_PKI_CHANX_CFG(offset)   (0x0001180044A00000ull + ((offset) & 4095) * 8)
+#define CVMX_PKI_CLKEN              (0x0001180044000410ull)
+#define CVMX_PKI_CLX_ECC_CTL(offset) (0x000118004400C020ull + ((offset) & 3) * 0x10000ull)
+#define CVMX_PKI_CLX_ECC_INT(offset) (0x000118004400C010ull + ((offset) & 3) * 0x10000ull)
+#define CVMX_PKI_CLX_INT(offset)     (0x000118004400C000ull + ((offset) & 3) * 0x10000ull)
+#define CVMX_PKI_CLX_PCAMX_ACTIONX(a, b, c)                                                        \
+       (0x0001180044708000ull + ((a) << 16) + ((b) << 12) + ((c) << 3))
+#define CVMX_PKI_CLX_PCAMX_MATCHX(a, b, c)                                                         \
+       (0x0001180044704000ull + ((a) << 16) + ((b) << 12) + ((c) << 3))
+#define CVMX_PKI_CLX_PCAMX_TERMX(a, b, c)                                                          \
+       (0x0001180044700000ull + ((a) << 16) + ((b) << 12) + ((c) << 3))
+#define CVMX_PKI_CLX_PKINDX_CFG(offset, block_id)                                                  \
+       (0x0001180044300040ull + (((offset) & 63) + ((block_id) & 3) * 0x100ull) * 256)
+#define CVMX_PKI_CLX_PKINDX_KMEMX(a, b, c)                                                         \
+       (0x0001180044200000ull + ((a) << 16) + ((b) << 8) + ((c) << 3))
+#define CVMX_PKI_CLX_PKINDX_L2_CUSTOM(offset, block_id)                                            \
+       (0x0001180044300058ull + (((offset) & 63) + ((block_id) & 3) * 0x100ull) * 256)
+#define CVMX_PKI_CLX_PKINDX_LG_CUSTOM(offset, block_id)                                            \
+       (0x0001180044300060ull + (((offset) & 63) + ((block_id) & 3) * 0x100ull) * 256)
+#define CVMX_PKI_CLX_PKINDX_SKIP(offset, block_id)                                                 \
+       (0x0001180044300050ull + (((offset) & 63) + ((block_id) & 3) * 0x100ull) * 256)
+#define CVMX_PKI_CLX_PKINDX_STYLE(offset, block_id)                                                \
+       (0x0001180044300048ull + (((offset) & 63) + ((block_id) & 3) * 0x100ull) * 256)
+#define CVMX_PKI_CLX_SMEMX(offset, block_id)                                                       \
+       (0x0001180044400000ull + (((offset) & 2047) + ((block_id) & 3) * 0x2000ull) * 8)
+#define CVMX_PKI_CLX_START(offset) (0x000118004400C030ull + ((offset) & 3) * 0x10000ull)
+#define CVMX_PKI_CLX_STYLEX_ALG(offset, block_id)                                                  \
+       (0x0001180044501000ull + (((offset) & 63) + ((block_id) & 3) * 0x2000ull) * 8)
+#define CVMX_PKI_CLX_STYLEX_CFG(offset, block_id)                                                  \
+       (0x0001180044500000ull + (((offset) & 63) + ((block_id) & 3) * 0x2000ull) * 8)
+#define CVMX_PKI_CLX_STYLEX_CFG2(offset, block_id)                                                 \
+       (0x0001180044500800ull + (((offset) & 63) + ((block_id) & 3) * 0x2000ull) * 8)
+#define CVMX_PKI_DSTATX_STAT0(offset)   (0x0001180044C00000ull + ((offset) & 1023) * 64)
+#define CVMX_PKI_DSTATX_STAT1(offset)   (0x0001180044C00008ull + ((offset) & 1023) * 64)
+#define CVMX_PKI_DSTATX_STAT2(offset)   (0x0001180044C00010ull + ((offset) & 1023) * 64)
+#define CVMX_PKI_DSTATX_STAT3(offset)   (0x0001180044C00018ull + ((offset) & 1023) * 64)
+#define CVMX_PKI_DSTATX_STAT4(offset)   (0x0001180044C00020ull + ((offset) & 1023) * 64)
+#define CVMX_PKI_ECC_CTL0               (0x0001180044000060ull)
+#define CVMX_PKI_ECC_CTL1               (0x0001180044000068ull)
+#define CVMX_PKI_ECC_CTL2               (0x0001180044000070ull)
+#define CVMX_PKI_ECC_INT0               (0x0001180044000040ull)
+#define CVMX_PKI_ECC_INT1               (0x0001180044000048ull)
+#define CVMX_PKI_ECC_INT2               (0x0001180044000050ull)
+#define CVMX_PKI_FRM_LEN_CHKX(offset)   (0x0001180044004000ull + ((offset) & 1) * 8)
+#define CVMX_PKI_GBL_PEN                (0x0001180044000200ull)
+#define CVMX_PKI_GEN_INT                (0x0001180044000020ull)
+#define CVMX_PKI_ICGX_CFG(offset)       (0x000118004400A000ull)
+#define CVMX_PKI_IMEMX(offset)          (0x0001180044100000ull + ((offset) & 2047) * 8)
+#define CVMX_PKI_LTYPEX_MAP(offset)     (0x0001180044005000ull + ((offset) & 31) * 8)
+#define CVMX_PKI_PBE_ECO                (0x0001180044000710ull)
+#define CVMX_PKI_PCAM_LOOKUP            (0x0001180044000500ull)
+#define CVMX_PKI_PCAM_RESULT            (0x0001180044000510ull)
+#define CVMX_PKI_PFE_DIAG               (0x0001180044000560ull)
+#define CVMX_PKI_PFE_ECO                (0x0001180044000720ull)
+#define CVMX_PKI_PIX_CLKEN              (0x0001180044000600ull)
+#define CVMX_PKI_PIX_DIAG               (0x0001180044000580ull)
+#define CVMX_PKI_PIX_ECO                (0x0001180044000700ull)
+#define CVMX_PKI_PKINDX_ICGSEL(offset)  (0x0001180044010000ull + ((offset) & 63) * 8)
+#define CVMX_PKI_PKNDX_INB_STAT0(offset) (0x0001180044F00000ull + ((offset) & 63) * 256)
+#define CVMX_PKI_PKNDX_INB_STAT1(offset) (0x0001180044F00008ull + ((offset) & 63) * 256)
+#define CVMX_PKI_PKNDX_INB_STAT2(offset) (0x0001180044F00010ull + ((offset) & 63) * 256)
+#define CVMX_PKI_PKT_ERR                (0x0001180044000030ull)
+#define CVMX_PKI_PTAG_AVAIL             (0x0001180044000130ull)
+#define CVMX_PKI_QPG_TBLBX(offset)      (0x0001180044820000ull + ((offset) & 2047) * 8)
+#define CVMX_PKI_QPG_TBLX(offset)       (0x0001180044800000ull + ((offset) & 2047) * 8)
+#define CVMX_PKI_REASM_SOPX(offset)     (0x0001180044006000ull + ((offset) & 1) * 8)
+#define CVMX_PKI_REQ_WGT                (0x0001180044000120ull)
+#define CVMX_PKI_SFT_RST                (0x0001180044000010ull)
+#define CVMX_PKI_STATX_HIST0(offset)    (0x0001180044E00000ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_HIST1(offset)    (0x0001180044E00008ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_HIST2(offset)    (0x0001180044E00010ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_HIST3(offset)    (0x0001180044E00018ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_HIST4(offset)    (0x0001180044E00020ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_HIST5(offset)    (0x0001180044E00028ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_HIST6(offset)    (0x0001180044E00030ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT0(offset)    (0x0001180044E00038ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT1(offset)    (0x0001180044E00040ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT10(offset)   (0x0001180044E00088ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT11(offset)   (0x0001180044E00090ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT12(offset)   (0x0001180044E00098ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT13(offset)   (0x0001180044E000A0ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT14(offset)   (0x0001180044E000A8ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT15(offset)   (0x0001180044E000B0ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT16(offset)   (0x0001180044E000B8ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT17(offset)   (0x0001180044E000C0ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT18(offset)   (0x0001180044E000C8ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT2(offset)    (0x0001180044E00048ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT3(offset)    (0x0001180044E00050ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT4(offset)    (0x0001180044E00058ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT5(offset)    (0x0001180044E00060ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT6(offset)    (0x0001180044E00068ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT7(offset)    (0x0001180044E00070ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT8(offset)    (0x0001180044E00078ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STATX_STAT9(offset)    (0x0001180044E00080ull + ((offset) & 63) * 256)
+#define CVMX_PKI_STAT_CTL               (0x0001180044000110ull)
+#define CVMX_PKI_STYLEX_BUF(offset)     (0x0001180044024000ull + ((offset) & 63) * 8)
+#define CVMX_PKI_STYLEX_TAG_MASK(offset) (0x0001180044021000ull + ((offset) & 63) * 8)
+#define CVMX_PKI_STYLEX_TAG_SEL(offset)         (0x0001180044020000ull + ((offset) & 63) * 8)
+#define CVMX_PKI_STYLEX_WQ2(offset)     (0x0001180044022000ull + ((offset) & 63) * 8)
+#define CVMX_PKI_STYLEX_WQ4(offset)     (0x0001180044023000ull + ((offset) & 63) * 8)
+#define CVMX_PKI_TAG_INCX_CTL(offset)   (0x0001180044007000ull + ((offset) & 31) * 8)
+#define CVMX_PKI_TAG_INCX_MASK(offset)  (0x0001180044008000ull + ((offset) & 31) * 8)
+#define CVMX_PKI_TAG_SECRET             (0x0001180044000430ull)
+#define CVMX_PKI_X2P_REQ_OFL            (0x0001180044000038ull)
+
+/**
+ * cvmx_pki_active0
+ */
+union cvmx_pki_active0 {
+       u64 u64;
+       struct cvmx_pki_active0_s {
+               u64 reserved_1_63 : 63;
+               u64 pfe_active : 1;
+       } s;
+       struct cvmx_pki_active0_s cn73xx;
+       struct cvmx_pki_active0_s cn78xx;
+       struct cvmx_pki_active0_s cn78xxp1;
+       struct cvmx_pki_active0_s cnf75xx;
+};
+
+typedef union cvmx_pki_active0 cvmx_pki_active0_t;
+
+/**
+ * cvmx_pki_active1
+ */
+union cvmx_pki_active1 {
+       u64 u64;
+       struct cvmx_pki_active1_s {
+               u64 reserved_4_63 : 60;
+               u64 fpc_active : 1;
+               u64 iobp_active : 1;
+               u64 sws_active : 1;
+               u64 pbtag_active : 1;
+       } s;
+       struct cvmx_pki_active1_s cn73xx;
+       struct cvmx_pki_active1_s cn78xx;
+       struct cvmx_pki_active1_s cn78xxp1;
+       struct cvmx_pki_active1_s cnf75xx;
+};
+
+typedef union cvmx_pki_active1 cvmx_pki_active1_t;
+
+/**
+ * cvmx_pki_active2
+ */
+union cvmx_pki_active2 {
+       u64 u64;
+       struct cvmx_pki_active2_s {
+               u64 reserved_5_63 : 59;
+               u64 pix_active : 5;
+       } s;
+       struct cvmx_pki_active2_s cn73xx;
+       struct cvmx_pki_active2_s cn78xx;
+       struct cvmx_pki_active2_s cn78xxp1;
+       struct cvmx_pki_active2_s cnf75xx;
+};
+
+typedef union cvmx_pki_active2 cvmx_pki_active2_t;
+
+/**
+ * cvmx_pki_aura#_cfg
+ *
+ * This register configures aura backpressure, etc.
+ *
+ */
+union cvmx_pki_aurax_cfg {
+       u64 u64;
+       struct cvmx_pki_aurax_cfg_s {
+               u64 reserved_32_63 : 32;
+               u64 pkt_add : 2;
+               u64 reserved_19_29 : 11;
+               u64 ena_red : 1;
+               u64 ena_drop : 1;
+               u64 ena_bp : 1;
+               u64 reserved_10_15 : 6;
+               u64 bpid : 10;
+       } s;
+       struct cvmx_pki_aurax_cfg_s cn73xx;
+       struct cvmx_pki_aurax_cfg_s cn78xx;
+       struct cvmx_pki_aurax_cfg_s cn78xxp1;
+       struct cvmx_pki_aurax_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pki_aurax_cfg cvmx_pki_aurax_cfg_t;
+
+/**
+ * cvmx_pki_bist_status0
+ *
+ * This register indicates BIST status.
+ *
+ */
+union cvmx_pki_bist_status0 {
+       u64 u64;
+       struct cvmx_pki_bist_status0_s {
+               u64 reserved_31_63 : 33;
+               u64 bist : 31;
+       } s;
+       struct cvmx_pki_bist_status0_s cn73xx;
+       struct cvmx_pki_bist_status0_s cn78xx;
+       struct cvmx_pki_bist_status0_s cn78xxp1;
+       struct cvmx_pki_bist_status0_s cnf75xx;
+};
+
+typedef union cvmx_pki_bist_status0 cvmx_pki_bist_status0_t;
+
+/**
+ * cvmx_pki_bist_status1
+ *
+ * This register indicates BIST status.
+ *
+ */
+union cvmx_pki_bist_status1 {
+       u64 u64;
+       struct cvmx_pki_bist_status1_s {
+               u64 reserved_26_63 : 38;
+               u64 bist : 26;
+       } s;
+       struct cvmx_pki_bist_status1_s cn73xx;
+       struct cvmx_pki_bist_status1_s cn78xx;
+       struct cvmx_pki_bist_status1_cn78xxp1 {
+               u64 reserved_21_63 : 43;
+               u64 bist : 21;
+       } cn78xxp1;
+       struct cvmx_pki_bist_status1_s cnf75xx;
+};
+
+typedef union cvmx_pki_bist_status1 cvmx_pki_bist_status1_t;
+
+/**
+ * cvmx_pki_bist_status2
+ *
+ * This register indicates BIST status.
+ *
+ */
+union cvmx_pki_bist_status2 {
+       u64 u64;
+       struct cvmx_pki_bist_status2_s {
+               u64 reserved_25_63 : 39;
+               u64 bist : 25;
+       } s;
+       struct cvmx_pki_bist_status2_s cn73xx;
+       struct cvmx_pki_bist_status2_s cn78xx;
+       struct cvmx_pki_bist_status2_s cn78xxp1;
+       struct cvmx_pki_bist_status2_s cnf75xx;
+};
+
+typedef union cvmx_pki_bist_status2 cvmx_pki_bist_status2_t;
+
+/**
+ * cvmx_pki_bpid#_state
+ *
+ * This register shows the current bpid state for diagnostics.
+ *
+ */
+union cvmx_pki_bpidx_state {
+       u64 u64;
+       struct cvmx_pki_bpidx_state_s {
+               u64 reserved_1_63 : 63;
+               u64 xoff : 1;
+       } s;
+       struct cvmx_pki_bpidx_state_s cn73xx;
+       struct cvmx_pki_bpidx_state_s cn78xx;
+       struct cvmx_pki_bpidx_state_s cn78xxp1;
+       struct cvmx_pki_bpidx_state_s cnf75xx;
+};
+
+typedef union cvmx_pki_bpidx_state cvmx_pki_bpidx_state_t;
+
+/**
+ * cvmx_pki_buf_ctl
+ */
+union cvmx_pki_buf_ctl {
+       u64 u64;
+       struct cvmx_pki_buf_ctl_s {
+               u64 reserved_11_63 : 53;
+               u64 fpa_wait : 1;
+               u64 fpa_cac_dis : 1;
+               u64 reserved_6_8 : 3;
+               u64 pkt_off : 1;
+               u64 reserved_3_4 : 2;
+               u64 pbp_en : 1;
+               u64 reserved_1_1 : 1;
+               u64 pki_en : 1;
+       } s;
+       struct cvmx_pki_buf_ctl_s cn73xx;
+       struct cvmx_pki_buf_ctl_s cn78xx;
+       struct cvmx_pki_buf_ctl_s cn78xxp1;
+       struct cvmx_pki_buf_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pki_buf_ctl cvmx_pki_buf_ctl_t;
+
+/**
+ * cvmx_pki_chan#_cfg
+ *
+ * This register configures each channel.
+ *
+ */
+union cvmx_pki_chanx_cfg {
+       u64 u64;
+       struct cvmx_pki_chanx_cfg_s {
+               u64 reserved_17_63 : 47;
+               u64 imp : 1;
+               u64 reserved_10_15 : 6;
+               u64 bpid : 10;
+       } s;
+       struct cvmx_pki_chanx_cfg_s cn73xx;
+       struct cvmx_pki_chanx_cfg_s cn78xx;
+       struct cvmx_pki_chanx_cfg_s cn78xxp1;
+       struct cvmx_pki_chanx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pki_chanx_cfg cvmx_pki_chanx_cfg_t;
+
+/**
+ * cvmx_pki_cl#_ecc_ctl
+ *
+ * This register configures ECC. All of PKI_CL()_ECC_CTL must be configured identically.
+ *
+ */
+union cvmx_pki_clx_ecc_ctl {
+       u64 u64;
+       struct cvmx_pki_clx_ecc_ctl_s {
+               u64 pcam_en : 1;
+               u64 reserved_24_62 : 39;
+               u64 pcam1_flip : 2;
+               u64 pcam0_flip : 2;
+               u64 smem_flip : 2;
+               u64 dmem_flip : 1;
+               u64 rf_flip : 1;
+               u64 reserved_5_15 : 11;
+               u64 pcam1_cdis : 1;
+               u64 pcam0_cdis : 1;
+               u64 smem_cdis : 1;
+               u64 dmem_cdis : 1;
+               u64 rf_cdis : 1;
+       } s;
+       struct cvmx_pki_clx_ecc_ctl_s cn73xx;
+       struct cvmx_pki_clx_ecc_ctl_s cn78xx;
+       struct cvmx_pki_clx_ecc_ctl_s cn78xxp1;
+       struct cvmx_pki_clx_ecc_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_ecc_ctl cvmx_pki_clx_ecc_ctl_t;
+
+/**
+ * cvmx_pki_cl#_ecc_int
+ */
+union cvmx_pki_clx_ecc_int {
+       u64 u64;
+       struct cvmx_pki_clx_ecc_int_s {
+               u64 reserved_8_63 : 56;
+               u64 pcam1_dbe : 1;
+               u64 pcam1_sbe : 1;
+               u64 pcam0_dbe : 1;
+               u64 pcam0_sbe : 1;
+               u64 smem_dbe : 1;
+               u64 smem_sbe : 1;
+               u64 dmem_perr : 1;
+               u64 rf_perr : 1;
+       } s;
+       struct cvmx_pki_clx_ecc_int_s cn73xx;
+       struct cvmx_pki_clx_ecc_int_s cn78xx;
+       struct cvmx_pki_clx_ecc_int_s cn78xxp1;
+       struct cvmx_pki_clx_ecc_int_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_ecc_int cvmx_pki_clx_ecc_int_t;
+
+/**
+ * cvmx_pki_cl#_int
+ */
+union cvmx_pki_clx_int {
+       u64 u64;
+       struct cvmx_pki_clx_int_s {
+               u64 reserved_4_63 : 60;
+               u64 iptint : 1;
+               u64 sched_conf : 1;
+               u64 pcam_conf : 2;
+       } s;
+       struct cvmx_pki_clx_int_s cn73xx;
+       struct cvmx_pki_clx_int_s cn78xx;
+       struct cvmx_pki_clx_int_s cn78xxp1;
+       struct cvmx_pki_clx_int_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_int cvmx_pki_clx_int_t;
+
+/**
+ * cvmx_pki_cl#_pcam#_action#
+ *
+ * This register configures the result side of the PCAM. PKI hardware is opaque as to the use
+ * of the 32 bits of CAM result.
+ *
+ * For each legal j and k, PKI_CL(i)_PCAM(j)_ACTION(k) must be configured identically for i=0..1.
+ *
+ * With the current parse engine code:
+ *
+ * Action performed based on PCAM lookup using the PKI_CL()_PCAM()_TERM() and
+ * PKI_CL()_PCAM()_MATCH() registers.
+ *
+ * If lookup data matches no PCAM entries, then no action takes place. No matches indicates
+ * normal parsing will continue.
+ *
+ * If data matches multiple PCAM entries, PKI_WQE_S[ERRLEV,OPCODE] of the processed packet may
+ * be set to PKI_ERRLEV_E::RE,PKI_OPCODE_E::RE_PKIPCAM and the PKI_CL()_INT[PCAM_CONF] error
+ * interrupt is signaled.  Once a conflict is detected, the PCAM state is unpredictable and is
+ * required to be fully reconfigured before further valid processing can take place.
+ */
+union cvmx_pki_clx_pcamx_actionx {
+       u64 u64;
+       struct cvmx_pki_clx_pcamx_actionx_s {
+               u64 reserved_31_63 : 33;
+               u64 pmc : 7;
+               u64 style_add : 8;
+               u64 pf : 3;
+               u64 setty : 5;
+               u64 advance : 8;
+       } s;
+       struct cvmx_pki_clx_pcamx_actionx_s cn73xx;
+       struct cvmx_pki_clx_pcamx_actionx_s cn78xx;
+       struct cvmx_pki_clx_pcamx_actionx_s cn78xxp1;
+       struct cvmx_pki_clx_pcamx_actionx_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pcamx_actionx cvmx_pki_clx_pcamx_actionx_t;
+
+/**
+ * cvmx_pki_cl#_pcam#_match#
+ *
+ * This register configures the match side of the PCAM. PKI hardware is opaque as to the use
+ * of the 32 bits of CAM data.
+ *
+ * For each legal j and k, PKI_CL(i)_PCAM(j)_MATCH(k) must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_pcamx_matchx {
+       u64 u64;
+       struct cvmx_pki_clx_pcamx_matchx_s {
+               u64 data1 : 32;
+               u64 data0 : 32;
+       } s;
+       struct cvmx_pki_clx_pcamx_matchx_s cn73xx;
+       struct cvmx_pki_clx_pcamx_matchx_s cn78xx;
+       struct cvmx_pki_clx_pcamx_matchx_s cn78xxp1;
+       struct cvmx_pki_clx_pcamx_matchx_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pcamx_matchx cvmx_pki_clx_pcamx_matchx_t;
+
+/**
+ * cvmx_pki_cl#_pcam#_term#
+ *
+ * This register configures the match side of the PCAM. PKI hardware is opaque as to the use
+ * of the 16 bits of CAM data; the split between TERM and STYLE is defined by the
+ * parse engine.
+ *
+ * For each legal j and k, PKI_CL(i)_PCAM(j)_TERM(k) must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_pcamx_termx {
+       u64 u64;
+       struct cvmx_pki_clx_pcamx_termx_s {
+               u64 valid : 1;
+               u64 reserved_48_62 : 15;
+               u64 term1 : 8;
+               u64 style1 : 8;
+               u64 reserved_16_31 : 16;
+               u64 term0 : 8;
+               u64 style0 : 8;
+       } s;
+       struct cvmx_pki_clx_pcamx_termx_s cn73xx;
+       struct cvmx_pki_clx_pcamx_termx_s cn78xx;
+       struct cvmx_pki_clx_pcamx_termx_s cn78xxp1;
+       struct cvmx_pki_clx_pcamx_termx_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pcamx_termx cvmx_pki_clx_pcamx_termx_t;
+
+/**
+ * cvmx_pki_cl#_pkind#_cfg
+ *
+ * This register is inside PKI_CL()_PKIND()_KMEM(). These CSRs are used only by
+ * the PKI parse engine.
+ *
+ * For each legal j, PKI_CL(i)_PKIND(j)_CFG must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_pkindx_cfg {
+       u64 u64;
+       struct cvmx_pki_clx_pkindx_cfg_s {
+               u64 reserved_11_63 : 53;
+               u64 lg_custom_layer : 3;
+               u64 fcs_pres : 1;
+               u64 mpls_en : 1;
+               u64 inst_hdr : 1;
+               u64 lg_custom : 1;
+               u64 fulc_en : 1;
+               u64 dsa_en : 1;
+               u64 hg2_en : 1;
+               u64 hg_en : 1;
+       } s;
+       struct cvmx_pki_clx_pkindx_cfg_s cn73xx;
+       struct cvmx_pki_clx_pkindx_cfg_s cn78xx;
+       struct cvmx_pki_clx_pkindx_cfg_s cn78xxp1;
+       struct cvmx_pki_clx_pkindx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pkindx_cfg cvmx_pki_clx_pkindx_cfg_t;
+
+/**
+ * cvmx_pki_cl#_pkind#_kmem#
+ *
+ * This register initializes the KMEM, which initializes the parse engine state for each
+ * pkind. These CSRs are used only by the PKI parse engine.
+ *
+ * Inside the KMEM are the following parse engine registers. These registers are the
+ * preferred access method for software:
+ * * PKI_CL()_PKIND()_CFG.
+ * * PKI_CL()_PKIND()_STYLE.
+ * * PKI_CL()_PKIND()_SKIP.
+ * * PKI_CL()_PKIND()_L2_CUSTOM.
+ * * PKI_CL()_PKIND()_LG_CUSTOM.
+ *
+ * To avoid overlapping addresses, these aliases have address bit 20 set in contrast to
+ * this register; the PKI address decoder ignores bit 20 when accessing
+ * PKI_CL()_PKIND()_KMEM().
+ *
+ * Software must reload the PKI_CL()_PKIND()_KMEM() registers upon the detection of
+ * PKI_ECC_INT0[KMEM_SBE] or PKI_ECC_INT0[KMEM_DBE].
+ *
+ * For each legal j and k value, PKI_CL(i)_PKIND(j)_KMEM(k) must be configured
+ * identically for i=0..1.
+ */
+union cvmx_pki_clx_pkindx_kmemx {
+       u64 u64;
+       struct cvmx_pki_clx_pkindx_kmemx_s {
+               u64 reserved_16_63 : 48;
+               u64 data : 16;
+       } s;
+       struct cvmx_pki_clx_pkindx_kmemx_s cn73xx;
+       struct cvmx_pki_clx_pkindx_kmemx_s cn78xx;
+       struct cvmx_pki_clx_pkindx_kmemx_s cn78xxp1;
+       struct cvmx_pki_clx_pkindx_kmemx_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pkindx_kmemx cvmx_pki_clx_pkindx_kmemx_t;
+
+/**
+ * cvmx_pki_cl#_pkind#_l2_custom
+ *
+ * This register is inside PKI_CL()_PKIND()_KMEM(). These CSRs are used only by
+ * the PKI parse engine.
+ *
+ * For each legal j, PKI_CL(i)_PKIND(j)_L2_CUSTOM must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_pkindx_l2_custom {
+       u64 u64;
+       struct cvmx_pki_clx_pkindx_l2_custom_s {
+               u64 reserved_16_63 : 48;
+               u64 valid : 1;
+               u64 reserved_8_14 : 7;
+               u64 offset : 8;
+       } s;
+       struct cvmx_pki_clx_pkindx_l2_custom_s cn73xx;
+       struct cvmx_pki_clx_pkindx_l2_custom_s cn78xx;
+       struct cvmx_pki_clx_pkindx_l2_custom_s cn78xxp1;
+       struct cvmx_pki_clx_pkindx_l2_custom_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pkindx_l2_custom cvmx_pki_clx_pkindx_l2_custom_t;
+
+/**
+ * cvmx_pki_cl#_pkind#_lg_custom
+ *
+ * This register is inside PKI_CL()_PKIND()_KMEM(). These CSRs are used only by
+ * the PKI parse engine.
+ *
+ * For each legal j, PKI_CL(i)_PKIND(j)_LG_CUSTOM must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_pkindx_lg_custom {
+       u64 u64;
+       struct cvmx_pki_clx_pkindx_lg_custom_s {
+               u64 reserved_8_63 : 56;
+               u64 offset : 8;
+       } s;
+       struct cvmx_pki_clx_pkindx_lg_custom_s cn73xx;
+       struct cvmx_pki_clx_pkindx_lg_custom_s cn78xx;
+       struct cvmx_pki_clx_pkindx_lg_custom_s cn78xxp1;
+       struct cvmx_pki_clx_pkindx_lg_custom_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pkindx_lg_custom cvmx_pki_clx_pkindx_lg_custom_t;
+
+/**
+ * cvmx_pki_cl#_pkind#_skip
+ *
+ * This register is inside PKI_CL()_PKIND()_KMEM(). These CSRs are used only by
+ * the PKI parse engine.
+ *
+ * For each legal j, PKI_CL(i)_PKIND(j)_SKIP must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_pkindx_skip {
+       u64 u64;
+       struct cvmx_pki_clx_pkindx_skip_s {
+               u64 reserved_16_63 : 48;
+               u64 fcs_skip : 8;
+               u64 inst_skip : 8;
+       } s;
+       struct cvmx_pki_clx_pkindx_skip_s cn73xx;
+       struct cvmx_pki_clx_pkindx_skip_s cn78xx;
+       struct cvmx_pki_clx_pkindx_skip_s cn78xxp1;
+       struct cvmx_pki_clx_pkindx_skip_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pkindx_skip cvmx_pki_clx_pkindx_skip_t;
+
+/**
+ * cvmx_pki_cl#_pkind#_style
+ *
+ * This register is inside PKI_CL()_PKIND()_KMEM(). These CSRs are used only by
+ * the PKI parse engine.
+ *
+ * For each legal j, PKI_CL(i)_PKIND(j)_STYLE must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_pkindx_style {
+       u64 u64;
+       struct cvmx_pki_clx_pkindx_style_s {
+               u64 reserved_15_63 : 49;
+               u64 pm : 7;
+               u64 style : 8;
+       } s;
+       struct cvmx_pki_clx_pkindx_style_s cn73xx;
+       struct cvmx_pki_clx_pkindx_style_s cn78xx;
+       struct cvmx_pki_clx_pkindx_style_s cn78xxp1;
+       struct cvmx_pki_clx_pkindx_style_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_pkindx_style cvmx_pki_clx_pkindx_style_t;
+
+/**
+ * cvmx_pki_cl#_smem#
+ *
+ * This register initializes the SMEM, which configures the parse engine. These CSRs
+ * are used by the PKI parse engine and other PKI hardware.
+ *
+ * Inside the SMEM are the following parse engine registers. These registers are the
+ * preferred access method for software:
+ * * PKI_CL()_STYLE()_CFG
+ * * PKI_CL()_STYLE()_CFG2
+ * * PKI_CL()_STYLE()_ALG
+ *
+ * To avoid overlapping addresses, these aliases have address bit 20 set in contrast to
+ * this register; the PKI address decoder ignores bit 20 when accessing
+ * PKI_CL()_SMEM().
+ *
+ * Software must reload the PKI_CL()_SMEM() registers upon the detection of
+ * PKI_CL()_ECC_INT[SMEM_SBE] or PKI_CL()_ECC_INT[SMEM_DBE].
+ *
+ * For each legal j, PKI_CL(i)_SMEM(j) must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_smemx {
+       u64 u64;
+       struct cvmx_pki_clx_smemx_s {
+               u64 reserved_32_63 : 32;
+               u64 data : 32;
+       } s;
+       struct cvmx_pki_clx_smemx_s cn73xx;
+       struct cvmx_pki_clx_smemx_s cn78xx;
+       struct cvmx_pki_clx_smemx_s cn78xxp1;
+       struct cvmx_pki_clx_smemx_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_smemx cvmx_pki_clx_smemx_t;
+
+/**
+ * cvmx_pki_cl#_start
+ *
+ * This register configures a cluster. All of PKI_CL()_START must be programmed identically.
+ *
+ */
+union cvmx_pki_clx_start {
+       u64 u64;
+       struct cvmx_pki_clx_start_s {
+               u64 reserved_11_63 : 53;
+               u64 start : 11;
+       } s;
+       struct cvmx_pki_clx_start_s cn73xx;
+       struct cvmx_pki_clx_start_s cn78xx;
+       struct cvmx_pki_clx_start_s cn78xxp1;
+       struct cvmx_pki_clx_start_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_start cvmx_pki_clx_start_t;
+
+/**
+ * cvmx_pki_cl#_style#_alg
+ *
+ * This register is inside PKI_CL()_SMEM(). These CSRs are used only by
+ * the PKI parse engine.
+ *
+ * For each legal j, PKI_CL(i)_STYLE(j)_ALG must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_stylex_alg {
+       u64 u64;
+       struct cvmx_pki_clx_stylex_alg_s {
+               u64 reserved_32_63 : 32;
+               u64 tt : 2;
+               u64 apad_nip : 3;
+               u64 qpg_qos : 3;
+               u64 qpg_port_sh : 3;
+               u64 qpg_port_msb : 4;
+               u64 reserved_11_16 : 6;
+               u64 tag_vni : 1;
+               u64 tag_gtp : 1;
+               u64 tag_spi : 1;
+               u64 tag_syn : 1;
+               u64 tag_pctl : 1;
+               u64 tag_vs1 : 1;
+               u64 tag_vs0 : 1;
+               u64 tag_vlan : 1;
+               u64 tag_mpls0 : 1;
+               u64 tag_prt : 1;
+               u64 wqe_vs : 1;
+       } s;
+       struct cvmx_pki_clx_stylex_alg_s cn73xx;
+       struct cvmx_pki_clx_stylex_alg_s cn78xx;
+       struct cvmx_pki_clx_stylex_alg_s cn78xxp1;
+       struct cvmx_pki_clx_stylex_alg_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_stylex_alg cvmx_pki_clx_stylex_alg_t;
+
+/**
+ * cvmx_pki_cl#_style#_cfg
+ *
+ * This register is inside PKI_CL()_SMEM(). These CSRs are used by
+ * the PKI parse engine and other PKI hardware.
+ *
+ * For each legal j, PKI_CL(i)_STYLE(j)_CFG must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_stylex_cfg {
+       u64 u64;
+       struct cvmx_pki_clx_stylex_cfg_s {
+               u64 reserved_31_63 : 33;
+               u64 ip6_udp_opt : 1;
+               u64 lenerr_en : 1;
+               u64 lenerr_eqpad : 1;
+               u64 minmax_sel : 1;
+               u64 maxerr_en : 1;
+               u64 minerr_en : 1;
+               u64 qpg_dis_grptag : 1;
+               u64 fcs_strip : 1;
+               u64 fcs_chk : 1;
+               u64 rawdrp : 1;
+               u64 drop : 1;
+               u64 nodrop : 1;
+               u64 qpg_dis_padd : 1;
+               u64 qpg_dis_grp : 1;
+               u64 qpg_dis_aura : 1;
+               u64 reserved_11_15 : 5;
+               u64 qpg_base : 11;
+       } s;
+       struct cvmx_pki_clx_stylex_cfg_s cn73xx;
+       struct cvmx_pki_clx_stylex_cfg_s cn78xx;
+       struct cvmx_pki_clx_stylex_cfg_s cn78xxp1;
+       struct cvmx_pki_clx_stylex_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_stylex_cfg cvmx_pki_clx_stylex_cfg_t;
+
+/**
+ * cvmx_pki_cl#_style#_cfg2
+ *
+ * This register is inside PKI_CL()_SMEM(). These CSRs are used by
+ * the PKI parse engine and other PKI hardware.
+ *
+ * For each legal j, PKI_CL(i)_STYLE(j)_CFG2 must be configured identically for i=0..1.
+ */
+union cvmx_pki_clx_stylex_cfg2 {
+       u64 u64;
+       struct cvmx_pki_clx_stylex_cfg2_s {
+               u64 reserved_32_63 : 32;
+               u64 tag_inc : 4;
+               u64 reserved_25_27 : 3;
+               u64 tag_masken : 1;
+               u64 tag_src_lg : 1;
+               u64 tag_src_lf : 1;
+               u64 tag_src_le : 1;
+               u64 tag_src_ld : 1;
+               u64 tag_src_lc : 1;
+               u64 tag_src_lb : 1;
+               u64 tag_dst_lg : 1;
+               u64 tag_dst_lf : 1;
+               u64 tag_dst_le : 1;
+               u64 tag_dst_ld : 1;
+               u64 tag_dst_lc : 1;
+               u64 tag_dst_lb : 1;
+               u64 len_lg : 1;
+               u64 len_lf : 1;
+               u64 len_le : 1;
+               u64 len_ld : 1;
+               u64 len_lc : 1;
+               u64 len_lb : 1;
+               u64 csum_lg : 1;
+               u64 csum_lf : 1;
+               u64 csum_le : 1;
+               u64 csum_ld : 1;
+               u64 csum_lc : 1;
+               u64 csum_lb : 1;
+       } s;
+       struct cvmx_pki_clx_stylex_cfg2_s cn73xx;
+       struct cvmx_pki_clx_stylex_cfg2_s cn78xx;
+       struct cvmx_pki_clx_stylex_cfg2_s cn78xxp1;
+       struct cvmx_pki_clx_stylex_cfg2_s cnf75xx;
+};
+
+typedef union cvmx_pki_clx_stylex_cfg2 cvmx_pki_clx_stylex_cfg2_t;
+
+/**
+ * cvmx_pki_clken
+ */
+union cvmx_pki_clken {
+       u64 u64;
+       struct cvmx_pki_clken_s {
+               u64 reserved_1_63 : 63;
+               u64 clken : 1;
+       } s;
+       struct cvmx_pki_clken_s cn73xx;
+       struct cvmx_pki_clken_s cn78xx;
+       struct cvmx_pki_clken_s cn78xxp1;
+       struct cvmx_pki_clken_s cnf75xx;
+};
+
+typedef union cvmx_pki_clken cvmx_pki_clken_t;
+
+/**
+ * cvmx_pki_dstat#_stat0
+ *
+ * This register contains statistics indexed by PKI_QPG_TBLB()[DSTAT_ID].
+ *
+ */
+union cvmx_pki_dstatx_stat0 {
+       u64 u64;
+       struct cvmx_pki_dstatx_stat0_s {
+               u64 reserved_32_63 : 32;
+               u64 pkts : 32;
+       } s;
+       struct cvmx_pki_dstatx_stat0_s cn73xx;
+       struct cvmx_pki_dstatx_stat0_s cn78xx;
+       struct cvmx_pki_dstatx_stat0_s cnf75xx;
+};
+
+typedef union cvmx_pki_dstatx_stat0 cvmx_pki_dstatx_stat0_t;
+
+/**
+ * cvmx_pki_dstat#_stat1
+ *
+ * This register contains statistics indexed by PKI_QPG_TBLB()[DSTAT_ID].
+ *
+ */
+union cvmx_pki_dstatx_stat1 {
+       u64 u64;
+       struct cvmx_pki_dstatx_stat1_s {
+               u64 reserved_40_63 : 24;
+               u64 octs : 40;
+       } s;
+       struct cvmx_pki_dstatx_stat1_s cn73xx;
+       struct cvmx_pki_dstatx_stat1_s cn78xx;
+       struct cvmx_pki_dstatx_stat1_s cnf75xx;
+};
+
+typedef union cvmx_pki_dstatx_stat1 cvmx_pki_dstatx_stat1_t;
+
+/**
+ * cvmx_pki_dstat#_stat2
+ *
+ * This register contains statistics indexed by PKI_QPG_TBLB()[DSTAT_ID].
+ *
+ */
+union cvmx_pki_dstatx_stat2 {
+       u64 u64;
+       struct cvmx_pki_dstatx_stat2_s {
+               u64 reserved_32_63 : 32;
+               u64 err_pkts : 32;
+       } s;
+       struct cvmx_pki_dstatx_stat2_s cn73xx;
+       struct cvmx_pki_dstatx_stat2_s cn78xx;
+       struct cvmx_pki_dstatx_stat2_s cnf75xx;
+};
+
+typedef union cvmx_pki_dstatx_stat2 cvmx_pki_dstatx_stat2_t;
+
+/**
+ * cvmx_pki_dstat#_stat3
+ *
+ * This register contains statistics indexed by PKI_QPG_TBLB()[DSTAT_ID].
+ *
+ */
+union cvmx_pki_dstatx_stat3 {
+       u64 u64;
+       struct cvmx_pki_dstatx_stat3_s {
+               u64 reserved_32_63 : 32;
+               u64 drp_pkts : 32;
+       } s;
+       struct cvmx_pki_dstatx_stat3_s cn73xx;
+       struct cvmx_pki_dstatx_stat3_s cn78xx;
+       struct cvmx_pki_dstatx_stat3_s cnf75xx;
+};
+
+typedef union cvmx_pki_dstatx_stat3 cvmx_pki_dstatx_stat3_t;
+
+/**
+ * cvmx_pki_dstat#_stat4
+ *
+ * This register contains statistics indexed by PKI_QPG_TBLB()[DSTAT_ID].
+ *
+ */
+union cvmx_pki_dstatx_stat4 {
+       u64 u64;
+       struct cvmx_pki_dstatx_stat4_s {
+               u64 reserved_40_63 : 24;
+               u64 drp_octs : 40;
+       } s;
+       struct cvmx_pki_dstatx_stat4_s cn73xx;
+       struct cvmx_pki_dstatx_stat4_s cn78xx;
+       struct cvmx_pki_dstatx_stat4_s cnf75xx;
+};
+
+typedef union cvmx_pki_dstatx_stat4 cvmx_pki_dstatx_stat4_t;
+
+/**
+ * cvmx_pki_ecc_ctl0
+ *
+ * This register allows inserting ECC errors for testing.
+ *
+ */
+union cvmx_pki_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pki_ecc_ctl0_s {
+               u64 reserved_24_63 : 40;
+               u64 ldfif_flip : 2;
+               u64 ldfif_cdis : 1;
+               u64 pbe_flip : 2;
+               u64 pbe_cdis : 1;
+               u64 wadr_flip : 2;
+               u64 wadr_cdis : 1;
+               u64 nxtptag_flip : 2;
+               u64 nxtptag_cdis : 1;
+               u64 curptag_flip : 2;
+               u64 curptag_cdis : 1;
+               u64 nxtblk_flip : 2;
+               u64 nxtblk_cdis : 1;
+               u64 kmem_flip : 2;
+               u64 kmem_cdis : 1;
+               u64 asm_flip : 2;
+               u64 asm_cdis : 1;
+       } s;
+       struct cvmx_pki_ecc_ctl0_s cn73xx;
+       struct cvmx_pki_ecc_ctl0_s cn78xx;
+       struct cvmx_pki_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pki_ecc_ctl0_s cnf75xx;
+};
+
+typedef union cvmx_pki_ecc_ctl0 cvmx_pki_ecc_ctl0_t;
+
+/**
+ * cvmx_pki_ecc_ctl1
+ *
+ * This register allows inserting ECC errors for testing.
+ *
+ */
+union cvmx_pki_ecc_ctl1 {
+       u64 u64;
+       struct cvmx_pki_ecc_ctl1_s {
+               u64 reserved_51_63 : 13;
+               u64 sws_flip : 2;
+               u64 sws_cdis : 1;
+               u64 wqeout_flip : 2;
+               u64 wqeout_cdis : 1;
+               u64 doa_flip : 2;
+               u64 doa_cdis : 1;
+               u64 bpid_flip : 2;
+               u64 bpid_cdis : 1;
+               u64 reserved_30_38 : 9;
+               u64 plc_flip : 2;
+               u64 plc_cdis : 1;
+               u64 pktwq_flip : 2;
+               u64 pktwq_cdis : 1;
+               u64 reserved_21_23 : 3;
+               u64 stylewq2_flip : 2;
+               u64 stylewq2_cdis : 1;
+               u64 tag_flip : 2;
+               u64 tag_cdis : 1;
+               u64 aura_flip : 2;
+               u64 aura_cdis : 1;
+               u64 chan_flip : 2;
+               u64 chan_cdis : 1;
+               u64 pbtag_flip : 2;
+               u64 pbtag_cdis : 1;
+               u64 stylewq_flip : 2;
+               u64 stylewq_cdis : 1;
+               u64 qpg_flip : 2;
+               u64 qpg_cdis : 1;
+       } s;
+       struct cvmx_pki_ecc_ctl1_s cn73xx;
+       struct cvmx_pki_ecc_ctl1_s cn78xx;
+       struct cvmx_pki_ecc_ctl1_cn78xxp1 {
+               u64 reserved_51_63 : 13;
+               u64 sws_flip : 2;
+               u64 sws_cdis : 1;
+               u64 wqeout_flip : 2;
+               u64 wqeout_cdis : 1;
+               u64 doa_flip : 2;
+               u64 doa_cdis : 1;
+               u64 bpid_flip : 2;
+               u64 bpid_cdis : 1;
+               u64 reserved_30_38 : 9;
+               u64 plc_flip : 2;
+               u64 plc_cdis : 1;
+               u64 pktwq_flip : 2;
+               u64 pktwq_cdis : 1;
+               u64 reserved_18_23 : 6;
+               u64 tag_flip : 2;
+               u64 tag_cdis : 1;
+               u64 aura_flip : 2;
+               u64 aura_cdis : 1;
+               u64 chan_flip : 2;
+               u64 chan_cdis : 1;
+               u64 pbtag_flip : 2;
+               u64 pbtag_cdis : 1;
+               u64 stylewq_flip : 2;
+               u64 stylewq_cdis : 1;
+               u64 qpg_flip : 2;
+               u64 qpg_cdis : 1;
+       } cn78xxp1;
+       struct cvmx_pki_ecc_ctl1_s cnf75xx;
+};
+
+typedef union cvmx_pki_ecc_ctl1 cvmx_pki_ecc_ctl1_t;
+
+/**
+ * cvmx_pki_ecc_ctl2
+ *
+ * This register allows inserting ECC errors for testing.
+ *
+ */
+union cvmx_pki_ecc_ctl2 {
+       u64 u64;
+       struct cvmx_pki_ecc_ctl2_s {
+               u64 reserved_3_63 : 61;
+               u64 imem_flip : 2;
+               u64 imem_cdis : 1;
+       } s;
+       struct cvmx_pki_ecc_ctl2_s cn73xx;
+       struct cvmx_pki_ecc_ctl2_s cn78xx;
+       struct cvmx_pki_ecc_ctl2_s cn78xxp1;
+       struct cvmx_pki_ecc_ctl2_s cnf75xx;
+};
+
+typedef union cvmx_pki_ecc_ctl2 cvmx_pki_ecc_ctl2_t;
+
+/**
+ * cvmx_pki_ecc_int0
+ */
+union cvmx_pki_ecc_int0 {
+       u64 u64;
+       struct cvmx_pki_ecc_int0_s {
+               u64 reserved_16_63 : 48;
+               u64 ldfif_dbe : 1;
+               u64 ldfif_sbe : 1;
+               u64 pbe_dbe : 1;
+               u64 pbe_sbe : 1;
+               u64 wadr_dbe : 1;
+               u64 wadr_sbe : 1;
+               u64 nxtptag_dbe : 1;
+               u64 nxtptag_sbe : 1;
+               u64 curptag_dbe : 1;
+               u64 curptag_sbe : 1;
+               u64 nxtblk_dbe : 1;
+               u64 nxtblk_sbe : 1;
+               u64 kmem_dbe : 1;
+               u64 kmem_sbe : 1;
+               u64 asm_dbe : 1;
+               u64 asm_sbe : 1;
+       } s;
+       struct cvmx_pki_ecc_int0_s cn73xx;
+       struct cvmx_pki_ecc_int0_s cn78xx;
+       struct cvmx_pki_ecc_int0_s cn78xxp1;
+       struct cvmx_pki_ecc_int0_s cnf75xx;
+};
+
+typedef union cvmx_pki_ecc_int0 cvmx_pki_ecc_int0_t;
+
+/**
+ * cvmx_pki_ecc_int1
+ */
+union cvmx_pki_ecc_int1 {
+       u64 u64;
+       struct cvmx_pki_ecc_int1_s {
+               u64 reserved_34_63 : 30;
+               u64 sws_dbe : 1;
+               u64 sws_sbe : 1;
+               u64 wqeout_dbe : 1;
+               u64 wqeout_sbe : 1;
+               u64 doa_dbe : 1;
+               u64 doa_sbe : 1;
+               u64 bpid_dbe : 1;
+               u64 bpid_sbe : 1;
+               u64 reserved_20_25 : 6;
+               u64 plc_dbe : 1;
+               u64 plc_sbe : 1;
+               u64 pktwq_dbe : 1;
+               u64 pktwq_sbe : 1;
+               u64 reserved_12_15 : 4;
+               u64 tag_dbe : 1;
+               u64 tag_sbe : 1;
+               u64 aura_dbe : 1;
+               u64 aura_sbe : 1;
+               u64 chan_dbe : 1;
+               u64 chan_sbe : 1;
+               u64 pbtag_dbe : 1;
+               u64 pbtag_sbe : 1;
+               u64 stylewq_dbe : 1;
+               u64 stylewq_sbe : 1;
+               u64 qpg_dbe : 1;
+               u64 qpg_sbe : 1;
+       } s;
+       struct cvmx_pki_ecc_int1_s cn73xx;
+       struct cvmx_pki_ecc_int1_s cn78xx;
+       struct cvmx_pki_ecc_int1_s cn78xxp1;
+       struct cvmx_pki_ecc_int1_s cnf75xx;
+};
+
+typedef union cvmx_pki_ecc_int1 cvmx_pki_ecc_int1_t;
+
+/**
+ * cvmx_pki_ecc_int2
+ */
+union cvmx_pki_ecc_int2 {
+       u64 u64;
+       struct cvmx_pki_ecc_int2_s {
+               u64 reserved_2_63 : 62;
+               u64 imem_dbe : 1;
+               u64 imem_sbe : 1;
+       } s;
+       struct cvmx_pki_ecc_int2_s cn73xx;
+       struct cvmx_pki_ecc_int2_s cn78xx;
+       struct cvmx_pki_ecc_int2_s cn78xxp1;
+       struct cvmx_pki_ecc_int2_s cnf75xx;
+};
+
+typedef union cvmx_pki_ecc_int2 cvmx_pki_ecc_int2_t;
+
+/**
+ * cvmx_pki_frm_len_chk#
+ */
+union cvmx_pki_frm_len_chkx {
+       u64 u64;
+       struct cvmx_pki_frm_len_chkx_s {
+               u64 reserved_32_63 : 32;
+               u64 maxlen : 16;
+               u64 minlen : 16;
+       } s;
+       struct cvmx_pki_frm_len_chkx_s cn73xx;
+       struct cvmx_pki_frm_len_chkx_s cn78xx;
+       struct cvmx_pki_frm_len_chkx_s cn78xxp1;
+       struct cvmx_pki_frm_len_chkx_s cnf75xx;
+};
+
+typedef union cvmx_pki_frm_len_chkx cvmx_pki_frm_len_chkx_t;
+
+/**
+ * cvmx_pki_gbl_pen
+ *
+ * This register contains global configuration information that applies to all
+ * pkinds. The values are opaque to PKI HW.
+ *
+ * This is intended for communication between the higher-level software SDK, and the
+ * SDK code that loads PKI_IMEM() with the parse engine code. This allows the loader to
+ * appropriately select the parse engine code with only those features required, so that
+ * performance will be optimized.
+ */
+union cvmx_pki_gbl_pen {
+       u64 u64;
+       struct cvmx_pki_gbl_pen_s {
+               u64 reserved_10_63 : 54;
+               u64 virt_pen : 1;
+               u64 clg_pen : 1;
+               u64 cl2_pen : 1;
+               u64 l4_pen : 1;
+               u64 il3_pen : 1;
+               u64 l3_pen : 1;
+               u64 mpls_pen : 1;
+               u64 fulc_pen : 1;
+               u64 dsa_pen : 1;
+               u64 hg_pen : 1;
+       } s;
+       struct cvmx_pki_gbl_pen_s cn73xx;
+       struct cvmx_pki_gbl_pen_s cn78xx;
+       struct cvmx_pki_gbl_pen_s cn78xxp1;
+       struct cvmx_pki_gbl_pen_s cnf75xx;
+};
+
+typedef union cvmx_pki_gbl_pen cvmx_pki_gbl_pen_t;
+
+/**
+ * cvmx_pki_gen_int
+ */
+union cvmx_pki_gen_int {
+       u64 u64;
+       struct cvmx_pki_gen_int_s {
+               u64 reserved_10_63 : 54;
+               u64 bufs_oflow : 1;
+               u64 pkt_size_oflow : 1;
+               u64 x2p_req_ofl : 1;
+               u64 drp_noavail : 1;
+               u64 dat : 1;
+               u64 eop : 1;
+               u64 sop : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } s;
+       struct cvmx_pki_gen_int_s cn73xx;
+       struct cvmx_pki_gen_int_s cn78xx;
+       struct cvmx_pki_gen_int_cn78xxp1 {
+               u64 reserved_8_63 : 56;
+               u64 x2p_req_ofl : 1;
+               u64 drp_noavail : 1;
+               u64 dat : 1;
+               u64 eop : 1;
+               u64 sop : 1;
+               u64 bckprs : 1;
+               u64 crcerr : 1;
+               u64 pktdrp : 1;
+       } cn78xxp1;
+       struct cvmx_pki_gen_int_s cnf75xx;
+};
+
+typedef union cvmx_pki_gen_int cvmx_pki_gen_int_t;
+
+/**
+ * cvmx_pki_icg#_cfg
+ *
+ * This register configures the cluster group.
+ *
+ */
+union cvmx_pki_icgx_cfg {
+       u64 u64;
+       struct cvmx_pki_icgx_cfg_s {
+               u64 reserved_53_63 : 11;
+               u64 maxipe_use : 5;
+               u64 reserved_36_47 : 12;
+               u64 clusters : 4;
+               u64 reserved_27_31 : 5;
+               u64 release_rqd : 1;
+               u64 mlo : 1;
+               u64 pena : 1;
+               u64 timer : 12;
+               u64 delay : 12;
+       } s;
+       struct cvmx_pki_icgx_cfg_s cn73xx;
+       struct cvmx_pki_icgx_cfg_s cn78xx;
+       struct cvmx_pki_icgx_cfg_s cn78xxp1;
+       struct cvmx_pki_icgx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pki_icgx_cfg cvmx_pki_icgx_cfg_t;
+
+/**
+ * cvmx_pki_imem#
+ */
+union cvmx_pki_imemx {
+       u64 u64;
+       struct cvmx_pki_imemx_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_pki_imemx_s cn73xx;
+       struct cvmx_pki_imemx_s cn78xx;
+       struct cvmx_pki_imemx_s cn78xxp1;
+       struct cvmx_pki_imemx_s cnf75xx;
+};
+
+typedef union cvmx_pki_imemx cvmx_pki_imemx_t;
+
+/**
+ * cvmx_pki_ltype#_map
+ *
+ * This register is the layer type map, indexed by PKI_LTYPE_E.
+ *
+ */
+union cvmx_pki_ltypex_map {
+       u64 u64;
+       struct cvmx_pki_ltypex_map_s {
+               u64 reserved_3_63 : 61;
+               u64 beltype : 3;
+       } s;
+       struct cvmx_pki_ltypex_map_s cn73xx;
+       struct cvmx_pki_ltypex_map_s cn78xx;
+       struct cvmx_pki_ltypex_map_s cn78xxp1;
+       struct cvmx_pki_ltypex_map_s cnf75xx;
+};
+
+typedef union cvmx_pki_ltypex_map cvmx_pki_ltypex_map_t;
+
+/**
+ * cvmx_pki_pbe_eco
+ */
+union cvmx_pki_pbe_eco {
+       u64 u64;
+       struct cvmx_pki_pbe_eco_s {
+               u64 reserved_32_63 : 32;
+               u64 eco_rw : 32;
+       } s;
+       struct cvmx_pki_pbe_eco_s cn73xx;
+       struct cvmx_pki_pbe_eco_s cn78xx;
+       struct cvmx_pki_pbe_eco_s cnf75xx;
+};
+
+typedef union cvmx_pki_pbe_eco cvmx_pki_pbe_eco_t;
+
+/**
+ * cvmx_pki_pcam_lookup
+ *
+ * For diagnostic use only, this register performs a PCAM lookup against the provided
+ * cluster and PCAM instance and loads results into PKI_PCAM_RESULT.
+ */
+union cvmx_pki_pcam_lookup {
+       u64 u64;
+       struct cvmx_pki_pcam_lookup_s {
+               u64 reserved_54_63 : 10;
+               u64 cl : 2;
+               u64 reserved_49_51 : 3;
+               u64 pcam : 1;
+               u64 term : 8;
+               u64 style : 8;
+               u64 data : 32;
+       } s;
+       struct cvmx_pki_pcam_lookup_s cn73xx;
+       struct cvmx_pki_pcam_lookup_s cn78xx;
+       struct cvmx_pki_pcam_lookup_s cn78xxp1;
+       struct cvmx_pki_pcam_lookup_s cnf75xx;
+};
+
+typedef union cvmx_pki_pcam_lookup cvmx_pki_pcam_lookup_t;
+
+/**
+ * cvmx_pki_pcam_result
+ *
+ * For diagnostic use only, this register returns PCAM results for the most recent write to
+ * PKI_PCAM_LOOKUP. The read will stall until the lookup is completed.
+ * PKI_CL()_ECC_CTL[PCAM_EN] must be clear before accessing this register. Read stall
+ * is implemented by delaying the PKI_PCAM_LOOKUP write acknowledge until the PCAM is
+ * free and the lookup can be issued.
+ */
+union cvmx_pki_pcam_result {
+       u64 u64;
+       struct cvmx_pki_pcam_result_s {
+               u64 reserved_41_63 : 23;
+               u64 match : 1;
+               u64 entry : 8;
+               u64 result : 32;
+       } s;
+       struct cvmx_pki_pcam_result_cn73xx {
+               u64 conflict : 1;
+               u64 reserved_41_62 : 22;
+               u64 match : 1;
+               u64 entry : 8;
+               u64 result : 32;
+       } cn73xx;
+       struct cvmx_pki_pcam_result_cn73xx cn78xx;
+       struct cvmx_pki_pcam_result_cn73xx cn78xxp1;
+       struct cvmx_pki_pcam_result_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pki_pcam_result cvmx_pki_pcam_result_t;
+
+/**
+ * cvmx_pki_pfe_diag
+ */
+union cvmx_pki_pfe_diag {
+       u64 u64;
+       struct cvmx_pki_pfe_diag_s {
+               u64 reserved_1_63 : 63;
+               u64 bad_rid : 1;
+       } s;
+       struct cvmx_pki_pfe_diag_s cn73xx;
+       struct cvmx_pki_pfe_diag_s cn78xx;
+       struct cvmx_pki_pfe_diag_s cn78xxp1;
+       struct cvmx_pki_pfe_diag_s cnf75xx;
+};
+
+typedef union cvmx_pki_pfe_diag cvmx_pki_pfe_diag_t;
+
+/**
+ * cvmx_pki_pfe_eco
+ */
+union cvmx_pki_pfe_eco {
+       u64 u64;
+       struct cvmx_pki_pfe_eco_s {
+               u64 reserved_32_63 : 32;
+               u64 eco_rw : 32;
+       } s;
+       struct cvmx_pki_pfe_eco_s cn73xx;
+       struct cvmx_pki_pfe_eco_s cn78xx;
+       struct cvmx_pki_pfe_eco_s cnf75xx;
+};
+
+typedef union cvmx_pki_pfe_eco cvmx_pki_pfe_eco_t;
+
+/**
+ * cvmx_pki_pix_clken
+ */
+union cvmx_pki_pix_clken {
+       u64 u64;
+       struct cvmx_pki_pix_clken_s {
+               u64 reserved_17_63 : 47;
+               u64 mech : 1;
+               u64 reserved_4_15 : 12;
+               u64 cls : 4;
+       } s;
+       struct cvmx_pki_pix_clken_s cn73xx;
+       struct cvmx_pki_pix_clken_s cn78xx;
+       struct cvmx_pki_pix_clken_s cn78xxp1;
+       struct cvmx_pki_pix_clken_s cnf75xx;
+};
+
+typedef union cvmx_pki_pix_clken cvmx_pki_pix_clken_t;
+
+/**
+ * cvmx_pki_pix_diag
+ */
+union cvmx_pki_pix_diag {
+       u64 u64;
+       struct cvmx_pki_pix_diag_s {
+               u64 reserved_4_63 : 60;
+               u64 nosched : 4;
+       } s;
+       struct cvmx_pki_pix_diag_s cn73xx;
+       struct cvmx_pki_pix_diag_s cn78xx;
+       struct cvmx_pki_pix_diag_s cn78xxp1;
+       struct cvmx_pki_pix_diag_s cnf75xx;
+};
+
+typedef union cvmx_pki_pix_diag cvmx_pki_pix_diag_t;
+
+/**
+ * cvmx_pki_pix_eco
+ */
+union cvmx_pki_pix_eco {
+       u64 u64;
+       struct cvmx_pki_pix_eco_s {
+               u64 reserved_32_63 : 32;
+               u64 eco_rw : 32;
+       } s;
+       struct cvmx_pki_pix_eco_s cn73xx;
+       struct cvmx_pki_pix_eco_s cn78xx;
+       struct cvmx_pki_pix_eco_s cnf75xx;
+};
+
+typedef union cvmx_pki_pix_eco cvmx_pki_pix_eco_t;
+
+/**
+ * cvmx_pki_pkind#_icgsel
+ */
+union cvmx_pki_pkindx_icgsel {
+       u64 u64;
+       struct cvmx_pki_pkindx_icgsel_s {
+               u64 reserved_2_63 : 62;
+               u64 icg : 2;
+       } s;
+       struct cvmx_pki_pkindx_icgsel_s cn73xx;
+       struct cvmx_pki_pkindx_icgsel_s cn78xx;
+       struct cvmx_pki_pkindx_icgsel_s cn78xxp1;
+       struct cvmx_pki_pkindx_icgsel_s cnf75xx;
+};
+
+typedef union cvmx_pki_pkindx_icgsel cvmx_pki_pkindx_icgsel_t;
+
+/**
+ * cvmx_pki_pknd#_inb_stat0
+ *
+ * This register counts inbound statistics, indexed by pkind.
+ *
+ */
+union cvmx_pki_pkndx_inb_stat0 {
+       u64 u64;
+       struct cvmx_pki_pkndx_inb_stat0_s {
+               u64 reserved_48_63 : 16;
+               u64 pkts : 48;
+       } s;
+       struct cvmx_pki_pkndx_inb_stat0_s cn73xx;
+       struct cvmx_pki_pkndx_inb_stat0_s cn78xx;
+       struct cvmx_pki_pkndx_inb_stat0_s cn78xxp1;
+       struct cvmx_pki_pkndx_inb_stat0_s cnf75xx;
+};
+
+typedef union cvmx_pki_pkndx_inb_stat0 cvmx_pki_pkndx_inb_stat0_t;
+
+/**
+ * cvmx_pki_pknd#_inb_stat1
+ *
+ * This register counts inbound statistics, indexed by pkind.
+ *
+ */
+union cvmx_pki_pkndx_inb_stat1 {
+       u64 u64;
+       struct cvmx_pki_pkndx_inb_stat1_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_pki_pkndx_inb_stat1_s cn73xx;
+       struct cvmx_pki_pkndx_inb_stat1_s cn78xx;
+       struct cvmx_pki_pkndx_inb_stat1_s cn78xxp1;
+       struct cvmx_pki_pkndx_inb_stat1_s cnf75xx;
+};
+
+typedef union cvmx_pki_pkndx_inb_stat1 cvmx_pki_pkndx_inb_stat1_t;
+
+/**
+ * cvmx_pki_pknd#_inb_stat2
+ *
+ * This register counts inbound statistics, indexed by pkind.
+ *
+ */
+union cvmx_pki_pkndx_inb_stat2 {
+       u64 u64;
+       struct cvmx_pki_pkndx_inb_stat2_s {
+               u64 reserved_48_63 : 16;
+               u64 errs : 48;
+       } s;
+       struct cvmx_pki_pkndx_inb_stat2_s cn73xx;
+       struct cvmx_pki_pkndx_inb_stat2_s cn78xx;
+       struct cvmx_pki_pkndx_inb_stat2_s cn78xxp1;
+       struct cvmx_pki_pkndx_inb_stat2_s cnf75xx;
+};
+
+typedef union cvmx_pki_pkndx_inb_stat2 cvmx_pki_pkndx_inb_stat2_t;
+
+/**
+ * cvmx_pki_pkt_err
+ */
+union cvmx_pki_pkt_err {
+       u64 u64;
+       struct cvmx_pki_pkt_err_s {
+               u64 reserved_7_63 : 57;
+               u64 reasm : 7;
+       } s;
+       struct cvmx_pki_pkt_err_s cn73xx;
+       struct cvmx_pki_pkt_err_s cn78xx;
+       struct cvmx_pki_pkt_err_s cn78xxp1;
+       struct cvmx_pki_pkt_err_s cnf75xx;
+};
+
+typedef union cvmx_pki_pkt_err cvmx_pki_pkt_err_t;
+
+/**
+ * cvmx_pki_ptag_avail
+ *
+ * For diagnostic use only.
+ *
+ */
+union cvmx_pki_ptag_avail {
+       u64 u64;
+       struct cvmx_pki_ptag_avail_s {
+               u64 reserved_8_63 : 56;
+               u64 avail : 8;
+       } s;
+       struct cvmx_pki_ptag_avail_s cn73xx;
+       struct cvmx_pki_ptag_avail_s cn78xx;
+       struct cvmx_pki_ptag_avail_s cnf75xx;
+};
+
+typedef union cvmx_pki_ptag_avail cvmx_pki_ptag_avail_t;
+
+/**
+ * cvmx_pki_qpg_tbl#
+ *
+ * These registers are used by PKI BE to indirectly calculate the Portadd/Aura/Group
+ * from the Diffsrv, HiGig or VLAN information as described in QPG. See also
+ * PKI_QPG_TBLB().
+ */
+union cvmx_pki_qpg_tblx {
+       u64 u64;
+       struct cvmx_pki_qpg_tblx_s {
+               u64 reserved_60_63 : 4;
+               u64 padd : 12;
+               u64 grptag_ok : 3;
+               u64 reserved_42_44 : 3;
+               u64 grp_ok : 10;
+               u64 grptag_bad : 3;
+               u64 reserved_26_28 : 3;
+               u64 grp_bad : 10;
+               u64 reserved_12_15 : 4;
+               u64 aura_node : 2;
+               u64 laura : 10;
+       } s;
+       struct cvmx_pki_qpg_tblx_s cn73xx;
+       struct cvmx_pki_qpg_tblx_s cn78xx;
+       struct cvmx_pki_qpg_tblx_s cn78xxp1;
+       struct cvmx_pki_qpg_tblx_s cnf75xx;
+};
+
+typedef union cvmx_pki_qpg_tblx cvmx_pki_qpg_tblx_t;
+
+/**
+ * cvmx_pki_qpg_tblb#
+ *
+ * This register configures the QPG table. See also PKI_QPG_TBL().
+ *
+ */
+union cvmx_pki_qpg_tblbx {
+       u64 u64;
+       struct cvmx_pki_qpg_tblbx_s {
+               u64 reserved_10_63 : 54;
+               u64 dstat_id : 10;
+       } s;
+       struct cvmx_pki_qpg_tblbx_s cn73xx;
+       struct cvmx_pki_qpg_tblbx_s cn78xx;
+       struct cvmx_pki_qpg_tblbx_s cnf75xx;
+};
+
+typedef union cvmx_pki_qpg_tblbx cvmx_pki_qpg_tblbx_t;
+
+/**
+ * cvmx_pki_reasm_sop#
+ */
+union cvmx_pki_reasm_sopx {
+       u64 u64;
+       struct cvmx_pki_reasm_sopx_s {
+               u64 sop : 64;
+       } s;
+       struct cvmx_pki_reasm_sopx_s cn73xx;
+       struct cvmx_pki_reasm_sopx_s cn78xx;
+       struct cvmx_pki_reasm_sopx_s cn78xxp1;
+       struct cvmx_pki_reasm_sopx_s cnf75xx;
+};
+
+typedef union cvmx_pki_reasm_sopx cvmx_pki_reasm_sopx_t;
+
+/**
+ * cvmx_pki_req_wgt
+ *
+ * This register controls the round-robin weights between each PKI requestor. For diagnostic
+ * tuning only.
+ */
+union cvmx_pki_req_wgt {
+       u64 u64;
+       struct cvmx_pki_req_wgt_s {
+               u64 reserved_36_63 : 28;
+               u64 wgt8 : 4;
+               u64 wgt7 : 4;
+               u64 wgt6 : 4;
+               u64 wgt5 : 4;
+               u64 wgt4 : 4;
+               u64 wgt3 : 4;
+               u64 wgt2 : 4;
+               u64 wgt1 : 4;
+               u64 wgt0 : 4;
+       } s;
+       struct cvmx_pki_req_wgt_s cn73xx;
+       struct cvmx_pki_req_wgt_s cn78xx;
+       struct cvmx_pki_req_wgt_s cn78xxp1;
+       struct cvmx_pki_req_wgt_s cnf75xx;
+};
+
+typedef union cvmx_pki_req_wgt cvmx_pki_req_wgt_t;
+
+/**
+ * cvmx_pki_sft_rst
+ */
+union cvmx_pki_sft_rst {
+       u64 u64;
+       struct cvmx_pki_sft_rst_s {
+               u64 busy : 1;
+               u64 reserved_33_62 : 30;
+               u64 active : 1;
+               u64 reserved_1_31 : 31;
+               u64 rst : 1;
+       } s;
+       struct cvmx_pki_sft_rst_s cn73xx;
+       struct cvmx_pki_sft_rst_s cn78xx;
+       struct cvmx_pki_sft_rst_s cn78xxp1;
+       struct cvmx_pki_sft_rst_s cnf75xx;
+};
+
+typedef union cvmx_pki_sft_rst cvmx_pki_sft_rst_t;
+
+/**
+ * cvmx_pki_stat#_hist0
+ */
+union cvmx_pki_statx_hist0 {
+       u64 u64;
+       struct cvmx_pki_statx_hist0_s {
+               u64 reserved_48_63 : 16;
+               u64 h1to63 : 48;
+       } s;
+       struct cvmx_pki_statx_hist0_s cn73xx;
+       struct cvmx_pki_statx_hist0_s cn78xx;
+       struct cvmx_pki_statx_hist0_s cn78xxp1;
+       struct cvmx_pki_statx_hist0_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_hist0 cvmx_pki_statx_hist0_t;
+
+/**
+ * cvmx_pki_stat#_hist1
+ */
+union cvmx_pki_statx_hist1 {
+       u64 u64;
+       struct cvmx_pki_statx_hist1_s {
+               u64 reserved_48_63 : 16;
+               u64 h64to127 : 48;
+       } s;
+       struct cvmx_pki_statx_hist1_s cn73xx;
+       struct cvmx_pki_statx_hist1_s cn78xx;
+       struct cvmx_pki_statx_hist1_s cn78xxp1;
+       struct cvmx_pki_statx_hist1_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_hist1 cvmx_pki_statx_hist1_t;
+
+/**
+ * cvmx_pki_stat#_hist2
+ */
+union cvmx_pki_statx_hist2 {
+       u64 u64;
+       struct cvmx_pki_statx_hist2_s {
+               u64 reserved_48_63 : 16;
+               u64 h128to255 : 48;
+       } s;
+       struct cvmx_pki_statx_hist2_s cn73xx;
+       struct cvmx_pki_statx_hist2_s cn78xx;
+       struct cvmx_pki_statx_hist2_s cn78xxp1;
+       struct cvmx_pki_statx_hist2_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_hist2 cvmx_pki_statx_hist2_t;
+
+/**
+ * cvmx_pki_stat#_hist3
+ */
+union cvmx_pki_statx_hist3 {
+       u64 u64;
+       struct cvmx_pki_statx_hist3_s {
+               u64 reserved_48_63 : 16;
+               u64 h256to511 : 48;
+       } s;
+       struct cvmx_pki_statx_hist3_s cn73xx;
+       struct cvmx_pki_statx_hist3_s cn78xx;
+       struct cvmx_pki_statx_hist3_s cn78xxp1;
+       struct cvmx_pki_statx_hist3_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_hist3 cvmx_pki_statx_hist3_t;
+
+/**
+ * cvmx_pki_stat#_hist4
+ */
+union cvmx_pki_statx_hist4 {
+       u64 u64;
+       struct cvmx_pki_statx_hist4_s {
+               u64 reserved_48_63 : 16;
+               u64 h512to1023 : 48;
+       } s;
+       struct cvmx_pki_statx_hist4_s cn73xx;
+       struct cvmx_pki_statx_hist4_s cn78xx;
+       struct cvmx_pki_statx_hist4_s cn78xxp1;
+       struct cvmx_pki_statx_hist4_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_hist4 cvmx_pki_statx_hist4_t;
+
+/**
+ * cvmx_pki_stat#_hist5
+ */
+union cvmx_pki_statx_hist5 {
+       u64 u64;
+       struct cvmx_pki_statx_hist5_s {
+               u64 reserved_48_63 : 16;
+               u64 h1024to1518 : 48;
+       } s;
+       struct cvmx_pki_statx_hist5_s cn73xx;
+       struct cvmx_pki_statx_hist5_s cn78xx;
+       struct cvmx_pki_statx_hist5_s cn78xxp1;
+       struct cvmx_pki_statx_hist5_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_hist5 cvmx_pki_statx_hist5_t;
+
+/**
+ * cvmx_pki_stat#_hist6
+ */
+union cvmx_pki_statx_hist6 {
+       u64 u64;
+       struct cvmx_pki_statx_hist6_s {
+               u64 reserved_48_63 : 16;
+               u64 h1519 : 48;
+       } s;
+       struct cvmx_pki_statx_hist6_s cn73xx;
+       struct cvmx_pki_statx_hist6_s cn78xx;
+       struct cvmx_pki_statx_hist6_s cn78xxp1;
+       struct cvmx_pki_statx_hist6_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_hist6 cvmx_pki_statx_hist6_t;
+
+/**
+ * cvmx_pki_stat#_stat0
+ */
+union cvmx_pki_statx_stat0 {
+       u64 u64;
+       struct cvmx_pki_statx_stat0_s {
+               u64 reserved_48_63 : 16;
+               u64 pkts : 48;
+       } s;
+       struct cvmx_pki_statx_stat0_s cn73xx;
+       struct cvmx_pki_statx_stat0_s cn78xx;
+       struct cvmx_pki_statx_stat0_s cn78xxp1;
+       struct cvmx_pki_statx_stat0_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat0 cvmx_pki_statx_stat0_t;
+
+/**
+ * cvmx_pki_stat#_stat1
+ */
+union cvmx_pki_statx_stat1 {
+       u64 u64;
+       struct cvmx_pki_statx_stat1_s {
+               u64 reserved_48_63 : 16;
+               u64 octs : 48;
+       } s;
+       struct cvmx_pki_statx_stat1_s cn73xx;
+       struct cvmx_pki_statx_stat1_s cn78xx;
+       struct cvmx_pki_statx_stat1_s cn78xxp1;
+       struct cvmx_pki_statx_stat1_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat1 cvmx_pki_statx_stat1_t;
+
+/**
+ * cvmx_pki_stat#_stat10
+ */
+union cvmx_pki_statx_stat10 {
+       u64 u64;
+       struct cvmx_pki_statx_stat10_s {
+               u64 reserved_48_63 : 16;
+               u64 jabber : 48;
+       } s;
+       struct cvmx_pki_statx_stat10_s cn73xx;
+       struct cvmx_pki_statx_stat10_s cn78xx;
+       struct cvmx_pki_statx_stat10_s cn78xxp1;
+       struct cvmx_pki_statx_stat10_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat10 cvmx_pki_statx_stat10_t;
+
+/**
+ * cvmx_pki_stat#_stat11
+ */
+union cvmx_pki_statx_stat11 {
+       u64 u64;
+       struct cvmx_pki_statx_stat11_s {
+               u64 reserved_48_63 : 16;
+               u64 oversz : 48;
+       } s;
+       struct cvmx_pki_statx_stat11_s cn73xx;
+       struct cvmx_pki_statx_stat11_s cn78xx;
+       struct cvmx_pki_statx_stat11_s cn78xxp1;
+       struct cvmx_pki_statx_stat11_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat11 cvmx_pki_statx_stat11_t;
+
+/**
+ * cvmx_pki_stat#_stat12
+ */
+union cvmx_pki_statx_stat12 {
+       u64 u64;
+       struct cvmx_pki_statx_stat12_s {
+               u64 reserved_48_63 : 16;
+               u64 l2err : 48;
+       } s;
+       struct cvmx_pki_statx_stat12_s cn73xx;
+       struct cvmx_pki_statx_stat12_s cn78xx;
+       struct cvmx_pki_statx_stat12_s cn78xxp1;
+       struct cvmx_pki_statx_stat12_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat12 cvmx_pki_statx_stat12_t;
+
+/**
+ * cvmx_pki_stat#_stat13
+ */
+union cvmx_pki_statx_stat13 {
+       u64 u64;
+       struct cvmx_pki_statx_stat13_s {
+               u64 reserved_48_63 : 16;
+               u64 spec : 48;
+       } s;
+       struct cvmx_pki_statx_stat13_s cn73xx;
+       struct cvmx_pki_statx_stat13_s cn78xx;
+       struct cvmx_pki_statx_stat13_s cn78xxp1;
+       struct cvmx_pki_statx_stat13_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat13 cvmx_pki_statx_stat13_t;
+
+/**
+ * cvmx_pki_stat#_stat14
+ */
+union cvmx_pki_statx_stat14 {
+       u64 u64;
+       struct cvmx_pki_statx_stat14_s {
+               u64 reserved_48_63 : 16;
+               u64 drp_bcast : 48;
+       } s;
+       struct cvmx_pki_statx_stat14_s cn73xx;
+       struct cvmx_pki_statx_stat14_s cn78xx;
+       struct cvmx_pki_statx_stat14_s cn78xxp1;
+       struct cvmx_pki_statx_stat14_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat14 cvmx_pki_statx_stat14_t;
+
+/**
+ * cvmx_pki_stat#_stat15
+ */
+union cvmx_pki_statx_stat15 {
+       u64 u64;
+       struct cvmx_pki_statx_stat15_s {
+               u64 reserved_48_63 : 16;
+               u64 drp_mcast : 48;
+       } s;
+       struct cvmx_pki_statx_stat15_s cn73xx;
+       struct cvmx_pki_statx_stat15_s cn78xx;
+       struct cvmx_pki_statx_stat15_s cn78xxp1;
+       struct cvmx_pki_statx_stat15_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat15 cvmx_pki_statx_stat15_t;
+
+/**
+ * cvmx_pki_stat#_stat16
+ */
+union cvmx_pki_statx_stat16 {
+       u64 u64;
+       struct cvmx_pki_statx_stat16_s {
+               u64 reserved_48_63 : 16;
+               u64 drp_bcast : 48;
+       } s;
+       struct cvmx_pki_statx_stat16_s cn73xx;
+       struct cvmx_pki_statx_stat16_s cn78xx;
+       struct cvmx_pki_statx_stat16_s cn78xxp1;
+       struct cvmx_pki_statx_stat16_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat16 cvmx_pki_statx_stat16_t;
+
+/**
+ * cvmx_pki_stat#_stat17
+ */
+union cvmx_pki_statx_stat17 {
+       u64 u64;
+       struct cvmx_pki_statx_stat17_s {
+               u64 reserved_48_63 : 16;
+               u64 drp_mcast : 48;
+       } s;
+       struct cvmx_pki_statx_stat17_s cn73xx;
+       struct cvmx_pki_statx_stat17_s cn78xx;
+       struct cvmx_pki_statx_stat17_s cn78xxp1;
+       struct cvmx_pki_statx_stat17_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat17 cvmx_pki_statx_stat17_t;
+
+/**
+ * cvmx_pki_stat#_stat18
+ */
+union cvmx_pki_statx_stat18 {
+       u64 u64;
+       struct cvmx_pki_statx_stat18_s {
+               u64 reserved_48_63 : 16;
+               u64 drp_spec : 48;
+       } s;
+       struct cvmx_pki_statx_stat18_s cn73xx;
+       struct cvmx_pki_statx_stat18_s cn78xx;
+       struct cvmx_pki_statx_stat18_s cn78xxp1;
+       struct cvmx_pki_statx_stat18_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat18 cvmx_pki_statx_stat18_t;
+
+/**
+ * cvmx_pki_stat#_stat2
+ */
+union cvmx_pki_statx_stat2 {
+       u64 u64;
+       struct cvmx_pki_statx_stat2_s {
+               u64 reserved_48_63 : 16;
+               u64 raw : 48;
+       } s;
+       struct cvmx_pki_statx_stat2_s cn73xx;
+       struct cvmx_pki_statx_stat2_s cn78xx;
+       struct cvmx_pki_statx_stat2_s cn78xxp1;
+       struct cvmx_pki_statx_stat2_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat2 cvmx_pki_statx_stat2_t;
+
+/**
+ * cvmx_pki_stat#_stat3
+ */
+union cvmx_pki_statx_stat3 {
+       u64 u64;
+       struct cvmx_pki_statx_stat3_s {
+               u64 reserved_48_63 : 16;
+               u64 drp_pkts : 48;
+       } s;
+       struct cvmx_pki_statx_stat3_s cn73xx;
+       struct cvmx_pki_statx_stat3_s cn78xx;
+       struct cvmx_pki_statx_stat3_s cn78xxp1;
+       struct cvmx_pki_statx_stat3_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat3 cvmx_pki_statx_stat3_t;
+
+/**
+ * cvmx_pki_stat#_stat4
+ */
+union cvmx_pki_statx_stat4 {
+       u64 u64;
+       struct cvmx_pki_statx_stat4_s {
+               u64 reserved_48_63 : 16;
+               u64 drp_octs : 48;
+       } s;
+       struct cvmx_pki_statx_stat4_s cn73xx;
+       struct cvmx_pki_statx_stat4_s cn78xx;
+       struct cvmx_pki_statx_stat4_s cn78xxp1;
+       struct cvmx_pki_statx_stat4_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat4 cvmx_pki_statx_stat4_t;
+
+/**
+ * cvmx_pki_stat#_stat5
+ */
+union cvmx_pki_statx_stat5 {
+       u64 u64;
+       struct cvmx_pki_statx_stat5_s {
+               u64 reserved_48_63 : 16;
+               u64 bcast : 48;
+       } s;
+       struct cvmx_pki_statx_stat5_s cn73xx;
+       struct cvmx_pki_statx_stat5_s cn78xx;
+       struct cvmx_pki_statx_stat5_s cn78xxp1;
+       struct cvmx_pki_statx_stat5_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat5 cvmx_pki_statx_stat5_t;
+
+/**
+ * cvmx_pki_stat#_stat6
+ */
+union cvmx_pki_statx_stat6 {
+       u64 u64;
+       struct cvmx_pki_statx_stat6_s {
+               u64 reserved_48_63 : 16;
+               u64 mcast : 48;
+       } s;
+       struct cvmx_pki_statx_stat6_s cn73xx;
+       struct cvmx_pki_statx_stat6_s cn78xx;
+       struct cvmx_pki_statx_stat6_s cn78xxp1;
+       struct cvmx_pki_statx_stat6_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat6 cvmx_pki_statx_stat6_t;
+
+/**
+ * cvmx_pki_stat#_stat7
+ */
+union cvmx_pki_statx_stat7 {
+       u64 u64;
+       struct cvmx_pki_statx_stat7_s {
+               u64 reserved_48_63 : 16;
+               u64 fcs : 48;
+       } s;
+       struct cvmx_pki_statx_stat7_s cn73xx;
+       struct cvmx_pki_statx_stat7_s cn78xx;
+       struct cvmx_pki_statx_stat7_s cn78xxp1;
+       struct cvmx_pki_statx_stat7_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat7 cvmx_pki_statx_stat7_t;
+
+/**
+ * cvmx_pki_stat#_stat8
+ */
+union cvmx_pki_statx_stat8 {
+       u64 u64;
+       struct cvmx_pki_statx_stat8_s {
+               u64 reserved_48_63 : 16;
+               u64 frag : 48;
+       } s;
+       struct cvmx_pki_statx_stat8_s cn73xx;
+       struct cvmx_pki_statx_stat8_s cn78xx;
+       struct cvmx_pki_statx_stat8_s cn78xxp1;
+       struct cvmx_pki_statx_stat8_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat8 cvmx_pki_statx_stat8_t;
+
+/**
+ * cvmx_pki_stat#_stat9
+ */
+union cvmx_pki_statx_stat9 {
+       u64 u64;
+       struct cvmx_pki_statx_stat9_s {
+               u64 reserved_48_63 : 16;
+               u64 undersz : 48;
+       } s;
+       struct cvmx_pki_statx_stat9_s cn73xx;
+       struct cvmx_pki_statx_stat9_s cn78xx;
+       struct cvmx_pki_statx_stat9_s cn78xxp1;
+       struct cvmx_pki_statx_stat9_s cnf75xx;
+};
+
+typedef union cvmx_pki_statx_stat9 cvmx_pki_statx_stat9_t;
+
+/**
+ * cvmx_pki_stat_ctl
+ *
+ * This register controls how the PKI statistics counters are handled.
+ *
+ */
+union cvmx_pki_stat_ctl {
+       u64 u64;
+       struct cvmx_pki_stat_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 mode : 2;
+       } s;
+       struct cvmx_pki_stat_ctl_s cn73xx;
+       struct cvmx_pki_stat_ctl_s cn78xx;
+       struct cvmx_pki_stat_ctl_s cn78xxp1;
+       struct cvmx_pki_stat_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pki_stat_ctl cvmx_pki_stat_ctl_t;
+
+/**
+ * cvmx_pki_style#_buf
+ *
+ * This register configures the PKI BE skip amounts and other information.
+ * It is indexed by final style, PKI_WQE_S[STYLE]<5:0>.
+ */
+union cvmx_pki_stylex_buf {
+       u64 u64;
+       struct cvmx_pki_stylex_buf_s {
+               u64 reserved_33_63 : 31;
+               u64 pkt_lend : 1;
+               u64 wqe_hsz : 2;
+               u64 wqe_skip : 2;
+               u64 first_skip : 6;
+               u64 later_skip : 6;
+               u64 opc_mode : 2;
+               u64 dis_wq_dat : 1;
+               u64 mb_size : 13;
+       } s;
+       struct cvmx_pki_stylex_buf_s cn73xx;
+       struct cvmx_pki_stylex_buf_s cn78xx;
+       struct cvmx_pki_stylex_buf_s cn78xxp1;
+       struct cvmx_pki_stylex_buf_s cnf75xx;
+};
+
+typedef union cvmx_pki_stylex_buf cvmx_pki_stylex_buf_t;
+
+/**
+ * cvmx_pki_style#_tag_mask
+ *
+ * This register configures the PKI BE tag algorithm.
+ * It is indexed by final style, PKI_WQE_S[STYLE]<5:0>.
+ */
+union cvmx_pki_stylex_tag_mask {
+       u64 u64;
+       struct cvmx_pki_stylex_tag_mask_s {
+               u64 reserved_16_63 : 48;
+               u64 mask : 16;
+       } s;
+       struct cvmx_pki_stylex_tag_mask_s cn73xx;
+       struct cvmx_pki_stylex_tag_mask_s cn78xx;
+       struct cvmx_pki_stylex_tag_mask_s cn78xxp1;
+       struct cvmx_pki_stylex_tag_mask_s cnf75xx;
+};
+
+typedef union cvmx_pki_stylex_tag_mask cvmx_pki_stylex_tag_mask_t;
+
+/**
+ * cvmx_pki_style#_tag_sel
+ *
+ * This register configures the PKI BE tag algorithm.
+ * It is indexed by final style, PKI_WQE_S[STYLE]<5:0>.
+ */
+union cvmx_pki_stylex_tag_sel {
+       u64 u64;
+       struct cvmx_pki_stylex_tag_sel_s {
+               u64 reserved_27_63 : 37;
+               u64 tag_idx3 : 3;
+               u64 reserved_19_23 : 5;
+               u64 tag_idx2 : 3;
+               u64 reserved_11_15 : 5;
+               u64 tag_idx1 : 3;
+               u64 reserved_3_7 : 5;
+               u64 tag_idx0 : 3;
+       } s;
+       struct cvmx_pki_stylex_tag_sel_s cn73xx;
+       struct cvmx_pki_stylex_tag_sel_s cn78xx;
+       struct cvmx_pki_stylex_tag_sel_s cn78xxp1;
+       struct cvmx_pki_stylex_tag_sel_s cnf75xx;
+};
+
+typedef union cvmx_pki_stylex_tag_sel cvmx_pki_stylex_tag_sel_t;
+
+/**
+ * cvmx_pki_style#_wq2
+ *
+ * This register configures the PKI BE WQE generation.
+ * It is indexed by final style, PKI_WQE_S[STYLE]<5:0>.
+ */
+union cvmx_pki_stylex_wq2 {
+       u64 u64;
+       struct cvmx_pki_stylex_wq2_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_pki_stylex_wq2_s cn73xx;
+       struct cvmx_pki_stylex_wq2_s cn78xx;
+       struct cvmx_pki_stylex_wq2_s cn78xxp1;
+       struct cvmx_pki_stylex_wq2_s cnf75xx;
+};
+
+typedef union cvmx_pki_stylex_wq2 cvmx_pki_stylex_wq2_t;
+
+/**
+ * cvmx_pki_style#_wq4
+ *
+ * This register configures the PKI BE WQE generation.
+ * It is indexed by final style, PKI_WQE_S[STYLE]<5:0>.
+ */
+union cvmx_pki_stylex_wq4 {
+       u64 u64;
+       struct cvmx_pki_stylex_wq4_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_pki_stylex_wq4_s cn73xx;
+       struct cvmx_pki_stylex_wq4_s cn78xx;
+       struct cvmx_pki_stylex_wq4_s cn78xxp1;
+       struct cvmx_pki_stylex_wq4_s cnf75xx;
+};
+
+typedef union cvmx_pki_stylex_wq4 cvmx_pki_stylex_wq4_t;
+
+/**
+ * cvmx_pki_tag_inc#_ctl
+ */
+union cvmx_pki_tag_incx_ctl {
+       u64 u64;
+       struct cvmx_pki_tag_incx_ctl_s {
+               u64 reserved_12_63 : 52;
+               u64 ptr_sel : 4;
+               u64 offset : 8;
+       } s;
+       struct cvmx_pki_tag_incx_ctl_s cn73xx;
+       struct cvmx_pki_tag_incx_ctl_s cn78xx;
+       struct cvmx_pki_tag_incx_ctl_s cn78xxp1;
+       struct cvmx_pki_tag_incx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pki_tag_incx_ctl cvmx_pki_tag_incx_ctl_t;
+
+/**
+ * cvmx_pki_tag_inc#_mask
+ */
+union cvmx_pki_tag_incx_mask {
+       u64 u64;
+       struct cvmx_pki_tag_incx_mask_s {
+               u64 en : 64;
+       } s;
+       struct cvmx_pki_tag_incx_mask_s cn73xx;
+       struct cvmx_pki_tag_incx_mask_s cn78xx;
+       struct cvmx_pki_tag_incx_mask_s cn78xxp1;
+       struct cvmx_pki_tag_incx_mask_s cnf75xx;
+};
+
+typedef union cvmx_pki_tag_incx_mask cvmx_pki_tag_incx_mask_t;
+
+/**
+ * cvmx_pki_tag_secret
+ *
+ * The source and destination initial values (IVs) in tag generation provide a mechanism for
+ * seeding with a random initialization value to reduce cache collision attacks.
+ */
+union cvmx_pki_tag_secret {
+       u64 u64;
+       struct cvmx_pki_tag_secret_s {
+               u64 dst6 : 16;
+               u64 src6 : 16;
+               u64 dst : 16;
+               u64 src : 16;
+       } s;
+       struct cvmx_pki_tag_secret_s cn73xx;
+       struct cvmx_pki_tag_secret_s cn78xx;
+       struct cvmx_pki_tag_secret_s cn78xxp1;
+       struct cvmx_pki_tag_secret_s cnf75xx;
+};
+
+typedef union cvmx_pki_tag_secret cvmx_pki_tag_secret_t;
+
+/**
+ * cvmx_pki_x2p_req_ofl
+ */
+union cvmx_pki_x2p_req_ofl {
+       u64 u64;
+       struct cvmx_pki_x2p_req_ofl_s {
+               u64 reserved_4_63 : 60;
+               u64 x2p_did : 4;
+       } s;
+       struct cvmx_pki_x2p_req_ofl_s cn73xx;
+       struct cvmx_pki_x2p_req_ofl_s cn78xx;
+       struct cvmx_pki_x2p_req_ofl_s cn78xxp1;
+       struct cvmx_pki_x2p_req_ofl_s cnf75xx;
+};
+
+typedef union cvmx_pki_x2p_req_ofl cvmx_pki_x2p_req_ofl_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pki-resources.h b/arch/mips/mach-octeon/include/mach/cvmx-pki-resources.h
new file mode 100644 (file)
index 0000000..79b99b0
--- /dev/null
@@ -0,0 +1,157 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Resource management for PKI resources.
+ */
+
+#ifndef __CVMX_PKI_RESOURCES_H__
+#define __CVMX_PKI_RESOURCES_H__
+
+/**
+ * This function allocates/reserves a style from pool of global styles per node.
+ * @param node  node to allocate style from.
+ * @param style         style to allocate, if -1 it will be allocated
+                first available style from style resource. If index is positive
+                number and in range, it will try to allocate specified style.
+ * @return      style number on success, -1 on failure.
+ */
+int cvmx_pki_style_alloc(int node, int style);
+
+/**
+ * This function allocates/reserves a cluster group from per node
+   cluster group resources.
+ * @param node         node to allocate cluster group from.
+   @param cl_grp       cluster group to allocate/reserve, if -1 ,
+                       allocate any available cluster group.
+ * @return             cluster group number or -1 on failure
+ */
+int cvmx_pki_cluster_grp_alloc(int node, int cl_grp);
+
+/**
+ * This function allocates/reserves a cluster from per node
+   cluster resources.
+ * @param node         node to allocate cluster group from.
+   @param cluster_mask mask of clusters  to allocate/reserve, if -1 ,
+                       allocate any available clusters.
+ * @param num_clusters number of clusters that will be allocated
+ */
+int cvmx_pki_cluster_alloc(int node, int num_clusters, u64 *cluster_mask);
+
+/**
+ * This function allocates/reserves a pcam entry from node
+ * @param node         node to allocate pcam entry from.
+   @param index        index of pacm entry (0-191), if -1 ,
+                       allocate any available pcam entry.
+ * @param bank         pcam bank where to allocate/reserve pcan entry from
+ * @param cluster_mask  mask of clusters from which pcam entry is needed.
+ * @return             pcam entry of -1 on failure
+ */
+int cvmx_pki_pcam_entry_alloc(int node, int index, int bank, u64 cluster_mask);
+
+/**
+ * This function allocates/reserves QPG table entries per node.
+ * @param node         node number.
+ * @param base_offset  base_offset in qpg table. If -1, first available
+                       qpg base_offset will be allocated. If base_offset is positive
+                       number and in range, it will try to allocate specified base_offset.
+   @param count                number of consecutive qpg entries to allocate. They will be consecutive
+                       from base offset.
+ * @return             qpg table base offset number on success, -1 on failure.
+ */
+int cvmx_pki_qpg_entry_alloc(int node, int base_offset, int count);
+
+/**
+ * This function frees a style from pool of global styles per node.
+ * @param node  node to free style from.
+ * @param style         style to free
+ * @return      0 on success, -1 on failure.
+ */
+int cvmx_pki_style_free(int node, int style);
+
+/**
+ * This function frees a cluster group from per node
+   cluster group resources.
+ * @param node         node to free cluster group from.
+   @param cl_grp       cluster group to free
+ * @return             0 on success or -1 on failure
+ */
+int cvmx_pki_cluster_grp_free(int node, int cl_grp);
+
+/**
+ * This function frees QPG table entries per node.
+ * @param node         node number.
+ * @param base_offset  base_offset in qpg table. If -1, first available
+ *                     qpg base_offset will be allocated. If base_offset is positive
+ *                     number and in range, it will try to allocate specified base_offset.
+ * @param count                number of consecutive qpg entries to allocate. They will be consecutive
+ *                     from base offset.
+ * @return             qpg table base offset number on success, -1 on failure.
+ */
+int cvmx_pki_qpg_entry_free(int node, int base_offset, int count);
+
+/**
+ * This function frees  clusters  from per node
+   clusters resources.
+ * @param node         node to free clusters from.
+ * @param cluster_mask  mask of clusters need freeing
+ * @return             0 on success or -1 on failure
+ */
+int cvmx_pki_cluster_free(int node, u64 cluster_mask);
+
+/**
+ * This function frees a pcam entry from node
+ * @param node         node to allocate pcam entry from.
+   @param index        index of pacm entry (0-191) needs to be freed.
+ * @param bank         pcam bank where to free pcam entry from
+ * @param cluster_mask  mask of clusters from which pcam entry is freed.
+ * @return             0 on success OR -1 on failure
+ */
+int cvmx_pki_pcam_entry_free(int node, int index, int bank, u64 cluster_mask);
+
+/**
+ * This function allocates/reserves a bpid from pool of global bpid per node.
+ * @param node node to allocate bpid from.
+ * @param bpid bpid  to allocate, if -1 it will be allocated
+ *             first available boid from bpid resource. If index is positive
+ *             number and in range, it will try to allocate specified bpid.
+ * @return     bpid number on success,
+ *             -1 on alloc failure.
+ *             -2 on resource already reserved.
+ */
+int cvmx_pki_bpid_alloc(int node, int bpid);
+
+/**
+ * This function frees a bpid from pool of global bpid per node.
+ * @param node  node to free bpid from.
+ * @param bpid  bpid to free
+ * @return      0 on success, -1 on failure or
+ */
+int cvmx_pki_bpid_free(int node, int bpid);
+
+/**
+ * This function frees all the PKI software resources
+ * (clusters, styles, qpg_entry, pcam_entry etc) for the specified node
+ */
+
+/**
+ * This function allocates/reserves an index from pool of global MTAG-IDX per node.
+ * @param node node to allocate index from.
+ * @param idx  index  to allocate, if -1 it will be allocated
+ * @return     MTAG index number on success,
+ *             -1 on alloc failure.
+ *             -2 on resource already reserved.
+ */
+int cvmx_pki_mtag_idx_alloc(int node, int idx);
+
+/**
+ * This function frees an index from pool of global MTAG-IDX per node.
+ * @param node  node to free bpid from.
+ * @param bpid  bpid to free
+ * @return      0 on success, -1 on failure or
+ */
+int cvmx_pki_mtag_idx_free(int node, int idx);
+
+void __cvmx_pki_global_rsrc_free(int node);
+
+#endif /*  __CVM_PKI_RESOURCES_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pki.h b/arch/mips/mach-octeon/include/mach/cvmx-pki.h
new file mode 100644 (file)
index 0000000..c1feb55
--- /dev/null
@@ -0,0 +1,970 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Packet Input Data unit.
+ */
+
+#ifndef __CVMX_PKI_H__
+#define __CVMX_PKI_H__
+
+#include "cvmx-fpa3.h"
+#include "cvmx-helper-util.h"
+#include "cvmx-helper-cfg.h"
+#include "cvmx-error.h"
+
+/* PKI AURA and BPID count are equal to FPA AURA count */
+#define CVMX_PKI_NUM_AURA             (cvmx_fpa3_num_auras())
+#define CVMX_PKI_NUM_BPID             (cvmx_fpa3_num_auras())
+#define CVMX_PKI_NUM_SSO_GROUP        (cvmx_sso_num_xgrp())
+#define CVMX_PKI_NUM_CLUSTER_GROUP_MAX 1
+#define CVMX_PKI_NUM_CLUSTER_GROUP     (cvmx_pki_num_cl_grp())
+#define CVMX_PKI_NUM_CLUSTER          (cvmx_pki_num_clusters())
+
+/* FIXME: Reduce some of these values, convert to routines XXX */
+#define CVMX_PKI_NUM_CHANNEL       4096
+#define CVMX_PKI_NUM_PKIND         64
+#define CVMX_PKI_NUM_INTERNAL_STYLE 256
+#define CVMX_PKI_NUM_FINAL_STYLE    64
+#define CVMX_PKI_NUM_QPG_ENTRY     2048
+#define CVMX_PKI_NUM_MTAG_IDX      (32 / 4) /* 32 registers grouped by 4*/
+#define CVMX_PKI_NUM_LTYPE         32
+#define CVMX_PKI_NUM_PCAM_BANK     2
+#define CVMX_PKI_NUM_PCAM_ENTRY            192
+#define CVMX_PKI_NUM_FRAME_CHECK    2
+#define CVMX_PKI_NUM_BELTYPE       32
+#define CVMX_PKI_MAX_FRAME_SIZE            65535
+#define CVMX_PKI_FIND_AVAL_ENTRY    (-1)
+#define CVMX_PKI_CLUSTER_ALL       0xf
+
+#ifdef CVMX_SUPPORT_SEPARATE_CLUSTER_CONFIG
+#define CVMX_PKI_TOTAL_PCAM_ENTRY                                                                  \
+       ((CVMX_PKI_NUM_CLUSTER) * (CVMX_PKI_NUM_PCAM_BANK) * (CVMX_PKI_NUM_PCAM_ENTRY))
+#else
+#define CVMX_PKI_TOTAL_PCAM_ENTRY (CVMX_PKI_NUM_PCAM_BANK * CVMX_PKI_NUM_PCAM_ENTRY)
+#endif
+
+static inline unsigned int cvmx_pki_num_clusters(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX) || OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return 2;
+       return 4;
+}
+
+static inline unsigned int cvmx_pki_num_cl_grp(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX) || OCTEON_IS_MODEL(OCTEON_CNF75XX) ||
+           OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 1;
+       return 0;
+}
+
+enum cvmx_pki_pkind_parse_mode {
+       CVMX_PKI_PARSE_LA_TO_LG = 0,  /* Parse LA(L2) to LG */
+       CVMX_PKI_PARSE_LB_TO_LG = 1,  /* Parse LB(custom) to LG */
+       CVMX_PKI_PARSE_LC_TO_LG = 3,  /* Parse LC(L3) to LG */
+       CVMX_PKI_PARSE_LG = 0x3f,     /* Parse LG */
+       CVMX_PKI_PARSE_NOTHING = 0x7f /* Parse nothing */
+};
+
+enum cvmx_pki_parse_mode_chg {
+       CVMX_PKI_PARSE_NO_CHG = 0x0,
+       CVMX_PKI_PARSE_SKIP_TO_LB = 0x1,
+       CVMX_PKI_PARSE_SKIP_TO_LC = 0x3,
+       CVMX_PKI_PARSE_SKIP_TO_LD = 0x7,
+       CVMX_PKI_PARSE_SKIP_TO_LG = 0x3f,
+       CVMX_PKI_PARSE_SKIP_ALL = 0x7f,
+};
+
+enum cvmx_pki_l2_len_mode { PKI_L2_LENCHK_EQUAL_GREATER = 0, PKI_L2_LENCHK_EQUAL_ONLY };
+
+enum cvmx_pki_cache_mode {
+       CVMX_PKI_OPC_MODE_STT = 0LL,      /* All blocks write through DRAM,*/
+       CVMX_PKI_OPC_MODE_STF = 1LL,      /* All blocks into L2 */
+       CVMX_PKI_OPC_MODE_STF1_STT = 2LL, /* 1st block L2, rest DRAM */
+       CVMX_PKI_OPC_MODE_STF2_STT = 3LL  /* 1st, 2nd blocks L2, rest DRAM */
+};
+
+/**
+ * Tag type definitions
+ */
+enum cvmx_sso_tag_type {
+       CVMX_SSO_TAG_TYPE_ORDERED = 0L,
+       CVMX_SSO_TAG_TYPE_ATOMIC = 1L,
+       CVMX_SSO_TAG_TYPE_UNTAGGED = 2L,
+       CVMX_SSO_TAG_TYPE_EMPTY = 3L
+};
+
+enum cvmx_pki_qpg_qos {
+       CVMX_PKI_QPG_QOS_NONE = 0,
+       CVMX_PKI_QPG_QOS_VLAN,
+       CVMX_PKI_QPG_QOS_MPLS,
+       CVMX_PKI_QPG_QOS_DSA_SRC,
+       CVMX_PKI_QPG_QOS_DIFFSERV,
+       CVMX_PKI_QPG_QOS_HIGIG,
+};
+
+enum cvmx_pki_wqe_vlan { CVMX_PKI_USE_FIRST_VLAN = 0, CVMX_PKI_USE_SECOND_VLAN };
+
+/**
+ * Controls how the PKI statistics counters are handled
+ * The PKI_STAT*_X registers can be indexed either by port kind (pkind), or
+ * final style. (Does not apply to the PKI_STAT_INB* registers.)
+ *    0 = X represents the packet’s pkind
+ *    1 = X represents the low 6-bits of packet’s final style
+ */
+enum cvmx_pki_stats_mode { CVMX_PKI_STAT_MODE_PKIND, CVMX_PKI_STAT_MODE_STYLE };
+
+enum cvmx_pki_fpa_wait { CVMX_PKI_DROP_PKT, CVMX_PKI_WAIT_PKT };
+
+#define PKI_BELTYPE_E__NONE_M 0x0
+#define PKI_BELTYPE_E__MISC_M 0x1
+#define PKI_BELTYPE_E__IP4_M  0x2
+#define PKI_BELTYPE_E__IP6_M  0x3
+#define PKI_BELTYPE_E__TCP_M  0x4
+#define PKI_BELTYPE_E__UDP_M  0x5
+#define PKI_BELTYPE_E__SCTP_M 0x6
+#define PKI_BELTYPE_E__SNAP_M 0x7
+
+/* PKI_BELTYPE_E_t */
+enum cvmx_pki_beltype {
+       CVMX_PKI_BELTYPE_NONE = PKI_BELTYPE_E__NONE_M,
+       CVMX_PKI_BELTYPE_MISC = PKI_BELTYPE_E__MISC_M,
+       CVMX_PKI_BELTYPE_IP4 = PKI_BELTYPE_E__IP4_M,
+       CVMX_PKI_BELTYPE_IP6 = PKI_BELTYPE_E__IP6_M,
+       CVMX_PKI_BELTYPE_TCP = PKI_BELTYPE_E__TCP_M,
+       CVMX_PKI_BELTYPE_UDP = PKI_BELTYPE_E__UDP_M,
+       CVMX_PKI_BELTYPE_SCTP = PKI_BELTYPE_E__SCTP_M,
+       CVMX_PKI_BELTYPE_SNAP = PKI_BELTYPE_E__SNAP_M,
+       CVMX_PKI_BELTYPE_MAX = CVMX_PKI_BELTYPE_SNAP
+};
+
+struct cvmx_pki_frame_len {
+       u16 maxlen;
+       u16 minlen;
+};
+
+struct cvmx_pki_tag_fields {
+       u64 layer_g_src : 1;
+       u64 layer_f_src : 1;
+       u64 layer_e_src : 1;
+       u64 layer_d_src : 1;
+       u64 layer_c_src : 1;
+       u64 layer_b_src : 1;
+       u64 layer_g_dst : 1;
+       u64 layer_f_dst : 1;
+       u64 layer_e_dst : 1;
+       u64 layer_d_dst : 1;
+       u64 layer_c_dst : 1;
+       u64 layer_b_dst : 1;
+       u64 input_port : 1;
+       u64 mpls_label : 1;
+       u64 first_vlan : 1;
+       u64 second_vlan : 1;
+       u64 ip_prot_nexthdr : 1;
+       u64 tag_sync : 1;
+       u64 tag_spi : 1;
+       u64 tag_gtp : 1;
+       u64 tag_vni : 1;
+};
+
+struct cvmx_pki_pkind_parse {
+       u64 mpls_en : 1;
+       u64 inst_hdr : 1;
+       u64 lg_custom : 1;
+       u64 fulc_en : 1;
+       u64 dsa_en : 1;
+       u64 hg2_en : 1;
+       u64 hg_en : 1;
+};
+
+struct cvmx_pki_pool_config {
+       int pool_num;
+       cvmx_fpa3_pool_t pool;
+       u64 buffer_size;
+       u64 buffer_count;
+};
+
+struct cvmx_pki_qpg_config {
+       int qpg_base;
+       int port_add;
+       int aura_num;
+       int grp_ok;
+       int grp_bad;
+       int grptag_ok;
+       int grptag_bad;
+};
+
+struct cvmx_pki_aura_config {
+       int aura_num;
+       int pool_num;
+       cvmx_fpa3_pool_t pool;
+       cvmx_fpa3_gaura_t aura;
+       int buffer_count;
+};
+
+struct cvmx_pki_cluster_grp_config {
+       int grp_num;
+       u64 cluster_mask; /* Bit mask of cluster assigned to this cluster group */
+};
+
+struct cvmx_pki_sso_grp_config {
+       int group;
+       int priority;
+       int weight;
+       int affinity;
+       u64 core_mask;
+       u8 core_mask_set;
+};
+
+/* This is per style structure for configuring port parameters,
+ * it is kind of of profile which can be assigned to any port.
+ * If multiple ports are assigned same style be aware that modifying
+ * that style will modify the respective parameters for all the ports
+ * which are using this style
+ */
+struct cvmx_pki_style_parm {
+       bool ip6_udp_opt;
+       bool lenerr_en;
+       bool maxerr_en;
+       bool minerr_en;
+       u8 lenerr_eqpad;
+       u8 minmax_sel;
+       bool qpg_dis_grptag;
+       bool fcs_strip;
+       bool fcs_chk;
+       bool rawdrp;
+       bool force_drop;
+       bool nodrop;
+       bool qpg_dis_padd;
+       bool qpg_dis_grp;
+       bool qpg_dis_aura;
+       u16 qpg_base;
+       enum cvmx_pki_qpg_qos qpg_qos;
+       u8 qpg_port_sh;
+       u8 qpg_port_msb;
+       u8 apad_nip;
+       u8 wqe_vs;
+       enum cvmx_sso_tag_type tag_type;
+       bool pkt_lend;
+       u8 wqe_hsz;
+       u16 wqe_skip;
+       u16 first_skip;
+       u16 later_skip;
+       enum cvmx_pki_cache_mode cache_mode;
+       u8 dis_wq_dat;
+       u64 mbuff_size;
+       bool len_lg;
+       bool len_lf;
+       bool len_le;
+       bool len_ld;
+       bool len_lc;
+       bool len_lb;
+       bool csum_lg;
+       bool csum_lf;
+       bool csum_le;
+       bool csum_ld;
+       bool csum_lc;
+       bool csum_lb;
+};
+
+/* This is per style structure for configuring port's tag configuration,
+ * it is kind of of profile which can be assigned to any port.
+ * If multiple ports are assigned same style be aware that modiying that style
+ * will modify the respective parameters for all the ports which are
+ * using this style */
+enum cvmx_pki_mtag_ptrsel {
+       CVMX_PKI_MTAG_PTRSEL_SOP = 0,
+       CVMX_PKI_MTAG_PTRSEL_LA = 8,
+       CVMX_PKI_MTAG_PTRSEL_LB = 9,
+       CVMX_PKI_MTAG_PTRSEL_LC = 10,
+       CVMX_PKI_MTAG_PTRSEL_LD = 11,
+       CVMX_PKI_MTAG_PTRSEL_LE = 12,
+       CVMX_PKI_MTAG_PTRSEL_LF = 13,
+       CVMX_PKI_MTAG_PTRSEL_LG = 14,
+       CVMX_PKI_MTAG_PTRSEL_VL = 15,
+};
+
+struct cvmx_pki_mask_tag {
+       bool enable;
+       int base;   /* CVMX_PKI_MTAG_PTRSEL_XXX */
+       int offset; /* Offset from base. */
+       u64 val;    /* Bitmask:
+               1 = enable, 0 = disabled for each byte in the 64-byte array.*/
+};
+
+struct cvmx_pki_style_tag_cfg {
+       struct cvmx_pki_tag_fields tag_fields;
+       struct cvmx_pki_mask_tag mask_tag[4];
+};
+
+struct cvmx_pki_style_config {
+       struct cvmx_pki_style_parm parm_cfg;
+       struct cvmx_pki_style_tag_cfg tag_cfg;
+};
+
+struct cvmx_pki_pkind_config {
+       u8 cluster_grp;
+       bool fcs_pres;
+       struct cvmx_pki_pkind_parse parse_en;
+       enum cvmx_pki_pkind_parse_mode initial_parse_mode;
+       u8 fcs_skip;
+       u8 inst_skip;
+       int initial_style;
+       bool custom_l2_hdr;
+       u8 l2_scan_offset;
+       u64 lg_scan_offset;
+};
+
+struct cvmx_pki_port_config {
+       struct cvmx_pki_pkind_config pkind_cfg;
+       struct cvmx_pki_style_config style_cfg;
+};
+
+struct cvmx_pki_global_parse {
+       u64 virt_pen : 1;
+       u64 clg_pen : 1;
+       u64 cl2_pen : 1;
+       u64 l4_pen : 1;
+       u64 il3_pen : 1;
+       u64 l3_pen : 1;
+       u64 mpls_pen : 1;
+       u64 fulc_pen : 1;
+       u64 dsa_pen : 1;
+       u64 hg_pen : 1;
+};
+
+struct cvmx_pki_tag_sec {
+       u16 dst6;
+       u16 src6;
+       u16 dst;
+       u16 src;
+};
+
+struct cvmx_pki_global_config {
+       u64 cluster_mask[CVMX_PKI_NUM_CLUSTER_GROUP_MAX];
+       enum cvmx_pki_stats_mode stat_mode;
+       enum cvmx_pki_fpa_wait fpa_wait;
+       struct cvmx_pki_global_parse gbl_pen;
+       struct cvmx_pki_tag_sec tag_secret;
+       struct cvmx_pki_frame_len frm_len[CVMX_PKI_NUM_FRAME_CHECK];
+       enum cvmx_pki_beltype ltype_map[CVMX_PKI_NUM_BELTYPE];
+       int pki_enable;
+};
+
+#define CVMX_PKI_PCAM_TERM_E_NONE_M     0x0
+#define CVMX_PKI_PCAM_TERM_E_L2_CUSTOM_M 0x2
+#define CVMX_PKI_PCAM_TERM_E_HIGIGD_M   0x4
+#define CVMX_PKI_PCAM_TERM_E_HIGIG_M    0x5
+#define CVMX_PKI_PCAM_TERM_E_SMACH_M    0x8
+#define CVMX_PKI_PCAM_TERM_E_SMACL_M    0x9
+#define CVMX_PKI_PCAM_TERM_E_DMACH_M    0xA
+#define CVMX_PKI_PCAM_TERM_E_DMACL_M    0xB
+#define CVMX_PKI_PCAM_TERM_E_GLORT_M    0x12
+#define CVMX_PKI_PCAM_TERM_E_DSA_M      0x13
+#define CVMX_PKI_PCAM_TERM_E_ETHTYPE0_M         0x18
+#define CVMX_PKI_PCAM_TERM_E_ETHTYPE1_M         0x19
+#define CVMX_PKI_PCAM_TERM_E_ETHTYPE2_M         0x1A
+#define CVMX_PKI_PCAM_TERM_E_ETHTYPE3_M         0x1B
+#define CVMX_PKI_PCAM_TERM_E_MPLS0_M    0x1E
+#define CVMX_PKI_PCAM_TERM_E_L3_SIPHH_M         0x1F
+#define CVMX_PKI_PCAM_TERM_E_L3_SIPMH_M         0x20
+#define CVMX_PKI_PCAM_TERM_E_L3_SIPML_M         0x21
+#define CVMX_PKI_PCAM_TERM_E_L3_SIPLL_M         0x22
+#define CVMX_PKI_PCAM_TERM_E_L3_FLAGS_M         0x23
+#define CVMX_PKI_PCAM_TERM_E_L3_DIPHH_M         0x24
+#define CVMX_PKI_PCAM_TERM_E_L3_DIPMH_M         0x25
+#define CVMX_PKI_PCAM_TERM_E_L3_DIPML_M         0x26
+#define CVMX_PKI_PCAM_TERM_E_L3_DIPLL_M         0x27
+#define CVMX_PKI_PCAM_TERM_E_LD_VNI_M   0x28
+#define CVMX_PKI_PCAM_TERM_E_IL3_FLAGS_M 0x2B
+#define CVMX_PKI_PCAM_TERM_E_LF_SPI_M   0x2E
+#define CVMX_PKI_PCAM_TERM_E_L4_SPORT_M         0x2f
+#define CVMX_PKI_PCAM_TERM_E_L4_PORT_M  0x30
+#define CVMX_PKI_PCAM_TERM_E_LG_CUSTOM_M 0x39
+
+enum cvmx_pki_term {
+       CVMX_PKI_PCAM_TERM_NONE = CVMX_PKI_PCAM_TERM_E_NONE_M,
+       CVMX_PKI_PCAM_TERM_L2_CUSTOM = CVMX_PKI_PCAM_TERM_E_L2_CUSTOM_M,
+       CVMX_PKI_PCAM_TERM_HIGIGD = CVMX_PKI_PCAM_TERM_E_HIGIGD_M,
+       CVMX_PKI_PCAM_TERM_HIGIG = CVMX_PKI_PCAM_TERM_E_HIGIG_M,
+       CVMX_PKI_PCAM_TERM_SMACH = CVMX_PKI_PCAM_TERM_E_SMACH_M,
+       CVMX_PKI_PCAM_TERM_SMACL = CVMX_PKI_PCAM_TERM_E_SMACL_M,
+       CVMX_PKI_PCAM_TERM_DMACH = CVMX_PKI_PCAM_TERM_E_DMACH_M,
+       CVMX_PKI_PCAM_TERM_DMACL = CVMX_PKI_PCAM_TERM_E_DMACL_M,
+       CVMX_PKI_PCAM_TERM_GLORT = CVMX_PKI_PCAM_TERM_E_GLORT_M,
+       CVMX_PKI_PCAM_TERM_DSA = CVMX_PKI_PCAM_TERM_E_DSA_M,
+       CVMX_PKI_PCAM_TERM_ETHTYPE0 = CVMX_PKI_PCAM_TERM_E_ETHTYPE0_M,
+       CVMX_PKI_PCAM_TERM_ETHTYPE1 = CVMX_PKI_PCAM_TERM_E_ETHTYPE1_M,
+       CVMX_PKI_PCAM_TERM_ETHTYPE2 = CVMX_PKI_PCAM_TERM_E_ETHTYPE2_M,
+       CVMX_PKI_PCAM_TERM_ETHTYPE3 = CVMX_PKI_PCAM_TERM_E_ETHTYPE3_M,
+       CVMX_PKI_PCAM_TERM_MPLS0 = CVMX_PKI_PCAM_TERM_E_MPLS0_M,
+       CVMX_PKI_PCAM_TERM_L3_SIPHH = CVMX_PKI_PCAM_TERM_E_L3_SIPHH_M,
+       CVMX_PKI_PCAM_TERM_L3_SIPMH = CVMX_PKI_PCAM_TERM_E_L3_SIPMH_M,
+       CVMX_PKI_PCAM_TERM_L3_SIPML = CVMX_PKI_PCAM_TERM_E_L3_SIPML_M,
+       CVMX_PKI_PCAM_TERM_L3_SIPLL = CVMX_PKI_PCAM_TERM_E_L3_SIPLL_M,
+       CVMX_PKI_PCAM_TERM_L3_FLAGS = CVMX_PKI_PCAM_TERM_E_L3_FLAGS_M,
+       CVMX_PKI_PCAM_TERM_L3_DIPHH = CVMX_PKI_PCAM_TERM_E_L3_DIPHH_M,
+       CVMX_PKI_PCAM_TERM_L3_DIPMH = CVMX_PKI_PCAM_TERM_E_L3_DIPMH_M,
+       CVMX_PKI_PCAM_TERM_L3_DIPML = CVMX_PKI_PCAM_TERM_E_L3_DIPML_M,
+       CVMX_PKI_PCAM_TERM_L3_DIPLL = CVMX_PKI_PCAM_TERM_E_L3_DIPLL_M,
+       CVMX_PKI_PCAM_TERM_LD_VNI = CVMX_PKI_PCAM_TERM_E_LD_VNI_M,
+       CVMX_PKI_PCAM_TERM_IL3_FLAGS = CVMX_PKI_PCAM_TERM_E_IL3_FLAGS_M,
+       CVMX_PKI_PCAM_TERM_LF_SPI = CVMX_PKI_PCAM_TERM_E_LF_SPI_M,
+       CVMX_PKI_PCAM_TERM_L4_PORT = CVMX_PKI_PCAM_TERM_E_L4_PORT_M,
+       CVMX_PKI_PCAM_TERM_L4_SPORT = CVMX_PKI_PCAM_TERM_E_L4_SPORT_M,
+       CVMX_PKI_PCAM_TERM_LG_CUSTOM = CVMX_PKI_PCAM_TERM_E_LG_CUSTOM_M
+};
+
+#define CVMX_PKI_DMACH_SHIFT     32
+#define CVMX_PKI_DMACH_MASK      cvmx_build_mask(16)
+#define CVMX_PKI_DMACL_MASK      CVMX_PKI_DATA_MASK_32
+#define CVMX_PKI_DATA_MASK_32    cvmx_build_mask(32)
+#define CVMX_PKI_DATA_MASK_16    cvmx_build_mask(16)
+#define CVMX_PKI_DMAC_MATCH_EXACT cvmx_build_mask(48)
+
+struct cvmx_pki_pcam_input {
+       u64 style;
+       u64 style_mask; /* bits: 1-match, 0-dont care */
+       enum cvmx_pki_term field;
+       u32 field_mask; /* bits: 1-match, 0-dont care */
+       u64 data;
+       u64 data_mask; /* bits: 1-match, 0-dont care */
+};
+
+struct cvmx_pki_pcam_action {
+       enum cvmx_pki_parse_mode_chg parse_mode_chg;
+       enum cvmx_pki_layer_type layer_type_set;
+       int style_add;
+       int parse_flag_set;
+       int pointer_advance;
+};
+
+struct cvmx_pki_pcam_config {
+       int in_use;
+       int entry_num;
+       u64 cluster_mask;
+       struct cvmx_pki_pcam_input pcam_input;
+       struct cvmx_pki_pcam_action pcam_action;
+};
+
+/**
+ * Status statistics for a port
+ */
+struct cvmx_pki_port_stats {
+       u64 dropped_octets;
+       u64 dropped_packets;
+       u64 pci_raw_packets;
+       u64 octets;
+       u64 packets;
+       u64 multicast_packets;
+       u64 broadcast_packets;
+       u64 len_64_packets;
+       u64 len_65_127_packets;
+       u64 len_128_255_packets;
+       u64 len_256_511_packets;
+       u64 len_512_1023_packets;
+       u64 len_1024_1518_packets;
+       u64 len_1519_max_packets;
+       u64 fcs_align_err_packets;
+       u64 runt_packets;
+       u64 runt_crc_packets;
+       u64 oversize_packets;
+       u64 oversize_crc_packets;
+       u64 inb_packets;
+       u64 inb_octets;
+       u64 inb_errors;
+       u64 mcast_l2_red_packets;
+       u64 bcast_l2_red_packets;
+       u64 mcast_l3_red_packets;
+       u64 bcast_l3_red_packets;
+};
+
+/**
+ * PKI Packet Instruction Header Structure (PKI_INST_HDR_S)
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 w : 1;    /* INST_HDR size: 0 = 2 bytes, 1 = 4 or 8 bytes */
+               u64 raw : 1;  /* RAW packet indicator in WQE[RAW]: 1 = enable */
+               u64 utag : 1; /* Use INST_HDR[TAG] to compute WQE[TAG]: 1 = enable */
+               u64 uqpg : 1; /* Use INST_HDR[QPG] to compute QPG: 1 = enable */
+               u64 rsvd1 : 1;
+               u64 pm : 3; /* Packet parsing mode. Legal values = 0x0..0x7 */
+               u64 sl : 8; /* Number of bytes in INST_HDR. */
+               /* The following fields are not present, if INST_HDR[W] = 0: */
+               u64 utt : 1; /* Use INST_HDR[TT] to compute WQE[TT]: 1 = enable */
+               u64 tt : 2;  /* INST_HDR[TT] => WQE[TT], if INST_HDR[UTT] = 1 */
+               u64 rsvd2 : 2;
+               u64 qpg : 11; /* INST_HDR[QPG] => QPG, if INST_HDR[UQPG] = 1 */
+               u64 tag : 32; /* INST_HDR[TAG] => WQE[TAG], if INST_HDR[UTAG] = 1 */
+       } s;
+} cvmx_pki_inst_hdr_t;
+
+/**
+ * This function assignes the clusters to a group, later pkind can be
+ * configured to use that group depending on number of clusters pkind
+ * would use. A given cluster can only be enabled in a single cluster group.
+ * Number of clusters assign to that group determines how many engine can work
+ * in parallel to process the packet. Eack cluster can process x MPPS.
+ *
+ * @param node Node
+ * @param cluster_group Group to attach clusters to.
+ * @param cluster_mask The mask of clusters which needs to be assigned to the group.
+ */
+static inline int cvmx_pki_attach_cluster_to_group(int node, u64 cluster_group, u64 cluster_mask)
+{
+       cvmx_pki_icgx_cfg_t pki_cl_grp;
+
+       if (cluster_group >= CVMX_PKI_NUM_CLUSTER_GROUP) {
+               debug("ERROR: config cluster group %d", (int)cluster_group);
+               return -1;
+       }
+       pki_cl_grp.u64 = cvmx_read_csr_node(node, CVMX_PKI_ICGX_CFG(cluster_group));
+       pki_cl_grp.s.clusters = cluster_mask;
+       cvmx_write_csr_node(node, CVMX_PKI_ICGX_CFG(cluster_group), pki_cl_grp.u64);
+       return 0;
+}
+
+static inline void cvmx_pki_write_global_parse(int node, struct cvmx_pki_global_parse gbl_pen)
+{
+       cvmx_pki_gbl_pen_t gbl_pen_reg;
+
+       gbl_pen_reg.u64 = cvmx_read_csr_node(node, CVMX_PKI_GBL_PEN);
+       gbl_pen_reg.s.virt_pen = gbl_pen.virt_pen;
+       gbl_pen_reg.s.clg_pen = gbl_pen.clg_pen;
+       gbl_pen_reg.s.cl2_pen = gbl_pen.cl2_pen;
+       gbl_pen_reg.s.l4_pen = gbl_pen.l4_pen;
+       gbl_pen_reg.s.il3_pen = gbl_pen.il3_pen;
+       gbl_pen_reg.s.l3_pen = gbl_pen.l3_pen;
+       gbl_pen_reg.s.mpls_pen = gbl_pen.mpls_pen;
+       gbl_pen_reg.s.fulc_pen = gbl_pen.fulc_pen;
+       gbl_pen_reg.s.dsa_pen = gbl_pen.dsa_pen;
+       gbl_pen_reg.s.hg_pen = gbl_pen.hg_pen;
+       cvmx_write_csr_node(node, CVMX_PKI_GBL_PEN, gbl_pen_reg.u64);
+}
+
+static inline void cvmx_pki_write_tag_secret(int node, struct cvmx_pki_tag_sec tag_secret)
+{
+       cvmx_pki_tag_secret_t tag_secret_reg;
+
+       tag_secret_reg.u64 = cvmx_read_csr_node(node, CVMX_PKI_TAG_SECRET);
+       tag_secret_reg.s.dst6 = tag_secret.dst6;
+       tag_secret_reg.s.src6 = tag_secret.src6;
+       tag_secret_reg.s.dst = tag_secret.dst;
+       tag_secret_reg.s.src = tag_secret.src;
+       cvmx_write_csr_node(node, CVMX_PKI_TAG_SECRET, tag_secret_reg.u64);
+}
+
+static inline void cvmx_pki_write_ltype_map(int node, enum cvmx_pki_layer_type layer,
+                                           enum cvmx_pki_beltype backend)
+{
+       cvmx_pki_ltypex_map_t ltype_map;
+
+       if (layer > CVMX_PKI_LTYPE_E_MAX || backend > CVMX_PKI_BELTYPE_MAX) {
+               debug("ERROR: invalid ltype beltype mapping\n");
+               return;
+       }
+       ltype_map.u64 = cvmx_read_csr_node(node, CVMX_PKI_LTYPEX_MAP(layer));
+       ltype_map.s.beltype = backend;
+       cvmx_write_csr_node(node, CVMX_PKI_LTYPEX_MAP(layer), ltype_map.u64);
+}
+
+/**
+ * This function enables the cluster group to start parsing.
+ *
+ * @param node    Node number.
+ * @param cl_grp  Cluster group to enable parsing.
+ */
+static inline int cvmx_pki_parse_enable(int node, unsigned int cl_grp)
+{
+       cvmx_pki_icgx_cfg_t pki_cl_grp;
+
+       if (cl_grp >= CVMX_PKI_NUM_CLUSTER_GROUP) {
+               debug("ERROR: pki parse en group %d", (int)cl_grp);
+               return -1;
+       }
+       pki_cl_grp.u64 = cvmx_read_csr_node(node, CVMX_PKI_ICGX_CFG(cl_grp));
+       pki_cl_grp.s.pena = 1;
+       cvmx_write_csr_node(node, CVMX_PKI_ICGX_CFG(cl_grp), pki_cl_grp.u64);
+       return 0;
+}
+
+/**
+ * This function enables the PKI to send bpid level backpressure to CN78XX inputs.
+ *
+ * @param node Node number.
+ */
+static inline void cvmx_pki_enable_backpressure(int node)
+{
+       cvmx_pki_buf_ctl_t pki_buf_ctl;
+
+       pki_buf_ctl.u64 = cvmx_read_csr_node(node, CVMX_PKI_BUF_CTL);
+       pki_buf_ctl.s.pbp_en = 1;
+       cvmx_write_csr_node(node, CVMX_PKI_BUF_CTL, pki_buf_ctl.u64);
+}
+
+/**
+ * Clear the statistics counters for a port.
+ *
+ * @param node Node number.
+ * @param port Port number (ipd_port) to get statistics for.
+ *    Make sure PKI_STATS_CTL:mode is set to 0 for collecting per port/pkind stats.
+ */
+void cvmx_pki_clear_port_stats(int node, u64 port);
+
+/**
+ * Get the status counters for index from PKI.
+ *
+ * @param node   Node number.
+ * @param index   PKIND number, if PKI_STATS_CTL:mode = 0 or
+ *     style(flow) number, if PKI_STATS_CTL:mode = 1
+ * @param status  Where to put the results.
+ */
+void cvmx_pki_get_stats(int node, int index, struct cvmx_pki_port_stats *status);
+
+/**
+ * Get the statistics counters for a port.
+ *
+ * @param node  Node number
+ * @param port   Port number (ipd_port) to get statistics for.
+ *    Make sure PKI_STATS_CTL:mode is set to 0 for collecting per port/pkind stats.
+ * @param status Where to put the results.
+ */
+static inline void cvmx_pki_get_port_stats(int node, u64 port, struct cvmx_pki_port_stats *status)
+{
+       int xipd = cvmx_helper_node_to_ipd_port(node, port);
+       int xiface = cvmx_helper_get_interface_num(xipd);
+       int index = cvmx_helper_get_interface_index_num(port);
+       int pknd = cvmx_helper_get_pknd(xiface, index);
+
+       cvmx_pki_get_stats(node, pknd, status);
+}
+
+/**
+ * Get the statistics counters for a flow represented by style in PKI.
+ *
+ * @param node Node number.
+ * @param style_num Style number to get statistics for.
+ *    Make sure PKI_STATS_CTL:mode is set to 1 for collecting per style/flow stats.
+ * @param status Where to put the results.
+ */
+static inline void cvmx_pki_get_flow_stats(int node, u64 style_num,
+                                          struct cvmx_pki_port_stats *status)
+{
+       cvmx_pki_get_stats(node, style_num, status);
+}
+
+/**
+ * Show integrated PKI configuration.
+ *
+ * @param node    node number
+ */
+int cvmx_pki_config_dump(unsigned int node);
+
+/**
+ * Show integrated PKI statistics.
+ *
+ * @param node    node number
+ */
+int cvmx_pki_stats_dump(unsigned int node);
+
+/**
+ * Clear PKI statistics.
+ *
+ * @param node    node number
+ */
+void cvmx_pki_stats_clear(unsigned int node);
+
+/**
+ * This function enables PKI.
+ *
+ * @param node  node to enable pki in.
+ */
+void cvmx_pki_enable(int node);
+
+/**
+ * This function disables PKI.
+ *
+ * @param node node to disable pki in.
+ */
+void cvmx_pki_disable(int node);
+
+/**
+ * This function soft resets PKI.
+ *
+ * @param node node to enable pki in.
+ */
+void cvmx_pki_reset(int node);
+
+/**
+ * This function sets the clusters in PKI.
+ *
+ * @param node node to set clusters in.
+ */
+int cvmx_pki_setup_clusters(int node);
+
+/**
+ * This function reads global configuration of PKI block.
+ *
+ * @param node    Node number.
+ * @param gbl_cfg Pointer to struct to read global configuration
+ */
+void cvmx_pki_read_global_config(int node, struct cvmx_pki_global_config *gbl_cfg);
+
+/**
+ * This function writes global configuration of PKI into hw.
+ *
+ * @param node    Node number.
+ * @param gbl_cfg Pointer to struct to global configuration
+ */
+void cvmx_pki_write_global_config(int node, struct cvmx_pki_global_config *gbl_cfg);
+
+/**
+ * This function reads per pkind parameters in hardware which defines how
+ * the incoming packet is processed.
+ *
+ * @param node   Node number.
+ * @param pkind  PKI supports a large number of incoming interfaces and packets
+ *     arriving on different interfaces or channels may want to be processed
+ *     differently. PKI uses the pkind to determine how the incoming packet
+ *     is processed.
+ * @param pkind_cfg    Pointer to struct conatining pkind configuration read
+ *     from hardware.
+ */
+int cvmx_pki_read_pkind_config(int node, int pkind, struct cvmx_pki_pkind_config *pkind_cfg);
+
+/**
+ * This function writes per pkind parameters in hardware which defines how
+ * the incoming packet is processed.
+ *
+ * @param node   Node number.
+ * @param pkind  PKI supports a large number of incoming interfaces and packets
+ *     arriving on different interfaces or channels may want to be processed
+ *     differently. PKI uses the pkind to determine how the incoming packet
+ *     is processed.
+ * @param pkind_cfg    Pointer to struct conatining pkind configuration need
+ *     to be written in hardware.
+ */
+int cvmx_pki_write_pkind_config(int node, int pkind, struct cvmx_pki_pkind_config *pkind_cfg);
+
+/**
+ * This function reads parameters associated with tag configuration in hardware.
+ *
+ * @param node  Node number.
+ * @param style  Style to configure tag for.
+ * @param cluster_mask  Mask of clusters to configure the style for.
+ * @param tag_cfg  Pointer to tag configuration struct.
+ */
+void cvmx_pki_read_tag_config(int node, int style, u64 cluster_mask,
+                             struct cvmx_pki_style_tag_cfg *tag_cfg);
+
+/**
+ * This function writes/configures parameters associated with tag
+ * configuration in hardware.
+ *
+ * @param node  Node number.
+ * @param style  Style to configure tag for.
+ * @param cluster_mask  Mask of clusters to configure the style for.
+ * @param tag_cfg  Pointer to taf configuration struct.
+ */
+void cvmx_pki_write_tag_config(int node, int style, u64 cluster_mask,
+                              struct cvmx_pki_style_tag_cfg *tag_cfg);
+
+/**
+ * This function reads parameters associated with style in hardware.
+ *
+ * @param node Node number.
+ * @param style  Style to read from.
+ * @param cluster_mask  Mask of clusters style belongs to.
+ * @param style_cfg  Pointer to style config struct.
+ */
+void cvmx_pki_read_style_config(int node, int style, u64 cluster_mask,
+                               struct cvmx_pki_style_config *style_cfg);
+
+/**
+ * This function writes/configures parameters associated with style in hardware.
+ *
+ * @param node  Node number.
+ * @param style  Style to configure.
+ * @param cluster_mask  Mask of clusters to configure the style for.
+ * @param style_cfg  Pointer to style config struct.
+ */
+void cvmx_pki_write_style_config(int node, u64 style, u64 cluster_mask,
+                                struct cvmx_pki_style_config *style_cfg);
+/**
+ * This function reads qpg entry at specified offset from qpg table
+ *
+ * @param node  Node number.
+ * @param offset  Offset in qpg table to read from.
+ * @param qpg_cfg  Pointer to structure containing qpg values
+ */
+int cvmx_pki_read_qpg_entry(int node, int offset, struct cvmx_pki_qpg_config *qpg_cfg);
+
+/**
+ * This function writes qpg entry at specified offset in qpg table
+ *
+ * @param node  Node number.
+ * @param offset  Offset in qpg table to write to.
+ * @param qpg_cfg  Pointer to stricture containing qpg values.
+ */
+void cvmx_pki_write_qpg_entry(int node, int offset, struct cvmx_pki_qpg_config *qpg_cfg);
+
+/**
+ * This function writes pcam entry at given offset in pcam table in hardware
+ *
+ * @param node  Node number.
+ * @param index         Offset in pcam table.
+ * @param cluster_mask  Mask of clusters in which to write pcam entry.
+ * @param input  Input keys to pcam match passed as struct.
+ * @param action  PCAM match action passed as struct
+ */
+int cvmx_pki_pcam_write_entry(int node, int index, u64 cluster_mask,
+                             struct cvmx_pki_pcam_input input, struct cvmx_pki_pcam_action action);
+/**
+ * Configures the channel which will receive backpressure from the specified bpid.
+ * Each channel listens for backpressure on a specific bpid.
+ * Each bpid can backpressure multiple channels.
+ * @param node  Node number.
+ * @param bpid  BPID from which channel will receive backpressure.
+ * @param channel  Channel number to receive backpressue.
+ */
+int cvmx_pki_write_channel_bpid(int node, int channel, int bpid);
+
+/**
+ * Configures the bpid on which, specified channel will
+ * assert backpressure.
+ * Each bpid receives backpressure from auras.
+ * Multiple auras can backpressure single bpid.
+ * @param node  Node number.
+ * @param aura  Number which will assert backpressure on that bpid.
+ * @param bpid  To assert backpressure on.
+ */
+int cvmx_pki_write_aura_bpid(int node, int aura, int bpid);
+
+/**
+ * Enables/Disabled QoS (RED Drop, Tail Drop & backpressure) for the* PKI aura.
+ *
+ * @param node  Node number
+ * @param aura  To enable/disable QoS on.
+ * @param ena_red  Enable/Disable RED drop between pass and drop level
+ *    1-enable 0-disable
+ * @param ena_drop  Enable/disable tail drop when max drop level exceeds
+ *    1-enable 0-disable
+ * @param ena_bp  Enable/Disable asserting backpressure on bpid when
+ *    max DROP level exceeds.
+ *    1-enable 0-disable
+ */
+int cvmx_pki_enable_aura_qos(int node, int aura, bool ena_red, bool ena_drop, bool ena_bp);
+
+/**
+ * This function gives the initial style used by that pkind.
+ *
+ * @param node  Node number.
+ * @param pkind  PKIND number.
+ */
+int cvmx_pki_get_pkind_style(int node, int pkind);
+
+/**
+ * This function sets the wqe buffer mode. First packet data buffer can reside
+ * either in same buffer as wqe OR it can go in separate buffer. If used the later mode,
+ * make sure software allocate enough buffers to now have wqe separate from packet data.
+ *
+ * @param node  Node number.
+ * @param style  Style to configure.
+ * @param pkt_outside_wqe
+ *    0 = The packet link pointer will be at word [FIRST_SKIP] immediately
+ *    followed by packet data, in the same buffer as the work queue entry.
+ *    1 = The packet link pointer will be at word [FIRST_SKIP] in a new
+ *    buffer separate from the work queue entry. Words following the
+ *    WQE in the same cache line will be zeroed, other lines in the
+ *    buffer will not be modified and will retain stale data (from the
+ *    buffer’s previous use). This setting may decrease the peak PKI
+ *    performance by up to half on small packets.
+ */
+void cvmx_pki_set_wqe_mode(int node, u64 style, bool pkt_outside_wqe);
+
+/**
+ * This function sets the Packet mode of all ports and styles to little-endian.
+ * It Changes write operations of packet data to L2C to
+ * be in little-endian. Does not change the WQE header format, which is
+ * properly endian neutral.
+ *
+ * @param node  Node number.
+ * @param style  Style to configure.
+ */
+void cvmx_pki_set_little_endian(int node, u64 style);
+
+/**
+ * Enables/Disables L2 length error check and max & min frame length checks.
+ *
+ * @param node  Node number.
+ * @param pknd  PKIND to disable error for.
+ * @param l2len_err     L2 length error check enable.
+ * @param maxframe_err Max frame error check enable.
+ * @param minframe_err Min frame error check enable.
+ *    1 -- Enabel err checks
+ *    0 -- Disable error checks
+ */
+void cvmx_pki_endis_l2_errs(int node, int pknd, bool l2len_err, bool maxframe_err,
+                           bool minframe_err);
+
+/**
+ * Enables/Disables fcs check and fcs stripping on the pkind.
+ *
+ * @param node  Node number.
+ * @param pknd  PKIND to apply settings on.
+ * @param fcs_chk  Enable/disable fcs check.
+ *    1 -- enable fcs error check.
+ *    0 -- disable fcs error check.
+ * @param fcs_strip     Strip L2 FCS bytes from packet, decrease WQE[LEN] by 4 bytes
+ *    1 -- strip L2 FCS.
+ *    0 -- Do not strip L2 FCS.
+ */
+void cvmx_pki_endis_fcs_check(int node, int pknd, bool fcs_chk, bool fcs_strip);
+
+/**
+ * This function shows the qpg table entries, read directly from hardware.
+ *
+ * @param node  Node number.
+ * @param num_entry  Number of entries to print.
+ */
+void cvmx_pki_show_qpg_entries(int node, u16 num_entry);
+
+/**
+ * This function shows the pcam table in raw format read directly from hardware.
+ *
+ * @param node  Node number.
+ */
+void cvmx_pki_show_pcam_entries(int node);
+
+/**
+ * This function shows the valid entries in readable format,
+ * read directly from hardware.
+ *
+ * @param node  Node number.
+ */
+void cvmx_pki_show_valid_pcam_entries(int node);
+
+/**
+ * This function shows the pkind attributes in readable format,
+ * read directly from hardware.
+ * @param node  Node number.
+ * @param pkind  PKIND number to print.
+ */
+void cvmx_pki_show_pkind_attributes(int node, int pkind);
+
+/**
+ * @INTERNAL
+ * This function is called by cvmx_helper_shutdown() to extract all FPA buffers
+ * out of the PKI. After this function completes, all FPA buffers that were
+ * prefetched by PKI will be in the appropriate FPA pool.
+ * This functions does not reset the PKI.
+ * WARNING: It is very important that PKI be reset soon after a call to this function.
+ *
+ * @param node  Node number.
+ */
+void __cvmx_pki_free_ptr(int node);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pko-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pko-defs.h
new file mode 100644 (file)
index 0000000..6ae0151
--- /dev/null
@@ -0,0 +1,9388 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pko.
+ */
+
+#ifndef __CVMX_PKO_DEFS_H__
+#define __CVMX_PKO_DEFS_H__
+
+#define CVMX_PKO_CHANNEL_LEVEL                 (0x00015400000800F0ull)
+#define CVMX_PKO_DPFI_ENA                      (0x0001540000C00018ull)
+#define CVMX_PKO_DPFI_FLUSH                    (0x0001540000C00008ull)
+#define CVMX_PKO_DPFI_FPA_AURA                 (0x0001540000C00010ull)
+#define CVMX_PKO_DPFI_STATUS                   (0x0001540000C00000ull)
+#define CVMX_PKO_DQX_BYTES(offset)             (0x00015400000000D8ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_CIR(offset)               (0x0001540000280018ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_DROPPED_BYTES(offset)     (0x00015400000000C8ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_DROPPED_PACKETS(offset)   (0x00015400000000C0ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_FIFO(offset)              (0x0001540000300078ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_PACKETS(offset)           (0x00015400000000D0ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_PICK(offset)              (0x0001540000300070ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_PIR(offset)               (0x0001540000280020ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_POINTERS(offset)          (0x0001540000280078ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_SCHEDULE(offset)          (0x0001540000280008ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_SCHED_STATE(offset)       (0x0001540000280028ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_SHAPE(offset)             (0x0001540000280010ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_SHAPE_STATE(offset)       (0x0001540000280030ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_SW_XOFF(offset)           (0x00015400002800E0ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_TOPOLOGY(offset)          (0x0001540000300000ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_WM_BUF_CNT(offset)                (0x00015400008000E8ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_WM_BUF_CTL(offset)                (0x00015400008000F0ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_WM_BUF_CTL_W1C(offset)    (0x00015400008000F8ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_WM_CNT(offset)            (0x0001540000000050ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_WM_CTL(offset)            (0x0001540000000040ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQX_WM_CTL_W1C(offset)                (0x0001540000000048ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_DQ_CSR_BUS_DEBUG              (0x00015400003001F8ull)
+#define CVMX_PKO_DQ_DEBUG                      (0x0001540000300128ull)
+#define CVMX_PKO_DRAIN_IRQ                     (0x0001540000000140ull)
+#define CVMX_PKO_ENABLE                                (0x0001540000D00008ull)
+#define CVMX_PKO_FORMATX_CTL(offset)           (0x0001540000900800ull + ((offset) & 127) * 8)
+#define CVMX_PKO_L1_SQA_DEBUG                  (0x0001540000080128ull)
+#define CVMX_PKO_L1_SQB_DEBUG                  (0x0001540000080130ull)
+#define CVMX_PKO_L1_SQX_CIR(offset)            (0x0001540000000018ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_DROPPED_BYTES(offset)  (0x0001540000000088ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_DROPPED_PACKETS(offset) (0x0001540000000080ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_GREEN(offset)          (0x0001540000080058ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_GREEN_BYTES(offset)    (0x00015400000000B8ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_GREEN_PACKETS(offset)  (0x00015400000000B0ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_LINK(offset)           (0x0001540000000038ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_PICK(offset)           (0x0001540000080070ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_RED(offset)            (0x0001540000080068ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_RED_BYTES(offset)      (0x0001540000000098ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_RED_PACKETS(offset)    (0x0001540000000090ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_SCHEDULE(offset)       (0x0001540000000008ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_SHAPE(offset)          (0x0001540000000010ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_SHAPE_STATE(offset)    (0x0001540000000030ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_SW_XOFF(offset)                (0x00015400000000E0ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_TOPOLOGY(offset)       (0x0001540000080000ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_YELLOW(offset)         (0x0001540000080060ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_YELLOW_BYTES(offset)   (0x00015400000000A8ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQX_YELLOW_PACKETS(offset) (0x00015400000000A0ull + ((offset) & 31) * 512)
+#define CVMX_PKO_L1_SQ_CSR_BUS_DEBUG           (0x00015400000801F8ull)
+#define CVMX_PKO_L2_SQA_DEBUG                  (0x0001540000100128ull)
+#define CVMX_PKO_L2_SQB_DEBUG                  (0x0001540000100130ull)
+#define CVMX_PKO_L2_SQX_CIR(offset)            (0x0001540000080018ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_GREEN(offset)          (0x0001540000100058ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_PICK(offset)           (0x0001540000100070ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_PIR(offset)            (0x0001540000080020ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_POINTERS(offset)       (0x0001540000080078ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_RED(offset)            (0x0001540000100068ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_SCHEDULE(offset)       (0x0001540000080008ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_SCHED_STATE(offset)    (0x0001540000080028ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_SHAPE(offset)          (0x0001540000080010ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_SHAPE_STATE(offset)    (0x0001540000080030ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_SW_XOFF(offset)                (0x00015400000800E0ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_TOPOLOGY(offset)       (0x0001540000100000ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQX_YELLOW(offset)         (0x0001540000100060ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L2_SQ_CSR_BUS_DEBUG           (0x00015400001001F8ull)
+#define CVMX_PKO_L3_L2_SQX_CHANNEL(offset)     (0x0001540000080038ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQA_DEBUG                  (0x0001540000180128ull)
+#define CVMX_PKO_L3_SQB_DEBUG                  (0x0001540000180130ull)
+#define CVMX_PKO_L3_SQX_CIR(offset)            (0x0001540000100018ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_GREEN(offset)          (0x0001540000180058ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_PICK(offset)           (0x0001540000180070ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_PIR(offset)            (0x0001540000100020ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_POINTERS(offset)       (0x0001540000100078ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_RED(offset)            (0x0001540000180068ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_SCHEDULE(offset)       (0x0001540000100008ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_SCHED_STATE(offset)    (0x0001540000100028ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_SHAPE(offset)          (0x0001540000100010ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_SHAPE_STATE(offset)    (0x0001540000100030ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_SW_XOFF(offset)                (0x00015400001000E0ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_TOPOLOGY(offset)       (0x0001540000180000ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQX_YELLOW(offset)         (0x0001540000180060ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L3_SQ_CSR_BUS_DEBUG           (0x00015400001801F8ull)
+#define CVMX_PKO_L4_SQA_DEBUG                  (0x0001540000200128ull)
+#define CVMX_PKO_L4_SQB_DEBUG                  (0x0001540000200130ull)
+#define CVMX_PKO_L4_SQX_CIR(offset)            (0x0001540000180018ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_GREEN(offset)          (0x0001540000200058ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_PICK(offset)           (0x0001540000200070ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_PIR(offset)            (0x0001540000180020ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_POINTERS(offset)       (0x0001540000180078ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_RED(offset)            (0x0001540000200068ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_SCHEDULE(offset)       (0x0001540000180008ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_SCHED_STATE(offset)    (0x0001540000180028ull + ((offset) & 511) * 512)
+#define CVMX_PKO_L4_SQX_SHAPE(offset)          (0x0001540000180010ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_SHAPE_STATE(offset)    (0x0001540000180030ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_SW_XOFF(offset)                (0x00015400001800E0ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_TOPOLOGY(offset)       (0x0001540000200000ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQX_YELLOW(offset)         (0x0001540000200060ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L4_SQ_CSR_BUS_DEBUG           (0x00015400002001F8ull)
+#define CVMX_PKO_L5_SQA_DEBUG                  (0x0001540000280128ull)
+#define CVMX_PKO_L5_SQB_DEBUG                  (0x0001540000280130ull)
+#define CVMX_PKO_L5_SQX_CIR(offset)            (0x0001540000200018ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_GREEN(offset)          (0x0001540000280058ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_PICK(offset)           (0x0001540000280070ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_PIR(offset)            (0x0001540000200020ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_POINTERS(offset)       (0x0001540000200078ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_RED(offset)            (0x0001540000280068ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_SCHEDULE(offset)       (0x0001540000200008ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_SCHED_STATE(offset)    (0x0001540000200028ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_SHAPE(offset)          (0x0001540000200010ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_SHAPE_STATE(offset)    (0x0001540000200030ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_SW_XOFF(offset)                (0x00015400002000E0ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_TOPOLOGY(offset)       (0x0001540000280000ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQX_YELLOW(offset)         (0x0001540000280060ull + ((offset) & 1023) * 512)
+#define CVMX_PKO_L5_SQ_CSR_BUS_DEBUG           (0x00015400002801F8ull)
+#define CVMX_PKO_LUTX(offset)                  (0x0001540000B00000ull + ((offset) & 1023) * 8)
+#define CVMX_PKO_LUT_BIST_STATUS               (0x0001540000B02018ull)
+#define CVMX_PKO_LUT_ECC_CTL0                  (0x0001540000BFFFD0ull)
+#define CVMX_PKO_LUT_ECC_DBE_STS0              (0x0001540000BFFFF0ull)
+#define CVMX_PKO_LUT_ECC_DBE_STS_CMB0          (0x0001540000BFFFD8ull)
+#define CVMX_PKO_LUT_ECC_SBE_STS0              (0x0001540000BFFFF8ull)
+#define CVMX_PKO_LUT_ECC_SBE_STS_CMB0          (0x0001540000BFFFE8ull)
+#define CVMX_PKO_MACX_CFG(offset)              (0x0001540000900000ull + ((offset) & 31) * 8)
+#define CVMX_PKO_MCI0_CRED_CNTX(offset)                (0x0001540000A40000ull + ((offset) & 31) * 8)
+#define CVMX_PKO_MCI0_MAX_CREDX(offset)                (0x0001540000A00000ull + ((offset) & 31) * 8)
+#define CVMX_PKO_MCI1_CRED_CNTX(offset)                (0x0001540000A80100ull + ((offset) & 31) * 8)
+#define CVMX_PKO_MCI1_MAX_CREDX(offset)                (0x0001540000A80000ull + ((offset) & 31) * 8)
+#define CVMX_PKO_MEM_COUNT0                    (0x0001180050001080ull)
+#define CVMX_PKO_MEM_COUNT1                    (0x0001180050001088ull)
+#define CVMX_PKO_MEM_DEBUG0                    (0x0001180050001100ull)
+#define CVMX_PKO_MEM_DEBUG1                    (0x0001180050001108ull)
+#define CVMX_PKO_MEM_DEBUG10                   (0x0001180050001150ull)
+#define CVMX_PKO_MEM_DEBUG11                   (0x0001180050001158ull)
+#define CVMX_PKO_MEM_DEBUG12                   (0x0001180050001160ull)
+#define CVMX_PKO_MEM_DEBUG13                   (0x0001180050001168ull)
+#define CVMX_PKO_MEM_DEBUG14                   (0x0001180050001170ull)
+#define CVMX_PKO_MEM_DEBUG2                    (0x0001180050001110ull)
+#define CVMX_PKO_MEM_DEBUG3                    (0x0001180050001118ull)
+#define CVMX_PKO_MEM_DEBUG4                    (0x0001180050001120ull)
+#define CVMX_PKO_MEM_DEBUG5                    (0x0001180050001128ull)
+#define CVMX_PKO_MEM_DEBUG6                    (0x0001180050001130ull)
+#define CVMX_PKO_MEM_DEBUG7                    (0x0001180050001138ull)
+#define CVMX_PKO_MEM_DEBUG8                    (0x0001180050001140ull)
+#define CVMX_PKO_MEM_DEBUG9                    (0x0001180050001148ull)
+#define CVMX_PKO_MEM_IPORT_PTRS                        (0x0001180050001030ull)
+#define CVMX_PKO_MEM_IPORT_QOS                 (0x0001180050001038ull)
+#define CVMX_PKO_MEM_IQUEUE_PTRS               (0x0001180050001040ull)
+#define CVMX_PKO_MEM_IQUEUE_QOS                        (0x0001180050001048ull)
+#define CVMX_PKO_MEM_PORT_PTRS                 (0x0001180050001010ull)
+#define CVMX_PKO_MEM_PORT_QOS                  (0x0001180050001018ull)
+#define CVMX_PKO_MEM_PORT_RATE0                        (0x0001180050001020ull)
+#define CVMX_PKO_MEM_PORT_RATE1                        (0x0001180050001028ull)
+#define CVMX_PKO_MEM_QUEUE_PTRS                        (0x0001180050001000ull)
+#define CVMX_PKO_MEM_QUEUE_QOS                 (0x0001180050001008ull)
+#define CVMX_PKO_MEM_THROTTLE_INT              (0x0001180050001058ull)
+#define CVMX_PKO_MEM_THROTTLE_PIPE             (0x0001180050001050ull)
+#define CVMX_PKO_NCB_BIST_STATUS               (0x0001540000EFFF00ull)
+#define CVMX_PKO_NCB_ECC_CTL0                  (0x0001540000EFFFD0ull)
+#define CVMX_PKO_NCB_ECC_DBE_STS0              (0x0001540000EFFFF0ull)
+#define CVMX_PKO_NCB_ECC_DBE_STS_CMB0          (0x0001540000EFFFD8ull)
+#define CVMX_PKO_NCB_ECC_SBE_STS0              (0x0001540000EFFFF8ull)
+#define CVMX_PKO_NCB_ECC_SBE_STS_CMB0          (0x0001540000EFFFE8ull)
+#define CVMX_PKO_NCB_INT                       (0x0001540000E00010ull)
+#define CVMX_PKO_NCB_TX_ERR_INFO               (0x0001540000E00008ull)
+#define CVMX_PKO_NCB_TX_ERR_WORD               (0x0001540000E00000ull)
+#define CVMX_PKO_PDM_BIST_STATUS               (0x00015400008FFF00ull)
+#define CVMX_PKO_PDM_CFG                       (0x0001540000800000ull)
+#define CVMX_PKO_PDM_CFG_DBG                   (0x0001540000800FF8ull)
+#define CVMX_PKO_PDM_CP_DBG                    (0x0001540000800190ull)
+#define CVMX_PKO_PDM_DQX_MINPAD(offset)                (0x00015400008F0000ull + ((offset) & 1023) * 8)
+#define CVMX_PKO_PDM_DRPBUF_DBG                        (0x00015400008000B0ull)
+#define CVMX_PKO_PDM_DWPBUF_DBG                        (0x00015400008000A8ull)
+#define CVMX_PKO_PDM_ECC_CTL0                  (0x00015400008FFFD0ull)
+#define CVMX_PKO_PDM_ECC_CTL1                  (0x00015400008FFFD8ull)
+#define CVMX_PKO_PDM_ECC_DBE_STS0              (0x00015400008FFFF0ull)
+#define CVMX_PKO_PDM_ECC_DBE_STS_CMB0          (0x00015400008FFFE0ull)
+#define CVMX_PKO_PDM_ECC_SBE_STS0              (0x00015400008FFFF8ull)
+#define CVMX_PKO_PDM_ECC_SBE_STS_CMB0          (0x00015400008FFFE8ull)
+#define CVMX_PKO_PDM_FILLB_DBG0                        (0x00015400008002A0ull)
+#define CVMX_PKO_PDM_FILLB_DBG1                        (0x00015400008002A8ull)
+#define CVMX_PKO_PDM_FILLB_DBG2                        (0x00015400008002B0ull)
+#define CVMX_PKO_PDM_FLSHB_DBG0                        (0x00015400008002B8ull)
+#define CVMX_PKO_PDM_FLSHB_DBG1                        (0x00015400008002C0ull)
+#define CVMX_PKO_PDM_INTF_DBG_RD               (0x0001540000900F20ull)
+#define CVMX_PKO_PDM_ISRD_DBG                  (0x0001540000800090ull)
+#define CVMX_PKO_PDM_ISRD_DBG_DQ               (0x0001540000800290ull)
+#define CVMX_PKO_PDM_ISRM_DBG                  (0x0001540000800098ull)
+#define CVMX_PKO_PDM_ISRM_DBG_DQ               (0x0001540000800298ull)
+#define CVMX_PKO_PDM_MEM_ADDR                  (0x0001540000800018ull)
+#define CVMX_PKO_PDM_MEM_DATA                  (0x0001540000800010ull)
+#define CVMX_PKO_PDM_MEM_RW_CTL                        (0x0001540000800020ull)
+#define CVMX_PKO_PDM_MEM_RW_STS                        (0x0001540000800028ull)
+#define CVMX_PKO_PDM_MWPBUF_DBG                        (0x00015400008000A0ull)
+#define CVMX_PKO_PDM_STS                       (0x0001540000800008ull)
+#define CVMX_PKO_PEB_BIST_STATUS               (0x0001540000900D00ull)
+#define CVMX_PKO_PEB_ECC_CTL0                  (0x00015400009FFFD0ull)
+#define CVMX_PKO_PEB_ECC_CTL1                  (0x00015400009FFFA8ull)
+#define CVMX_PKO_PEB_ECC_DBE_STS0              (0x00015400009FFFF0ull)
+#define CVMX_PKO_PEB_ECC_DBE_STS_CMB0          (0x00015400009FFFD8ull)
+#define CVMX_PKO_PEB_ECC_SBE_STS0              (0x00015400009FFFF8ull)
+#define CVMX_PKO_PEB_ECC_SBE_STS_CMB0          (0x00015400009FFFE8ull)
+#define CVMX_PKO_PEB_ECO                       (0x0001540000901000ull)
+#define CVMX_PKO_PEB_ERR_INT                   (0x0001540000900C00ull)
+#define CVMX_PKO_PEB_EXT_HDR_DEF_ERR_INFO      (0x0001540000900C08ull)
+#define CVMX_PKO_PEB_FCS_SOP_ERR_INFO          (0x0001540000900C18ull)
+#define CVMX_PKO_PEB_JUMP_DEF_ERR_INFO         (0x0001540000900C10ull)
+#define CVMX_PKO_PEB_MACX_CFG_WR_ERR_INFO      (0x0001540000900C50ull)
+#define CVMX_PKO_PEB_MAX_LINK_ERR_INFO         (0x0001540000900C48ull)
+#define CVMX_PKO_PEB_NCB_CFG                   (0x0001540000900308ull)
+#define CVMX_PKO_PEB_PAD_ERR_INFO              (0x0001540000900C28ull)
+#define CVMX_PKO_PEB_PSE_FIFO_ERR_INFO         (0x0001540000900C20ull)
+#define CVMX_PKO_PEB_SUBD_ADDR_ERR_INFO                (0x0001540000900C38ull)
+#define CVMX_PKO_PEB_SUBD_SIZE_ERR_INFO                (0x0001540000900C40ull)
+#define CVMX_PKO_PEB_TRUNC_ERR_INFO            (0x0001540000900C30ull)
+#define CVMX_PKO_PEB_TSO_CFG                   (0x0001540000900310ull)
+#define CVMX_PKO_PQA_DEBUG                     (0x0001540000000128ull)
+#define CVMX_PKO_PQB_DEBUG                     (0x0001540000000130ull)
+#define CVMX_PKO_PQ_CSR_BUS_DEBUG              (0x00015400000001F8ull)
+#define CVMX_PKO_PQ_DEBUG_GREEN                        (0x0001540000000058ull)
+#define CVMX_PKO_PQ_DEBUG_LINKS                        (0x0001540000000068ull)
+#define CVMX_PKO_PQ_DEBUG_YELLOW               (0x0001540000000060ull)
+#define CVMX_PKO_PSE_DQ_BIST_STATUS            (0x0001540000300138ull)
+#define CVMX_PKO_PSE_DQ_ECC_CTL0               (0x0001540000300100ull)
+#define CVMX_PKO_PSE_DQ_ECC_DBE_STS0           (0x0001540000300118ull)
+#define CVMX_PKO_PSE_DQ_ECC_DBE_STS_CMB0       (0x0001540000300120ull)
+#define CVMX_PKO_PSE_DQ_ECC_SBE_STS0           (0x0001540000300108ull)
+#define CVMX_PKO_PSE_DQ_ECC_SBE_STS_CMB0       (0x0001540000300110ull)
+#define CVMX_PKO_PSE_PQ_BIST_STATUS            (0x0001540000000138ull)
+#define CVMX_PKO_PSE_PQ_ECC_CTL0               (0x0001540000000100ull)
+#define CVMX_PKO_PSE_PQ_ECC_DBE_STS0           (0x0001540000000118ull)
+#define CVMX_PKO_PSE_PQ_ECC_DBE_STS_CMB0       (0x0001540000000120ull)
+#define CVMX_PKO_PSE_PQ_ECC_SBE_STS0           (0x0001540000000108ull)
+#define CVMX_PKO_PSE_PQ_ECC_SBE_STS_CMB0       (0x0001540000000110ull)
+#define CVMX_PKO_PSE_SQ1_BIST_STATUS           (0x0001540000080138ull)
+#define CVMX_PKO_PSE_SQ1_ECC_CTL0              (0x0001540000080100ull)
+#define CVMX_PKO_PSE_SQ1_ECC_DBE_STS0          (0x0001540000080118ull)
+#define CVMX_PKO_PSE_SQ1_ECC_DBE_STS_CMB0      (0x0001540000080120ull)
+#define CVMX_PKO_PSE_SQ1_ECC_SBE_STS0          (0x0001540000080108ull)
+#define CVMX_PKO_PSE_SQ1_ECC_SBE_STS_CMB0      (0x0001540000080110ull)
+#define CVMX_PKO_PSE_SQ2_BIST_STATUS           (0x0001540000100138ull)
+#define CVMX_PKO_PSE_SQ2_ECC_CTL0              (0x0001540000100100ull)
+#define CVMX_PKO_PSE_SQ2_ECC_DBE_STS0          (0x0001540000100118ull)
+#define CVMX_PKO_PSE_SQ2_ECC_DBE_STS_CMB0      (0x0001540000100120ull)
+#define CVMX_PKO_PSE_SQ2_ECC_SBE_STS0          (0x0001540000100108ull)
+#define CVMX_PKO_PSE_SQ2_ECC_SBE_STS_CMB0      (0x0001540000100110ull)
+#define CVMX_PKO_PSE_SQ3_BIST_STATUS           (0x0001540000180138ull)
+#define CVMX_PKO_PSE_SQ3_ECC_CTL0              (0x0001540000180100ull)
+#define CVMX_PKO_PSE_SQ3_ECC_DBE_STS0          (0x0001540000180118ull)
+#define CVMX_PKO_PSE_SQ3_ECC_DBE_STS_CMB0      (0x0001540000180120ull)
+#define CVMX_PKO_PSE_SQ3_ECC_SBE_STS0          (0x0001540000180108ull)
+#define CVMX_PKO_PSE_SQ3_ECC_SBE_STS_CMB0      (0x0001540000180110ull)
+#define CVMX_PKO_PSE_SQ4_BIST_STATUS           (0x0001540000200138ull)
+#define CVMX_PKO_PSE_SQ4_ECC_CTL0              (0x0001540000200100ull)
+#define CVMX_PKO_PSE_SQ4_ECC_DBE_STS0          (0x0001540000200118ull)
+#define CVMX_PKO_PSE_SQ4_ECC_DBE_STS_CMB0      (0x0001540000200120ull)
+#define CVMX_PKO_PSE_SQ4_ECC_SBE_STS0          (0x0001540000200108ull)
+#define CVMX_PKO_PSE_SQ4_ECC_SBE_STS_CMB0      (0x0001540000200110ull)
+#define CVMX_PKO_PSE_SQ5_BIST_STATUS           (0x0001540000280138ull)
+#define CVMX_PKO_PSE_SQ5_ECC_CTL0              (0x0001540000280100ull)
+#define CVMX_PKO_PSE_SQ5_ECC_DBE_STS0          (0x0001540000280118ull)
+#define CVMX_PKO_PSE_SQ5_ECC_DBE_STS_CMB0      (0x0001540000280120ull)
+#define CVMX_PKO_PSE_SQ5_ECC_SBE_STS0          (0x0001540000280108ull)
+#define CVMX_PKO_PSE_SQ5_ECC_SBE_STS_CMB0      (0x0001540000280110ull)
+#define CVMX_PKO_PTFX_STATUS(offset)           (0x0001540000900100ull + ((offset) & 31) * 8)
+#define CVMX_PKO_PTF_IOBP_CFG                  (0x0001540000900300ull)
+#define CVMX_PKO_PTGFX_CFG(offset)             (0x0001540000900200ull + ((offset) & 7) * 8)
+#define CVMX_PKO_REG_BIST_RESULT               (0x0001180050000080ull)
+#define CVMX_PKO_REG_CMD_BUF                   (0x0001180050000010ull)
+#define CVMX_PKO_REG_CRC_CTLX(offset)          (0x0001180050000028ull + ((offset) & 1) * 8)
+#define CVMX_PKO_REG_CRC_ENABLE                        (0x0001180050000020ull)
+#define CVMX_PKO_REG_CRC_IVX(offset)           (0x0001180050000038ull + ((offset) & 1) * 8)
+#define CVMX_PKO_REG_DEBUG0                    (0x0001180050000098ull)
+#define CVMX_PKO_REG_DEBUG1                    (0x00011800500000A0ull)
+#define CVMX_PKO_REG_DEBUG2                    (0x00011800500000A8ull)
+#define CVMX_PKO_REG_DEBUG3                    (0x00011800500000B0ull)
+#define CVMX_PKO_REG_DEBUG4                    (0x00011800500000B8ull)
+#define CVMX_PKO_REG_ENGINE_INFLIGHT           (0x0001180050000050ull)
+#define CVMX_PKO_REG_ENGINE_INFLIGHT1          (0x0001180050000318ull)
+#define CVMX_PKO_REG_ENGINE_STORAGEX(offset)   (0x0001180050000300ull + ((offset) & 1) * 8)
+#define CVMX_PKO_REG_ENGINE_THRESH             (0x0001180050000058ull)
+#define CVMX_PKO_REG_ERROR                     (0x0001180050000088ull)
+#define CVMX_PKO_REG_FLAGS                     (0x0001180050000000ull)
+#define CVMX_PKO_REG_GMX_PORT_MODE             (0x0001180050000018ull)
+#define CVMX_PKO_REG_INT_MASK                  (0x0001180050000090ull)
+#define CVMX_PKO_REG_LOOPBACK_BPID             (0x0001180050000118ull)
+#define CVMX_PKO_REG_LOOPBACK_PKIND            (0x0001180050000068ull)
+#define CVMX_PKO_REG_MIN_PKT                   (0x0001180050000070ull)
+#define CVMX_PKO_REG_PREEMPT                   (0x0001180050000110ull)
+#define CVMX_PKO_REG_QUEUE_MODE                        (0x0001180050000048ull)
+#define CVMX_PKO_REG_QUEUE_PREEMPT             (0x0001180050000108ull)
+#define CVMX_PKO_REG_QUEUE_PTRS1               (0x0001180050000100ull)
+#define CVMX_PKO_REG_READ_IDX                  (0x0001180050000008ull)
+#define CVMX_PKO_REG_THROTTLE                  (0x0001180050000078ull)
+#define CVMX_PKO_REG_TIMESTAMP                 (0x0001180050000060ull)
+#define CVMX_PKO_SHAPER_CFG                    (0x00015400000800F8ull)
+#define CVMX_PKO_STATE_UID_IN_USEX_RD(offset)  (0x0001540000900F00ull + ((offset) & 3) * 8)
+#define CVMX_PKO_STATUS                                (0x0001540000D00000ull)
+#define CVMX_PKO_TXFX_PKT_CNT_RD(offset)       (0x0001540000900E00ull + ((offset) & 31) * 8)
+
+/**
+ * cvmx_pko_channel_level
+ */
+union cvmx_pko_channel_level {
+       u64 u64;
+       struct cvmx_pko_channel_level_s {
+               u64 reserved_1_63 : 63;
+               u64 cc_level : 1;
+       } s;
+       struct cvmx_pko_channel_level_s cn73xx;
+       struct cvmx_pko_channel_level_s cn78xx;
+       struct cvmx_pko_channel_level_s cn78xxp1;
+       struct cvmx_pko_channel_level_s cnf75xx;
+};
+
+typedef union cvmx_pko_channel_level cvmx_pko_channel_level_t;
+
+/**
+ * cvmx_pko_dpfi_ena
+ */
+union cvmx_pko_dpfi_ena {
+       u64 u64;
+       struct cvmx_pko_dpfi_ena_s {
+               u64 reserved_1_63 : 63;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_dpfi_ena_s cn73xx;
+       struct cvmx_pko_dpfi_ena_s cn78xx;
+       struct cvmx_pko_dpfi_ena_s cn78xxp1;
+       struct cvmx_pko_dpfi_ena_s cnf75xx;
+};
+
+typedef union cvmx_pko_dpfi_ena cvmx_pko_dpfi_ena_t;
+
+/**
+ * cvmx_pko_dpfi_flush
+ */
+union cvmx_pko_dpfi_flush {
+       u64 u64;
+       struct cvmx_pko_dpfi_flush_s {
+               u64 reserved_1_63 : 63;
+               u64 flush_en : 1;
+       } s;
+       struct cvmx_pko_dpfi_flush_s cn73xx;
+       struct cvmx_pko_dpfi_flush_s cn78xx;
+       struct cvmx_pko_dpfi_flush_s cn78xxp1;
+       struct cvmx_pko_dpfi_flush_s cnf75xx;
+};
+
+typedef union cvmx_pko_dpfi_flush cvmx_pko_dpfi_flush_t;
+
+/**
+ * cvmx_pko_dpfi_fpa_aura
+ */
+union cvmx_pko_dpfi_fpa_aura {
+       u64 u64;
+       struct cvmx_pko_dpfi_fpa_aura_s {
+               u64 reserved_12_63 : 52;
+               u64 node : 2;
+               u64 laura : 10;
+       } s;
+       struct cvmx_pko_dpfi_fpa_aura_s cn73xx;
+       struct cvmx_pko_dpfi_fpa_aura_s cn78xx;
+       struct cvmx_pko_dpfi_fpa_aura_s cn78xxp1;
+       struct cvmx_pko_dpfi_fpa_aura_s cnf75xx;
+};
+
+typedef union cvmx_pko_dpfi_fpa_aura cvmx_pko_dpfi_fpa_aura_t;
+
+/**
+ * cvmx_pko_dpfi_status
+ */
+union cvmx_pko_dpfi_status {
+       u64 u64;
+       struct cvmx_pko_dpfi_status_s {
+               u64 ptr_cnt : 32;
+               u64 reserved_27_31 : 5;
+               u64 xpd_fif_cnt : 4;
+               u64 dalc_fif_cnt : 4;
+               u64 alc_fif_cnt : 5;
+               u64 reserved_13_13 : 1;
+               u64 isrd_ptr1_rtn_full : 1;
+               u64 isrd_ptr0_rtn_full : 1;
+               u64 isrm_ptr1_rtn_full : 1;
+               u64 isrm_ptr0_rtn_full : 1;
+               u64 isrd_ptr1_val : 1;
+               u64 isrd_ptr0_val : 1;
+               u64 isrm_ptr1_val : 1;
+               u64 isrm_ptr0_val : 1;
+               u64 ptr_req_pend : 1;
+               u64 ptr_rtn_pend : 1;
+               u64 fpa_empty : 1;
+               u64 dpfi_empty : 1;
+               u64 cache_flushed : 1;
+       } s;
+       struct cvmx_pko_dpfi_status_s cn73xx;
+       struct cvmx_pko_dpfi_status_s cn78xx;
+       struct cvmx_pko_dpfi_status_cn78xxp1 {
+               u64 ptr_cnt : 32;
+               u64 reserved_13_31 : 19;
+               u64 isrd_ptr1_rtn_full : 1;
+               u64 isrd_ptr0_rtn_full : 1;
+               u64 isrm_ptr1_rtn_full : 1;
+               u64 isrm_ptr0_rtn_full : 1;
+               u64 isrd_ptr1_val : 1;
+               u64 isrd_ptr0_val : 1;
+               u64 isrm_ptr1_val : 1;
+               u64 isrm_ptr0_val : 1;
+               u64 ptr_req_pend : 1;
+               u64 ptr_rtn_pend : 1;
+               u64 fpa_empty : 1;
+               u64 dpfi_empty : 1;
+               u64 cache_flushed : 1;
+       } cn78xxp1;
+       struct cvmx_pko_dpfi_status_s cnf75xx;
+};
+
+typedef union cvmx_pko_dpfi_status cvmx_pko_dpfi_status_t;
+
+/**
+ * cvmx_pko_dq#_bytes
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_BYTES.
+ *
+ */
+union cvmx_pko_dqx_bytes {
+       u64 u64;
+       struct cvmx_pko_dqx_bytes_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_dqx_bytes_s cn73xx;
+       struct cvmx_pko_dqx_bytes_s cn78xx;
+       struct cvmx_pko_dqx_bytes_s cn78xxp1;
+       struct cvmx_pko_dqx_bytes_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_bytes cvmx_pko_dqx_bytes_t;
+
+/**
+ * cvmx_pko_dq#_cir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_dqx_cir {
+       u64 u64;
+       struct cvmx_pko_dqx_cir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_dqx_cir_s cn73xx;
+       struct cvmx_pko_dqx_cir_s cn78xx;
+       struct cvmx_pko_dqx_cir_s cn78xxp1;
+       struct cvmx_pko_dqx_cir_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_cir cvmx_pko_dqx_cir_t;
+
+/**
+ * cvmx_pko_dq#_dropped_bytes
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_BYTES.
+ *
+ */
+union cvmx_pko_dqx_dropped_bytes {
+       u64 u64;
+       struct cvmx_pko_dqx_dropped_bytes_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_dqx_dropped_bytes_s cn73xx;
+       struct cvmx_pko_dqx_dropped_bytes_s cn78xx;
+       struct cvmx_pko_dqx_dropped_bytes_s cn78xxp1;
+       struct cvmx_pko_dqx_dropped_bytes_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_dropped_bytes cvmx_pko_dqx_dropped_bytes_t;
+
+/**
+ * cvmx_pko_dq#_dropped_packets
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_PACKETS.
+ *
+ */
+union cvmx_pko_dqx_dropped_packets {
+       u64 u64;
+       struct cvmx_pko_dqx_dropped_packets_s {
+               u64 reserved_40_63 : 24;
+               u64 count : 40;
+       } s;
+       struct cvmx_pko_dqx_dropped_packets_s cn73xx;
+       struct cvmx_pko_dqx_dropped_packets_s cn78xx;
+       struct cvmx_pko_dqx_dropped_packets_s cn78xxp1;
+       struct cvmx_pko_dqx_dropped_packets_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_dropped_packets cvmx_pko_dqx_dropped_packets_t;
+
+/**
+ * cvmx_pko_dq#_fifo
+ */
+union cvmx_pko_dqx_fifo {
+       u64 u64;
+       struct cvmx_pko_dqx_fifo_s {
+               u64 reserved_15_63 : 49;
+               u64 p_con : 1;
+               u64 head : 7;
+               u64 tail : 7;
+       } s;
+       struct cvmx_pko_dqx_fifo_s cn73xx;
+       struct cvmx_pko_dqx_fifo_s cn78xx;
+       struct cvmx_pko_dqx_fifo_s cn78xxp1;
+       struct cvmx_pko_dqx_fifo_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_fifo cvmx_pko_dqx_fifo_t;
+
+/**
+ * cvmx_pko_dq#_packets
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_PACKETS.
+ *
+ */
+union cvmx_pko_dqx_packets {
+       u64 u64;
+       struct cvmx_pko_dqx_packets_s {
+               u64 reserved_40_63 : 24;
+               u64 count : 40;
+       } s;
+       struct cvmx_pko_dqx_packets_s cn73xx;
+       struct cvmx_pko_dqx_packets_s cn78xx;
+       struct cvmx_pko_dqx_packets_s cn78xxp1;
+       struct cvmx_pko_dqx_packets_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_packets cvmx_pko_dqx_packets_t;
+
+/**
+ * cvmx_pko_dq#_pick
+ *
+ * This CSR contains the meta for the DQ, and is for debug and reconfiguration
+ * only and should never be written. See also PKO_META_DESC_S.
+ */
+union cvmx_pko_dqx_pick {
+       u64 u64;
+       struct cvmx_pko_dqx_pick_s {
+               u64 dq : 10;
+               u64 color : 2;
+               u64 child : 10;
+               u64 bubble : 1;
+               u64 p_con : 1;
+               u64 c_con : 1;
+               u64 uid : 7;
+               u64 jump : 1;
+               u64 fpd : 1;
+               u64 ds : 1;
+               u64 adjust : 9;
+               u64 pir_dis : 1;
+               u64 cir_dis : 1;
+               u64 red_algo_override : 2;
+               u64 length : 16;
+       } s;
+       struct cvmx_pko_dqx_pick_s cn73xx;
+       struct cvmx_pko_dqx_pick_s cn78xx;
+       struct cvmx_pko_dqx_pick_s cn78xxp1;
+       struct cvmx_pko_dqx_pick_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_pick cvmx_pko_dqx_pick_t;
+
+/**
+ * cvmx_pko_dq#_pir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_dqx_pir {
+       u64 u64;
+       struct cvmx_pko_dqx_pir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_dqx_pir_s cn73xx;
+       struct cvmx_pko_dqx_pir_s cn78xx;
+       struct cvmx_pko_dqx_pir_s cn78xxp1;
+       struct cvmx_pko_dqx_pir_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_pir cvmx_pko_dqx_pir_t;
+
+/**
+ * cvmx_pko_dq#_pointers
+ *
+ * This register has the same bit fields as PKO_L3_SQ(0..255)_POINTERS.
+ *
+ */
+union cvmx_pko_dqx_pointers {
+       u64 u64;
+       struct cvmx_pko_dqx_pointers_s {
+               u64 reserved_26_63 : 38;
+               u64 prev : 10;
+               u64 reserved_10_15 : 6;
+               u64 next : 10;
+       } s;
+       struct cvmx_pko_dqx_pointers_cn73xx {
+               u64 reserved_24_63 : 40;
+               u64 prev : 8;
+               u64 reserved_8_15 : 8;
+               u64 next : 8;
+       } cn73xx;
+       struct cvmx_pko_dqx_pointers_s cn78xx;
+       struct cvmx_pko_dqx_pointers_s cn78xxp1;
+       struct cvmx_pko_dqx_pointers_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_pointers cvmx_pko_dqx_pointers_t;
+
+/**
+ * cvmx_pko_dq#_sched_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHED_STATE.
+ *
+ */
+union cvmx_pko_dqx_sched_state {
+       u64 u64;
+       struct cvmx_pko_dqx_sched_state_s {
+               u64 reserved_25_63 : 39;
+               u64 rr_count : 25;
+       } s;
+       struct cvmx_pko_dqx_sched_state_s cn73xx;
+       struct cvmx_pko_dqx_sched_state_s cn78xx;
+       struct cvmx_pko_dqx_sched_state_s cn78xxp1;
+       struct cvmx_pko_dqx_sched_state_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_sched_state cvmx_pko_dqx_sched_state_t;
+
+/**
+ * cvmx_pko_dq#_schedule
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHEDULE.
+ *
+ */
+union cvmx_pko_dqx_schedule {
+       u64 u64;
+       struct cvmx_pko_dqx_schedule_s {
+               u64 reserved_28_63 : 36;
+               u64 prio : 4;
+               u64 rr_quantum : 24;
+       } s;
+       struct cvmx_pko_dqx_schedule_s cn73xx;
+       struct cvmx_pko_dqx_schedule_s cn78xx;
+       struct cvmx_pko_dqx_schedule_s cn78xxp1;
+       struct cvmx_pko_dqx_schedule_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_schedule cvmx_pko_dqx_schedule_t;
+
+/**
+ * cvmx_pko_dq#_shape
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_SHAPE.
+ *
+ */
+union cvmx_pko_dqx_shape {
+       u64 u64;
+       struct cvmx_pko_dqx_shape_s {
+               u64 reserved_27_63 : 37;
+               u64 schedule_list : 2;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } s;
+       struct cvmx_pko_dqx_shape_s cn73xx;
+       struct cvmx_pko_dqx_shape_cn78xx {
+               u64 reserved_25_63 : 39;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } cn78xx;
+       struct cvmx_pko_dqx_shape_cn78xx cn78xxp1;
+       struct cvmx_pko_dqx_shape_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_shape cvmx_pko_dqx_shape_t;
+
+/**
+ * cvmx_pko_dq#_shape_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SHAPE_STATE.
+ * This register must not be written during normal operation.
+ */
+union cvmx_pko_dqx_shape_state {
+       u64 u64;
+       struct cvmx_pko_dqx_shape_state_s {
+               u64 reserved_60_63 : 4;
+               u64 tw_timestamp : 6;
+               u64 color : 2;
+               u64 pir_accum : 26;
+               u64 cir_accum : 26;
+       } s;
+       struct cvmx_pko_dqx_shape_state_s cn73xx;
+       struct cvmx_pko_dqx_shape_state_s cn78xx;
+       struct cvmx_pko_dqx_shape_state_s cn78xxp1;
+       struct cvmx_pko_dqx_shape_state_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_shape_state cvmx_pko_dqx_shape_state_t;
+
+/**
+ * cvmx_pko_dq#_sw_xoff
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_SW_XOFF.
+ *
+ */
+union cvmx_pko_dqx_sw_xoff {
+       u64 u64;
+       struct cvmx_pko_dqx_sw_xoff_s {
+               u64 reserved_4_63 : 60;
+               u64 drain_irq : 1;
+               u64 drain_null_link : 1;
+               u64 drain : 1;
+               u64 xoff : 1;
+       } s;
+       struct cvmx_pko_dqx_sw_xoff_s cn73xx;
+       struct cvmx_pko_dqx_sw_xoff_s cn78xx;
+       struct cvmx_pko_dqx_sw_xoff_s cn78xxp1;
+       struct cvmx_pko_dqx_sw_xoff_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_sw_xoff cvmx_pko_dqx_sw_xoff_t;
+
+/**
+ * cvmx_pko_dq#_topology
+ */
+union cvmx_pko_dqx_topology {
+       u64 u64;
+       struct cvmx_pko_dqx_topology_s {
+               u64 reserved_26_63 : 38;
+               u64 parent : 10;
+               u64 reserved_0_15 : 16;
+       } s;
+       struct cvmx_pko_dqx_topology_cn73xx {
+               u64 reserved_24_63 : 40;
+               u64 parent : 8;
+               u64 reserved_0_15 : 16;
+       } cn73xx;
+       struct cvmx_pko_dqx_topology_s cn78xx;
+       struct cvmx_pko_dqx_topology_s cn78xxp1;
+       struct cvmx_pko_dqx_topology_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_topology cvmx_pko_dqx_topology_t;
+
+/**
+ * cvmx_pko_dq#_wm_buf_cnt
+ */
+union cvmx_pko_dqx_wm_buf_cnt {
+       u64 u64;
+       struct cvmx_pko_dqx_wm_buf_cnt_s {
+               u64 reserved_36_63 : 28;
+               u64 count : 36;
+       } s;
+       struct cvmx_pko_dqx_wm_buf_cnt_s cn73xx;
+       struct cvmx_pko_dqx_wm_buf_cnt_s cn78xx;
+       struct cvmx_pko_dqx_wm_buf_cnt_s cn78xxp1;
+       struct cvmx_pko_dqx_wm_buf_cnt_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_wm_buf_cnt cvmx_pko_dqx_wm_buf_cnt_t;
+
+/**
+ * cvmx_pko_dq#_wm_buf_ctl
+ */
+union cvmx_pko_dqx_wm_buf_ctl {
+       u64 u64;
+       struct cvmx_pko_dqx_wm_buf_ctl_s {
+               u64 reserved_51_63 : 13;
+               u64 enable : 1;
+               u64 reserved_49_49 : 1;
+               u64 intr : 1;
+               u64 reserved_36_47 : 12;
+               u64 threshold : 36;
+       } s;
+       struct cvmx_pko_dqx_wm_buf_ctl_s cn73xx;
+       struct cvmx_pko_dqx_wm_buf_ctl_s cn78xx;
+       struct cvmx_pko_dqx_wm_buf_ctl_s cn78xxp1;
+       struct cvmx_pko_dqx_wm_buf_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_wm_buf_ctl cvmx_pko_dqx_wm_buf_ctl_t;
+
+/**
+ * cvmx_pko_dq#_wm_buf_ctl_w1c
+ */
+union cvmx_pko_dqx_wm_buf_ctl_w1c {
+       u64 u64;
+       struct cvmx_pko_dqx_wm_buf_ctl_w1c_s {
+               u64 reserved_49_63 : 15;
+               u64 intr : 1;
+               u64 reserved_0_47 : 48;
+       } s;
+       struct cvmx_pko_dqx_wm_buf_ctl_w1c_s cn73xx;
+       struct cvmx_pko_dqx_wm_buf_ctl_w1c_s cn78xx;
+       struct cvmx_pko_dqx_wm_buf_ctl_w1c_s cn78xxp1;
+       struct cvmx_pko_dqx_wm_buf_ctl_w1c_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_wm_buf_ctl_w1c cvmx_pko_dqx_wm_buf_ctl_w1c_t;
+
+/**
+ * cvmx_pko_dq#_wm_cnt
+ */
+union cvmx_pko_dqx_wm_cnt {
+       u64 u64;
+       struct cvmx_pko_dqx_wm_cnt_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_dqx_wm_cnt_s cn73xx;
+       struct cvmx_pko_dqx_wm_cnt_s cn78xx;
+       struct cvmx_pko_dqx_wm_cnt_s cn78xxp1;
+       struct cvmx_pko_dqx_wm_cnt_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_wm_cnt cvmx_pko_dqx_wm_cnt_t;
+
+/**
+ * cvmx_pko_dq#_wm_ctl
+ */
+union cvmx_pko_dqx_wm_ctl {
+       u64 u64;
+       struct cvmx_pko_dqx_wm_ctl_s {
+               u64 reserved_52_63 : 12;
+               u64 ncb_query_rsp : 1;
+               u64 enable : 1;
+               u64 kind : 1;
+               u64 intr : 1;
+               u64 threshold : 48;
+       } s;
+       struct cvmx_pko_dqx_wm_ctl_s cn73xx;
+       struct cvmx_pko_dqx_wm_ctl_s cn78xx;
+       struct cvmx_pko_dqx_wm_ctl_s cn78xxp1;
+       struct cvmx_pko_dqx_wm_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_wm_ctl cvmx_pko_dqx_wm_ctl_t;
+
+/**
+ * cvmx_pko_dq#_wm_ctl_w1c
+ */
+union cvmx_pko_dqx_wm_ctl_w1c {
+       u64 u64;
+       struct cvmx_pko_dqx_wm_ctl_w1c_s {
+               u64 reserved_49_63 : 15;
+               u64 intr : 1;
+               u64 reserved_0_47 : 48;
+       } s;
+       struct cvmx_pko_dqx_wm_ctl_w1c_s cn73xx;
+       struct cvmx_pko_dqx_wm_ctl_w1c_s cn78xx;
+       struct cvmx_pko_dqx_wm_ctl_w1c_s cn78xxp1;
+       struct cvmx_pko_dqx_wm_ctl_w1c_s cnf75xx;
+};
+
+typedef union cvmx_pko_dqx_wm_ctl_w1c cvmx_pko_dqx_wm_ctl_w1c_t;
+
+/**
+ * cvmx_pko_dq_csr_bus_debug
+ */
+union cvmx_pko_dq_csr_bus_debug {
+       u64 u64;
+       struct cvmx_pko_dq_csr_bus_debug_s {
+               u64 csr_bus_debug : 64;
+       } s;
+       struct cvmx_pko_dq_csr_bus_debug_s cn73xx;
+       struct cvmx_pko_dq_csr_bus_debug_s cn78xx;
+       struct cvmx_pko_dq_csr_bus_debug_s cn78xxp1;
+       struct cvmx_pko_dq_csr_bus_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_dq_csr_bus_debug cvmx_pko_dq_csr_bus_debug_t;
+
+/**
+ * cvmx_pko_dq_debug
+ */
+union cvmx_pko_dq_debug {
+       u64 u64;
+       struct cvmx_pko_dq_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_dq_debug_s cn73xx;
+       struct cvmx_pko_dq_debug_s cn78xx;
+       struct cvmx_pko_dq_debug_s cn78xxp1;
+       struct cvmx_pko_dq_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_dq_debug cvmx_pko_dq_debug_t;
+
+/**
+ * cvmx_pko_drain_irq
+ */
+union cvmx_pko_drain_irq {
+       u64 u64;
+       struct cvmx_pko_drain_irq_s {
+               u64 reserved_1_63 : 63;
+               u64 intr : 1;
+       } s;
+       struct cvmx_pko_drain_irq_s cn73xx;
+       struct cvmx_pko_drain_irq_s cn78xx;
+       struct cvmx_pko_drain_irq_s cn78xxp1;
+       struct cvmx_pko_drain_irq_s cnf75xx;
+};
+
+typedef union cvmx_pko_drain_irq cvmx_pko_drain_irq_t;
+
+/**
+ * cvmx_pko_enable
+ */
+union cvmx_pko_enable {
+       u64 u64;
+       struct cvmx_pko_enable_s {
+               u64 reserved_1_63 : 63;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_enable_s cn73xx;
+       struct cvmx_pko_enable_s cn78xx;
+       struct cvmx_pko_enable_s cn78xxp1;
+       struct cvmx_pko_enable_s cnf75xx;
+};
+
+typedef union cvmx_pko_enable cvmx_pko_enable_t;
+
+/**
+ * cvmx_pko_format#_ctl
+ *
+ * Describes packet marking calculations for YELLOW and for RED_SEND packets.
+ * PKO_SEND_HDR_S[FORMAT] selects the CSR used for the packet descriptor.
+ *
+ * All the packet marking calculations assume big-endian bits within a byte.
+ *
+ * For example, if MARKPTR is 3 and [OFFSET] is 5 and the packet is YELLOW,
+ * the PKO marking hardware would do this:
+ *
+ * _  byte[3]<2:0> |=   Y_VAL<3:1>
+ * _  byte[3]<2:0> &= ~Y_MASK<3:1>
+ * _  byte[4]<7>   |=   Y_VAL<0>
+ * _  byte[4]<7>   &= ~Y_MASK<0>
+ *
+ * where byte[3] is the 3rd byte in the packet, and byte[4] the 4th.
+ *
+ * For another example, if MARKPTR is 3 and [OFFSET] is 0 and the packet is RED_SEND,
+ *
+ * _   byte[3]<7:4> |=   R_VAL<3:0>
+ * _   byte[3]<7:4> &= ~R_MASK<3:0>
+ */
+union cvmx_pko_formatx_ctl {
+       u64 u64;
+       struct cvmx_pko_formatx_ctl_s {
+               u64 reserved_27_63 : 37;
+               u64 offset : 11;
+               u64 y_mask : 4;
+               u64 y_val : 4;
+               u64 r_mask : 4;
+               u64 r_val : 4;
+       } s;
+       struct cvmx_pko_formatx_ctl_s cn73xx;
+       struct cvmx_pko_formatx_ctl_s cn78xx;
+       struct cvmx_pko_formatx_ctl_s cn78xxp1;
+       struct cvmx_pko_formatx_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pko_formatx_ctl cvmx_pko_formatx_ctl_t;
+
+/**
+ * cvmx_pko_l1_sq#_cir
+ */
+union cvmx_pko_l1_sqx_cir {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_cir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l1_sqx_cir_s cn73xx;
+       struct cvmx_pko_l1_sqx_cir_s cn78xx;
+       struct cvmx_pko_l1_sqx_cir_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_cir_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_cir cvmx_pko_l1_sqx_cir_t;
+
+/**
+ * cvmx_pko_l1_sq#_dropped_bytes
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_BYTES.
+ *
+ */
+union cvmx_pko_l1_sqx_dropped_bytes {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_dropped_bytes_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_l1_sqx_dropped_bytes_s cn73xx;
+       struct cvmx_pko_l1_sqx_dropped_bytes_s cn78xx;
+       struct cvmx_pko_l1_sqx_dropped_bytes_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_dropped_bytes_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_dropped_bytes cvmx_pko_l1_sqx_dropped_bytes_t;
+
+/**
+ * cvmx_pko_l1_sq#_dropped_packets
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_PACKETS.
+ *
+ */
+union cvmx_pko_l1_sqx_dropped_packets {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_dropped_packets_s {
+               u64 reserved_40_63 : 24;
+               u64 count : 40;
+       } s;
+       struct cvmx_pko_l1_sqx_dropped_packets_s cn73xx;
+       struct cvmx_pko_l1_sqx_dropped_packets_s cn78xx;
+       struct cvmx_pko_l1_sqx_dropped_packets_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_dropped_packets_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_dropped_packets cvmx_pko_l1_sqx_dropped_packets_t;
+
+/**
+ * cvmx_pko_l1_sq#_green
+ */
+union cvmx_pko_l1_sqx_green {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_green_s {
+               u64 reserved_41_63 : 23;
+               u64 rr_active : 1;
+               u64 active_vec : 20;
+               u64 reserved_19_19 : 1;
+               u64 head : 9;
+               u64 reserved_9_9 : 1;
+               u64 tail : 9;
+       } s;
+       struct cvmx_pko_l1_sqx_green_s cn73xx;
+       struct cvmx_pko_l1_sqx_green_s cn78xx;
+       struct cvmx_pko_l1_sqx_green_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_green_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_green cvmx_pko_l1_sqx_green_t;
+
+/**
+ * cvmx_pko_l1_sq#_green_bytes
+ */
+union cvmx_pko_l1_sqx_green_bytes {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_green_bytes_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_l1_sqx_green_bytes_s cn73xx;
+       struct cvmx_pko_l1_sqx_green_bytes_s cn78xx;
+       struct cvmx_pko_l1_sqx_green_bytes_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_green_bytes_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_green_bytes cvmx_pko_l1_sqx_green_bytes_t;
+
+/**
+ * cvmx_pko_l1_sq#_green_packets
+ */
+union cvmx_pko_l1_sqx_green_packets {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_green_packets_s {
+               u64 reserved_40_63 : 24;
+               u64 count : 40;
+       } s;
+       struct cvmx_pko_l1_sqx_green_packets_s cn73xx;
+       struct cvmx_pko_l1_sqx_green_packets_s cn78xx;
+       struct cvmx_pko_l1_sqx_green_packets_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_green_packets_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_green_packets cvmx_pko_l1_sqx_green_packets_t;
+
+/**
+ * cvmx_pko_l1_sq#_link
+ */
+union cvmx_pko_l1_sqx_link {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_link_s {
+               u64 reserved_49_63 : 15;
+               u64 link : 5;
+               u64 reserved_32_43 : 12;
+               u64 cc_word_cnt : 20;
+               u64 cc_packet_cnt : 10;
+               u64 cc_enable : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_l1_sqx_link_cn73xx {
+               u64 reserved_48_63 : 16;
+               u64 link : 4;
+               u64 reserved_32_43 : 12;
+               u64 cc_word_cnt : 20;
+               u64 cc_packet_cnt : 10;
+               u64 cc_enable : 1;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_l1_sqx_link_s cn78xx;
+       struct cvmx_pko_l1_sqx_link_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_link_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_link cvmx_pko_l1_sqx_link_t;
+
+/**
+ * cvmx_pko_l1_sq#_pick
+ *
+ * This CSR contains the meta for the L1 SQ, and is for debug and reconfiguration
+ * only and should never be written. See also PKO_META_DESC_S.
+ */
+union cvmx_pko_l1_sqx_pick {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_pick_s {
+               u64 dq : 10;
+               u64 color : 2;
+               u64 child : 10;
+               u64 bubble : 1;
+               u64 p_con : 1;
+               u64 c_con : 1;
+               u64 uid : 7;
+               u64 jump : 1;
+               u64 fpd : 1;
+               u64 ds : 1;
+               u64 adjust : 9;
+               u64 pir_dis : 1;
+               u64 cir_dis : 1;
+               u64 red_algo_override : 2;
+               u64 length : 16;
+       } s;
+       struct cvmx_pko_l1_sqx_pick_s cn73xx;
+       struct cvmx_pko_l1_sqx_pick_s cn78xx;
+       struct cvmx_pko_l1_sqx_pick_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_pick_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_pick cvmx_pko_l1_sqx_pick_t;
+
+/**
+ * cvmx_pko_l1_sq#_red
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_YELLOW.
+ *
+ */
+union cvmx_pko_l1_sqx_red {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_red_s {
+               u64 reserved_19_63 : 45;
+               u64 head : 9;
+               u64 reserved_9_9 : 1;
+               u64 tail : 9;
+       } s;
+       struct cvmx_pko_l1_sqx_red_s cn73xx;
+       struct cvmx_pko_l1_sqx_red_s cn78xx;
+       struct cvmx_pko_l1_sqx_red_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_red_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_red cvmx_pko_l1_sqx_red_t;
+
+/**
+ * cvmx_pko_l1_sq#_red_bytes
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_BYTES.
+ *
+ */
+union cvmx_pko_l1_sqx_red_bytes {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_red_bytes_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_l1_sqx_red_bytes_s cn73xx;
+       struct cvmx_pko_l1_sqx_red_bytes_s cn78xx;
+       struct cvmx_pko_l1_sqx_red_bytes_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_red_bytes_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_red_bytes cvmx_pko_l1_sqx_red_bytes_t;
+
+/**
+ * cvmx_pko_l1_sq#_red_packets
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_PACKETS.
+ *
+ */
+union cvmx_pko_l1_sqx_red_packets {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_red_packets_s {
+               u64 reserved_40_63 : 24;
+               u64 count : 40;
+       } s;
+       struct cvmx_pko_l1_sqx_red_packets_s cn73xx;
+       struct cvmx_pko_l1_sqx_red_packets_s cn78xx;
+       struct cvmx_pko_l1_sqx_red_packets_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_red_packets_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_red_packets cvmx_pko_l1_sqx_red_packets_t;
+
+/**
+ * cvmx_pko_l1_sq#_schedule
+ */
+union cvmx_pko_l1_sqx_schedule {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_schedule_s {
+               u64 dummy : 40;
+               u64 rr_quantum : 24;
+       } s;
+       struct cvmx_pko_l1_sqx_schedule_cn73xx {
+               u64 reserved_24_63 : 40;
+               u64 rr_quantum : 24;
+       } cn73xx;
+       struct cvmx_pko_l1_sqx_schedule_cn73xx cn78xx;
+       struct cvmx_pko_l1_sqx_schedule_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_schedule_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_schedule cvmx_pko_l1_sqx_schedule_t;
+
+/**
+ * cvmx_pko_l1_sq#_shape
+ */
+union cvmx_pko_l1_sqx_shape {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_shape_s {
+               u64 reserved_25_63 : 39;
+               u64 length_disable : 1;
+               u64 reserved_18_23 : 6;
+               u64 link : 5;
+               u64 reserved_9_12 : 4;
+               u64 adjust : 9;
+       } s;
+       struct cvmx_pko_l1_sqx_shape_cn73xx {
+               u64 reserved_25_63 : 39;
+               u64 length_disable : 1;
+               u64 reserved_17_23 : 7;
+               u64 link : 4;
+               u64 reserved_9_12 : 4;
+               u64 adjust : 9;
+       } cn73xx;
+       struct cvmx_pko_l1_sqx_shape_s cn78xx;
+       struct cvmx_pko_l1_sqx_shape_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_shape_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_shape cvmx_pko_l1_sqx_shape_t;
+
+/**
+ * cvmx_pko_l1_sq#_shape_state
+ *
+ * This register must not be written during normal operation.
+ *
+ */
+union cvmx_pko_l1_sqx_shape_state {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_shape_state_s {
+               u64 reserved_60_63 : 4;
+               u64 tw_timestamp : 6;
+               u64 color2 : 1;
+               u64 color : 1;
+               u64 reserved_26_51 : 26;
+               u64 cir_accum : 26;
+       } s;
+       struct cvmx_pko_l1_sqx_shape_state_cn73xx {
+               u64 reserved_60_63 : 4;
+               u64 tw_timestamp : 6;
+               u64 reserved_53_53 : 1;
+               u64 color : 1;
+               u64 reserved_26_51 : 26;
+               u64 cir_accum : 26;
+       } cn73xx;
+       struct cvmx_pko_l1_sqx_shape_state_cn73xx cn78xx;
+       struct cvmx_pko_l1_sqx_shape_state_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_shape_state_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_shape_state cvmx_pko_l1_sqx_shape_state_t;
+
+/**
+ * cvmx_pko_l1_sq#_sw_xoff
+ */
+union cvmx_pko_l1_sqx_sw_xoff {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_sw_xoff_s {
+               u64 reserved_4_63 : 60;
+               u64 drain_irq : 1;
+               u64 drain_null_link : 1;
+               u64 drain : 1;
+               u64 xoff : 1;
+       } s;
+       struct cvmx_pko_l1_sqx_sw_xoff_s cn73xx;
+       struct cvmx_pko_l1_sqx_sw_xoff_s cn78xx;
+       struct cvmx_pko_l1_sqx_sw_xoff_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_sw_xoff_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_sw_xoff cvmx_pko_l1_sqx_sw_xoff_t;
+
+/**
+ * cvmx_pko_l1_sq#_topology
+ */
+union cvmx_pko_l1_sqx_topology {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_topology_s {
+               u64 reserved_41_63 : 23;
+               u64 prio_anchor : 9;
+               u64 reserved_21_31 : 11;
+               u64 link : 5;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_l1_sqx_topology_cn73xx {
+               u64 reserved_40_63 : 24;
+               u64 prio_anchor : 8;
+               u64 reserved_20_31 : 12;
+               u64 link : 4;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_l1_sqx_topology_s cn78xx;
+       struct cvmx_pko_l1_sqx_topology_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_topology_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_topology cvmx_pko_l1_sqx_topology_t;
+
+/**
+ * cvmx_pko_l1_sq#_yellow
+ */
+union cvmx_pko_l1_sqx_yellow {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_yellow_s {
+               u64 reserved_19_63 : 45;
+               u64 head : 9;
+               u64 reserved_9_9 : 1;
+               u64 tail : 9;
+       } s;
+       struct cvmx_pko_l1_sqx_yellow_s cn73xx;
+       struct cvmx_pko_l1_sqx_yellow_s cn78xx;
+       struct cvmx_pko_l1_sqx_yellow_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_yellow_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_yellow cvmx_pko_l1_sqx_yellow_t;
+
+/**
+ * cvmx_pko_l1_sq#_yellow_bytes
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_BYTES.
+ *
+ */
+union cvmx_pko_l1_sqx_yellow_bytes {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_yellow_bytes_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_l1_sqx_yellow_bytes_s cn73xx;
+       struct cvmx_pko_l1_sqx_yellow_bytes_s cn78xx;
+       struct cvmx_pko_l1_sqx_yellow_bytes_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_yellow_bytes_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_yellow_bytes cvmx_pko_l1_sqx_yellow_bytes_t;
+
+/**
+ * cvmx_pko_l1_sq#_yellow_packets
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN_PACKETS.
+ *
+ */
+union cvmx_pko_l1_sqx_yellow_packets {
+       u64 u64;
+       struct cvmx_pko_l1_sqx_yellow_packets_s {
+               u64 reserved_40_63 : 24;
+               u64 count : 40;
+       } s;
+       struct cvmx_pko_l1_sqx_yellow_packets_s cn73xx;
+       struct cvmx_pko_l1_sqx_yellow_packets_s cn78xx;
+       struct cvmx_pko_l1_sqx_yellow_packets_s cn78xxp1;
+       struct cvmx_pko_l1_sqx_yellow_packets_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqx_yellow_packets cvmx_pko_l1_sqx_yellow_packets_t;
+
+/**
+ * cvmx_pko_l1_sq_csr_bus_debug
+ */
+union cvmx_pko_l1_sq_csr_bus_debug {
+       u64 u64;
+       struct cvmx_pko_l1_sq_csr_bus_debug_s {
+               u64 csr_bus_debug : 64;
+       } s;
+       struct cvmx_pko_l1_sq_csr_bus_debug_s cn73xx;
+       struct cvmx_pko_l1_sq_csr_bus_debug_s cn78xx;
+       struct cvmx_pko_l1_sq_csr_bus_debug_s cn78xxp1;
+       struct cvmx_pko_l1_sq_csr_bus_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sq_csr_bus_debug cvmx_pko_l1_sq_csr_bus_debug_t;
+
+/**
+ * cvmx_pko_l1_sqa_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l1_sqa_debug {
+       u64 u64;
+       struct cvmx_pko_l1_sqa_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l1_sqa_debug_s cn73xx;
+       struct cvmx_pko_l1_sqa_debug_s cn78xx;
+       struct cvmx_pko_l1_sqa_debug_s cn78xxp1;
+       struct cvmx_pko_l1_sqa_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqa_debug cvmx_pko_l1_sqa_debug_t;
+
+/**
+ * cvmx_pko_l1_sqb_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l1_sqb_debug {
+       u64 u64;
+       struct cvmx_pko_l1_sqb_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l1_sqb_debug_s cn73xx;
+       struct cvmx_pko_l1_sqb_debug_s cn78xx;
+       struct cvmx_pko_l1_sqb_debug_s cn78xxp1;
+       struct cvmx_pko_l1_sqb_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l1_sqb_debug cvmx_pko_l1_sqb_debug_t;
+
+/**
+ * cvmx_pko_l2_sq#_cir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l2_sqx_cir {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_cir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l2_sqx_cir_s cn73xx;
+       struct cvmx_pko_l2_sqx_cir_s cn78xx;
+       struct cvmx_pko_l2_sqx_cir_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_cir_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_cir cvmx_pko_l2_sqx_cir_t;
+
+/**
+ * cvmx_pko_l2_sq#_green
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_GREEN.
+ *
+ */
+union cvmx_pko_l2_sqx_green {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_green_s {
+               u64 reserved_41_63 : 23;
+               u64 rr_active : 1;
+               u64 active_vec : 20;
+               u64 reserved_19_19 : 1;
+               u64 head : 9;
+               u64 reserved_9_9 : 1;
+               u64 tail : 9;
+       } s;
+       struct cvmx_pko_l2_sqx_green_s cn73xx;
+       struct cvmx_pko_l2_sqx_green_s cn78xx;
+       struct cvmx_pko_l2_sqx_green_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_green_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_green cvmx_pko_l2_sqx_green_t;
+
+/**
+ * cvmx_pko_l2_sq#_pick
+ *
+ * This CSR contains the meta for the L2 SQ, and is for debug and reconfiguration
+ * only and should never be written. See also PKO_META_DESC_S.
+ */
+union cvmx_pko_l2_sqx_pick {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_pick_s {
+               u64 dq : 10;
+               u64 color : 2;
+               u64 child : 10;
+               u64 bubble : 1;
+               u64 p_con : 1;
+               u64 c_con : 1;
+               u64 uid : 7;
+               u64 jump : 1;
+               u64 fpd : 1;
+               u64 ds : 1;
+               u64 adjust : 9;
+               u64 pir_dis : 1;
+               u64 cir_dis : 1;
+               u64 red_algo_override : 2;
+               u64 length : 16;
+       } s;
+       struct cvmx_pko_l2_sqx_pick_s cn73xx;
+       struct cvmx_pko_l2_sqx_pick_s cn78xx;
+       struct cvmx_pko_l2_sqx_pick_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_pick_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_pick cvmx_pko_l2_sqx_pick_t;
+
+/**
+ * cvmx_pko_l2_sq#_pir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l2_sqx_pir {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_pir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l2_sqx_pir_s cn73xx;
+       struct cvmx_pko_l2_sqx_pir_s cn78xx;
+       struct cvmx_pko_l2_sqx_pir_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_pir_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_pir cvmx_pko_l2_sqx_pir_t;
+
+/**
+ * cvmx_pko_l2_sq#_pointers
+ */
+union cvmx_pko_l2_sqx_pointers {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_pointers_s {
+               u64 reserved_25_63 : 39;
+               u64 prev : 9;
+               u64 reserved_9_15 : 7;
+               u64 next : 9;
+       } s;
+       struct cvmx_pko_l2_sqx_pointers_cn73xx {
+               u64 reserved_24_63 : 40;
+               u64 prev : 8;
+               u64 reserved_8_15 : 8;
+               u64 next : 8;
+       } cn73xx;
+       struct cvmx_pko_l2_sqx_pointers_s cn78xx;
+       struct cvmx_pko_l2_sqx_pointers_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_pointers_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_pointers cvmx_pko_l2_sqx_pointers_t;
+
+/**
+ * cvmx_pko_l2_sq#_red
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_RED.
+ *
+ */
+union cvmx_pko_l2_sqx_red {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_red_s {
+               u64 reserved_19_63 : 45;
+               u64 head : 9;
+               u64 reserved_9_9 : 1;
+               u64 tail : 9;
+       } s;
+       struct cvmx_pko_l2_sqx_red_s cn73xx;
+       struct cvmx_pko_l2_sqx_red_s cn78xx;
+       struct cvmx_pko_l2_sqx_red_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_red_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_red cvmx_pko_l2_sqx_red_t;
+
+/**
+ * cvmx_pko_l2_sq#_sched_state
+ */
+union cvmx_pko_l2_sqx_sched_state {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_sched_state_s {
+               u64 reserved_25_63 : 39;
+               u64 rr_count : 25;
+       } s;
+       struct cvmx_pko_l2_sqx_sched_state_s cn73xx;
+       struct cvmx_pko_l2_sqx_sched_state_s cn78xx;
+       struct cvmx_pko_l2_sqx_sched_state_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_sched_state_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_sched_state cvmx_pko_l2_sqx_sched_state_t;
+
+/**
+ * cvmx_pko_l2_sq#_schedule
+ */
+union cvmx_pko_l2_sqx_schedule {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_schedule_s {
+               u64 reserved_28_63 : 36;
+               u64 prio : 4;
+               u64 rr_quantum : 24;
+       } s;
+       struct cvmx_pko_l2_sqx_schedule_s cn73xx;
+       struct cvmx_pko_l2_sqx_schedule_s cn78xx;
+       struct cvmx_pko_l2_sqx_schedule_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_schedule_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_schedule cvmx_pko_l2_sqx_schedule_t;
+
+/**
+ * cvmx_pko_l2_sq#_shape
+ */
+union cvmx_pko_l2_sqx_shape {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_shape_s {
+               u64 reserved_27_63 : 37;
+               u64 schedule_list : 2;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } s;
+       struct cvmx_pko_l2_sqx_shape_s cn73xx;
+       struct cvmx_pko_l2_sqx_shape_cn78xx {
+               u64 reserved_25_63 : 39;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } cn78xx;
+       struct cvmx_pko_l2_sqx_shape_cn78xx cn78xxp1;
+       struct cvmx_pko_l2_sqx_shape_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_shape cvmx_pko_l2_sqx_shape_t;
+
+/**
+ * cvmx_pko_l2_sq#_shape_state
+ *
+ * This register must not be written during normal operation.
+ *
+ */
+union cvmx_pko_l2_sqx_shape_state {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_shape_state_s {
+               u64 reserved_60_63 : 4;
+               u64 tw_timestamp : 6;
+               u64 color : 2;
+               u64 pir_accum : 26;
+               u64 cir_accum : 26;
+       } s;
+       struct cvmx_pko_l2_sqx_shape_state_s cn73xx;
+       struct cvmx_pko_l2_sqx_shape_state_s cn78xx;
+       struct cvmx_pko_l2_sqx_shape_state_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_shape_state_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_shape_state cvmx_pko_l2_sqx_shape_state_t;
+
+/**
+ * cvmx_pko_l2_sq#_sw_xoff
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_SW_XOFF.
+ *
+ */
+union cvmx_pko_l2_sqx_sw_xoff {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_sw_xoff_s {
+               u64 reserved_4_63 : 60;
+               u64 drain_irq : 1;
+               u64 drain_null_link : 1;
+               u64 drain : 1;
+               u64 xoff : 1;
+       } s;
+       struct cvmx_pko_l2_sqx_sw_xoff_s cn73xx;
+       struct cvmx_pko_l2_sqx_sw_xoff_s cn78xx;
+       struct cvmx_pko_l2_sqx_sw_xoff_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_sw_xoff_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_sw_xoff cvmx_pko_l2_sqx_sw_xoff_t;
+
+/**
+ * cvmx_pko_l2_sq#_topology
+ */
+union cvmx_pko_l2_sqx_topology {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_topology_s {
+               u64 reserved_41_63 : 23;
+               u64 prio_anchor : 9;
+               u64 reserved_21_31 : 11;
+               u64 parent : 5;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_l2_sqx_topology_cn73xx {
+               u64 reserved_40_63 : 24;
+               u64 prio_anchor : 8;
+               u64 reserved_20_31 : 12;
+               u64 parent : 4;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_l2_sqx_topology_s cn78xx;
+       struct cvmx_pko_l2_sqx_topology_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_topology_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_topology cvmx_pko_l2_sqx_topology_t;
+
+/**
+ * cvmx_pko_l2_sq#_yellow
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_YELLOW.
+ *
+ */
+union cvmx_pko_l2_sqx_yellow {
+       u64 u64;
+       struct cvmx_pko_l2_sqx_yellow_s {
+               u64 reserved_19_63 : 45;
+               u64 head : 9;
+               u64 reserved_9_9 : 1;
+               u64 tail : 9;
+       } s;
+       struct cvmx_pko_l2_sqx_yellow_s cn73xx;
+       struct cvmx_pko_l2_sqx_yellow_s cn78xx;
+       struct cvmx_pko_l2_sqx_yellow_s cn78xxp1;
+       struct cvmx_pko_l2_sqx_yellow_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqx_yellow cvmx_pko_l2_sqx_yellow_t;
+
+/**
+ * cvmx_pko_l2_sq_csr_bus_debug
+ */
+union cvmx_pko_l2_sq_csr_bus_debug {
+       u64 u64;
+       struct cvmx_pko_l2_sq_csr_bus_debug_s {
+               u64 csr_bus_debug : 64;
+       } s;
+       struct cvmx_pko_l2_sq_csr_bus_debug_s cn73xx;
+       struct cvmx_pko_l2_sq_csr_bus_debug_s cn78xx;
+       struct cvmx_pko_l2_sq_csr_bus_debug_s cn78xxp1;
+       struct cvmx_pko_l2_sq_csr_bus_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sq_csr_bus_debug cvmx_pko_l2_sq_csr_bus_debug_t;
+
+/**
+ * cvmx_pko_l2_sqa_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l2_sqa_debug {
+       u64 u64;
+       struct cvmx_pko_l2_sqa_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l2_sqa_debug_s cn73xx;
+       struct cvmx_pko_l2_sqa_debug_s cn78xx;
+       struct cvmx_pko_l2_sqa_debug_s cn78xxp1;
+       struct cvmx_pko_l2_sqa_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqa_debug cvmx_pko_l2_sqa_debug_t;
+
+/**
+ * cvmx_pko_l2_sqb_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l2_sqb_debug {
+       u64 u64;
+       struct cvmx_pko_l2_sqb_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l2_sqb_debug_s cn73xx;
+       struct cvmx_pko_l2_sqb_debug_s cn78xx;
+       struct cvmx_pko_l2_sqb_debug_s cn78xxp1;
+       struct cvmx_pko_l2_sqb_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l2_sqb_debug cvmx_pko_l2_sqb_debug_t;
+
+/**
+ * cvmx_pko_l3_l2_sq#_channel
+ *
+ * PKO_CHANNEL_LEVEL[CC_LEVEL] determines whether this CSR array is associated to
+ * the L2 SQs or the L3 SQs.
+ */
+union cvmx_pko_l3_l2_sqx_channel {
+       u64 u64;
+       struct cvmx_pko_l3_l2_sqx_channel_s {
+               u64 reserved_44_63 : 20;
+               u64 cc_channel : 12;
+               u64 cc_word_cnt : 20;
+               u64 cc_packet_cnt : 10;
+               u64 cc_enable : 1;
+               u64 hw_xoff : 1;
+       } s;
+       struct cvmx_pko_l3_l2_sqx_channel_s cn73xx;
+       struct cvmx_pko_l3_l2_sqx_channel_s cn78xx;
+       struct cvmx_pko_l3_l2_sqx_channel_s cn78xxp1;
+       struct cvmx_pko_l3_l2_sqx_channel_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_l2_sqx_channel cvmx_pko_l3_l2_sqx_channel_t;
+
+/**
+ * cvmx_pko_l3_sq#_cir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l3_sqx_cir {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_cir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l3_sqx_cir_s cn73xx;
+       struct cvmx_pko_l3_sqx_cir_s cn78xx;
+       struct cvmx_pko_l3_sqx_cir_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_cir_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_cir cvmx_pko_l3_sqx_cir_t;
+
+/**
+ * cvmx_pko_l3_sq#_green
+ */
+union cvmx_pko_l3_sqx_green {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_green_s {
+               u64 reserved_41_63 : 23;
+               u64 rr_active : 1;
+               u64 active_vec : 20;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l3_sqx_green_cn73xx {
+               u64 reserved_41_63 : 23;
+               u64 rr_active : 1;
+               u64 active_vec : 20;
+               u64 reserved_18_19 : 2;
+               u64 head : 8;
+               u64 reserved_8_9 : 2;
+               u64 tail : 8;
+       } cn73xx;
+       struct cvmx_pko_l3_sqx_green_s cn78xx;
+       struct cvmx_pko_l3_sqx_green_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_green_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_green cvmx_pko_l3_sqx_green_t;
+
+/**
+ * cvmx_pko_l3_sq#_pick
+ *
+ * This CSR contains the meta for the L3 SQ, and is for debug and reconfiguration
+ * only and should never be written. See also PKO_META_DESC_S.
+ */
+union cvmx_pko_l3_sqx_pick {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_pick_s {
+               u64 dq : 10;
+               u64 color : 2;
+               u64 child : 10;
+               u64 bubble : 1;
+               u64 p_con : 1;
+               u64 c_con : 1;
+               u64 uid : 7;
+               u64 jump : 1;
+               u64 fpd : 1;
+               u64 ds : 1;
+               u64 adjust : 9;
+               u64 pir_dis : 1;
+               u64 cir_dis : 1;
+               u64 red_algo_override : 2;
+               u64 length : 16;
+       } s;
+       struct cvmx_pko_l3_sqx_pick_s cn73xx;
+       struct cvmx_pko_l3_sqx_pick_s cn78xx;
+       struct cvmx_pko_l3_sqx_pick_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_pick_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_pick cvmx_pko_l3_sqx_pick_t;
+
+/**
+ * cvmx_pko_l3_sq#_pir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l3_sqx_pir {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_pir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l3_sqx_pir_s cn73xx;
+       struct cvmx_pko_l3_sqx_pir_s cn78xx;
+       struct cvmx_pko_l3_sqx_pir_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_pir_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_pir cvmx_pko_l3_sqx_pir_t;
+
+/**
+ * cvmx_pko_l3_sq#_pointers
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_POINTERS.
+ *
+ */
+union cvmx_pko_l3_sqx_pointers {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_pointers_s {
+               u64 reserved_25_63 : 39;
+               u64 prev : 9;
+               u64 reserved_9_15 : 7;
+               u64 next : 9;
+       } s;
+       struct cvmx_pko_l3_sqx_pointers_cn73xx {
+               u64 reserved_24_63 : 40;
+               u64 prev : 8;
+               u64 reserved_8_15 : 8;
+               u64 next : 8;
+       } cn73xx;
+       struct cvmx_pko_l3_sqx_pointers_s cn78xx;
+       struct cvmx_pko_l3_sqx_pointers_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_pointers_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_pointers cvmx_pko_l3_sqx_pointers_t;
+
+/**
+ * cvmx_pko_l3_sq#_red
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_YELLOW.
+ *
+ */
+union cvmx_pko_l3_sqx_red {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_red_s {
+               u64 reserved_20_63 : 44;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l3_sqx_red_cn73xx {
+               u64 reserved_18_63 : 46;
+               u64 head : 8;
+               u64 reserved_8_9 : 2;
+               u64 tail : 8;
+       } cn73xx;
+       struct cvmx_pko_l3_sqx_red_s cn78xx;
+       struct cvmx_pko_l3_sqx_red_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_red_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_red cvmx_pko_l3_sqx_red_t;
+
+/**
+ * cvmx_pko_l3_sq#_sched_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHED_STATE.
+ *
+ */
+union cvmx_pko_l3_sqx_sched_state {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_sched_state_s {
+               u64 reserved_25_63 : 39;
+               u64 rr_count : 25;
+       } s;
+       struct cvmx_pko_l3_sqx_sched_state_s cn73xx;
+       struct cvmx_pko_l3_sqx_sched_state_s cn78xx;
+       struct cvmx_pko_l3_sqx_sched_state_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_sched_state_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_sched_state cvmx_pko_l3_sqx_sched_state_t;
+
+/**
+ * cvmx_pko_l3_sq#_schedule
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHEDULE.
+ *
+ */
+union cvmx_pko_l3_sqx_schedule {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_schedule_s {
+               u64 reserved_28_63 : 36;
+               u64 prio : 4;
+               u64 rr_quantum : 24;
+       } s;
+       struct cvmx_pko_l3_sqx_schedule_s cn73xx;
+       struct cvmx_pko_l3_sqx_schedule_s cn78xx;
+       struct cvmx_pko_l3_sqx_schedule_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_schedule_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_schedule cvmx_pko_l3_sqx_schedule_t;
+
+/**
+ * cvmx_pko_l3_sq#_shape
+ */
+union cvmx_pko_l3_sqx_shape {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_shape_s {
+               u64 reserved_27_63 : 37;
+               u64 schedule_list : 2;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } s;
+       struct cvmx_pko_l3_sqx_shape_s cn73xx;
+       struct cvmx_pko_l3_sqx_shape_cn78xx {
+               u64 reserved_25_63 : 39;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } cn78xx;
+       struct cvmx_pko_l3_sqx_shape_cn78xx cn78xxp1;
+       struct cvmx_pko_l3_sqx_shape_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_shape cvmx_pko_l3_sqx_shape_t;
+
+/**
+ * cvmx_pko_l3_sq#_shape_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SHAPE_STATE.
+ * This register must not be written during normal operation.
+ */
+union cvmx_pko_l3_sqx_shape_state {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_shape_state_s {
+               u64 reserved_60_63 : 4;
+               u64 tw_timestamp : 6;
+               u64 color : 2;
+               u64 pir_accum : 26;
+               u64 cir_accum : 26;
+       } s;
+       struct cvmx_pko_l3_sqx_shape_state_s cn73xx;
+       struct cvmx_pko_l3_sqx_shape_state_s cn78xx;
+       struct cvmx_pko_l3_sqx_shape_state_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_shape_state_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_shape_state cvmx_pko_l3_sqx_shape_state_t;
+
+/**
+ * cvmx_pko_l3_sq#_sw_xoff
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_SW_XOFF
+ *
+ */
+union cvmx_pko_l3_sqx_sw_xoff {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_sw_xoff_s {
+               u64 reserved_4_63 : 60;
+               u64 drain_irq : 1;
+               u64 drain_null_link : 1;
+               u64 drain : 1;
+               u64 xoff : 1;
+       } s;
+       struct cvmx_pko_l3_sqx_sw_xoff_s cn73xx;
+       struct cvmx_pko_l3_sqx_sw_xoff_s cn78xx;
+       struct cvmx_pko_l3_sqx_sw_xoff_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_sw_xoff_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_sw_xoff cvmx_pko_l3_sqx_sw_xoff_t;
+
+/**
+ * cvmx_pko_l3_sq#_topology
+ */
+union cvmx_pko_l3_sqx_topology {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_topology_s {
+               u64 reserved_42_63 : 22;
+               u64 prio_anchor : 10;
+               u64 reserved_25_31 : 7;
+               u64 parent : 9;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_l3_sqx_topology_cn73xx {
+               u64 reserved_40_63 : 24;
+               u64 prio_anchor : 8;
+               u64 reserved_24_31 : 8;
+               u64 parent : 8;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_l3_sqx_topology_s cn78xx;
+       struct cvmx_pko_l3_sqx_topology_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_topology_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_topology cvmx_pko_l3_sqx_topology_t;
+
+/**
+ * cvmx_pko_l3_sq#_yellow
+ */
+union cvmx_pko_l3_sqx_yellow {
+       u64 u64;
+       struct cvmx_pko_l3_sqx_yellow_s {
+               u64 reserved_20_63 : 44;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l3_sqx_yellow_cn73xx {
+               u64 reserved_18_63 : 46;
+               u64 head : 8;
+               u64 reserved_8_9 : 2;
+               u64 tail : 8;
+       } cn73xx;
+       struct cvmx_pko_l3_sqx_yellow_s cn78xx;
+       struct cvmx_pko_l3_sqx_yellow_s cn78xxp1;
+       struct cvmx_pko_l3_sqx_yellow_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqx_yellow cvmx_pko_l3_sqx_yellow_t;
+
+/**
+ * cvmx_pko_l3_sq_csr_bus_debug
+ */
+union cvmx_pko_l3_sq_csr_bus_debug {
+       u64 u64;
+       struct cvmx_pko_l3_sq_csr_bus_debug_s {
+               u64 csr_bus_debug : 64;
+       } s;
+       struct cvmx_pko_l3_sq_csr_bus_debug_s cn73xx;
+       struct cvmx_pko_l3_sq_csr_bus_debug_s cn78xx;
+       struct cvmx_pko_l3_sq_csr_bus_debug_s cn78xxp1;
+       struct cvmx_pko_l3_sq_csr_bus_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sq_csr_bus_debug cvmx_pko_l3_sq_csr_bus_debug_t;
+
+/**
+ * cvmx_pko_l3_sqa_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l3_sqa_debug {
+       u64 u64;
+       struct cvmx_pko_l3_sqa_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l3_sqa_debug_s cn73xx;
+       struct cvmx_pko_l3_sqa_debug_s cn78xx;
+       struct cvmx_pko_l3_sqa_debug_s cn78xxp1;
+       struct cvmx_pko_l3_sqa_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqa_debug cvmx_pko_l3_sqa_debug_t;
+
+/**
+ * cvmx_pko_l3_sqb_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l3_sqb_debug {
+       u64 u64;
+       struct cvmx_pko_l3_sqb_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l3_sqb_debug_s cn73xx;
+       struct cvmx_pko_l3_sqb_debug_s cn78xx;
+       struct cvmx_pko_l3_sqb_debug_s cn78xxp1;
+       struct cvmx_pko_l3_sqb_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_l3_sqb_debug cvmx_pko_l3_sqb_debug_t;
+
+/**
+ * cvmx_pko_l4_sq#_cir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l4_sqx_cir {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_cir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l4_sqx_cir_s cn78xx;
+       struct cvmx_pko_l4_sqx_cir_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_cir cvmx_pko_l4_sqx_cir_t;
+
+/**
+ * cvmx_pko_l4_sq#_green
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_GREEN.
+ *
+ */
+union cvmx_pko_l4_sqx_green {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_green_s {
+               u64 reserved_41_63 : 23;
+               u64 rr_active : 1;
+               u64 active_vec : 20;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l4_sqx_green_s cn78xx;
+       struct cvmx_pko_l4_sqx_green_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_green cvmx_pko_l4_sqx_green_t;
+
+/**
+ * cvmx_pko_l4_sq#_pick
+ *
+ * This CSR contains the meta for the L4 SQ, and is for debug and reconfiguration
+ * only and should never be written. See also PKO_META_DESC_S.
+ */
+union cvmx_pko_l4_sqx_pick {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_pick_s {
+               u64 dq : 10;
+               u64 color : 2;
+               u64 child : 10;
+               u64 bubble : 1;
+               u64 p_con : 1;
+               u64 c_con : 1;
+               u64 uid : 7;
+               u64 jump : 1;
+               u64 fpd : 1;
+               u64 ds : 1;
+               u64 adjust : 9;
+               u64 pir_dis : 1;
+               u64 cir_dis : 1;
+               u64 red_algo_override : 2;
+               u64 length : 16;
+       } s;
+       struct cvmx_pko_l4_sqx_pick_s cn78xx;
+       struct cvmx_pko_l4_sqx_pick_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_pick cvmx_pko_l4_sqx_pick_t;
+
+/**
+ * cvmx_pko_l4_sq#_pir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l4_sqx_pir {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_pir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l4_sqx_pir_s cn78xx;
+       struct cvmx_pko_l4_sqx_pir_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_pir cvmx_pko_l4_sqx_pir_t;
+
+/**
+ * cvmx_pko_l4_sq#_pointers
+ */
+union cvmx_pko_l4_sqx_pointers {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_pointers_s {
+               u64 reserved_26_63 : 38;
+               u64 prev : 10;
+               u64 reserved_10_15 : 6;
+               u64 next : 10;
+       } s;
+       struct cvmx_pko_l4_sqx_pointers_s cn78xx;
+       struct cvmx_pko_l4_sqx_pointers_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_pointers cvmx_pko_l4_sqx_pointers_t;
+
+/**
+ * cvmx_pko_l4_sq#_red
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_YELLOW.
+ *
+ */
+union cvmx_pko_l4_sqx_red {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_red_s {
+               u64 reserved_20_63 : 44;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l4_sqx_red_s cn78xx;
+       struct cvmx_pko_l4_sqx_red_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_red cvmx_pko_l4_sqx_red_t;
+
+/**
+ * cvmx_pko_l4_sq#_sched_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHED_STATE.
+ *
+ */
+union cvmx_pko_l4_sqx_sched_state {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_sched_state_s {
+               u64 reserved_25_63 : 39;
+               u64 rr_count : 25;
+       } s;
+       struct cvmx_pko_l4_sqx_sched_state_s cn78xx;
+       struct cvmx_pko_l4_sqx_sched_state_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_sched_state cvmx_pko_l4_sqx_sched_state_t;
+
+/**
+ * cvmx_pko_l4_sq#_schedule
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHEDULE.
+ *
+ */
+union cvmx_pko_l4_sqx_schedule {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_schedule_s {
+               u64 reserved_28_63 : 36;
+               u64 prio : 4;
+               u64 rr_quantum : 24;
+       } s;
+       struct cvmx_pko_l4_sqx_schedule_s cn78xx;
+       struct cvmx_pko_l4_sqx_schedule_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_schedule cvmx_pko_l4_sqx_schedule_t;
+
+/**
+ * cvmx_pko_l4_sq#_shape
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_SHAPE.
+ *
+ */
+union cvmx_pko_l4_sqx_shape {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_shape_s {
+               u64 reserved_25_63 : 39;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } s;
+       struct cvmx_pko_l4_sqx_shape_s cn78xx;
+       struct cvmx_pko_l4_sqx_shape_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_shape cvmx_pko_l4_sqx_shape_t;
+
+/**
+ * cvmx_pko_l4_sq#_shape_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SHAPE_STATE.
+ * This register must not be written during normal operation.
+ */
+union cvmx_pko_l4_sqx_shape_state {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_shape_state_s {
+               u64 reserved_60_63 : 4;
+               u64 tw_timestamp : 6;
+               u64 color : 2;
+               u64 pir_accum : 26;
+               u64 cir_accum : 26;
+       } s;
+       struct cvmx_pko_l4_sqx_shape_state_s cn78xx;
+       struct cvmx_pko_l4_sqx_shape_state_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_shape_state cvmx_pko_l4_sqx_shape_state_t;
+
+/**
+ * cvmx_pko_l4_sq#_sw_xoff
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_SW_XOFF.
+ *
+ */
+union cvmx_pko_l4_sqx_sw_xoff {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_sw_xoff_s {
+               u64 reserved_4_63 : 60;
+               u64 drain_irq : 1;
+               u64 drain_null_link : 1;
+               u64 drain : 1;
+               u64 xoff : 1;
+       } s;
+       struct cvmx_pko_l4_sqx_sw_xoff_s cn78xx;
+       struct cvmx_pko_l4_sqx_sw_xoff_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_sw_xoff cvmx_pko_l4_sqx_sw_xoff_t;
+
+/**
+ * cvmx_pko_l4_sq#_topology
+ */
+union cvmx_pko_l4_sqx_topology {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_topology_s {
+               u64 reserved_42_63 : 22;
+               u64 prio_anchor : 10;
+               u64 reserved_25_31 : 7;
+               u64 parent : 9;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_l4_sqx_topology_s cn78xx;
+       struct cvmx_pko_l4_sqx_topology_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_topology cvmx_pko_l4_sqx_topology_t;
+
+/**
+ * cvmx_pko_l4_sq#_yellow
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_YELLOW.
+ *
+ */
+union cvmx_pko_l4_sqx_yellow {
+       u64 u64;
+       struct cvmx_pko_l4_sqx_yellow_s {
+               u64 reserved_20_63 : 44;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l4_sqx_yellow_s cn78xx;
+       struct cvmx_pko_l4_sqx_yellow_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqx_yellow cvmx_pko_l4_sqx_yellow_t;
+
+/**
+ * cvmx_pko_l4_sq_csr_bus_debug
+ */
+union cvmx_pko_l4_sq_csr_bus_debug {
+       u64 u64;
+       struct cvmx_pko_l4_sq_csr_bus_debug_s {
+               u64 csr_bus_debug : 64;
+       } s;
+       struct cvmx_pko_l4_sq_csr_bus_debug_s cn78xx;
+       struct cvmx_pko_l4_sq_csr_bus_debug_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sq_csr_bus_debug cvmx_pko_l4_sq_csr_bus_debug_t;
+
+/**
+ * cvmx_pko_l4_sqa_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l4_sqa_debug {
+       u64 u64;
+       struct cvmx_pko_l4_sqa_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l4_sqa_debug_s cn78xx;
+       struct cvmx_pko_l4_sqa_debug_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqa_debug cvmx_pko_l4_sqa_debug_t;
+
+/**
+ * cvmx_pko_l4_sqb_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l4_sqb_debug {
+       u64 u64;
+       struct cvmx_pko_l4_sqb_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l4_sqb_debug_s cn78xx;
+       struct cvmx_pko_l4_sqb_debug_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l4_sqb_debug cvmx_pko_l4_sqb_debug_t;
+
+/**
+ * cvmx_pko_l5_sq#_cir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l5_sqx_cir {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_cir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l5_sqx_cir_s cn78xx;
+       struct cvmx_pko_l5_sqx_cir_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_cir cvmx_pko_l5_sqx_cir_t;
+
+/**
+ * cvmx_pko_l5_sq#_green
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_GREEN.
+ *
+ */
+union cvmx_pko_l5_sqx_green {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_green_s {
+               u64 reserved_41_63 : 23;
+               u64 rr_active : 1;
+               u64 active_vec : 20;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l5_sqx_green_s cn78xx;
+       struct cvmx_pko_l5_sqx_green_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_green cvmx_pko_l5_sqx_green_t;
+
+/**
+ * cvmx_pko_l5_sq#_pick
+ *
+ * This CSR contains the meta for the L5 SQ, and is for debug and reconfiguration
+ * only and should never be written. See also PKO_META_DESC_S.
+ */
+union cvmx_pko_l5_sqx_pick {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_pick_s {
+               u64 dq : 10;
+               u64 color : 2;
+               u64 child : 10;
+               u64 bubble : 1;
+               u64 p_con : 1;
+               u64 c_con : 1;
+               u64 uid : 7;
+               u64 jump : 1;
+               u64 fpd : 1;
+               u64 ds : 1;
+               u64 adjust : 9;
+               u64 pir_dis : 1;
+               u64 cir_dis : 1;
+               u64 red_algo_override : 2;
+               u64 length : 16;
+       } s;
+       struct cvmx_pko_l5_sqx_pick_s cn78xx;
+       struct cvmx_pko_l5_sqx_pick_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_pick cvmx_pko_l5_sqx_pick_t;
+
+/**
+ * cvmx_pko_l5_sq#_pir
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_CIR.
+ *
+ */
+union cvmx_pko_l5_sqx_pir {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_pir_s {
+               u64 reserved_41_63 : 23;
+               u64 burst_exponent : 4;
+               u64 burst_mantissa : 8;
+               u64 reserved_17_28 : 12;
+               u64 rate_divider_exponent : 4;
+               u64 rate_exponent : 4;
+               u64 rate_mantissa : 8;
+               u64 enable : 1;
+       } s;
+       struct cvmx_pko_l5_sqx_pir_s cn78xx;
+       struct cvmx_pko_l5_sqx_pir_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_pir cvmx_pko_l5_sqx_pir_t;
+
+/**
+ * cvmx_pko_l5_sq#_pointers
+ *
+ * This register has the same bit fields as PKO_L4_SQ()_POINTERS.
+ *
+ */
+union cvmx_pko_l5_sqx_pointers {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_pointers_s {
+               u64 reserved_26_63 : 38;
+               u64 prev : 10;
+               u64 reserved_10_15 : 6;
+               u64 next : 10;
+       } s;
+       struct cvmx_pko_l5_sqx_pointers_s cn78xx;
+       struct cvmx_pko_l5_sqx_pointers_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_pointers cvmx_pko_l5_sqx_pointers_t;
+
+/**
+ * cvmx_pko_l5_sq#_red
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_YELLOW.
+ *
+ */
+union cvmx_pko_l5_sqx_red {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_red_s {
+               u64 reserved_20_63 : 44;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l5_sqx_red_s cn78xx;
+       struct cvmx_pko_l5_sqx_red_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_red cvmx_pko_l5_sqx_red_t;
+
+/**
+ * cvmx_pko_l5_sq#_sched_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHED_STATE.
+ *
+ */
+union cvmx_pko_l5_sqx_sched_state {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_sched_state_s {
+               u64 reserved_25_63 : 39;
+               u64 rr_count : 25;
+       } s;
+       struct cvmx_pko_l5_sqx_sched_state_s cn78xx;
+       struct cvmx_pko_l5_sqx_sched_state_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_sched_state cvmx_pko_l5_sqx_sched_state_t;
+
+/**
+ * cvmx_pko_l5_sq#_schedule
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SCHEDULE.
+ *
+ */
+union cvmx_pko_l5_sqx_schedule {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_schedule_s {
+               u64 reserved_28_63 : 36;
+               u64 prio : 4;
+               u64 rr_quantum : 24;
+       } s;
+       struct cvmx_pko_l5_sqx_schedule_s cn78xx;
+       struct cvmx_pko_l5_sqx_schedule_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_schedule cvmx_pko_l5_sqx_schedule_t;
+
+/**
+ * cvmx_pko_l5_sq#_shape
+ */
+union cvmx_pko_l5_sqx_shape {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_shape_s {
+               u64 reserved_25_63 : 39;
+               u64 length_disable : 1;
+               u64 reserved_13_23 : 11;
+               u64 yellow_disable : 1;
+               u64 red_disable : 1;
+               u64 red_algo : 2;
+               u64 adjust : 9;
+       } s;
+       struct cvmx_pko_l5_sqx_shape_s cn78xx;
+       struct cvmx_pko_l5_sqx_shape_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_shape cvmx_pko_l5_sqx_shape_t;
+
+/**
+ * cvmx_pko_l5_sq#_shape_state
+ *
+ * This register has the same bit fields as PKO_L2_SQ()_SHAPE_STATE.
+ * This register must not be written during normal operation.
+ */
+union cvmx_pko_l5_sqx_shape_state {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_shape_state_s {
+               u64 reserved_60_63 : 4;
+               u64 tw_timestamp : 6;
+               u64 color : 2;
+               u64 pir_accum : 26;
+               u64 cir_accum : 26;
+       } s;
+       struct cvmx_pko_l5_sqx_shape_state_s cn78xx;
+       struct cvmx_pko_l5_sqx_shape_state_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_shape_state cvmx_pko_l5_sqx_shape_state_t;
+
+/**
+ * cvmx_pko_l5_sq#_sw_xoff
+ *
+ * This register has the same bit fields as PKO_L1_SQ()_SW_XOFF.
+ *
+ */
+union cvmx_pko_l5_sqx_sw_xoff {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_sw_xoff_s {
+               u64 reserved_4_63 : 60;
+               u64 drain_irq : 1;
+               u64 drain_null_link : 1;
+               u64 drain : 1;
+               u64 xoff : 1;
+       } s;
+       struct cvmx_pko_l5_sqx_sw_xoff_s cn78xx;
+       struct cvmx_pko_l5_sqx_sw_xoff_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_sw_xoff cvmx_pko_l5_sqx_sw_xoff_t;
+
+/**
+ * cvmx_pko_l5_sq#_topology
+ */
+union cvmx_pko_l5_sqx_topology {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_topology_s {
+               u64 reserved_42_63 : 22;
+               u64 prio_anchor : 10;
+               u64 reserved_26_31 : 6;
+               u64 parent : 10;
+               u64 reserved_5_15 : 11;
+               u64 rr_prio : 4;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_l5_sqx_topology_s cn78xx;
+       struct cvmx_pko_l5_sqx_topology_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_topology cvmx_pko_l5_sqx_topology_t;
+
+/**
+ * cvmx_pko_l5_sq#_yellow
+ *
+ * This register has the same bit fields as PKO_L3_SQ()_YELLOW.
+ *
+ */
+union cvmx_pko_l5_sqx_yellow {
+       u64 u64;
+       struct cvmx_pko_l5_sqx_yellow_s {
+               u64 reserved_20_63 : 44;
+               u64 head : 10;
+               u64 tail : 10;
+       } s;
+       struct cvmx_pko_l5_sqx_yellow_s cn78xx;
+       struct cvmx_pko_l5_sqx_yellow_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqx_yellow cvmx_pko_l5_sqx_yellow_t;
+
+/**
+ * cvmx_pko_l5_sq_csr_bus_debug
+ */
+union cvmx_pko_l5_sq_csr_bus_debug {
+       u64 u64;
+       struct cvmx_pko_l5_sq_csr_bus_debug_s {
+               u64 csr_bus_debug : 64;
+       } s;
+       struct cvmx_pko_l5_sq_csr_bus_debug_s cn78xx;
+       struct cvmx_pko_l5_sq_csr_bus_debug_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sq_csr_bus_debug cvmx_pko_l5_sq_csr_bus_debug_t;
+
+/**
+ * cvmx_pko_l5_sqa_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l5_sqa_debug {
+       u64 u64;
+       struct cvmx_pko_l5_sqa_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l5_sqa_debug_s cn78xx;
+       struct cvmx_pko_l5_sqa_debug_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqa_debug cvmx_pko_l5_sqa_debug_t;
+
+/**
+ * cvmx_pko_l5_sqb_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_l5_sqb_debug {
+       u64 u64;
+       struct cvmx_pko_l5_sqb_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_l5_sqb_debug_s cn78xx;
+       struct cvmx_pko_l5_sqb_debug_s cn78xxp1;
+};
+
+typedef union cvmx_pko_l5_sqb_debug cvmx_pko_l5_sqb_debug_t;
+
+/**
+ * cvmx_pko_lut#
+ *
+ * PKO_LUT has a location for each used PKI_CHAN_E. The following table
+ * shows the mapping between LINK/MAC_NUM's, PKI_CHAN_E channels, and
+ * PKO_LUT indices.
+ *
+ * <pre>
+ *   LINK/   PKI_CHAN_E    Corresponding
+ * MAC_NUM   Range         PKO_LUT index   Description
+ * -------   -----------   -------------   -----------------
+ *     0     0x000-0x03F   0x040-0x07F     LBK Loopback
+ *     1     0x100-0x13F   0x080-0x0BF     DPI packet output
+ *     2     0x800-0x80F   0x000-0x00F     BGX0 Logical MAC 0
+ *     3     0x810-0x81F   0x010-0x01F     BGX0 Logical MAC 1
+ *     4     0x820-0x82F   0x020-0x02F     BGX0 Logical MAC 2
+ *     5     0x830-0x83F   0x030-0x03F     BGX0 Logical MAC 3
+ * </pre>
+ */
+union cvmx_pko_lutx {
+       u64 u64;
+       struct cvmx_pko_lutx_s {
+               u64 reserved_16_63 : 48;
+               u64 valid : 1;
+               u64 reserved_14_14 : 1;
+               u64 pq_idx : 5;
+               u64 queue_number : 9;
+       } s;
+       struct cvmx_pko_lutx_cn73xx {
+               u64 reserved_16_63 : 48;
+               u64 valid : 1;
+               u64 reserved_13_14 : 2;
+               u64 pq_idx : 4;
+               u64 reserved_8_8 : 1;
+               u64 queue_number : 8;
+       } cn73xx;
+       struct cvmx_pko_lutx_s cn78xx;
+       struct cvmx_pko_lutx_s cn78xxp1;
+       struct cvmx_pko_lutx_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_lutx cvmx_pko_lutx_t;
+
+/**
+ * cvmx_pko_lut_bist_status
+ */
+union cvmx_pko_lut_bist_status {
+       u64 u64;
+       struct cvmx_pko_lut_bist_status_s {
+               u64 reserved_1_63 : 63;
+               u64 bist_status : 1;
+       } s;
+       struct cvmx_pko_lut_bist_status_s cn73xx;
+       struct cvmx_pko_lut_bist_status_s cn78xx;
+       struct cvmx_pko_lut_bist_status_s cn78xxp1;
+       struct cvmx_pko_lut_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_pko_lut_bist_status cvmx_pko_lut_bist_status_t;
+
+/**
+ * cvmx_pko_lut_ecc_ctl0
+ */
+union cvmx_pko_lut_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_lut_ecc_ctl0_s {
+               u64 c2q_lut_ram_flip : 2;
+               u64 c2q_lut_ram_cdis : 1;
+               u64 reserved_0_60 : 61;
+       } s;
+       struct cvmx_pko_lut_ecc_ctl0_s cn73xx;
+       struct cvmx_pko_lut_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_lut_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_lut_ecc_ctl0_s cnf75xx;
+};
+
+typedef union cvmx_pko_lut_ecc_ctl0 cvmx_pko_lut_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_lut_ecc_dbe_sts0
+ */
+union cvmx_pko_lut_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_lut_ecc_dbe_sts0_s {
+               u64 c2q_lut_ram_dbe : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_lut_ecc_dbe_sts0_s cn73xx;
+       struct cvmx_pko_lut_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_lut_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_lut_ecc_dbe_sts0_s cnf75xx;
+};
+
+typedef union cvmx_pko_lut_ecc_dbe_sts0 cvmx_pko_lut_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_lut_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_lut_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_lut_ecc_dbe_sts_cmb0_s {
+               u64 lut_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_lut_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_lut_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_lut_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_lut_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_lut_ecc_dbe_sts_cmb0 cvmx_pko_lut_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_lut_ecc_sbe_sts0
+ */
+union cvmx_pko_lut_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_lut_ecc_sbe_sts0_s {
+               u64 c2q_lut_ram_sbe : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_lut_ecc_sbe_sts0_s cn73xx;
+       struct cvmx_pko_lut_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_lut_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_lut_ecc_sbe_sts0_s cnf75xx;
+};
+
+typedef union cvmx_pko_lut_ecc_sbe_sts0 cvmx_pko_lut_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_lut_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_lut_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_lut_ecc_sbe_sts_cmb0_s {
+               u64 lut_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_lut_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_lut_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_lut_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_lut_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_lut_ecc_sbe_sts_cmb0 cvmx_pko_lut_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_mac#_cfg
+ *
+ * These registers create the links between the MACs and the TxFIFO used to store the data,
+ * and hold the per-MAC configuration bits.  These registers must be disabled (FIFO_NUM set
+ * to 31) prior to reconfiguration of any of the other bits.
+ *
+ * <pre>
+ *   CSR Name       Associated MAC
+ *   ------------   -------------------
+ *   PKO_MAC0_CFG   LBK loopback
+ *   PKO_MAC1_CFG   DPI packet output
+ *   PKO_MAC2_CFG   BGX0  logical MAC 0
+ *   PKO_MAC3_CFG   BGX0  logical MAC 1
+ *   PKO_MAC4_CFG   BGX0  logical MAC 2
+ *   PKO_MAC5_CFG   BGX0  logical MAC 3
+ *   PKO_MAC6_CFG   SRIO0 logical MAC 0
+ *   PKO_MAC7_CFG   SRIO0 logical MAC 1
+ *   PKO_MAC8_CFG   SRIO1 logical MAC 0
+ *   PKO_MAC9_CFG   SRIO1 logical MAC 1
+ * </pre>
+ */
+union cvmx_pko_macx_cfg {
+       u64 u64;
+       struct cvmx_pko_macx_cfg_s {
+               u64 reserved_17_63 : 47;
+               u64 min_pad_ena : 1;
+               u64 fcs_ena : 1;
+               u64 fcs_sop_off : 8;
+               u64 skid_max_cnt : 2;
+               u64 fifo_num : 5;
+       } s;
+       struct cvmx_pko_macx_cfg_s cn73xx;
+       struct cvmx_pko_macx_cfg_s cn78xx;
+       struct cvmx_pko_macx_cfg_s cn78xxp1;
+       struct cvmx_pko_macx_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pko_macx_cfg cvmx_pko_macx_cfg_t;
+
+/**
+ * cvmx_pko_mci0_cred_cnt#
+ */
+union cvmx_pko_mci0_cred_cntx {
+       u64 u64;
+       struct cvmx_pko_mci0_cred_cntx_s {
+               u64 reserved_13_63 : 51;
+               u64 cred_cnt : 13;
+       } s;
+       struct cvmx_pko_mci0_cred_cntx_s cn78xx;
+       struct cvmx_pko_mci0_cred_cntx_s cn78xxp1;
+};
+
+typedef union cvmx_pko_mci0_cred_cntx cvmx_pko_mci0_cred_cntx_t;
+
+/**
+ * cvmx_pko_mci0_max_cred#
+ */
+union cvmx_pko_mci0_max_credx {
+       u64 u64;
+       struct cvmx_pko_mci0_max_credx_s {
+               u64 reserved_12_63 : 52;
+               u64 max_cred_lim : 12;
+       } s;
+       struct cvmx_pko_mci0_max_credx_s cn78xx;
+       struct cvmx_pko_mci0_max_credx_s cn78xxp1;
+};
+
+typedef union cvmx_pko_mci0_max_credx cvmx_pko_mci0_max_credx_t;
+
+/**
+ * cvmx_pko_mci1_cred_cnt#
+ */
+union cvmx_pko_mci1_cred_cntx {
+       u64 u64;
+       struct cvmx_pko_mci1_cred_cntx_s {
+               u64 reserved_13_63 : 51;
+               u64 cred_cnt : 13;
+       } s;
+       struct cvmx_pko_mci1_cred_cntx_s cn73xx;
+       struct cvmx_pko_mci1_cred_cntx_s cn78xx;
+       struct cvmx_pko_mci1_cred_cntx_s cn78xxp1;
+       struct cvmx_pko_mci1_cred_cntx_s cnf75xx;
+};
+
+typedef union cvmx_pko_mci1_cred_cntx cvmx_pko_mci1_cred_cntx_t;
+
+/**
+ * cvmx_pko_mci1_max_cred#
+ */
+union cvmx_pko_mci1_max_credx {
+       u64 u64;
+       struct cvmx_pko_mci1_max_credx_s {
+               u64 reserved_12_63 : 52;
+               u64 max_cred_lim : 12;
+       } s;
+       struct cvmx_pko_mci1_max_credx_s cn73xx;
+       struct cvmx_pko_mci1_max_credx_s cn78xx;
+       struct cvmx_pko_mci1_max_credx_s cn78xxp1;
+       struct cvmx_pko_mci1_max_credx_s cnf75xx;
+};
+
+typedef union cvmx_pko_mci1_max_credx cvmx_pko_mci1_max_credx_t;
+
+/**
+ * cvmx_pko_mem_count0
+ *
+ * Notes:
+ * Total number of packets seen by PKO, per port
+ * A write to this address will clear the entry whose index is specified as COUNT[5:0].
+ * This CSR is a memory of 44 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_count0 {
+       u64 u64;
+       struct cvmx_pko_mem_count0_s {
+               u64 reserved_32_63 : 32;
+               u64 count : 32;
+       } s;
+       struct cvmx_pko_mem_count0_s cn30xx;
+       struct cvmx_pko_mem_count0_s cn31xx;
+       struct cvmx_pko_mem_count0_s cn38xx;
+       struct cvmx_pko_mem_count0_s cn38xxp2;
+       struct cvmx_pko_mem_count0_s cn50xx;
+       struct cvmx_pko_mem_count0_s cn52xx;
+       struct cvmx_pko_mem_count0_s cn52xxp1;
+       struct cvmx_pko_mem_count0_s cn56xx;
+       struct cvmx_pko_mem_count0_s cn56xxp1;
+       struct cvmx_pko_mem_count0_s cn58xx;
+       struct cvmx_pko_mem_count0_s cn58xxp1;
+       struct cvmx_pko_mem_count0_s cn61xx;
+       struct cvmx_pko_mem_count0_s cn63xx;
+       struct cvmx_pko_mem_count0_s cn63xxp1;
+       struct cvmx_pko_mem_count0_s cn66xx;
+       struct cvmx_pko_mem_count0_s cn68xx;
+       struct cvmx_pko_mem_count0_s cn68xxp1;
+       struct cvmx_pko_mem_count0_s cn70xx;
+       struct cvmx_pko_mem_count0_s cn70xxp1;
+       struct cvmx_pko_mem_count0_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_count0 cvmx_pko_mem_count0_t;
+
+/**
+ * cvmx_pko_mem_count1
+ *
+ * Notes:
+ * Total number of bytes seen by PKO, per port
+ * A write to this address will clear the entry whose index is specified as COUNT[5:0].
+ * This CSR is a memory of 44 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_count1 {
+       u64 u64;
+       struct cvmx_pko_mem_count1_s {
+               u64 reserved_48_63 : 16;
+               u64 count : 48;
+       } s;
+       struct cvmx_pko_mem_count1_s cn30xx;
+       struct cvmx_pko_mem_count1_s cn31xx;
+       struct cvmx_pko_mem_count1_s cn38xx;
+       struct cvmx_pko_mem_count1_s cn38xxp2;
+       struct cvmx_pko_mem_count1_s cn50xx;
+       struct cvmx_pko_mem_count1_s cn52xx;
+       struct cvmx_pko_mem_count1_s cn52xxp1;
+       struct cvmx_pko_mem_count1_s cn56xx;
+       struct cvmx_pko_mem_count1_s cn56xxp1;
+       struct cvmx_pko_mem_count1_s cn58xx;
+       struct cvmx_pko_mem_count1_s cn58xxp1;
+       struct cvmx_pko_mem_count1_s cn61xx;
+       struct cvmx_pko_mem_count1_s cn63xx;
+       struct cvmx_pko_mem_count1_s cn63xxp1;
+       struct cvmx_pko_mem_count1_s cn66xx;
+       struct cvmx_pko_mem_count1_s cn68xx;
+       struct cvmx_pko_mem_count1_s cn68xxp1;
+       struct cvmx_pko_mem_count1_s cn70xx;
+       struct cvmx_pko_mem_count1_s cn70xxp1;
+       struct cvmx_pko_mem_count1_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_count1 cvmx_pko_mem_count1_t;
+
+/**
+ * cvmx_pko_mem_debug0
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko_prt_psb.cmnd[63:0]
+ * This CSR is a memory of 12 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug0 {
+       u64 u64;
+       struct cvmx_pko_mem_debug0_s {
+               u64 fau : 28;
+               u64 cmd : 14;
+               u64 segs : 6;
+               u64 size : 16;
+       } s;
+       struct cvmx_pko_mem_debug0_s cn30xx;
+       struct cvmx_pko_mem_debug0_s cn31xx;
+       struct cvmx_pko_mem_debug0_s cn38xx;
+       struct cvmx_pko_mem_debug0_s cn38xxp2;
+       struct cvmx_pko_mem_debug0_s cn50xx;
+       struct cvmx_pko_mem_debug0_s cn52xx;
+       struct cvmx_pko_mem_debug0_s cn52xxp1;
+       struct cvmx_pko_mem_debug0_s cn56xx;
+       struct cvmx_pko_mem_debug0_s cn56xxp1;
+       struct cvmx_pko_mem_debug0_s cn58xx;
+       struct cvmx_pko_mem_debug0_s cn58xxp1;
+       struct cvmx_pko_mem_debug0_s cn61xx;
+       struct cvmx_pko_mem_debug0_s cn63xx;
+       struct cvmx_pko_mem_debug0_s cn63xxp1;
+       struct cvmx_pko_mem_debug0_s cn66xx;
+       struct cvmx_pko_mem_debug0_s cn68xx;
+       struct cvmx_pko_mem_debug0_s cn68xxp1;
+       struct cvmx_pko_mem_debug0_s cn70xx;
+       struct cvmx_pko_mem_debug0_s cn70xxp1;
+       struct cvmx_pko_mem_debug0_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug0 cvmx_pko_mem_debug0_t;
+
+/**
+ * cvmx_pko_mem_debug1
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko_prt_psb.curr[63:0]
+ * This CSR is a memory of 12 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug1 {
+       u64 u64;
+       struct cvmx_pko_mem_debug1_s {
+               u64 i : 1;
+               u64 back : 4;
+               u64 pool : 3;
+               u64 size : 16;
+               u64 ptr : 40;
+       } s;
+       struct cvmx_pko_mem_debug1_s cn30xx;
+       struct cvmx_pko_mem_debug1_s cn31xx;
+       struct cvmx_pko_mem_debug1_s cn38xx;
+       struct cvmx_pko_mem_debug1_s cn38xxp2;
+       struct cvmx_pko_mem_debug1_s cn50xx;
+       struct cvmx_pko_mem_debug1_s cn52xx;
+       struct cvmx_pko_mem_debug1_s cn52xxp1;
+       struct cvmx_pko_mem_debug1_s cn56xx;
+       struct cvmx_pko_mem_debug1_s cn56xxp1;
+       struct cvmx_pko_mem_debug1_s cn58xx;
+       struct cvmx_pko_mem_debug1_s cn58xxp1;
+       struct cvmx_pko_mem_debug1_s cn61xx;
+       struct cvmx_pko_mem_debug1_s cn63xx;
+       struct cvmx_pko_mem_debug1_s cn63xxp1;
+       struct cvmx_pko_mem_debug1_s cn66xx;
+       struct cvmx_pko_mem_debug1_s cn68xx;
+       struct cvmx_pko_mem_debug1_s cn68xxp1;
+       struct cvmx_pko_mem_debug1_s cn70xx;
+       struct cvmx_pko_mem_debug1_s cn70xxp1;
+       struct cvmx_pko_mem_debug1_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug1 cvmx_pko_mem_debug1_t;
+
+/**
+ * cvmx_pko_mem_debug10
+ *
+ * Notes:
+ * Internal per-engine state intended for debug use only - pko.dat.ptr.ptrs1, pko.dat.ptr.ptrs2
+ * This CSR is a memory of 10 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug10 {
+       u64 u64;
+       struct cvmx_pko_mem_debug10_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug10_cn30xx {
+               u64 fau : 28;
+               u64 cmd : 14;
+               u64 segs : 6;
+               u64 size : 16;
+       } cn30xx;
+       struct cvmx_pko_mem_debug10_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug10_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug10_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug10_cn50xx {
+               u64 reserved_49_63 : 15;
+               u64 ptrs1 : 17;
+               u64 reserved_17_31 : 15;
+               u64 ptrs2 : 17;
+       } cn50xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn52xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn52xxp1;
+       struct cvmx_pko_mem_debug10_cn50xx cn56xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn56xxp1;
+       struct cvmx_pko_mem_debug10_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug10_cn50xx cn61xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn63xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn63xxp1;
+       struct cvmx_pko_mem_debug10_cn50xx cn66xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn68xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn68xxp1;
+       struct cvmx_pko_mem_debug10_cn50xx cn70xx;
+       struct cvmx_pko_mem_debug10_cn50xx cn70xxp1;
+       struct cvmx_pko_mem_debug10_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug10 cvmx_pko_mem_debug10_t;
+
+/**
+ * cvmx_pko_mem_debug11
+ *
+ * Notes:
+ * Internal per-engine state intended for debug use only - pko.out.sta.state[22:0]
+ * This CSR is a memory of 10 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug11 {
+       u64 u64;
+       struct cvmx_pko_mem_debug11_s {
+               u64 i : 1;
+               u64 back : 4;
+               u64 pool : 3;
+               u64 size : 16;
+               u64 reserved_0_39 : 40;
+       } s;
+       struct cvmx_pko_mem_debug11_cn30xx {
+               u64 i : 1;
+               u64 back : 4;
+               u64 pool : 3;
+               u64 size : 16;
+               u64 ptr : 40;
+       } cn30xx;
+       struct cvmx_pko_mem_debug11_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug11_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug11_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug11_cn50xx {
+               u64 reserved_23_63 : 41;
+               u64 maj : 1;
+               u64 uid : 3;
+               u64 sop : 1;
+               u64 len : 1;
+               u64 chk : 1;
+               u64 cnt : 13;
+               u64 mod : 3;
+       } cn50xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn52xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn52xxp1;
+       struct cvmx_pko_mem_debug11_cn50xx cn56xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn56xxp1;
+       struct cvmx_pko_mem_debug11_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug11_cn50xx cn61xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn63xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn63xxp1;
+       struct cvmx_pko_mem_debug11_cn50xx cn66xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn68xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn68xxp1;
+       struct cvmx_pko_mem_debug11_cn50xx cn70xx;
+       struct cvmx_pko_mem_debug11_cn50xx cn70xxp1;
+       struct cvmx_pko_mem_debug11_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug11 cvmx_pko_mem_debug11_t;
+
+/**
+ * cvmx_pko_mem_debug12
+ *
+ * Notes:
+ * Internal per-engine x4 state intended for debug use only - pko.out.ctl.cmnd[63:0]
+ * This CSR is a memory of 40 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug12 {
+       u64 u64;
+       struct cvmx_pko_mem_debug12_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug12_cn30xx {
+               u64 data : 64;
+       } cn30xx;
+       struct cvmx_pko_mem_debug12_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug12_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug12_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug12_cn50xx {
+               u64 fau : 28;
+               u64 cmd : 14;
+               u64 segs : 6;
+               u64 size : 16;
+       } cn50xx;
+       struct cvmx_pko_mem_debug12_cn50xx cn52xx;
+       struct cvmx_pko_mem_debug12_cn50xx cn52xxp1;
+       struct cvmx_pko_mem_debug12_cn50xx cn56xx;
+       struct cvmx_pko_mem_debug12_cn50xx cn56xxp1;
+       struct cvmx_pko_mem_debug12_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug12_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug12_cn50xx cn61xx;
+       struct cvmx_pko_mem_debug12_cn50xx cn63xx;
+       struct cvmx_pko_mem_debug12_cn50xx cn63xxp1;
+       struct cvmx_pko_mem_debug12_cn50xx cn66xx;
+       struct cvmx_pko_mem_debug12_cn68xx {
+               u64 state : 64;
+       } cn68xx;
+       struct cvmx_pko_mem_debug12_cn68xx cn68xxp1;
+       struct cvmx_pko_mem_debug12_cn50xx cn70xx;
+       struct cvmx_pko_mem_debug12_cn50xx cn70xxp1;
+       struct cvmx_pko_mem_debug12_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug12 cvmx_pko_mem_debug12_t;
+
+/**
+ * cvmx_pko_mem_debug13
+ *
+ * Notes:
+ * Internal per-engine x4 state intended for debug use only - pko.out.ctl.head[63:0]
+ * This CSR is a memory of 40 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug13 {
+       u64 u64;
+       struct cvmx_pko_mem_debug13_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug13_cn30xx {
+               u64 reserved_51_63 : 13;
+               u64 widx : 17;
+               u64 ridx2 : 17;
+               u64 widx2 : 17;
+       } cn30xx;
+       struct cvmx_pko_mem_debug13_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug13_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug13_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug13_cn50xx {
+               u64 i : 1;
+               u64 back : 4;
+               u64 pool : 3;
+               u64 size : 16;
+               u64 ptr : 40;
+       } cn50xx;
+       struct cvmx_pko_mem_debug13_cn50xx cn52xx;
+       struct cvmx_pko_mem_debug13_cn50xx cn52xxp1;
+       struct cvmx_pko_mem_debug13_cn50xx cn56xx;
+       struct cvmx_pko_mem_debug13_cn50xx cn56xxp1;
+       struct cvmx_pko_mem_debug13_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug13_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug13_cn50xx cn61xx;
+       struct cvmx_pko_mem_debug13_cn50xx cn63xx;
+       struct cvmx_pko_mem_debug13_cn50xx cn63xxp1;
+       struct cvmx_pko_mem_debug13_cn50xx cn66xx;
+       struct cvmx_pko_mem_debug13_cn68xx {
+               u64 state : 64;
+       } cn68xx;
+       struct cvmx_pko_mem_debug13_cn68xx cn68xxp1;
+       struct cvmx_pko_mem_debug13_cn50xx cn70xx;
+       struct cvmx_pko_mem_debug13_cn50xx cn70xxp1;
+       struct cvmx_pko_mem_debug13_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug13 cvmx_pko_mem_debug13_t;
+
+/**
+ * cvmx_pko_mem_debug14
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko.prt.psb.save[63:0]
+ * This CSR is a memory of 132 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug14 {
+       u64 u64;
+       struct cvmx_pko_mem_debug14_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug14_cn30xx {
+               u64 reserved_17_63 : 47;
+               u64 ridx : 17;
+       } cn30xx;
+       struct cvmx_pko_mem_debug14_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug14_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug14_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug14_cn52xx {
+               u64 data : 64;
+       } cn52xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_debug14_cn52xx cn56xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn56xxp1;
+       struct cvmx_pko_mem_debug14_cn52xx cn61xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn63xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn63xxp1;
+       struct cvmx_pko_mem_debug14_cn52xx cn66xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn70xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn70xxp1;
+       struct cvmx_pko_mem_debug14_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug14 cvmx_pko_mem_debug14_t;
+
+/**
+ * cvmx_pko_mem_debug2
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko_prt_psb.head[63:0]
+ * This CSR is a memory of 12 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug2 {
+       u64 u64;
+       struct cvmx_pko_mem_debug2_s {
+               u64 i : 1;
+               u64 back : 4;
+               u64 pool : 3;
+               u64 size : 16;
+               u64 ptr : 40;
+       } s;
+       struct cvmx_pko_mem_debug2_s cn30xx;
+       struct cvmx_pko_mem_debug2_s cn31xx;
+       struct cvmx_pko_mem_debug2_s cn38xx;
+       struct cvmx_pko_mem_debug2_s cn38xxp2;
+       struct cvmx_pko_mem_debug2_s cn50xx;
+       struct cvmx_pko_mem_debug2_s cn52xx;
+       struct cvmx_pko_mem_debug2_s cn52xxp1;
+       struct cvmx_pko_mem_debug2_s cn56xx;
+       struct cvmx_pko_mem_debug2_s cn56xxp1;
+       struct cvmx_pko_mem_debug2_s cn58xx;
+       struct cvmx_pko_mem_debug2_s cn58xxp1;
+       struct cvmx_pko_mem_debug2_s cn61xx;
+       struct cvmx_pko_mem_debug2_s cn63xx;
+       struct cvmx_pko_mem_debug2_s cn63xxp1;
+       struct cvmx_pko_mem_debug2_s cn66xx;
+       struct cvmx_pko_mem_debug2_s cn68xx;
+       struct cvmx_pko_mem_debug2_s cn68xxp1;
+       struct cvmx_pko_mem_debug2_s cn70xx;
+       struct cvmx_pko_mem_debug2_s cn70xxp1;
+       struct cvmx_pko_mem_debug2_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug2 cvmx_pko_mem_debug2_t;
+
+/**
+ * cvmx_pko_mem_debug3
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko_prt_psb.resp[63:0]
+ * This CSR is a memory of 12 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug3 {
+       u64 u64;
+       struct cvmx_pko_mem_debug3_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug3_cn30xx {
+               u64 i : 1;
+               u64 back : 4;
+               u64 pool : 3;
+               u64 size : 16;
+               u64 ptr : 40;
+       } cn30xx;
+       struct cvmx_pko_mem_debug3_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug3_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug3_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug3_cn50xx {
+               u64 data : 64;
+       } cn50xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn52xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn52xxp1;
+       struct cvmx_pko_mem_debug3_cn50xx cn56xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn56xxp1;
+       struct cvmx_pko_mem_debug3_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug3_cn50xx cn61xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn63xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn63xxp1;
+       struct cvmx_pko_mem_debug3_cn50xx cn66xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn68xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn68xxp1;
+       struct cvmx_pko_mem_debug3_cn50xx cn70xx;
+       struct cvmx_pko_mem_debug3_cn50xx cn70xxp1;
+       struct cvmx_pko_mem_debug3_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug3 cvmx_pko_mem_debug3_t;
+
+/**
+ * cvmx_pko_mem_debug4
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko_prt_psb.state[63:0]
+ * This CSR is a memory of 12 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug4 {
+       u64 u64;
+       struct cvmx_pko_mem_debug4_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug4_cn30xx {
+               u64 data : 64;
+       } cn30xx;
+       struct cvmx_pko_mem_debug4_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug4_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug4_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug4_cn50xx {
+               u64 cmnd_segs : 3;
+               u64 cmnd_siz : 16;
+               u64 cmnd_off : 6;
+               u64 uid : 3;
+               u64 dread_sop : 1;
+               u64 init_dwrite : 1;
+               u64 chk_once : 1;
+               u64 chk_mode : 1;
+               u64 active : 1;
+               u64 static_p : 1;
+               u64 qos : 3;
+               u64 qcb_ridx : 5;
+               u64 qid_off_max : 4;
+               u64 qid_off : 4;
+               u64 qid_base : 8;
+               u64 wait : 1;
+               u64 minor : 2;
+               u64 major : 3;
+       } cn50xx;
+       struct cvmx_pko_mem_debug4_cn52xx {
+               u64 curr_siz : 8;
+               u64 curr_off : 16;
+               u64 cmnd_segs : 6;
+               u64 cmnd_siz : 16;
+               u64 cmnd_off : 6;
+               u64 uid : 2;
+               u64 dread_sop : 1;
+               u64 init_dwrite : 1;
+               u64 chk_once : 1;
+               u64 chk_mode : 1;
+               u64 wait : 1;
+               u64 minor : 2;
+               u64 major : 3;
+       } cn52xx;
+       struct cvmx_pko_mem_debug4_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_debug4_cn52xx cn56xx;
+       struct cvmx_pko_mem_debug4_cn52xx cn56xxp1;
+       struct cvmx_pko_mem_debug4_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug4_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug4_cn52xx cn61xx;
+       struct cvmx_pko_mem_debug4_cn52xx cn63xx;
+       struct cvmx_pko_mem_debug4_cn52xx cn63xxp1;
+       struct cvmx_pko_mem_debug4_cn52xx cn66xx;
+       struct cvmx_pko_mem_debug4_cn68xx {
+               u64 curr_siz : 9;
+               u64 curr_off : 16;
+               u64 cmnd_segs : 6;
+               u64 cmnd_siz : 16;
+               u64 cmnd_off : 6;
+               u64 dread_sop : 1;
+               u64 init_dwrite : 1;
+               u64 chk_once : 1;
+               u64 chk_mode : 1;
+               u64 reserved_6_6 : 1;
+               u64 minor : 2;
+               u64 major : 4;
+       } cn68xx;
+       struct cvmx_pko_mem_debug4_cn68xx cn68xxp1;
+       struct cvmx_pko_mem_debug4_cn52xx cn70xx;
+       struct cvmx_pko_mem_debug4_cn52xx cn70xxp1;
+       struct cvmx_pko_mem_debug4_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug4 cvmx_pko_mem_debug4_t;
+
+/**
+ * cvmx_pko_mem_debug5
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko_prt_psb.state[127:64]
+ * This CSR is a memory of 12 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug5 {
+       u64 u64;
+       struct cvmx_pko_mem_debug5_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug5_cn30xx {
+               u64 dwri_mod : 1;
+               u64 dwri_sop : 1;
+               u64 dwri_len : 1;
+               u64 dwri_cnt : 13;
+               u64 cmnd_siz : 16;
+               u64 uid : 1;
+               u64 xfer_wor : 1;
+               u64 xfer_dwr : 1;
+               u64 cbuf_fre : 1;
+               u64 reserved_27_27 : 1;
+               u64 chk_mode : 1;
+               u64 active : 1;
+               u64 qos : 3;
+               u64 qcb_ridx : 5;
+               u64 qid_off : 3;
+               u64 qid_base : 7;
+               u64 wait : 1;
+               u64 minor : 2;
+               u64 major : 4;
+       } cn30xx;
+       struct cvmx_pko_mem_debug5_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug5_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug5_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug5_cn50xx {
+               u64 curr_ptr : 29;
+               u64 curr_siz : 16;
+               u64 curr_off : 16;
+               u64 cmnd_segs : 3;
+       } cn50xx;
+       struct cvmx_pko_mem_debug5_cn52xx {
+               u64 reserved_54_63 : 10;
+               u64 nxt_inflt : 6;
+               u64 curr_ptr : 40;
+               u64 curr_siz : 8;
+       } cn52xx;
+       struct cvmx_pko_mem_debug5_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_debug5_cn52xx cn56xx;
+       struct cvmx_pko_mem_debug5_cn52xx cn56xxp1;
+       struct cvmx_pko_mem_debug5_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug5_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug5_cn61xx {
+               u64 reserved_56_63 : 8;
+               u64 ptp : 1;
+               u64 major_3 : 1;
+               u64 nxt_inflt : 6;
+               u64 curr_ptr : 40;
+               u64 curr_siz : 8;
+       } cn61xx;
+       struct cvmx_pko_mem_debug5_cn61xx cn63xx;
+       struct cvmx_pko_mem_debug5_cn61xx cn63xxp1;
+       struct cvmx_pko_mem_debug5_cn61xx cn66xx;
+       struct cvmx_pko_mem_debug5_cn68xx {
+               u64 reserved_57_63 : 7;
+               u64 uid : 3;
+               u64 ptp : 1;
+               u64 nxt_inflt : 6;
+               u64 curr_ptr : 40;
+               u64 curr_siz : 7;
+       } cn68xx;
+       struct cvmx_pko_mem_debug5_cn68xx cn68xxp1;
+       struct cvmx_pko_mem_debug5_cn61xx cn70xx;
+       struct cvmx_pko_mem_debug5_cn61xx cn70xxp1;
+       struct cvmx_pko_mem_debug5_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug5 cvmx_pko_mem_debug5_t;
+
+/**
+ * cvmx_pko_mem_debug6
+ *
+ * Notes:
+ * Internal per-port state intended for debug use only - pko_prt_psb.port[63:0]
+ * This CSR is a memory of 44 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug6 {
+       u64 u64;
+       struct cvmx_pko_mem_debug6_s {
+               u64 reserved_38_63 : 26;
+               u64 qos_active : 1;
+               u64 reserved_0_36 : 37;
+       } s;
+       struct cvmx_pko_mem_debug6_cn30xx {
+               u64 reserved_11_63 : 53;
+               u64 qid_offm : 3;
+               u64 static_p : 1;
+               u64 work_min : 3;
+               u64 dwri_chk : 1;
+               u64 dwri_uid : 1;
+               u64 dwri_mod : 2;
+       } cn30xx;
+       struct cvmx_pko_mem_debug6_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug6_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug6_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug6_cn50xx {
+               u64 reserved_11_63 : 53;
+               u64 curr_ptr : 11;
+       } cn50xx;
+       struct cvmx_pko_mem_debug6_cn52xx {
+               u64 reserved_37_63 : 27;
+               u64 qid_offres : 4;
+               u64 qid_offths : 4;
+               u64 preempter : 1;
+               u64 preemptee : 1;
+               u64 preempted : 1;
+               u64 active : 1;
+               u64 statc : 1;
+               u64 qos : 3;
+               u64 qcb_ridx : 5;
+               u64 qid_offmax : 4;
+               u64 qid_off : 4;
+               u64 qid_base : 8;
+       } cn52xx;
+       struct cvmx_pko_mem_debug6_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_debug6_cn52xx cn56xx;
+       struct cvmx_pko_mem_debug6_cn52xx cn56xxp1;
+       struct cvmx_pko_mem_debug6_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug6_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug6_cn52xx cn61xx;
+       struct cvmx_pko_mem_debug6_cn52xx cn63xx;
+       struct cvmx_pko_mem_debug6_cn52xx cn63xxp1;
+       struct cvmx_pko_mem_debug6_cn52xx cn66xx;
+       struct cvmx_pko_mem_debug6_cn68xx {
+               u64 reserved_38_63 : 26;
+               u64 qos_active : 1;
+               u64 qid_offths : 5;
+               u64 preempter : 1;
+               u64 preemptee : 1;
+               u64 active : 1;
+               u64 static_p : 1;
+               u64 qos : 3;
+               u64 qcb_ridx : 7;
+               u64 qid_offmax : 5;
+               u64 qid_off : 5;
+               u64 qid_base : 8;
+       } cn68xx;
+       struct cvmx_pko_mem_debug6_cn68xx cn68xxp1;
+       struct cvmx_pko_mem_debug6_cn70xx {
+               u64 reserved_63_37 : 27;
+               u64 qid_offres : 4;
+               u64 qid_offths : 4;
+               u64 preempter : 1;
+               u64 preemptee : 1;
+               u64 preempted : 1;
+               u64 active : 1;
+               u64 staticb : 1;
+               u64 qos : 3;
+               u64 qcb_ridx : 5;
+               u64 qid_offmax : 4;
+               u64 qid_off : 4;
+               u64 qid_base : 8;
+       } cn70xx;
+       struct cvmx_pko_mem_debug6_cn70xx cn70xxp1;
+       struct cvmx_pko_mem_debug6_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug6 cvmx_pko_mem_debug6_t;
+
+/**
+ * cvmx_pko_mem_debug7
+ *
+ * Notes:
+ * Internal per-queue state intended for debug use only - pko_prt_qsb.state[63:0]
+ * This CSR is a memory of 256 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug7 {
+       u64 u64;
+       struct cvmx_pko_mem_debug7_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_mem_debug7_cn30xx {
+               u64 reserved_58_63 : 6;
+               u64 dwb : 9;
+               u64 start : 33;
+               u64 size : 16;
+       } cn30xx;
+       struct cvmx_pko_mem_debug7_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug7_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug7_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug7_cn50xx {
+               u64 qos : 5;
+               u64 tail : 1;
+               u64 buf_siz : 13;
+               u64 buf_ptr : 33;
+               u64 qcb_widx : 6;
+               u64 qcb_ridx : 6;
+       } cn50xx;
+       struct cvmx_pko_mem_debug7_cn50xx cn52xx;
+       struct cvmx_pko_mem_debug7_cn50xx cn52xxp1;
+       struct cvmx_pko_mem_debug7_cn50xx cn56xx;
+       struct cvmx_pko_mem_debug7_cn50xx cn56xxp1;
+       struct cvmx_pko_mem_debug7_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug7_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug7_cn50xx cn61xx;
+       struct cvmx_pko_mem_debug7_cn50xx cn63xx;
+       struct cvmx_pko_mem_debug7_cn50xx cn63xxp1;
+       struct cvmx_pko_mem_debug7_cn50xx cn66xx;
+       struct cvmx_pko_mem_debug7_cn68xx {
+               u64 buf_siz : 11;
+               u64 buf_ptr : 37;
+               u64 qcb_widx : 8;
+               u64 qcb_ridx : 8;
+       } cn68xx;
+       struct cvmx_pko_mem_debug7_cn68xx cn68xxp1;
+       struct cvmx_pko_mem_debug7_cn50xx cn70xx;
+       struct cvmx_pko_mem_debug7_cn50xx cn70xxp1;
+       struct cvmx_pko_mem_debug7_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug7 cvmx_pko_mem_debug7_t;
+
+/**
+ * cvmx_pko_mem_debug8
+ *
+ * Notes:
+ * Internal per-queue state intended for debug use only - pko_prt_qsb.state[91:64]
+ * This CSR is a memory of 256 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug8 {
+       u64 u64;
+       struct cvmx_pko_mem_debug8_s {
+               u64 reserved_59_63 : 5;
+               u64 tail : 1;
+               u64 reserved_0_57 : 58;
+       } s;
+       struct cvmx_pko_mem_debug8_cn30xx {
+               u64 qos : 5;
+               u64 tail : 1;
+               u64 buf_siz : 13;
+               u64 buf_ptr : 33;
+               u64 qcb_widx : 6;
+               u64 qcb_ridx : 6;
+       } cn30xx;
+       struct cvmx_pko_mem_debug8_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug8_cn30xx cn38xx;
+       struct cvmx_pko_mem_debug8_cn30xx cn38xxp2;
+       struct cvmx_pko_mem_debug8_cn50xx {
+               u64 reserved_28_63 : 36;
+               u64 doorbell : 20;
+               u64 reserved_6_7 : 2;
+               u64 static_p : 1;
+               u64 s_tail : 1;
+               u64 static_q : 1;
+               u64 qos : 3;
+       } cn50xx;
+       struct cvmx_pko_mem_debug8_cn52xx {
+               u64 reserved_29_63 : 35;
+               u64 preempter : 1;
+               u64 doorbell : 20;
+               u64 reserved_7_7 : 1;
+               u64 preemptee : 1;
+               u64 static_p : 1;
+               u64 s_tail : 1;
+               u64 static_q : 1;
+               u64 qos : 3;
+       } cn52xx;
+       struct cvmx_pko_mem_debug8_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_debug8_cn52xx cn56xx;
+       struct cvmx_pko_mem_debug8_cn52xx cn56xxp1;
+       struct cvmx_pko_mem_debug8_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug8_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug8_cn61xx {
+               u64 reserved_42_63 : 22;
+               u64 qid_qqos : 8;
+               u64 reserved_33_33 : 1;
+               u64 qid_idx : 4;
+               u64 preempter : 1;
+               u64 doorbell : 20;
+               u64 reserved_7_7 : 1;
+               u64 preemptee : 1;
+               u64 static_p : 1;
+               u64 s_tail : 1;
+               u64 static_q : 1;
+               u64 qos : 3;
+       } cn61xx;
+       struct cvmx_pko_mem_debug8_cn52xx cn63xx;
+       struct cvmx_pko_mem_debug8_cn52xx cn63xxp1;
+       struct cvmx_pko_mem_debug8_cn61xx cn66xx;
+       struct cvmx_pko_mem_debug8_cn68xx {
+               u64 reserved_50_63 : 14;
+               u64 qid_qqos : 8;
+               u64 qid_idx : 5;
+               u64 preempter : 1;
+               u64 doorbell : 20;
+               u64 reserved_9_15 : 7;
+               u64 qid_qos : 6;
+               u64 qid_tail : 1;
+               u64 buf_siz : 2;
+       } cn68xx;
+       struct cvmx_pko_mem_debug8_cn68xx cn68xxp1;
+       struct cvmx_pko_mem_debug8_cn61xx cn70xx;
+       struct cvmx_pko_mem_debug8_cn61xx cn70xxp1;
+       struct cvmx_pko_mem_debug8_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug8 cvmx_pko_mem_debug8_t;
+
+/**
+ * cvmx_pko_mem_debug9
+ *
+ * Notes:
+ * Internal per-engine state intended for debug use only - pko.dat.ptr.ptrs0, pko.dat.ptr.ptrs3
+ * This CSR is a memory of 10 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.
+ */
+union cvmx_pko_mem_debug9 {
+       u64 u64;
+       struct cvmx_pko_mem_debug9_s {
+               u64 reserved_49_63 : 15;
+               u64 ptrs0 : 17;
+               u64 reserved_0_31 : 32;
+       } s;
+       struct cvmx_pko_mem_debug9_cn30xx {
+               u64 reserved_28_63 : 36;
+               u64 doorbell : 20;
+               u64 reserved_5_7 : 3;
+               u64 s_tail : 1;
+               u64 static_q : 1;
+               u64 qos : 3;
+       } cn30xx;
+       struct cvmx_pko_mem_debug9_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug9_cn38xx {
+               u64 reserved_28_63 : 36;
+               u64 doorbell : 20;
+               u64 reserved_6_7 : 2;
+               u64 static_p : 1;
+               u64 s_tail : 1;
+               u64 static_q : 1;
+               u64 qos : 3;
+       } cn38xx;
+       struct cvmx_pko_mem_debug9_cn38xx cn38xxp2;
+       struct cvmx_pko_mem_debug9_cn50xx {
+               u64 reserved_49_63 : 15;
+               u64 ptrs0 : 17;
+               u64 reserved_17_31 : 15;
+               u64 ptrs3 : 17;
+       } cn50xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn52xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn52xxp1;
+       struct cvmx_pko_mem_debug9_cn50xx cn56xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn56xxp1;
+       struct cvmx_pko_mem_debug9_cn50xx cn58xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn58xxp1;
+       struct cvmx_pko_mem_debug9_cn50xx cn61xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn63xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn63xxp1;
+       struct cvmx_pko_mem_debug9_cn50xx cn66xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn68xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn68xxp1;
+       struct cvmx_pko_mem_debug9_cn50xx cn70xx;
+       struct cvmx_pko_mem_debug9_cn50xx cn70xxp1;
+       struct cvmx_pko_mem_debug9_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_debug9 cvmx_pko_mem_debug9_t;
+
+/**
+ * cvmx_pko_mem_iport_ptrs
+ *
+ * Notes:
+ * This CSR is a memory of 128 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  The index to this CSR is an IPORT.  A read of any
+ * entry that has not been previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_iport_ptrs {
+       u64 u64;
+       struct cvmx_pko_mem_iport_ptrs_s {
+               u64 reserved_63_63 : 1;
+               u64 crc : 1;
+               u64 static_p : 1;
+               u64 qos_mask : 8;
+               u64 min_pkt : 3;
+               u64 reserved_31_49 : 19;
+               u64 pipe : 7;
+               u64 reserved_21_23 : 3;
+               u64 intr : 5;
+               u64 reserved_13_15 : 3;
+               u64 eid : 5;
+               u64 reserved_7_7 : 1;
+               u64 ipid : 7;
+       } s;
+       struct cvmx_pko_mem_iport_ptrs_s cn68xx;
+       struct cvmx_pko_mem_iport_ptrs_s cn68xxp1;
+};
+
+typedef union cvmx_pko_mem_iport_ptrs cvmx_pko_mem_iport_ptrs_t;
+
+/**
+ * cvmx_pko_mem_iport_qos
+ *
+ * Notes:
+ * Sets the QOS mask, per port.  These QOS_MASK bits are logically and physically the same QOS_MASK
+ * bits in PKO_MEM_IPORT_PTRS.  This CSR address allows the QOS_MASK bits to be written during PKO
+ * operation without affecting any other port state.  The engine to which port PID is mapped is engine
+ * EID.  Note that the port to engine mapping must be the same as was previously programmed via the
+ * PKO_MEM_IPORT_PTRS CSR.
+ * This CSR is a memory of 128 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  The index to this CSR is an IPORT.  A read of
+ * any entry that has not been previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_iport_qos {
+       u64 u64;
+       struct cvmx_pko_mem_iport_qos_s {
+               u64 reserved_61_63 : 3;
+               u64 qos_mask : 8;
+               u64 reserved_13_52 : 40;
+               u64 eid : 5;
+               u64 reserved_7_7 : 1;
+               u64 ipid : 7;
+       } s;
+       struct cvmx_pko_mem_iport_qos_s cn68xx;
+       struct cvmx_pko_mem_iport_qos_s cn68xxp1;
+};
+
+typedef union cvmx_pko_mem_iport_qos cvmx_pko_mem_iport_qos_t;
+
+/**
+ * cvmx_pko_mem_iqueue_ptrs
+ *
+ * Notes:
+ * Sets the queue to port mapping and the initial command buffer pointer, per queue.  Unused queues must
+ * set BUF_PTR=0.  Each queue may map to at most one port.  No more than 32 queues may map to a port.
+ * The set of queues that is mapped to a port must be a contiguous array of queues.  The port to which
+ * queue QID is mapped is port IPID.  The index of queue QID in port IPID's queue list is IDX.  The last
+ * queue in port IPID's queue array must have its TAIL bit set.
+ * STATIC_Q marks queue QID as having static priority.  STATIC_P marks the port IPID to which QID is
+ * mapped as having at least one queue with static priority.  If any QID that maps to IPID has static
+ * priority, then all QID that map to IPID must have STATIC_P set.  Queues marked as static priority
+ * must be contiguous and begin at IDX 0.  The last queue that is marked as having static priority
+ * must have its S_TAIL bit set.
+ * This CSR is a memory of 256 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  The index to this CSR is an IQUEUE.  A read of any
+ * entry that has not been previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_iqueue_ptrs {
+       u64 u64;
+       struct cvmx_pko_mem_iqueue_ptrs_s {
+               u64 s_tail : 1;
+               u64 static_p : 1;
+               u64 static_q : 1;
+               u64 qos_mask : 8;
+               u64 buf_ptr : 31;
+               u64 tail : 1;
+               u64 index : 5;
+               u64 reserved_15_15 : 1;
+               u64 ipid : 7;
+               u64 qid : 8;
+       } s;
+       struct cvmx_pko_mem_iqueue_ptrs_s cn68xx;
+       struct cvmx_pko_mem_iqueue_ptrs_s cn68xxp1;
+};
+
+typedef union cvmx_pko_mem_iqueue_ptrs cvmx_pko_mem_iqueue_ptrs_t;
+
+/**
+ * cvmx_pko_mem_iqueue_qos
+ *
+ * Notes:
+ * Sets the QOS mask, per queue.  These QOS_MASK bits are logically and physically the same QOS_MASK
+ * bits in PKO_MEM_IQUEUE_PTRS.  This CSR address allows the QOS_MASK bits to be written during PKO
+ * operation without affecting any other queue state.  The port to which queue QID is mapped is port
+ * IPID.  Note that the queue to port mapping must be the same as was previously programmed via the
+ * PKO_MEM_IQUEUE_PTRS CSR.
+ * This CSR is a memory of 256 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  The index to this CSR is an IQUEUE.  A read of any
+ * entry that has not been previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_iqueue_qos {
+       u64 u64;
+       struct cvmx_pko_mem_iqueue_qos_s {
+               u64 reserved_61_63 : 3;
+               u64 qos_mask : 8;
+               u64 reserved_15_52 : 38;
+               u64 ipid : 7;
+               u64 qid : 8;
+       } s;
+       struct cvmx_pko_mem_iqueue_qos_s cn68xx;
+       struct cvmx_pko_mem_iqueue_qos_s cn68xxp1;
+};
+
+typedef union cvmx_pko_mem_iqueue_qos cvmx_pko_mem_iqueue_qos_t;
+
+/**
+ * cvmx_pko_mem_port_ptrs
+ *
+ * Notes:
+ * Sets the port to engine mapping, per port.  Ports marked as static priority need not be contiguous,
+ * but they must be the lowest numbered PIDs mapped to this EID and must have QOS_MASK=0xff.  If EID==8
+ * or EID==9, then PID[1:0] is used to direct the packet to the correct port on that interface.
+ * EID==15 can be used for unused PKO-internal ports.
+ * The reset configuration is the following:
+ *   PID EID(ext port) BP_PORT QOS_MASK STATIC_P
+ *   -------------------------------------------
+ *     0   0( 0)             0     0xff        0
+ *     1   1( 1)             1     0xff        0
+ *     2   2( 2)             2     0xff        0
+ *     3   3( 3)             3     0xff        0
+ *     4   0( 0)             4     0xff        0
+ *     5   1( 1)             5     0xff        0
+ *     6   2( 2)             6     0xff        0
+ *     7   3( 3)             7     0xff        0
+ *     8   0( 0)             8     0xff        0
+ *     9   1( 1)             9     0xff        0
+ *    10   2( 2)            10     0xff        0
+ *    11   3( 3)            11     0xff        0
+ *    12   0( 0)            12     0xff        0
+ *    13   1( 1)            13     0xff        0
+ *    14   2( 2)            14     0xff        0
+ *    15   3( 3)            15     0xff        0
+ *   -------------------------------------------
+ *    16   4(16)            16     0xff        0
+ *    17   5(17)            17     0xff        0
+ *    18   6(18)            18     0xff        0
+ *    19   7(19)            19     0xff        0
+ *    20   4(16)            20     0xff        0
+ *    21   5(17)            21     0xff        0
+ *    22   6(18)            22     0xff        0
+ *    23   7(19)            23     0xff        0
+ *    24   4(16)            24     0xff        0
+ *    25   5(17)            25     0xff        0
+ *    26   6(18)            26     0xff        0
+ *    27   7(19)            27     0xff        0
+ *    28   4(16)            28     0xff        0
+ *    29   5(17)            29     0xff        0
+ *    30   6(18)            30     0xff        0
+ *    31   7(19)            31     0xff        0
+ *   -------------------------------------------
+ *    32   8(32)            32     0xff        0
+ *    33   8(33)            33     0xff        0
+ *    34   8(34)            34     0xff        0
+ *    35   8(35)            35     0xff        0
+ *   -------------------------------------------
+ *    36   9(36)            36     0xff        0
+ *    37   9(37)            37     0xff        0
+ *    38   9(38)            38     0xff        0
+ *    39   9(39)            39     0xff        0
+ *
+ * This CSR is a memory of 48 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_port_ptrs {
+       u64 u64;
+       struct cvmx_pko_mem_port_ptrs_s {
+               u64 reserved_62_63 : 2;
+               u64 static_p : 1;
+               u64 qos_mask : 8;
+               u64 reserved_16_52 : 37;
+               u64 bp_port : 6;
+               u64 eid : 4;
+               u64 pid : 6;
+       } s;
+       struct cvmx_pko_mem_port_ptrs_s cn52xx;
+       struct cvmx_pko_mem_port_ptrs_s cn52xxp1;
+       struct cvmx_pko_mem_port_ptrs_s cn56xx;
+       struct cvmx_pko_mem_port_ptrs_s cn56xxp1;
+       struct cvmx_pko_mem_port_ptrs_s cn61xx;
+       struct cvmx_pko_mem_port_ptrs_s cn63xx;
+       struct cvmx_pko_mem_port_ptrs_s cn63xxp1;
+       struct cvmx_pko_mem_port_ptrs_s cn66xx;
+       struct cvmx_pko_mem_port_ptrs_s cn70xx;
+       struct cvmx_pko_mem_port_ptrs_s cn70xxp1;
+       struct cvmx_pko_mem_port_ptrs_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_port_ptrs cvmx_pko_mem_port_ptrs_t;
+
+/**
+ * cvmx_pko_mem_port_qos
+ *
+ * Notes:
+ * Sets the QOS mask, per port.  These QOS_MASK bits are logically and physically the same QOS_MASK
+ * bits in PKO_MEM_PORT_PTRS.  This CSR address allows the QOS_MASK bits to be written during PKO
+ * operation without affecting any other port state.  The engine to which port PID is mapped is engine
+ * EID.  Note that the port to engine mapping must be the same as was previously programmed via the
+ * PKO_MEM_PORT_PTRS CSR.
+ * This CSR is a memory of 44 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_port_qos {
+       u64 u64;
+       struct cvmx_pko_mem_port_qos_s {
+               u64 reserved_61_63 : 3;
+               u64 qos_mask : 8;
+               u64 reserved_10_52 : 43;
+               u64 eid : 4;
+               u64 pid : 6;
+       } s;
+       struct cvmx_pko_mem_port_qos_s cn52xx;
+       struct cvmx_pko_mem_port_qos_s cn52xxp1;
+       struct cvmx_pko_mem_port_qos_s cn56xx;
+       struct cvmx_pko_mem_port_qos_s cn56xxp1;
+       struct cvmx_pko_mem_port_qos_s cn61xx;
+       struct cvmx_pko_mem_port_qos_s cn63xx;
+       struct cvmx_pko_mem_port_qos_s cn63xxp1;
+       struct cvmx_pko_mem_port_qos_s cn66xx;
+       struct cvmx_pko_mem_port_qos_s cn70xx;
+       struct cvmx_pko_mem_port_qos_s cn70xxp1;
+       struct cvmx_pko_mem_port_qos_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_port_qos cvmx_pko_mem_port_qos_t;
+
+/**
+ * cvmx_pko_mem_port_rate0
+ *
+ * Notes:
+ * This CSR is a memory of 44 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_port_rate0 {
+       u64 u64;
+       struct cvmx_pko_mem_port_rate0_s {
+               u64 reserved_51_63 : 13;
+               u64 rate_word : 19;
+               u64 rate_pkt : 24;
+               u64 reserved_7_7 : 1;
+               u64 pid : 7;
+       } s;
+       struct cvmx_pko_mem_port_rate0_cn52xx {
+               u64 reserved_51_63 : 13;
+               u64 rate_word : 19;
+               u64 rate_pkt : 24;
+               u64 reserved_6_7 : 2;
+               u64 pid : 6;
+       } cn52xx;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn56xx;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn56xxp1;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn61xx;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn63xx;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn63xxp1;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn66xx;
+       struct cvmx_pko_mem_port_rate0_s cn68xx;
+       struct cvmx_pko_mem_port_rate0_s cn68xxp1;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn70xx;
+       struct cvmx_pko_mem_port_rate0_cn52xx cn70xxp1;
+       struct cvmx_pko_mem_port_rate0_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_port_rate0 cvmx_pko_mem_port_rate0_t;
+
+/**
+ * cvmx_pko_mem_port_rate1
+ *
+ * Notes:
+ * Writing PKO_MEM_PORT_RATE1[PID,RATE_LIM] has the side effect of setting the corresponding
+ * accumulator to zero.
+ * This CSR is a memory of 44 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_port_rate1 {
+       u64 u64;
+       struct cvmx_pko_mem_port_rate1_s {
+               u64 reserved_32_63 : 32;
+               u64 rate_lim : 24;
+               u64 reserved_7_7 : 1;
+               u64 pid : 7;
+       } s;
+       struct cvmx_pko_mem_port_rate1_cn52xx {
+               u64 reserved_32_63 : 32;
+               u64 rate_lim : 24;
+               u64 reserved_6_7 : 2;
+               u64 pid : 6;
+       } cn52xx;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn56xx;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn56xxp1;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn61xx;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn63xx;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn63xxp1;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn66xx;
+       struct cvmx_pko_mem_port_rate1_s cn68xx;
+       struct cvmx_pko_mem_port_rate1_s cn68xxp1;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn70xx;
+       struct cvmx_pko_mem_port_rate1_cn52xx cn70xxp1;
+       struct cvmx_pko_mem_port_rate1_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pko_mem_port_rate1 cvmx_pko_mem_port_rate1_t;
+
+/**
+ * cvmx_pko_mem_queue_ptrs
+ *
+ * Notes:
+ * Sets the queue to port mapping and the initial command buffer pointer, per queue
+ * Each queue may map to at most one port.  No more than 16 queues may map to a port.  The set of
+ * queues that is mapped to a port must be a contiguous array of queues.  The port to which queue QID
+ * is mapped is port PID.  The index of queue QID in port PID's queue list is IDX.  The last queue in
+ * port PID's queue array must have its TAIL bit set.  Unused queues must be mapped to port 63.
+ * STATIC_Q marks queue QID as having static priority.  STATIC_P marks the port PID to which QID is
+ * mapped as having at least one queue with static priority.  If any QID that maps to PID has static
+ * priority, then all QID that map to PID must have STATIC_P set.  Queues marked as static priority
+ * must be contiguous and begin at IDX 0.  The last queue that is marked as having static priority
+ * must have its S_TAIL bit set.
+ * This CSR is a memory of 256 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_queue_ptrs {
+       u64 u64;
+       struct cvmx_pko_mem_queue_ptrs_s {
+               u64 s_tail : 1;
+               u64 static_p : 1;
+               u64 static_q : 1;
+               u64 qos_mask : 8;
+               u64 buf_ptr : 36;
+               u64 tail : 1;
+               u64 index : 3;
+               u64 port : 6;
+               u64 queue : 7;
+       } s;
+       struct cvmx_pko_mem_queue_ptrs_s cn30xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn31xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn38xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn38xxp2;
+       struct cvmx_pko_mem_queue_ptrs_s cn50xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn52xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn52xxp1;
+       struct cvmx_pko_mem_queue_ptrs_s cn56xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn56xxp1;
+       struct cvmx_pko_mem_queue_ptrs_s cn58xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn58xxp1;
+       struct cvmx_pko_mem_queue_ptrs_s cn61xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn63xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn63xxp1;
+       struct cvmx_pko_mem_queue_ptrs_s cn66xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn70xx;
+       struct cvmx_pko_mem_queue_ptrs_s cn70xxp1;
+       struct cvmx_pko_mem_queue_ptrs_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_queue_ptrs cvmx_pko_mem_queue_ptrs_t;
+
+/**
+ * cvmx_pko_mem_queue_qos
+ *
+ * Notes:
+ * Sets the QOS mask, per queue.  These QOS_MASK bits are logically and physically the same QOS_MASK
+ * bits in PKO_MEM_QUEUE_PTRS.  This CSR address allows the QOS_MASK bits to be written during PKO
+ * operation without affecting any other queue state.  The port to which queue QID is mapped is port
+ * PID.  Note that the queue to port mapping must be the same as was previously programmed via the
+ * PKO_MEM_QUEUE_PTRS CSR.
+ * This CSR is a memory of 256 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  A read of any entry that has not been
+ * previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_queue_qos {
+       u64 u64;
+       struct cvmx_pko_mem_queue_qos_s {
+               u64 reserved_61_63 : 3;
+               u64 qos_mask : 8;
+               u64 reserved_13_52 : 40;
+               u64 pid : 6;
+               u64 qid : 7;
+       } s;
+       struct cvmx_pko_mem_queue_qos_s cn30xx;
+       struct cvmx_pko_mem_queue_qos_s cn31xx;
+       struct cvmx_pko_mem_queue_qos_s cn38xx;
+       struct cvmx_pko_mem_queue_qos_s cn38xxp2;
+       struct cvmx_pko_mem_queue_qos_s cn50xx;
+       struct cvmx_pko_mem_queue_qos_s cn52xx;
+       struct cvmx_pko_mem_queue_qos_s cn52xxp1;
+       struct cvmx_pko_mem_queue_qos_s cn56xx;
+       struct cvmx_pko_mem_queue_qos_s cn56xxp1;
+       struct cvmx_pko_mem_queue_qos_s cn58xx;
+       struct cvmx_pko_mem_queue_qos_s cn58xxp1;
+       struct cvmx_pko_mem_queue_qos_s cn61xx;
+       struct cvmx_pko_mem_queue_qos_s cn63xx;
+       struct cvmx_pko_mem_queue_qos_s cn63xxp1;
+       struct cvmx_pko_mem_queue_qos_s cn66xx;
+       struct cvmx_pko_mem_queue_qos_s cn70xx;
+       struct cvmx_pko_mem_queue_qos_s cn70xxp1;
+       struct cvmx_pko_mem_queue_qos_s cnf71xx;
+};
+
+typedef union cvmx_pko_mem_queue_qos cvmx_pko_mem_queue_qos_t;
+
+/**
+ * cvmx_pko_mem_throttle_int
+ *
+ * Notes:
+ * Writing PACKET and WORD with 0 resets both counts for INT to 0 rather than add 0.
+ * Otherwise, writes to this CSR add to the existing WORD/PACKET counts for the interface INT.
+ *
+ * PKO tracks the number of (8-byte) WORD's and PACKET's in-flight (sum total in both PKO
+ * and the interface MAC) on the interface. (When PKO first selects a packet from a PKO queue, it
+ * increments the counts appropriately. When the interface MAC has (largely) completed sending
+ * the words/packet, PKO decrements the count appropriately.) When PKO_REG_FLAGS[ENA_THROTTLE]
+ * is set and the most-significant bit of the WORD or packet count for a interface is set,
+ * PKO will not transfer any packets over the interface. Software can limit the amount of
+ * packet data and/or the number of packets that OCTEON can send out the chip after receiving backpressure
+ * from the interface/pipe via these per-pipe throttle counts when PKO_REG_FLAGS[ENA_THROTTLE]=1.
+ * For example, to limit the number of packets outstanding in the interface to N, preset PACKET for
+ * the pipe to the value 0x20-N (0x20 is the smallest PACKET value with the most-significant bit set).
+ *
+ * This CSR is a memory of 32 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  The index to this CSR is an INTERFACE.  A read of any
+ * entry that has not been previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_throttle_int {
+       u64 u64;
+       struct cvmx_pko_mem_throttle_int_s {
+               u64 reserved_47_63 : 17;
+               u64 word : 15;
+               u64 reserved_14_31 : 18;
+               u64 packet : 6;
+               u64 reserved_5_7 : 3;
+               u64 intr : 5;
+       } s;
+       struct cvmx_pko_mem_throttle_int_s cn68xx;
+       struct cvmx_pko_mem_throttle_int_s cn68xxp1;
+};
+
+typedef union cvmx_pko_mem_throttle_int cvmx_pko_mem_throttle_int_t;
+
+/**
+ * cvmx_pko_mem_throttle_pipe
+ *
+ * Notes:
+ * Writing PACKET and WORD with 0 resets both counts for PIPE to 0 rather than add 0.
+ * Otherwise, writes to this CSR add to the existing WORD/PACKET counts for the PKO pipe PIPE.
+ *
+ * PKO tracks the number of (8-byte) WORD's and PACKET's in-flight (sum total in both PKO
+ * and the interface MAC) on the pipe. (When PKO first selects a packet from a PKO queue, it
+ * increments the counts appropriately. When the interface MAC has (largely) completed sending
+ * the words/packet, PKO decrements the count appropriately.) When PKO_REG_FLAGS[ENA_THROTTLE]
+ * is set and the most-significant bit of the WORD or packet count for a PKO pipe is set,
+ * PKO will not transfer any packets over the PKO pipe. Software can limit the amount of
+ * packet data and/or the number of packets that OCTEON can send out the chip after receiving backpressure
+ * from the interface/pipe via these per-pipe throttle counts when PKO_REG_FLAGS[ENA_THROTTLE]=1.
+ * For example, to limit the number of packets outstanding in the pipe to N, preset PACKET for
+ * the pipe to the value 0x20-N (0x20 is the smallest PACKET value with the most-significant bit set).
+ *
+ * This CSR is a memory of 128 entries, and thus, the PKO_REG_READ_IDX CSR must be written before any
+ * CSR read operations to this address can be performed.  The index to this CSR is a PIPE.  A read of any
+ * entry that has not been previously written is illegal and will result in unpredictable CSR read data.
+ */
+union cvmx_pko_mem_throttle_pipe {
+       u64 u64;
+       struct cvmx_pko_mem_throttle_pipe_s {
+               u64 reserved_47_63 : 17;
+               u64 word : 15;
+               u64 reserved_14_31 : 18;
+               u64 packet : 6;
+               u64 reserved_7_7 : 1;
+               u64 pipe : 7;
+       } s;
+       struct cvmx_pko_mem_throttle_pipe_s cn68xx;
+       struct cvmx_pko_mem_throttle_pipe_s cn68xxp1;
+};
+
+typedef union cvmx_pko_mem_throttle_pipe cvmx_pko_mem_throttle_pipe_t;
+
+/**
+ * cvmx_pko_ncb_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_ncb_bist_status {
+       u64 u64;
+       struct cvmx_pko_ncb_bist_status_s {
+               u64 ncbi_l2_out_ram_bist_status : 1;
+               u64 ncbi_pp_out_ram_bist_status : 1;
+               u64 ncbo_pdm_cmd_dat_ram_bist_status : 1;
+               u64 ncbi_l2_pdm_pref_ram_bist_status : 1;
+               u64 ncbo_pp_fif_ram_bist_status : 1;
+               u64 ncbo_skid_fif_ram_bist_status : 1;
+               u64 reserved_0_57 : 58;
+       } s;
+       struct cvmx_pko_ncb_bist_status_s cn73xx;
+       struct cvmx_pko_ncb_bist_status_s cn78xx;
+       struct cvmx_pko_ncb_bist_status_s cn78xxp1;
+       struct cvmx_pko_ncb_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_bist_status cvmx_pko_ncb_bist_status_t;
+
+/**
+ * cvmx_pko_ncb_ecc_ctl0
+ */
+union cvmx_pko_ncb_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_ncb_ecc_ctl0_s {
+               u64 ncbi_l2_out_ram_flip : 2;
+               u64 ncbi_l2_out_ram_cdis : 1;
+               u64 ncbi_pp_out_ram_flip : 2;
+               u64 ncbi_pp_out_ram_cdis : 1;
+               u64 ncbo_pdm_cmd_dat_ram_flip : 2;
+               u64 ncbo_pdm_cmd_dat_ram_cdis : 1;
+               u64 ncbi_l2_pdm_pref_ram_flip : 2;
+               u64 ncbi_l2_pdm_pref_ram_cdis : 1;
+               u64 ncbo_pp_fif_ram_flip : 2;
+               u64 ncbo_pp_fif_ram_cdis : 1;
+               u64 ncbo_skid_fif_ram_flip : 2;
+               u64 ncbo_skid_fif_ram_cdis : 1;
+               u64 reserved_0_45 : 46;
+       } s;
+       struct cvmx_pko_ncb_ecc_ctl0_s cn73xx;
+       struct cvmx_pko_ncb_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_ncb_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_ncb_ecc_ctl0_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_ecc_ctl0 cvmx_pko_ncb_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_ncb_ecc_dbe_sts0
+ */
+union cvmx_pko_ncb_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_ncb_ecc_dbe_sts0_s {
+               u64 ncbi_l2_out_ram_dbe : 1;
+               u64 ncbi_pp_out_ram_dbe : 1;
+               u64 ncbo_pdm_cmd_dat_ram_dbe : 1;
+               u64 ncbi_l2_pdm_pref_ram_dbe : 1;
+               u64 ncbo_pp_fif_ram_dbe : 1;
+               u64 ncbo_skid_fif_ram_dbe : 1;
+               u64 reserved_0_57 : 58;
+       } s;
+       struct cvmx_pko_ncb_ecc_dbe_sts0_s cn73xx;
+       struct cvmx_pko_ncb_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_ncb_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_ncb_ecc_dbe_sts0_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_ecc_dbe_sts0 cvmx_pko_ncb_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_ncb_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_ncb_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_ncb_ecc_dbe_sts_cmb0_s {
+               u64 ncb_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_ncb_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_ncb_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_ncb_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_ncb_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_ecc_dbe_sts_cmb0 cvmx_pko_ncb_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_ncb_ecc_sbe_sts0
+ */
+union cvmx_pko_ncb_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_ncb_ecc_sbe_sts0_s {
+               u64 ncbi_l2_out_ram_sbe : 1;
+               u64 ncbi_pp_out_ram_sbe : 1;
+               u64 ncbo_pdm_cmd_dat_ram_sbe : 1;
+               u64 ncbi_l2_pdm_pref_ram_sbe : 1;
+               u64 ncbo_pp_fif_ram_sbe : 1;
+               u64 ncbo_skid_fif_ram_sbe : 1;
+               u64 reserved_0_57 : 58;
+       } s;
+       struct cvmx_pko_ncb_ecc_sbe_sts0_s cn73xx;
+       struct cvmx_pko_ncb_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_ncb_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_ncb_ecc_sbe_sts0_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_ecc_sbe_sts0 cvmx_pko_ncb_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_ncb_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_ncb_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_ncb_ecc_sbe_sts_cmb0_s {
+               u64 ncb_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_ncb_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_ncb_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_ncb_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_ncb_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_ecc_sbe_sts_cmb0 cvmx_pko_ncb_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_ncb_int
+ */
+union cvmx_pko_ncb_int {
+       u64 u64;
+       struct cvmx_pko_ncb_int_s {
+               u64 reserved_2_63 : 62;
+               u64 tso_segment_cnt : 1;
+               u64 ncb_tx_error : 1;
+       } s;
+       struct cvmx_pko_ncb_int_s cn73xx;
+       struct cvmx_pko_ncb_int_s cn78xx;
+       struct cvmx_pko_ncb_int_s cn78xxp1;
+       struct cvmx_pko_ncb_int_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_int cvmx_pko_ncb_int_t;
+
+/**
+ * cvmx_pko_ncb_tx_err_info
+ */
+union cvmx_pko_ncb_tx_err_info {
+       u64 u64;
+       struct cvmx_pko_ncb_tx_err_info_s {
+               u64 reserved_32_63 : 32;
+               u64 wcnt : 5;
+               u64 src : 12;
+               u64 dst : 8;
+               u64 tag : 4;
+               u64 eot : 1;
+               u64 sot : 1;
+               u64 valid : 1;
+       } s;
+       struct cvmx_pko_ncb_tx_err_info_s cn73xx;
+       struct cvmx_pko_ncb_tx_err_info_s cn78xx;
+       struct cvmx_pko_ncb_tx_err_info_s cn78xxp1;
+       struct cvmx_pko_ncb_tx_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_tx_err_info cvmx_pko_ncb_tx_err_info_t;
+
+/**
+ * cvmx_pko_ncb_tx_err_word
+ */
+union cvmx_pko_ncb_tx_err_word {
+       u64 u64;
+       struct cvmx_pko_ncb_tx_err_word_s {
+               u64 err_word : 64;
+       } s;
+       struct cvmx_pko_ncb_tx_err_word_s cn73xx;
+       struct cvmx_pko_ncb_tx_err_word_s cn78xx;
+       struct cvmx_pko_ncb_tx_err_word_s cn78xxp1;
+       struct cvmx_pko_ncb_tx_err_word_s cnf75xx;
+};
+
+typedef union cvmx_pko_ncb_tx_err_word cvmx_pko_ncb_tx_err_word_t;
+
+/**
+ * cvmx_pko_pdm_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pdm_bist_status {
+       u64 u64;
+       struct cvmx_pko_pdm_bist_status_s {
+               u64 flshb_cache_lo_ram_bist_status : 1;
+               u64 flshb_cache_hi_ram_bist_status : 1;
+               u64 isrm_ca_iinst_ram_bist_status : 1;
+               u64 isrm_ca_cm_ram_bist_status : 1;
+               u64 isrm_st_ram2_bist_status : 1;
+               u64 isrm_st_ram1_bist_status : 1;
+               u64 isrm_st_ram0_bist_status : 1;
+               u64 isrd_st_ram3_bist_status : 1;
+               u64 isrd_st_ram2_bist_status : 1;
+               u64 isrd_st_ram1_bist_status : 1;
+               u64 isrd_st_ram0_bist_status : 1;
+               u64 drp_hi_ram_bist_status : 1;
+               u64 drp_lo_ram_bist_status : 1;
+               u64 dwp_hi_ram_bist_status : 1;
+               u64 dwp_lo_ram_bist_status : 1;
+               u64 mwp_hi_ram_bist_status : 1;
+               u64 mwp_lo_ram_bist_status : 1;
+               u64 fillb_m_rsp_ram_hi_bist_status : 1;
+               u64 fillb_m_rsp_ram_lo_bist_status : 1;
+               u64 fillb_d_rsp_ram_hi_bist_status : 1;
+               u64 fillb_d_rsp_ram_lo_bist_status : 1;
+               u64 fillb_d_rsp_dat_fifo_bist_status : 1;
+               u64 fillb_m_rsp_dat_fifo_bist_status : 1;
+               u64 flshb_m_dat_ram_bist_status : 1;
+               u64 flshb_d_dat_ram_bist_status : 1;
+               u64 minpad_ram_bist_status : 1;
+               u64 mwp_hi_spt_ram_bist_status : 1;
+               u64 mwp_lo_spt_ram_bist_status : 1;
+               u64 buf_wm_ram_bist_status : 1;
+               u64 reserved_0_34 : 35;
+       } s;
+       struct cvmx_pko_pdm_bist_status_s cn73xx;
+       struct cvmx_pko_pdm_bist_status_s cn78xx;
+       struct cvmx_pko_pdm_bist_status_s cn78xxp1;
+       struct cvmx_pko_pdm_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_bist_status cvmx_pko_pdm_bist_status_t;
+
+/**
+ * cvmx_pko_pdm_cfg
+ */
+union cvmx_pko_pdm_cfg {
+       u64 u64;
+       struct cvmx_pko_pdm_cfg_s {
+               u64 reserved_13_63 : 51;
+               u64 dis_lpd_w2r_fill : 1;
+               u64 en_fr_w2r_ptr_swp : 1;
+               u64 dis_flsh_cache : 1;
+               u64 pko_pad_minlen : 7;
+               u64 diag_mode : 1;
+               u64 alloc_lds : 1;
+               u64 alloc_sts : 1;
+       } s;
+       struct cvmx_pko_pdm_cfg_s cn73xx;
+       struct cvmx_pko_pdm_cfg_s cn78xx;
+       struct cvmx_pko_pdm_cfg_s cn78xxp1;
+       struct cvmx_pko_pdm_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_cfg cvmx_pko_pdm_cfg_t;
+
+/**
+ * cvmx_pko_pdm_cfg_dbg
+ */
+union cvmx_pko_pdm_cfg_dbg {
+       u64 u64;
+       struct cvmx_pko_pdm_cfg_dbg_s {
+               u64 reserved_32_63 : 32;
+               u64 cp_stall_thrshld : 32;
+       } s;
+       struct cvmx_pko_pdm_cfg_dbg_s cn73xx;
+       struct cvmx_pko_pdm_cfg_dbg_s cn78xx;
+       struct cvmx_pko_pdm_cfg_dbg_s cn78xxp1;
+       struct cvmx_pko_pdm_cfg_dbg_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_cfg_dbg cvmx_pko_pdm_cfg_dbg_t;
+
+/**
+ * cvmx_pko_pdm_cp_dbg
+ */
+union cvmx_pko_pdm_cp_dbg {
+       u64 u64;
+       struct cvmx_pko_pdm_cp_dbg_s {
+               u64 reserved_16_63 : 48;
+               u64 stateless_fif_cnt : 6;
+               u64 reserved_5_9 : 5;
+               u64 op_fif_not_full : 5;
+       } s;
+       struct cvmx_pko_pdm_cp_dbg_s cn73xx;
+       struct cvmx_pko_pdm_cp_dbg_s cn78xx;
+       struct cvmx_pko_pdm_cp_dbg_s cn78xxp1;
+       struct cvmx_pko_pdm_cp_dbg_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_cp_dbg cvmx_pko_pdm_cp_dbg_t;
+
+/**
+ * cvmx_pko_pdm_dq#_minpad
+ */
+union cvmx_pko_pdm_dqx_minpad {
+       u64 u64;
+       struct cvmx_pko_pdm_dqx_minpad_s {
+               u64 reserved_1_63 : 63;
+               u64 minpad : 1;
+       } s;
+       struct cvmx_pko_pdm_dqx_minpad_s cn73xx;
+       struct cvmx_pko_pdm_dqx_minpad_s cn78xx;
+       struct cvmx_pko_pdm_dqx_minpad_s cn78xxp1;
+       struct cvmx_pko_pdm_dqx_minpad_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_dqx_minpad cvmx_pko_pdm_dqx_minpad_t;
+
+/**
+ * cvmx_pko_pdm_drpbuf_dbg
+ */
+union cvmx_pko_pdm_drpbuf_dbg {
+       u64 u64;
+       struct cvmx_pko_pdm_drpbuf_dbg_s {
+               u64 reserved_43_63 : 21;
+               u64 sel_nxt_ptr : 1;
+               u64 load_val : 1;
+               u64 rdy : 1;
+               u64 cur_state : 3;
+               u64 reserved_33_36 : 4;
+               u64 track_rd_cnt : 6;
+               u64 track_wr_cnt : 6;
+               u64 reserved_17_20 : 4;
+               u64 mem_addr : 13;
+               u64 mem_en : 4;
+       } s;
+       struct cvmx_pko_pdm_drpbuf_dbg_s cn73xx;
+       struct cvmx_pko_pdm_drpbuf_dbg_s cn78xx;
+       struct cvmx_pko_pdm_drpbuf_dbg_s cn78xxp1;
+       struct cvmx_pko_pdm_drpbuf_dbg_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_drpbuf_dbg cvmx_pko_pdm_drpbuf_dbg_t;
+
+/**
+ * cvmx_pko_pdm_dwpbuf_dbg
+ */
+union cvmx_pko_pdm_dwpbuf_dbg {
+       u64 u64;
+       struct cvmx_pko_pdm_dwpbuf_dbg_s {
+               u64 reserved_48_63 : 16;
+               u64 cmd_proc : 1;
+               u64 reserved_46_46 : 1;
+               u64 mem_data_val : 1;
+               u64 insert_np : 1;
+               u64 reserved_43_43 : 1;
+               u64 sel_nxt_ptr : 1;
+               u64 load_val : 1;
+               u64 rdy : 1;
+               u64 cur_state : 3;
+               u64 mem_rdy : 1;
+               u64 reserved_33_35 : 3;
+               u64 track_rd_cnt : 6;
+               u64 track_wr_cnt : 6;
+               u64 reserved_19_20 : 2;
+               u64 insert_dp : 2;
+               u64 mem_addr : 13;
+               u64 mem_en : 4;
+       } s;
+       struct cvmx_pko_pdm_dwpbuf_dbg_cn73xx {
+               u64 reserved_48_63 : 16;
+               u64 cmd_proc : 1;
+               u64 reserved_46_46 : 1;
+               u64 mem_data_val : 1;
+               u64 insert_np : 1;
+               u64 reserved_43_43 : 1;
+               u64 sel_nxt_ptr : 1;
+               u64 load_val : 1;
+               u64 rdy : 1;
+               u64 reserved_37_39 : 3;
+               u64 mem_rdy : 1;
+               u64 reserved_19_35 : 17;
+               u64 insert_dp : 2;
+               u64 reserved_15_16 : 2;
+               u64 mem_addr : 11;
+               u64 mem_en : 4;
+       } cn73xx;
+       struct cvmx_pko_pdm_dwpbuf_dbg_s cn78xx;
+       struct cvmx_pko_pdm_dwpbuf_dbg_s cn78xxp1;
+       struct cvmx_pko_pdm_dwpbuf_dbg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_dwpbuf_dbg cvmx_pko_pdm_dwpbuf_dbg_t;
+
+/**
+ * cvmx_pko_pdm_ecc_ctl0
+ */
+union cvmx_pko_pdm_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pdm_ecc_ctl0_s {
+               u64 flshb_cache_lo_ram_flip : 2;
+               u64 flshb_cache_lo_ram_cdis : 1;
+               u64 flshb_cache_hi_ram_flip : 2;
+               u64 flshb_cache_hi_ram_cdis : 1;
+               u64 isrm_ca_iinst_ram_flip : 2;
+               u64 isrm_ca_iinst_ram_cdis : 1;
+               u64 isrm_ca_cm_ram_flip : 2;
+               u64 isrm_ca_cm_ram_cdis : 1;
+               u64 isrm_st_ram2_flip : 2;
+               u64 isrm_st_ram2_cdis : 1;
+               u64 isrm_st_ram1_flip : 2;
+               u64 isrm_st_ram1_cdis : 1;
+               u64 isrm_st_ram0_flip : 2;
+               u64 isrm_st_ram0_cdis : 1;
+               u64 isrd_st_ram3_flip : 2;
+               u64 isrd_st_ram3_cdis : 1;
+               u64 isrd_st_ram2_flip : 2;
+               u64 isrd_st_ram2_cdis : 1;
+               u64 isrd_st_ram1_flip : 2;
+               u64 isrd_st_ram1_cdis : 1;
+               u64 isrd_st_ram0_flip : 2;
+               u64 isrd_st_ram0_cdis : 1;
+               u64 drp_hi_ram_flip : 2;
+               u64 drp_hi_ram_cdis : 1;
+               u64 drp_lo_ram_flip : 2;
+               u64 drp_lo_ram_cdis : 1;
+               u64 dwp_hi_ram_flip : 2;
+               u64 dwp_hi_ram_cdis : 1;
+               u64 dwp_lo_ram_flip : 2;
+               u64 dwp_lo_ram_cdis : 1;
+               u64 mwp_hi_ram_flip : 2;
+               u64 mwp_hi_ram_cdis : 1;
+               u64 mwp_lo_ram_flip : 2;
+               u64 mwp_lo_ram_cdis : 1;
+               u64 fillb_m_rsp_ram_hi_flip : 2;
+               u64 fillb_m_rsp_ram_hi_cdis : 1;
+               u64 fillb_m_rsp_ram_lo_flip : 2;
+               u64 fillb_m_rsp_ram_lo_cdis : 1;
+               u64 fillb_d_rsp_ram_hi_flip : 2;
+               u64 fillb_d_rsp_ram_hi_cdis : 1;
+               u64 fillb_d_rsp_ram_lo_flip : 2;
+               u64 fillb_d_rsp_ram_lo_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_pdm_ecc_ctl0_cn73xx {
+               u64 flshb_cache_lo_ram_flip : 2;
+               u64 flshb_cache_lo_ram_cdis : 1;
+               u64 flshb_cache_hi_ram_flip : 2;
+               u64 flshb_cache_hi_ram_cdis : 1;
+               u64 isrm_ca_iinst_ram_flip : 2;
+               u64 isrm_ca_iinst_ram_cdis : 1;
+               u64 isrm_ca_cm_ram_flip : 2;
+               u64 isrm_ca_cm_ram_cdis : 1;
+               u64 isrm_st_ram2_flip : 2;
+               u64 isrm_st_ram2_cdis : 1;
+               u64 isrm_st_ram1_flip : 2;
+               u64 isrm_st_ram1_cdis : 1;
+               u64 isrm_st_ram0_flip : 2;
+               u64 isrm_st_ram0_cdis : 1;
+               u64 isrd_st_ram3_flip : 2;
+               u64 isrd_st_ram3_cdis : 1;
+               u64 isrd_st_ram2_flip : 2;
+               u64 isrd_st_ram2_cdis : 1;
+               u64 isrd_st_ram1_flip : 2;
+               u64 isrd_st_ram1_cdis : 1;
+               u64 isrd_st_ram0_flip : 2;
+               u64 isrd_st_ram0_cdis : 1;
+               u64 drp_hi_ram_flip : 2;
+               u64 drp_hi_ram_cdis : 1;
+               u64 drp_lo_ram_flip : 2;
+               u64 drp_lo_ram_cdis : 1;
+               u64 dwp_hi_ram_flip : 2;
+               u64 dwp_hi_ram_cdis : 1;
+               u64 dwp_lo_ram_flip : 2;
+               u64 dwp_lo_ram_cdis : 1;
+               u64 reserved_13_18 : 6;
+               u64 fillb_m_rsp_ram_hi_flip : 2;
+               u64 fillb_m_rsp_ram_hi_cdis : 1;
+               u64 fillb_m_rsp_ram_lo_flip : 2;
+               u64 fillb_m_rsp_ram_lo_cdis : 1;
+               u64 fillb_d_rsp_ram_hi_flip : 2;
+               u64 fillb_d_rsp_ram_hi_cdis : 1;
+               u64 fillb_d_rsp_ram_lo_flip : 2;
+               u64 fillb_d_rsp_ram_lo_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_pdm_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pdm_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_pdm_ecc_ctl0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_ecc_ctl0 cvmx_pko_pdm_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pdm_ecc_ctl1
+ */
+union cvmx_pko_pdm_ecc_ctl1 {
+       u64 u64;
+       struct cvmx_pko_pdm_ecc_ctl1_s {
+               u64 reserved_15_63 : 49;
+               u64 buf_wm_ram_flip : 2;
+               u64 buf_wm_ram_cdis : 1;
+               u64 mwp_mem0_ram_flip : 2;
+               u64 mwp_mem1_ram_flip : 2;
+               u64 mwp_mem2_ram_flip : 2;
+               u64 mwp_mem3_ram_flip : 2;
+               u64 mwp_ram_cdis : 1;
+               u64 minpad_ram_flip : 2;
+               u64 minpad_ram_cdis : 1;
+       } s;
+       struct cvmx_pko_pdm_ecc_ctl1_s cn73xx;
+       struct cvmx_pko_pdm_ecc_ctl1_s cn78xx;
+       struct cvmx_pko_pdm_ecc_ctl1_s cn78xxp1;
+       struct cvmx_pko_pdm_ecc_ctl1_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_ecc_ctl1 cvmx_pko_pdm_ecc_ctl1_t;
+
+/**
+ * cvmx_pko_pdm_ecc_dbe_sts0
+ */
+union cvmx_pko_pdm_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pdm_ecc_dbe_sts0_s {
+               u64 flshb_cache_lo_ram_dbe : 1;
+               u64 flshb_cache_hi_ram_dbe : 1;
+               u64 isrm_ca_iinst_ram_dbe : 1;
+               u64 isrm_ca_cm_ram_dbe : 1;
+               u64 isrm_st_ram2_dbe : 1;
+               u64 isrm_st_ram1_dbe : 1;
+               u64 isrm_st_ram0_dbe : 1;
+               u64 isrd_st_ram3_dbe : 1;
+               u64 isrd_st_ram2_dbe : 1;
+               u64 isrd_st_ram1_dbe : 1;
+               u64 isrd_st_ram0_dbe : 1;
+               u64 drp_hi_ram_dbe : 1;
+               u64 drp_lo_ram_dbe : 1;
+               u64 dwp_hi_ram_dbe : 1;
+               u64 dwp_lo_ram_dbe : 1;
+               u64 mwp_hi_ram_dbe : 1;
+               u64 mwp_lo_ram_dbe : 1;
+               u64 fillb_m_rsp_ram_hi_dbe : 1;
+               u64 fillb_m_rsp_ram_lo_dbe : 1;
+               u64 fillb_d_rsp_ram_hi_dbe : 1;
+               u64 fillb_d_rsp_ram_lo_dbe : 1;
+               u64 minpad_ram_dbe : 1;
+               u64 mwp_hi_spt_ram_dbe : 1;
+               u64 mwp_lo_spt_ram_dbe : 1;
+               u64 buf_wm_ram_dbe : 1;
+               u64 reserved_0_38 : 39;
+       } s;
+       struct cvmx_pko_pdm_ecc_dbe_sts0_s cn73xx;
+       struct cvmx_pko_pdm_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pdm_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pdm_ecc_dbe_sts0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_ecc_dbe_sts0 cvmx_pko_pdm_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pdm_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pdm_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pdm_ecc_dbe_sts_cmb0_s {
+               u64 pdm_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pdm_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pdm_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pdm_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pdm_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_ecc_dbe_sts_cmb0 cvmx_pko_pdm_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pdm_ecc_sbe_sts0
+ */
+union cvmx_pko_pdm_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pdm_ecc_sbe_sts0_s {
+               u64 flshb_cache_lo_ram_sbe : 1;
+               u64 flshb_cache_hi_ram_sbe : 1;
+               u64 isrm_ca_iinst_ram_sbe : 1;
+               u64 isrm_ca_cm_ram_sbe : 1;
+               u64 isrm_st_ram2_sbe : 1;
+               u64 isrm_st_ram1_sbe : 1;
+               u64 isrm_st_ram0_sbe : 1;
+               u64 isrd_st_ram3_sbe : 1;
+               u64 isrd_st_ram2_sbe : 1;
+               u64 isrd_st_ram1_sbe : 1;
+               u64 isrd_st_ram0_sbe : 1;
+               u64 drp_hi_ram_sbe : 1;
+               u64 drp_lo_ram_sbe : 1;
+               u64 dwp_hi_ram_sbe : 1;
+               u64 dwp_lo_ram_sbe : 1;
+               u64 mwp_hi_ram_sbe : 1;
+               u64 mwp_lo_ram_sbe : 1;
+               u64 fillb_m_rsp_ram_hi_sbe : 1;
+               u64 fillb_m_rsp_ram_lo_sbe : 1;
+               u64 fillb_d_rsp_ram_hi_sbe : 1;
+               u64 fillb_d_rsp_ram_lo_sbe : 1;
+               u64 minpad_ram_sbe : 1;
+               u64 mwp_hi_spt_ram_sbe : 1;
+               u64 mwp_lo_spt_ram_sbe : 1;
+               u64 buf_wm_ram_sbe : 1;
+               u64 reserved_0_38 : 39;
+       } s;
+       struct cvmx_pko_pdm_ecc_sbe_sts0_s cn73xx;
+       struct cvmx_pko_pdm_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pdm_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pdm_ecc_sbe_sts0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_ecc_sbe_sts0 cvmx_pko_pdm_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pdm_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pdm_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pdm_ecc_sbe_sts_cmb0_s {
+               u64 pdm_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pdm_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pdm_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pdm_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pdm_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_ecc_sbe_sts_cmb0 cvmx_pko_pdm_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pdm_fillb_dbg0
+ */
+union cvmx_pko_pdm_fillb_dbg0 {
+       u64 u64;
+       struct cvmx_pko_pdm_fillb_dbg0_s {
+               u64 reserved_57_63 : 7;
+               u64 pd_seq : 5;
+               u64 resp_pd_seq : 5;
+               u64 d_rsp_lo_ram_addr_sel : 2;
+               u64 d_rsp_hi_ram_addr_sel : 2;
+               u64 d_rsp_rd_seq : 5;
+               u64 d_rsp_fifo_rd_seq : 5;
+               u64 d_fill_req_fifo_val : 1;
+               u64 d_rsp_ram_valid : 32;
+       } s;
+       struct cvmx_pko_pdm_fillb_dbg0_s cn73xx;
+       struct cvmx_pko_pdm_fillb_dbg0_s cn78xx;
+       struct cvmx_pko_pdm_fillb_dbg0_s cn78xxp1;
+       struct cvmx_pko_pdm_fillb_dbg0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_fillb_dbg0 cvmx_pko_pdm_fillb_dbg0_t;
+
+/**
+ * cvmx_pko_pdm_fillb_dbg1
+ */
+union cvmx_pko_pdm_fillb_dbg1 {
+       u64 u64;
+       struct cvmx_pko_pdm_fillb_dbg1_s {
+               u64 reserved_57_63 : 7;
+               u64 mp_seq : 5;
+               u64 resp_mp_seq : 5;
+               u64 m_rsp_lo_ram_addr_sel : 2;
+               u64 m_rsp_hi_ram_addr_sel : 2;
+               u64 m_rsp_rd_seq : 5;
+               u64 m_rsp_fifo_rd_seq : 5;
+               u64 m_fill_req_fifo_val : 1;
+               u64 m_rsp_ram_valid : 32;
+       } s;
+       struct cvmx_pko_pdm_fillb_dbg1_s cn73xx;
+       struct cvmx_pko_pdm_fillb_dbg1_s cn78xx;
+       struct cvmx_pko_pdm_fillb_dbg1_s cn78xxp1;
+       struct cvmx_pko_pdm_fillb_dbg1_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_fillb_dbg1 cvmx_pko_pdm_fillb_dbg1_t;
+
+/**
+ * cvmx_pko_pdm_fillb_dbg2
+ */
+union cvmx_pko_pdm_fillb_dbg2 {
+       u64 u64;
+       struct cvmx_pko_pdm_fillb_dbg2_s {
+               u64 reserved_9_63 : 55;
+               u64 fillb_sm : 5;
+               u64 reserved_3_3 : 1;
+               u64 iobp0_credit_cntr : 3;
+       } s;
+       struct cvmx_pko_pdm_fillb_dbg2_s cn73xx;
+       struct cvmx_pko_pdm_fillb_dbg2_s cn78xx;
+       struct cvmx_pko_pdm_fillb_dbg2_s cn78xxp1;
+       struct cvmx_pko_pdm_fillb_dbg2_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_fillb_dbg2 cvmx_pko_pdm_fillb_dbg2_t;
+
+/**
+ * cvmx_pko_pdm_flshb_dbg0
+ */
+union cvmx_pko_pdm_flshb_dbg0 {
+       u64 u64;
+       struct cvmx_pko_pdm_flshb_dbg0_s {
+               u64 reserved_44_63 : 20;
+               u64 flshb_sm : 7;
+               u64 flshb_ctl_sm : 9;
+               u64 cam_hptr : 5;
+               u64 cam_tptr : 5;
+               u64 expected_stdns : 6;
+               u64 d_flshb_eot_cntr : 3;
+               u64 m_flshb_eot_cntr : 3;
+               u64 ncbi_credit_cntr : 6;
+       } s;
+       struct cvmx_pko_pdm_flshb_dbg0_s cn73xx;
+       struct cvmx_pko_pdm_flshb_dbg0_s cn78xx;
+       struct cvmx_pko_pdm_flshb_dbg0_s cn78xxp1;
+       struct cvmx_pko_pdm_flshb_dbg0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_flshb_dbg0 cvmx_pko_pdm_flshb_dbg0_t;
+
+/**
+ * cvmx_pko_pdm_flshb_dbg1
+ */
+union cvmx_pko_pdm_flshb_dbg1 {
+       u64 u64;
+       struct cvmx_pko_pdm_flshb_dbg1_s {
+               u64 cam_stdn : 32;
+               u64 cam_valid : 32;
+       } s;
+       struct cvmx_pko_pdm_flshb_dbg1_s cn73xx;
+       struct cvmx_pko_pdm_flshb_dbg1_s cn78xx;
+       struct cvmx_pko_pdm_flshb_dbg1_s cn78xxp1;
+       struct cvmx_pko_pdm_flshb_dbg1_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_flshb_dbg1 cvmx_pko_pdm_flshb_dbg1_t;
+
+/**
+ * cvmx_pko_pdm_intf_dbg_rd
+ *
+ * For diagnostic use only.
+ *
+ */
+union cvmx_pko_pdm_intf_dbg_rd {
+       u64 u64;
+       struct cvmx_pko_pdm_intf_dbg_rd_s {
+               u64 reserved_48_63 : 16;
+               u64 in_flight : 8;
+               u64 pdm_req_cred_cnt : 8;
+               u64 pse_buf_waddr : 8;
+               u64 pse_buf_raddr : 8;
+               u64 resp_buf_waddr : 8;
+               u64 resp_buf_raddr : 8;
+       } s;
+       struct cvmx_pko_pdm_intf_dbg_rd_s cn73xx;
+       struct cvmx_pko_pdm_intf_dbg_rd_s cn78xx;
+       struct cvmx_pko_pdm_intf_dbg_rd_s cn78xxp1;
+       struct cvmx_pko_pdm_intf_dbg_rd_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_intf_dbg_rd cvmx_pko_pdm_intf_dbg_rd_t;
+
+/**
+ * cvmx_pko_pdm_isrd_dbg
+ */
+union cvmx_pko_pdm_isrd_dbg {
+       u64 u64;
+       struct cvmx_pko_pdm_isrd_dbg_s {
+               u64 isrd_vals_in : 4;
+               u64 reserved_59_59 : 1;
+               u64 req_hptr : 6;
+               u64 rdy_hptr : 6;
+               u64 reserved_44_46 : 3;
+               u64 in_arb_reqs : 8;
+               u64 in_arb_gnts : 7;
+               u64 cmt_arb_reqs : 7;
+               u64 cmt_arb_gnts : 7;
+               u64 in_use : 4;
+               u64 has_cred : 4;
+               u64 val_exec : 7;
+       } s;
+       struct cvmx_pko_pdm_isrd_dbg_s cn73xx;
+       struct cvmx_pko_pdm_isrd_dbg_s cn78xx;
+       struct cvmx_pko_pdm_isrd_dbg_cn78xxp1 {
+               u64 reserved_44_63 : 20;
+               u64 in_arb_reqs : 8;
+               u64 in_arb_gnts : 7;
+               u64 cmt_arb_reqs : 7;
+               u64 cmt_arb_gnts : 7;
+               u64 in_use : 4;
+               u64 has_cred : 4;
+               u64 val_exec : 7;
+       } cn78xxp1;
+       struct cvmx_pko_pdm_isrd_dbg_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_isrd_dbg cvmx_pko_pdm_isrd_dbg_t;
+
+/**
+ * cvmx_pko_pdm_isrd_dbg_dq
+ */
+union cvmx_pko_pdm_isrd_dbg_dq {
+       u64 u64;
+       struct cvmx_pko_pdm_isrd_dbg_dq_s {
+               u64 reserved_46_63 : 18;
+               u64 pebrd_sic_dq : 10;
+               u64 reserved_34_35 : 2;
+               u64 pebfill_sic_dq : 10;
+               u64 reserved_22_23 : 2;
+               u64 fr_sic_dq : 10;
+               u64 reserved_10_11 : 2;
+               u64 cp_sic_dq : 10;
+       } s;
+       struct cvmx_pko_pdm_isrd_dbg_dq_s cn73xx;
+       struct cvmx_pko_pdm_isrd_dbg_dq_s cn78xx;
+       struct cvmx_pko_pdm_isrd_dbg_dq_s cn78xxp1;
+       struct cvmx_pko_pdm_isrd_dbg_dq_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_isrd_dbg_dq cvmx_pko_pdm_isrd_dbg_dq_t;
+
+/**
+ * cvmx_pko_pdm_isrm_dbg
+ */
+union cvmx_pko_pdm_isrm_dbg {
+       u64 u64;
+       struct cvmx_pko_pdm_isrm_dbg_s {
+               u64 val_in : 3;
+               u64 reserved_34_60 : 27;
+               u64 in_arb_reqs : 7;
+               u64 in_arb_gnts : 6;
+               u64 cmt_arb_reqs : 6;
+               u64 cmt_arb_gnts : 6;
+               u64 in_use : 3;
+               u64 has_cred : 3;
+               u64 val_exec : 3;
+       } s;
+       struct cvmx_pko_pdm_isrm_dbg_s cn73xx;
+       struct cvmx_pko_pdm_isrm_dbg_s cn78xx;
+       struct cvmx_pko_pdm_isrm_dbg_cn78xxp1 {
+               u64 reserved_34_63 : 30;
+               u64 in_arb_reqs : 7;
+               u64 in_arb_gnts : 6;
+               u64 cmt_arb_reqs : 6;
+               u64 cmt_arb_gnts : 6;
+               u64 in_use : 3;
+               u64 has_cred : 3;
+               u64 val_exec : 3;
+       } cn78xxp1;
+       struct cvmx_pko_pdm_isrm_dbg_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_isrm_dbg cvmx_pko_pdm_isrm_dbg_t;
+
+/**
+ * cvmx_pko_pdm_isrm_dbg_dq
+ */
+union cvmx_pko_pdm_isrm_dbg_dq {
+       u64 u64;
+       struct cvmx_pko_pdm_isrm_dbg_dq_s {
+               u64 reserved_34_63 : 30;
+               u64 ack_sic_dq : 10;
+               u64 reserved_22_23 : 2;
+               u64 fr_sic_dq : 10;
+               u64 reserved_10_11 : 2;
+               u64 cp_sic_dq : 10;
+       } s;
+       struct cvmx_pko_pdm_isrm_dbg_dq_s cn73xx;
+       struct cvmx_pko_pdm_isrm_dbg_dq_s cn78xx;
+       struct cvmx_pko_pdm_isrm_dbg_dq_s cn78xxp1;
+       struct cvmx_pko_pdm_isrm_dbg_dq_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_isrm_dbg_dq cvmx_pko_pdm_isrm_dbg_dq_t;
+
+/**
+ * cvmx_pko_pdm_mem_addr
+ */
+union cvmx_pko_pdm_mem_addr {
+       u64 u64;
+       struct cvmx_pko_pdm_mem_addr_s {
+               u64 memsel : 3;
+               u64 reserved_17_60 : 44;
+               u64 memaddr : 14;
+               u64 reserved_2_2 : 1;
+               u64 membanksel : 2;
+       } s;
+       struct cvmx_pko_pdm_mem_addr_s cn73xx;
+       struct cvmx_pko_pdm_mem_addr_s cn78xx;
+       struct cvmx_pko_pdm_mem_addr_s cn78xxp1;
+       struct cvmx_pko_pdm_mem_addr_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_mem_addr cvmx_pko_pdm_mem_addr_t;
+
+/**
+ * cvmx_pko_pdm_mem_data
+ */
+union cvmx_pko_pdm_mem_data {
+       u64 u64;
+       struct cvmx_pko_pdm_mem_data_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_pko_pdm_mem_data_s cn73xx;
+       struct cvmx_pko_pdm_mem_data_s cn78xx;
+       struct cvmx_pko_pdm_mem_data_s cn78xxp1;
+       struct cvmx_pko_pdm_mem_data_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_mem_data cvmx_pko_pdm_mem_data_t;
+
+/**
+ * cvmx_pko_pdm_mem_rw_ctl
+ */
+union cvmx_pko_pdm_mem_rw_ctl {
+       u64 u64;
+       struct cvmx_pko_pdm_mem_rw_ctl_s {
+               u64 reserved_2_63 : 62;
+               u64 read : 1;
+               u64 write : 1;
+       } s;
+       struct cvmx_pko_pdm_mem_rw_ctl_s cn73xx;
+       struct cvmx_pko_pdm_mem_rw_ctl_s cn78xx;
+       struct cvmx_pko_pdm_mem_rw_ctl_s cn78xxp1;
+       struct cvmx_pko_pdm_mem_rw_ctl_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_mem_rw_ctl cvmx_pko_pdm_mem_rw_ctl_t;
+
+/**
+ * cvmx_pko_pdm_mem_rw_sts
+ */
+union cvmx_pko_pdm_mem_rw_sts {
+       u64 u64;
+       struct cvmx_pko_pdm_mem_rw_sts_s {
+               u64 reserved_1_63 : 63;
+               u64 readdone : 1;
+       } s;
+       struct cvmx_pko_pdm_mem_rw_sts_s cn73xx;
+       struct cvmx_pko_pdm_mem_rw_sts_s cn78xx;
+       struct cvmx_pko_pdm_mem_rw_sts_s cn78xxp1;
+       struct cvmx_pko_pdm_mem_rw_sts_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_mem_rw_sts cvmx_pko_pdm_mem_rw_sts_t;
+
+/**
+ * cvmx_pko_pdm_mwpbuf_dbg
+ */
+union cvmx_pko_pdm_mwpbuf_dbg {
+       u64 u64;
+       struct cvmx_pko_pdm_mwpbuf_dbg_s {
+               u64 reserved_49_63 : 15;
+               u64 str_proc : 1;
+               u64 cmd_proc : 1;
+               u64 str_val : 1;
+               u64 mem_data_val : 1;
+               u64 insert_np : 1;
+               u64 insert_mp : 1;
+               u64 sel_nxt_ptr : 1;
+               u64 load_val : 1;
+               u64 rdy : 1;
+               u64 cur_state : 3;
+               u64 mem_rdy : 1;
+               u64 str_rdy : 1;
+               u64 contention_type : 2;
+               u64 track_rd_cnt : 6;
+               u64 track_wr_cnt : 6;
+               u64 mem_wen : 4;
+               u64 mem_addr : 13;
+               u64 mem_en : 4;
+       } s;
+       struct cvmx_pko_pdm_mwpbuf_dbg_cn73xx {
+               u64 reserved_49_63 : 15;
+               u64 str_proc : 1;
+               u64 cmd_proc : 1;
+               u64 str_val : 1;
+               u64 mem_data_val : 1;
+               u64 insert_np : 1;
+               u64 insert_mp : 1;
+               u64 sel_nxt_ptr : 1;
+               u64 load_val : 1;
+               u64 rdy : 1;
+               u64 cur_state : 3;
+               u64 mem_rdy : 1;
+               u64 str_rdy : 1;
+               u64 contention_type : 2;
+               u64 reserved_21_32 : 12;
+               u64 mem_wen : 4;
+               u64 reserved_15_16 : 2;
+               u64 mem_addr : 11;
+               u64 mem_en : 4;
+       } cn73xx;
+       struct cvmx_pko_pdm_mwpbuf_dbg_s cn78xx;
+       struct cvmx_pko_pdm_mwpbuf_dbg_s cn78xxp1;
+       struct cvmx_pko_pdm_mwpbuf_dbg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_mwpbuf_dbg cvmx_pko_pdm_mwpbuf_dbg_t;
+
+/**
+ * cvmx_pko_pdm_sts
+ */
+union cvmx_pko_pdm_sts {
+       u64 u64;
+       struct cvmx_pko_pdm_sts_s {
+               u64 reserved_38_63 : 26;
+               u64 cp_stalled_thrshld_hit : 1;
+               u64 reserved_35_36 : 2;
+               u64 mwpbuf_data_val_err : 1;
+               u64 drpbuf_data_val_err : 1;
+               u64 dwpbuf_data_val_err : 1;
+               u64 reserved_30_31 : 2;
+               u64 qcmd_iobx_err_sts : 4;
+               u64 qcmd_iobx_err : 1;
+               u64 sendpkt_lmtdma_err_sts : 4;
+               u64 sendpkt_lmtdma_err : 1;
+               u64 sendpkt_lmtst_err_sts : 4;
+               u64 sendpkt_lmtst_err : 1;
+               u64 fpa_no_ptrs : 1;
+               u64 reserved_12_13 : 2;
+               u64 cp_sendpkt_err_no_drp_code : 2;
+               u64 cp_sendpkt_err_no_drp : 1;
+               u64 reserved_7_8 : 2;
+               u64 cp_sendpkt_err_drop_code : 3;
+               u64 cp_sendpkt_err_drop : 1;
+               u64 reserved_1_2 : 2;
+               u64 desc_crc_err : 1;
+       } s;
+       struct cvmx_pko_pdm_sts_s cn73xx;
+       struct cvmx_pko_pdm_sts_s cn78xx;
+       struct cvmx_pko_pdm_sts_s cn78xxp1;
+       struct cvmx_pko_pdm_sts_s cnf75xx;
+};
+
+typedef union cvmx_pko_pdm_sts cvmx_pko_pdm_sts_t;
+
+/**
+ * cvmx_pko_peb_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_peb_bist_status {
+       u64 u64;
+       struct cvmx_pko_peb_bist_status_s {
+               u64 reserved_26_63 : 38;
+               u64 add_work_fifo : 1;
+               u64 pdm_pse_buf_ram : 1;
+               u64 iobp0_fifo_ram : 1;
+               u64 iobp1_fifo_ram : 1;
+               u64 state_mem0 : 1;
+               u64 reserved_19_20 : 2;
+               u64 state_mem3 : 1;
+               u64 iobp1_uid_fifo_ram : 1;
+               u64 nxt_link_ptr_ram : 1;
+               u64 pd_bank0_ram : 1;
+               u64 pd_bank1_ram : 1;
+               u64 pd_bank2_ram : 1;
+               u64 pd_bank3_ram : 1;
+               u64 pd_var_bank_ram : 1;
+               u64 pdm_resp_buf_ram : 1;
+               u64 tx_fifo_pkt_ram : 1;
+               u64 tx_fifo_hdr_ram : 1;
+               u64 tx_fifo_crc_ram : 1;
+               u64 ts_addwork_ram : 1;
+               u64 send_mem_ts_fifo : 1;
+               u64 send_mem_stdn_fifo : 1;
+               u64 send_mem_fifo : 1;
+               u64 pkt_mrk_ram : 1;
+               u64 peb_st_inf_ram : 1;
+               u64 peb_sm_jmp_ram : 1;
+       } s;
+       struct cvmx_pko_peb_bist_status_cn73xx {
+               u64 reserved_26_63 : 38;
+               u64 add_work_fifo : 1;
+               u64 pdm_pse_buf_ram : 1;
+               u64 iobp0_fifo_ram : 1;
+               u64 iobp1_fifo_ram : 1;
+               u64 state_mem0 : 1;
+               u64 reserved_19_20 : 2;
+               u64 state_mem3 : 1;
+               u64 iobp1_uid_fifo_ram : 1;
+               u64 nxt_link_ptr_ram : 1;
+               u64 pd_bank0_ram : 1;
+               u64 reserved_13_14 : 2;
+               u64 pd_bank3_ram : 1;
+               u64 pd_var_bank_ram : 1;
+               u64 pdm_resp_buf_ram : 1;
+               u64 tx_fifo_pkt_ram : 1;
+               u64 tx_fifo_hdr_ram : 1;
+               u64 tx_fifo_crc_ram : 1;
+               u64 ts_addwork_ram : 1;
+               u64 send_mem_ts_fifo : 1;
+               u64 send_mem_stdn_fifo : 1;
+               u64 send_mem_fifo : 1;
+               u64 pkt_mrk_ram : 1;
+               u64 peb_st_inf_ram : 1;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_peb_bist_status_cn73xx cn78xx;
+       struct cvmx_pko_peb_bist_status_s cn78xxp1;
+       struct cvmx_pko_peb_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_peb_bist_status cvmx_pko_peb_bist_status_t;
+
+/**
+ * cvmx_pko_peb_ecc_ctl0
+ */
+union cvmx_pko_peb_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_peb_ecc_ctl0_s {
+               u64 iobp1_uid_fifo_ram_flip : 2;
+               u64 iobp1_uid_fifo_ram_cdis : 1;
+               u64 iobp0_fifo_ram_flip : 2;
+               u64 iobp0_fifo_ram_cdis : 1;
+               u64 iobp1_fifo_ram_flip : 2;
+               u64 iobp1_fifo_ram_cdis : 1;
+               u64 pdm_resp_buf_ram_flip : 2;
+               u64 pdm_resp_buf_ram_cdis : 1;
+               u64 pdm_pse_buf_ram_flip : 2;
+               u64 pdm_pse_buf_ram_cdis : 1;
+               u64 peb_sm_jmp_ram_flip : 2;
+               u64 peb_sm_jmp_ram_cdis : 1;
+               u64 peb_st_inf_ram_flip : 2;
+               u64 peb_st_inf_ram_cdis : 1;
+               u64 pd_bank3_ram_flip : 2;
+               u64 pd_bank3_ram_cdis : 1;
+               u64 pd_bank2_ram_flip : 2;
+               u64 pd_bank2_ram_cdis : 1;
+               u64 pd_bank1_ram_flip : 2;
+               u64 pd_bank1_ram_cdis : 1;
+               u64 pd_bank0_ram_flip : 2;
+               u64 pd_bank0_ram_cdis : 1;
+               u64 pd_var_bank_ram_flip : 2;
+               u64 pd_var_bank_ram_cdis : 1;
+               u64 tx_fifo_crc_ram_flip : 2;
+               u64 tx_fifo_crc_ram_cdis : 1;
+               u64 tx_fifo_hdr_ram_flip : 2;
+               u64 tx_fifo_hdr_ram_cdis : 1;
+               u64 tx_fifo_pkt_ram_flip : 2;
+               u64 tx_fifo_pkt_ram_cdis : 1;
+               u64 add_work_fifo_flip : 2;
+               u64 add_work_fifo_cdis : 1;
+               u64 send_mem_fifo_flip : 2;
+               u64 send_mem_fifo_cdis : 1;
+               u64 send_mem_stdn_fifo_flip : 2;
+               u64 send_mem_stdn_fifo_cdis : 1;
+               u64 send_mem_ts_fifo_flip : 2;
+               u64 send_mem_ts_fifo_cdis : 1;
+               u64 nxt_link_ptr_ram_flip : 2;
+               u64 nxt_link_ptr_ram_cdis : 1;
+               u64 pkt_mrk_ram_flip : 2;
+               u64 pkt_mrk_ram_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_peb_ecc_ctl0_cn73xx {
+               u64 iobp1_uid_fifo_ram_flip : 2;
+               u64 iobp1_uid_fifo_ram_cdis : 1;
+               u64 iobp0_fifo_ram_flip : 2;
+               u64 iobp0_fifo_ram_cdis : 1;
+               u64 iobp1_fifo_ram_flip : 2;
+               u64 iobp1_fifo_ram_cdis : 1;
+               u64 pdm_resp_buf_ram_flip : 2;
+               u64 pdm_resp_buf_ram_cdis : 1;
+               u64 pdm_pse_buf_ram_flip : 2;
+               u64 pdm_pse_buf_ram_cdis : 1;
+               u64 reserved_46_48 : 3;
+               u64 peb_st_inf_ram_flip : 2;
+               u64 peb_st_inf_ram_cdis : 1;
+               u64 pd_bank3_ram_flip : 2;
+               u64 pd_bank3_ram_cdis : 1;
+               u64 reserved_34_39 : 6;
+               u64 pd_bank0_ram_flip : 2;
+               u64 pd_bank0_ram_cdis : 1;
+               u64 pd_var_bank_ram_flip : 2;
+               u64 pd_var_bank_ram_cdis : 1;
+               u64 tx_fifo_crc_ram_flip : 2;
+               u64 tx_fifo_crc_ram_cdis : 1;
+               u64 tx_fifo_hdr_ram_flip : 2;
+               u64 tx_fifo_hdr_ram_cdis : 1;
+               u64 tx_fifo_pkt_ram_flip : 2;
+               u64 tx_fifo_pkt_ram_cdis : 1;
+               u64 add_work_fifo_flip : 2;
+               u64 add_work_fifo_cdis : 1;
+               u64 send_mem_fifo_flip : 2;
+               u64 send_mem_fifo_cdis : 1;
+               u64 send_mem_stdn_fifo_flip : 2;
+               u64 send_mem_stdn_fifo_cdis : 1;
+               u64 send_mem_ts_fifo_flip : 2;
+               u64 send_mem_ts_fifo_cdis : 1;
+               u64 nxt_link_ptr_ram_flip : 2;
+               u64 nxt_link_ptr_ram_cdis : 1;
+               u64 pkt_mrk_ram_flip : 2;
+               u64 pkt_mrk_ram_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_peb_ecc_ctl0_cn73xx cn78xx;
+       struct cvmx_pko_peb_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_peb_ecc_ctl0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ecc_ctl0 cvmx_pko_peb_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_peb_ecc_ctl1
+ */
+union cvmx_pko_peb_ecc_ctl1 {
+       u64 u64;
+       struct cvmx_pko_peb_ecc_ctl1_s {
+               u64 ts_addwork_ram_flip : 2;
+               u64 ts_addwork_ram_cdis : 1;
+               u64 state_mem0_flip : 2;
+               u64 state_mem0_cdis : 1;
+               u64 reserved_52_57 : 6;
+               u64 state_mem3_flip : 2;
+               u64 state_mem3_cdis : 1;
+               u64 reserved_0_48 : 49;
+       } s;
+       struct cvmx_pko_peb_ecc_ctl1_s cn73xx;
+       struct cvmx_pko_peb_ecc_ctl1_cn78xx {
+               u64 ts_addwork_ram_flip : 2;
+               u64 ts_addwork_ram_cdis : 1;
+               u64 reserved_0_60 : 61;
+       } cn78xx;
+       struct cvmx_pko_peb_ecc_ctl1_cn78xx cn78xxp1;
+       struct cvmx_pko_peb_ecc_ctl1_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ecc_ctl1 cvmx_pko_peb_ecc_ctl1_t;
+
+/**
+ * cvmx_pko_peb_ecc_dbe_sts0
+ */
+union cvmx_pko_peb_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_peb_ecc_dbe_sts0_s {
+               u64 iobp1_uid_fifo_ram_dbe : 1;
+               u64 iobp0_fifo_ram_dbe : 1;
+               u64 iobp1_fifo_ram_dbe : 1;
+               u64 pdm_resp_buf_ram_dbe : 1;
+               u64 pdm_pse_buf_ram_dbe : 1;
+               u64 peb_sm_jmp_ram_dbe : 1;
+               u64 peb_st_inf_ram_dbe : 1;
+               u64 pd_bank3_ram_dbe : 1;
+               u64 pd_bank2_ram_dbe : 1;
+               u64 pd_bank1_ram_dbe : 1;
+               u64 pd_bank0_ram_dbe : 1;
+               u64 pd_var_bank_ram_dbe : 1;
+               u64 tx_fifo_crc_ram_dbe : 1;
+               u64 tx_fifo_hdr_ram_dbe : 1;
+               u64 tx_fifo_pkt_ram_dbe : 1;
+               u64 add_work_fifo_dbe : 1;
+               u64 send_mem_fifo_dbe : 1;
+               u64 send_mem_stdn_fifo_dbe : 1;
+               u64 send_mem_ts_fifo_dbe : 1;
+               u64 nxt_link_ptr_ram_dbe : 1;
+               u64 pkt_mrk_ram_dbe : 1;
+               u64 ts_addwork_ram_dbe : 1;
+               u64 state_mem0_dbe : 1;
+               u64 reserved_39_40 : 2;
+               u64 state_mem3_dbe : 1;
+               u64 reserved_0_37 : 38;
+       } s;
+       struct cvmx_pko_peb_ecc_dbe_sts0_cn73xx {
+               u64 iobp1_uid_fifo_ram_dbe : 1;
+               u64 iobp0_fifo_ram_dbe : 1;
+               u64 iobp1_fifo_ram_dbe : 1;
+               u64 pdm_resp_buf_ram_dbe : 1;
+               u64 pdm_pse_buf_ram_dbe : 1;
+               u64 reserved_58_58 : 1;
+               u64 peb_st_inf_ram_dbe : 1;
+               u64 pd_bank3_ram_dbe : 1;
+               u64 reserved_54_55 : 2;
+               u64 pd_bank0_ram_dbe : 1;
+               u64 pd_var_bank_ram_dbe : 1;
+               u64 tx_fifo_crc_ram_dbe : 1;
+               u64 tx_fifo_hdr_ram_dbe : 1;
+               u64 tx_fifo_pkt_ram_dbe : 1;
+               u64 add_work_fifo_dbe : 1;
+               u64 send_mem_fifo_dbe : 1;
+               u64 send_mem_stdn_fifo_dbe : 1;
+               u64 send_mem_ts_fifo_dbe : 1;
+               u64 nxt_link_ptr_ram_dbe : 1;
+               u64 pkt_mrk_ram_dbe : 1;
+               u64 ts_addwork_ram_dbe : 1;
+               u64 state_mem0_dbe : 1;
+               u64 reserved_39_40 : 2;
+               u64 state_mem3_dbe : 1;
+               u64 reserved_0_37 : 38;
+       } cn73xx;
+       struct cvmx_pko_peb_ecc_dbe_sts0_cn78xx {
+               u64 iobp1_uid_fifo_ram_dbe : 1;
+               u64 iobp0_fifo_ram_dbe : 1;
+               u64 iobp1_fifo_ram_dbe : 1;
+               u64 pdm_resp_buf_ram_dbe : 1;
+               u64 pdm_pse_buf_ram_dbe : 1;
+               u64 reserved_58_58 : 1;
+               u64 peb_st_inf_ram_dbe : 1;
+               u64 pd_bank3_ram_dbe : 1;
+               u64 reserved_54_55 : 2;
+               u64 pd_bank0_ram_dbe : 1;
+               u64 pd_var_bank_ram_dbe : 1;
+               u64 tx_fifo_crc_ram_dbe : 1;
+               u64 tx_fifo_hdr_ram_dbe : 1;
+               u64 tx_fifo_pkt_ram_dbe : 1;
+               u64 add_work_fifo_dbe : 1;
+               u64 send_mem_fifo_dbe : 1;
+               u64 send_mem_stdn_fifo_dbe : 1;
+               u64 send_mem_ts_fifo_dbe : 1;
+               u64 nxt_link_ptr_ram_dbe : 1;
+               u64 pkt_mrk_ram_dbe : 1;
+               u64 ts_addwork_ram_dbe : 1;
+               u64 reserved_0_41 : 42;
+       } cn78xx;
+       struct cvmx_pko_peb_ecc_dbe_sts0_cn78xxp1 {
+               u64 iobp1_uid_fifo_ram_dbe : 1;
+               u64 iobp0_fifo_ram_dbe : 1;
+               u64 iobp1_fifo_ram_dbe : 1;
+               u64 pdm_resp_buf_ram_dbe : 1;
+               u64 pdm_pse_buf_ram_dbe : 1;
+               u64 peb_sm_jmp_ram_dbe : 1;
+               u64 peb_st_inf_ram_dbe : 1;
+               u64 pd_bank3_ram_dbe : 1;
+               u64 pd_bank2_ram_dbe : 1;
+               u64 pd_bank1_ram_dbe : 1;
+               u64 pd_bank0_ram_dbe : 1;
+               u64 pd_var_bank_ram_dbe : 1;
+               u64 tx_fifo_crc_ram_dbe : 1;
+               u64 tx_fifo_hdr_ram_dbe : 1;
+               u64 tx_fifo_pkt_ram_dbe : 1;
+               u64 add_work_fifo_dbe : 1;
+               u64 send_mem_fifo_dbe : 1;
+               u64 send_mem_stdn_fifo_dbe : 1;
+               u64 send_mem_ts_fifo_dbe : 1;
+               u64 nxt_link_ptr_ram_dbe : 1;
+               u64 pkt_mrk_ram_dbe : 1;
+               u64 ts_addwork_ram_dbe : 1;
+               u64 reserved_0_41 : 42;
+       } cn78xxp1;
+       struct cvmx_pko_peb_ecc_dbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ecc_dbe_sts0 cvmx_pko_peb_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_peb_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_peb_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_peb_ecc_dbe_sts_cmb0_s {
+               u64 peb_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_peb_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_peb_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_peb_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_peb_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ecc_dbe_sts_cmb0 cvmx_pko_peb_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_peb_ecc_sbe_sts0
+ */
+union cvmx_pko_peb_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_peb_ecc_sbe_sts0_s {
+               u64 iobp1_uid_fifo_ram_sbe : 1;
+               u64 iobp0_fifo_ram_sbe : 1;
+               u64 iobp1_fifo_ram_sbe : 1;
+               u64 pdm_resp_buf_ram_sbe : 1;
+               u64 pdm_pse_buf_ram_sbe : 1;
+               u64 peb_sm_jmp_ram_sbe : 1;
+               u64 peb_st_inf_ram_sbe : 1;
+               u64 pd_bank3_ram_sbe : 1;
+               u64 pd_bank2_ram_sbe : 1;
+               u64 pd_bank1_ram_sbe : 1;
+               u64 pd_bank0_ram_sbe : 1;
+               u64 pd_var_bank_ram_sbe : 1;
+               u64 tx_fifo_crc_ram_sbe : 1;
+               u64 tx_fifo_hdr_ram_sbe : 1;
+               u64 tx_fifo_pkt_ram_sbe : 1;
+               u64 add_work_fifo_sbe : 1;
+               u64 send_mem_fifo_sbe : 1;
+               u64 send_mem_stdn_fifo_sbe : 1;
+               u64 send_mem_ts_fifo_sbe : 1;
+               u64 nxt_link_ptr_ram_sbe : 1;
+               u64 pkt_mrk_ram_sbe : 1;
+               u64 ts_addwork_ram_sbe : 1;
+               u64 state_mem0_sbe : 1;
+               u64 reserved_39_40 : 2;
+               u64 state_mem3_sbe : 1;
+               u64 reserved_0_37 : 38;
+       } s;
+       struct cvmx_pko_peb_ecc_sbe_sts0_cn73xx {
+               u64 iobp1_uid_fifo_ram_sbe : 1;
+               u64 iobp0_fifo_ram_sbe : 1;
+               u64 iobp1_fifo_ram_sbe : 1;
+               u64 pdm_resp_buf_ram_sbe : 1;
+               u64 pdm_pse_buf_ram_sbe : 1;
+               u64 reserved_58_58 : 1;
+               u64 peb_st_inf_ram_sbe : 1;
+               u64 pd_bank3_ram_sbe : 1;
+               u64 reserved_54_55 : 2;
+               u64 pd_bank0_ram_sbe : 1;
+               u64 pd_var_bank_ram_sbe : 1;
+               u64 tx_fifo_crc_ram_sbe : 1;
+               u64 tx_fifo_hdr_ram_sbe : 1;
+               u64 tx_fifo_pkt_ram_sbe : 1;
+               u64 add_work_fifo_sbe : 1;
+               u64 send_mem_fifo_sbe : 1;
+               u64 send_mem_stdn_fifo_sbe : 1;
+               u64 send_mem_ts_fifo_sbe : 1;
+               u64 nxt_link_ptr_ram_sbe : 1;
+               u64 pkt_mrk_ram_sbe : 1;
+               u64 ts_addwork_ram_sbe : 1;
+               u64 state_mem0_sbe : 1;
+               u64 reserved_39_40 : 2;
+               u64 state_mem3_sbe : 1;
+               u64 reserved_0_37 : 38;
+       } cn73xx;
+       struct cvmx_pko_peb_ecc_sbe_sts0_cn78xx {
+               u64 iobp1_uid_fifo_ram_sbe : 1;
+               u64 iobp0_fifo_ram_sbe : 1;
+               u64 iobp1_fifo_ram_sbe : 1;
+               u64 pdm_resp_buf_ram_sbe : 1;
+               u64 pdm_pse_buf_ram_sbe : 1;
+               u64 reserved_58_58 : 1;
+               u64 peb_st_inf_ram_sbe : 1;
+               u64 pd_bank3_ram_sbe : 1;
+               u64 reserved_54_55 : 2;
+               u64 pd_bank0_ram_sbe : 1;
+               u64 pd_var_bank_ram_sbe : 1;
+               u64 tx_fifo_crc_ram_sbe : 1;
+               u64 tx_fifo_hdr_ram_sbe : 1;
+               u64 tx_fifo_pkt_ram_sbe : 1;
+               u64 add_work_fifo_sbe : 1;
+               u64 send_mem_fifo_sbe : 1;
+               u64 send_mem_stdn_fifo_sbe : 1;
+               u64 send_mem_ts_fifo_sbe : 1;
+               u64 nxt_link_ptr_ram_sbe : 1;
+               u64 pkt_mrk_ram_sbe : 1;
+               u64 ts_addwork_ram_sbe : 1;
+               u64 reserved_0_41 : 42;
+       } cn78xx;
+       struct cvmx_pko_peb_ecc_sbe_sts0_cn78xxp1 {
+               u64 iobp1_uid_fifo_ram_sbe : 1;
+               u64 iobp0_fifo_ram_sbe : 1;
+               u64 iobp1_fifo_ram_sbe : 1;
+               u64 pdm_resp_buf_ram_sbe : 1;
+               u64 pdm_pse_buf_ram_sbe : 1;
+               u64 peb_sm_jmp_ram_sbe : 1;
+               u64 peb_st_inf_ram_sbe : 1;
+               u64 pd_bank3_ram_sbe : 1;
+               u64 pd_bank2_ram_sbe : 1;
+               u64 pd_bank1_ram_sbe : 1;
+               u64 pd_bank0_ram_sbe : 1;
+               u64 pd_var_bank_ram_sbe : 1;
+               u64 tx_fifo_crc_ram_sbe : 1;
+               u64 tx_fifo_hdr_ram_sbe : 1;
+               u64 tx_fifo_pkt_ram_sbe : 1;
+               u64 add_work_fifo_sbe : 1;
+               u64 send_mem_fifo_sbe : 1;
+               u64 send_mem_stdn_fifo_sbe : 1;
+               u64 send_mem_ts_fifo_sbe : 1;
+               u64 nxt_link_ptr_ram_sbe : 1;
+               u64 pkt_mrk_ram_sbe : 1;
+               u64 ts_addwork_ram_sbe : 1;
+               u64 reserved_0_41 : 42;
+       } cn78xxp1;
+       struct cvmx_pko_peb_ecc_sbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ecc_sbe_sts0 cvmx_pko_peb_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_peb_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_peb_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_peb_ecc_sbe_sts_cmb0_s {
+               u64 peb_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_peb_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_peb_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_peb_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_peb_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ecc_sbe_sts_cmb0 cvmx_pko_peb_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_peb_eco
+ */
+union cvmx_pko_peb_eco {
+       u64 u64;
+       struct cvmx_pko_peb_eco_s {
+               u64 reserved_32_63 : 32;
+               u64 eco_rw : 32;
+       } s;
+       struct cvmx_pko_peb_eco_s cn73xx;
+       struct cvmx_pko_peb_eco_s cn78xx;
+       struct cvmx_pko_peb_eco_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_eco cvmx_pko_peb_eco_t;
+
+/**
+ * cvmx_pko_peb_err_int
+ */
+union cvmx_pko_peb_err_int {
+       u64 u64;
+       struct cvmx_pko_peb_err_int_s {
+               u64 reserved_10_63 : 54;
+               u64 peb_macx_cfg_wr_err : 1;
+               u64 peb_max_link_err : 1;
+               u64 peb_subd_size_err : 1;
+               u64 peb_subd_addr_err : 1;
+               u64 peb_trunc_err : 1;
+               u64 peb_pad_err : 1;
+               u64 peb_pse_fifo_err : 1;
+               u64 peb_fcs_sop_err : 1;
+               u64 peb_jump_def_err : 1;
+               u64 peb_ext_hdr_def_err : 1;
+       } s;
+       struct cvmx_pko_peb_err_int_s cn73xx;
+       struct cvmx_pko_peb_err_int_s cn78xx;
+       struct cvmx_pko_peb_err_int_s cn78xxp1;
+       struct cvmx_pko_peb_err_int_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_err_int cvmx_pko_peb_err_int_t;
+
+/**
+ * cvmx_pko_peb_ext_hdr_def_err_info
+ */
+union cvmx_pko_peb_ext_hdr_def_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_ext_hdr_def_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_ext_hdr_def_err_info_s cn73xx;
+       struct cvmx_pko_peb_ext_hdr_def_err_info_s cn78xx;
+       struct cvmx_pko_peb_ext_hdr_def_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_ext_hdr_def_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ext_hdr_def_err_info cvmx_pko_peb_ext_hdr_def_err_info_t;
+
+/**
+ * cvmx_pko_peb_fcs_sop_err_info
+ */
+union cvmx_pko_peb_fcs_sop_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_fcs_sop_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_fcs_sop_err_info_s cn73xx;
+       struct cvmx_pko_peb_fcs_sop_err_info_s cn78xx;
+       struct cvmx_pko_peb_fcs_sop_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_fcs_sop_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_fcs_sop_err_info cvmx_pko_peb_fcs_sop_err_info_t;
+
+/**
+ * cvmx_pko_peb_jump_def_err_info
+ */
+union cvmx_pko_peb_jump_def_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_jump_def_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_jump_def_err_info_s cn73xx;
+       struct cvmx_pko_peb_jump_def_err_info_s cn78xx;
+       struct cvmx_pko_peb_jump_def_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_jump_def_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_jump_def_err_info cvmx_pko_peb_jump_def_err_info_t;
+
+/**
+ * cvmx_pko_peb_macx_cfg_wr_err_info
+ */
+union cvmx_pko_peb_macx_cfg_wr_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_macx_cfg_wr_err_info_s {
+               u64 reserved_8_63 : 56;
+               u64 val : 1;
+               u64 mac : 7;
+       } s;
+       struct cvmx_pko_peb_macx_cfg_wr_err_info_s cn73xx;
+       struct cvmx_pko_peb_macx_cfg_wr_err_info_s cn78xx;
+       struct cvmx_pko_peb_macx_cfg_wr_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_macx_cfg_wr_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_macx_cfg_wr_err_info cvmx_pko_peb_macx_cfg_wr_err_info_t;
+
+/**
+ * cvmx_pko_peb_max_link_err_info
+ */
+union cvmx_pko_peb_max_link_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_max_link_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_max_link_err_info_s cn73xx;
+       struct cvmx_pko_peb_max_link_err_info_s cn78xx;
+       struct cvmx_pko_peb_max_link_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_max_link_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_max_link_err_info cvmx_pko_peb_max_link_err_info_t;
+
+/**
+ * cvmx_pko_peb_ncb_cfg
+ */
+union cvmx_pko_peb_ncb_cfg {
+       u64 u64;
+       struct cvmx_pko_peb_ncb_cfg_s {
+               u64 reserved_1_63 : 63;
+               u64 rstp : 1;
+       } s;
+       struct cvmx_pko_peb_ncb_cfg_s cn73xx;
+       struct cvmx_pko_peb_ncb_cfg_s cn78xx;
+       struct cvmx_pko_peb_ncb_cfg_s cn78xxp1;
+       struct cvmx_pko_peb_ncb_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_ncb_cfg cvmx_pko_peb_ncb_cfg_t;
+
+/**
+ * cvmx_pko_peb_pad_err_info
+ */
+union cvmx_pko_peb_pad_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_pad_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_pad_err_info_s cn73xx;
+       struct cvmx_pko_peb_pad_err_info_s cn78xx;
+       struct cvmx_pko_peb_pad_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_pad_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_pad_err_info cvmx_pko_peb_pad_err_info_t;
+
+/**
+ * cvmx_pko_peb_pse_fifo_err_info
+ */
+union cvmx_pko_peb_pse_fifo_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_pse_fifo_err_info_s {
+               u64 reserved_25_63 : 39;
+               u64 link : 5;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_pse_fifo_err_info_cn73xx {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } cn73xx;
+       struct cvmx_pko_peb_pse_fifo_err_info_s cn78xx;
+       struct cvmx_pko_peb_pse_fifo_err_info_cn73xx cn78xxp1;
+       struct cvmx_pko_peb_pse_fifo_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_pse_fifo_err_info cvmx_pko_peb_pse_fifo_err_info_t;
+
+/**
+ * cvmx_pko_peb_subd_addr_err_info
+ */
+union cvmx_pko_peb_subd_addr_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_subd_addr_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_subd_addr_err_info_s cn73xx;
+       struct cvmx_pko_peb_subd_addr_err_info_s cn78xx;
+       struct cvmx_pko_peb_subd_addr_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_subd_addr_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_subd_addr_err_info cvmx_pko_peb_subd_addr_err_info_t;
+
+/**
+ * cvmx_pko_peb_subd_size_err_info
+ */
+union cvmx_pko_peb_subd_size_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_subd_size_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_subd_size_err_info_s cn73xx;
+       struct cvmx_pko_peb_subd_size_err_info_s cn78xx;
+       struct cvmx_pko_peb_subd_size_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_subd_size_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_subd_size_err_info cvmx_pko_peb_subd_size_err_info_t;
+
+/**
+ * cvmx_pko_peb_trunc_err_info
+ */
+union cvmx_pko_peb_trunc_err_info {
+       u64 u64;
+       struct cvmx_pko_peb_trunc_err_info_s {
+               u64 reserved_20_63 : 44;
+               u64 val : 1;
+               u64 fifo : 7;
+               u64 chan : 12;
+       } s;
+       struct cvmx_pko_peb_trunc_err_info_s cn73xx;
+       struct cvmx_pko_peb_trunc_err_info_s cn78xx;
+       struct cvmx_pko_peb_trunc_err_info_s cn78xxp1;
+       struct cvmx_pko_peb_trunc_err_info_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_trunc_err_info cvmx_pko_peb_trunc_err_info_t;
+
+/**
+ * cvmx_pko_peb_tso_cfg
+ */
+union cvmx_pko_peb_tso_cfg {
+       u64 u64;
+       struct cvmx_pko_peb_tso_cfg_s {
+               u64 reserved_44_63 : 20;
+               u64 fsf : 12;
+               u64 reserved_28_31 : 4;
+               u64 msf : 12;
+               u64 reserved_12_15 : 4;
+               u64 lsf : 12;
+       } s;
+       struct cvmx_pko_peb_tso_cfg_s cn73xx;
+       struct cvmx_pko_peb_tso_cfg_s cn78xx;
+       struct cvmx_pko_peb_tso_cfg_s cn78xxp1;
+       struct cvmx_pko_peb_tso_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pko_peb_tso_cfg cvmx_pko_peb_tso_cfg_t;
+
+/**
+ * cvmx_pko_pq_csr_bus_debug
+ */
+union cvmx_pko_pq_csr_bus_debug {
+       u64 u64;
+       struct cvmx_pko_pq_csr_bus_debug_s {
+               u64 csr_bus_debug : 64;
+       } s;
+       struct cvmx_pko_pq_csr_bus_debug_s cn73xx;
+       struct cvmx_pko_pq_csr_bus_debug_s cn78xx;
+       struct cvmx_pko_pq_csr_bus_debug_s cn78xxp1;
+       struct cvmx_pko_pq_csr_bus_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_pq_csr_bus_debug cvmx_pko_pq_csr_bus_debug_t;
+
+/**
+ * cvmx_pko_pq_debug_green
+ */
+union cvmx_pko_pq_debug_green {
+       u64 u64;
+       struct cvmx_pko_pq_debug_green_s {
+               u64 g_valid : 32;
+               u64 cred_ok_n : 32;
+       } s;
+       struct cvmx_pko_pq_debug_green_s cn73xx;
+       struct cvmx_pko_pq_debug_green_s cn78xx;
+       struct cvmx_pko_pq_debug_green_s cn78xxp1;
+       struct cvmx_pko_pq_debug_green_s cnf75xx;
+};
+
+typedef union cvmx_pko_pq_debug_green cvmx_pko_pq_debug_green_t;
+
+/**
+ * cvmx_pko_pq_debug_links
+ */
+union cvmx_pko_pq_debug_links {
+       u64 u64;
+       struct cvmx_pko_pq_debug_links_s {
+               u64 links_ready : 32;
+               u64 peb_lnk_rdy_ir : 32;
+       } s;
+       struct cvmx_pko_pq_debug_links_s cn73xx;
+       struct cvmx_pko_pq_debug_links_s cn78xx;
+       struct cvmx_pko_pq_debug_links_s cn78xxp1;
+       struct cvmx_pko_pq_debug_links_s cnf75xx;
+};
+
+typedef union cvmx_pko_pq_debug_links cvmx_pko_pq_debug_links_t;
+
+/**
+ * cvmx_pko_pq_debug_yellow
+ */
+union cvmx_pko_pq_debug_yellow {
+       u64 u64;
+       struct cvmx_pko_pq_debug_yellow_s {
+               u64 y_valid : 32;
+               u64 reserved_28_31 : 4;
+               u64 link_vv : 28;
+       } s;
+       struct cvmx_pko_pq_debug_yellow_s cn73xx;
+       struct cvmx_pko_pq_debug_yellow_s cn78xx;
+       struct cvmx_pko_pq_debug_yellow_s cn78xxp1;
+       struct cvmx_pko_pq_debug_yellow_s cnf75xx;
+};
+
+typedef union cvmx_pko_pq_debug_yellow cvmx_pko_pq_debug_yellow_t;
+
+/**
+ * cvmx_pko_pqa_debug
+ */
+union cvmx_pko_pqa_debug {
+       u64 u64;
+       struct cvmx_pko_pqa_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_pqa_debug_s cn73xx;
+       struct cvmx_pko_pqa_debug_s cn78xx;
+       struct cvmx_pko_pqa_debug_s cn78xxp1;
+       struct cvmx_pko_pqa_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_pqa_debug cvmx_pko_pqa_debug_t;
+
+/**
+ * cvmx_pko_pqb_debug
+ *
+ * This register has the same bit fields as PKO_PQA_DEBUG.
+ *
+ */
+union cvmx_pko_pqb_debug {
+       u64 u64;
+       struct cvmx_pko_pqb_debug_s {
+               u64 dbg_vec : 64;
+       } s;
+       struct cvmx_pko_pqb_debug_s cn73xx;
+       struct cvmx_pko_pqb_debug_s cn78xx;
+       struct cvmx_pko_pqb_debug_s cn78xxp1;
+       struct cvmx_pko_pqb_debug_s cnf75xx;
+};
+
+typedef union cvmx_pko_pqb_debug cvmx_pko_pqb_debug_t;
+
+/**
+ * cvmx_pko_pse_dq_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pse_dq_bist_status {
+       u64 u64;
+       struct cvmx_pko_pse_dq_bist_status_s {
+               u64 reserved_8_63 : 56;
+               u64 rt7_sram : 1;
+               u64 rt6_sram : 1;
+               u64 rt5_sram : 1;
+               u64 reserved_4_4 : 1;
+               u64 rt3_sram : 1;
+               u64 rt2_sram : 1;
+               u64 rt1_sram : 1;
+               u64 rt0_sram : 1;
+       } s;
+       struct cvmx_pko_pse_dq_bist_status_cn73xx {
+               u64 reserved_5_63 : 59;
+               u64 wt_sram : 1;
+               u64 reserved_2_3 : 2;
+               u64 rt1_sram : 1;
+               u64 rt0_sram : 1;
+       } cn73xx;
+       struct cvmx_pko_pse_dq_bist_status_cn78xx {
+               u64 reserved_9_63 : 55;
+               u64 wt_sram : 1;
+               u64 rt7_sram : 1;
+               u64 rt6_sram : 1;
+               u64 rt5_sram : 1;
+               u64 rt4_sram : 1;
+               u64 rt3_sram : 1;
+               u64 rt2_sram : 1;
+               u64 rt1_sram : 1;
+               u64 rt0_sram : 1;
+       } cn78xx;
+       struct cvmx_pko_pse_dq_bist_status_cn78xx cn78xxp1;
+       struct cvmx_pko_pse_dq_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_dq_bist_status cvmx_pko_pse_dq_bist_status_t;
+
+/**
+ * cvmx_pko_pse_dq_ecc_ctl0
+ */
+union cvmx_pko_pse_dq_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pse_dq_ecc_ctl0_s {
+               u64 dq_wt_ram_flip : 2;
+               u64 dq_wt_ram_cdis : 1;
+               u64 dq_rt7_flip : 2;
+               u64 dq_rt7_cdis : 1;
+               u64 dq_rt6_flip : 2;
+               u64 dq_rt6_cdis : 1;
+               u64 dq_rt5_flip : 2;
+               u64 dq_rt5_cdis : 1;
+               u64 dq_rt4_flip : 2;
+               u64 dq_rt4_cdis : 1;
+               u64 dq_rt3_flip : 2;
+               u64 dq_rt3_cdis : 1;
+               u64 dq_rt2_flip : 2;
+               u64 dq_rt2_cdis : 1;
+               u64 dq_rt1_flip : 2;
+               u64 dq_rt1_cdis : 1;
+               u64 dq_rt0_flip : 2;
+               u64 dq_rt0_cdis : 1;
+               u64 reserved_0_36 : 37;
+       } s;
+       struct cvmx_pko_pse_dq_ecc_ctl0_cn73xx {
+               u64 dq_wt_ram_flip : 2;
+               u64 dq_wt_ram_cdis : 1;
+               u64 reserved_43_60 : 18;
+               u64 dq_rt1_flip : 2;
+               u64 dq_rt1_cdis : 1;
+               u64 dq_rt0_flip : 2;
+               u64 dq_rt0_cdis : 1;
+               u64 reserved_0_36 : 37;
+       } cn73xx;
+       struct cvmx_pko_pse_dq_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pse_dq_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_pse_dq_ecc_ctl0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_dq_ecc_ctl0 cvmx_pko_pse_dq_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pse_dq_ecc_dbe_sts0
+ */
+union cvmx_pko_pse_dq_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts0_s {
+               u64 dq_wt_ram_dbe : 1;
+               u64 dq_rt7_dbe : 1;
+               u64 dq_rt6_dbe : 1;
+               u64 dq_rt5_dbe : 1;
+               u64 dq_rt4_dbe : 1;
+               u64 dq_rt3_dbe : 1;
+               u64 dq_rt2_dbe : 1;
+               u64 dq_rt1_dbe : 1;
+               u64 dq_rt0_dbe : 1;
+               u64 reserved_0_54 : 55;
+       } s;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts0_cn73xx {
+               u64 dq_wt_ram_dbe : 1;
+               u64 reserved_57_62 : 6;
+               u64 dq_rt1_dbe : 1;
+               u64 dq_rt0_dbe : 1;
+               u64 reserved_0_54 : 55;
+       } cn73xx;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_dq_ecc_dbe_sts0 cvmx_pko_pse_dq_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_dq_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pse_dq_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts_cmb0_s {
+               u64 pse_dq_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_dq_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_dq_ecc_dbe_sts_cmb0 cvmx_pko_pse_dq_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_dq_ecc_sbe_sts0
+ */
+union cvmx_pko_pse_dq_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts0_s {
+               u64 dq_wt_ram_sbe : 1;
+               u64 dq_rt7_sbe : 1;
+               u64 dq_rt6_sbe : 1;
+               u64 dq_rt5_sbe : 1;
+               u64 dq_rt4_sbe : 1;
+               u64 dq_rt3_sbe : 1;
+               u64 dq_rt2_sbe : 1;
+               u64 dq_rt1_sbe : 1;
+               u64 dq_rt0_sbe : 1;
+               u64 reserved_0_54 : 55;
+       } s;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts0_cn73xx {
+               u64 dq_wt_ram_sbe : 1;
+               u64 reserved_57_62 : 6;
+               u64 dq_rt1_sbe : 1;
+               u64 dq_rt0_sbe : 1;
+               u64 reserved_0_54 : 55;
+       } cn73xx;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_dq_ecc_sbe_sts0 cvmx_pko_pse_dq_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_dq_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pse_dq_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts_cmb0_s {
+               u64 pse_dq_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_dq_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_dq_ecc_sbe_sts_cmb0 cvmx_pko_pse_dq_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_pq_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pse_pq_bist_status {
+       u64 u64;
+       struct cvmx_pko_pse_pq_bist_status_s {
+               u64 reserved_15_63 : 49;
+               u64 tp_sram : 1;
+               u64 irq_fifo_sram : 1;
+               u64 wmd_sram : 1;
+               u64 wms_sram : 1;
+               u64 cxd_sram : 1;
+               u64 dqd_sram : 1;
+               u64 dqs_sram : 1;
+               u64 pqd_sram : 1;
+               u64 pqr_sram : 1;
+               u64 pqy_sram : 1;
+               u64 pqg_sram : 1;
+               u64 std_sram : 1;
+               u64 st_sram : 1;
+               u64 reserved_1_1 : 1;
+               u64 cxs_sram : 1;
+       } s;
+       struct cvmx_pko_pse_pq_bist_status_cn73xx {
+               u64 reserved_15_63 : 49;
+               u64 tp_sram : 1;
+               u64 reserved_13_13 : 1;
+               u64 wmd_sram : 1;
+               u64 reserved_11_11 : 1;
+               u64 cxd_sram : 1;
+               u64 dqd_sram : 1;
+               u64 dqs_sram : 1;
+               u64 pqd_sram : 1;
+               u64 pqr_sram : 1;
+               u64 pqy_sram : 1;
+               u64 pqg_sram : 1;
+               u64 std_sram : 1;
+               u64 st_sram : 1;
+               u64 reserved_1_1 : 1;
+               u64 cxs_sram : 1;
+       } cn73xx;
+       struct cvmx_pko_pse_pq_bist_status_s cn78xx;
+       struct cvmx_pko_pse_pq_bist_status_s cn78xxp1;
+       struct cvmx_pko_pse_pq_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_pq_bist_status cvmx_pko_pse_pq_bist_status_t;
+
+/**
+ * cvmx_pko_pse_pq_ecc_ctl0
+ */
+union cvmx_pko_pse_pq_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pse_pq_ecc_ctl0_s {
+               u64 pq_cxs_ram_flip : 2;
+               u64 pq_cxs_ram_cdis : 1;
+               u64 pq_cxd_ram_flip : 2;
+               u64 pq_cxd_ram_cdis : 1;
+               u64 irq_fifo_sram_flip : 2;
+               u64 irq_fifo_sram_cdis : 1;
+               u64 tp_sram_flip : 2;
+               u64 tp_sram_cdis : 1;
+               u64 pq_std_ram_flip : 2;
+               u64 pq_std_ram_cdis : 1;
+               u64 pq_st_ram_flip : 2;
+               u64 pq_st_ram_cdis : 1;
+               u64 pq_wmd_ram_flip : 2;
+               u64 pq_wmd_ram_cdis : 1;
+               u64 pq_wms_ram_flip : 2;
+               u64 pq_wms_ram_cdis : 1;
+               u64 reserved_0_39 : 40;
+       } s;
+       struct cvmx_pko_pse_pq_ecc_ctl0_cn73xx {
+               u64 pq_cxs_ram_flip : 2;
+               u64 pq_cxs_ram_cdis : 1;
+               u64 pq_cxd_ram_flip : 2;
+               u64 pq_cxd_ram_cdis : 1;
+               u64 reserved_55_57 : 3;
+               u64 tp_sram_flip : 2;
+               u64 tp_sram_cdis : 1;
+               u64 pq_std_ram_flip : 2;
+               u64 pq_std_ram_cdis : 1;
+               u64 pq_st_ram_flip : 2;
+               u64 pq_st_ram_cdis : 1;
+               u64 pq_wmd_ram_flip : 2;
+               u64 pq_wmd_ram_cdis : 1;
+               u64 reserved_0_42 : 43;
+       } cn73xx;
+       struct cvmx_pko_pse_pq_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pse_pq_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_pse_pq_ecc_ctl0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_pq_ecc_ctl0 cvmx_pko_pse_pq_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pse_pq_ecc_dbe_sts0
+ */
+union cvmx_pko_pse_pq_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts0_s {
+               u64 pq_cxs_ram_dbe : 1;
+               u64 pq_cxd_ram_dbe : 1;
+               u64 irq_fifo_sram_dbe : 1;
+               u64 tp_sram_dbe : 1;
+               u64 pq_std_ram_dbe : 1;
+               u64 pq_st_ram_dbe : 1;
+               u64 pq_wmd_ram_dbe : 1;
+               u64 pq_wms_ram_dbe : 1;
+               u64 reserved_0_55 : 56;
+       } s;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts0_cn73xx {
+               u64 pq_cxs_ram_dbe : 1;
+               u64 pq_cxd_ram_dbe : 1;
+               u64 reserved_61_61 : 1;
+               u64 tp_sram_dbe : 1;
+               u64 pq_std_ram_dbe : 1;
+               u64 pq_st_ram_dbe : 1;
+               u64 pq_wmd_ram_dbe : 1;
+               u64 reserved_0_56 : 57;
+       } cn73xx;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_pq_ecc_dbe_sts0 cvmx_pko_pse_pq_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_pq_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pse_pq_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts_cmb0_s {
+               u64 pse_pq_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_pq_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_pq_ecc_dbe_sts_cmb0 cvmx_pko_pse_pq_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_pq_ecc_sbe_sts0
+ */
+union cvmx_pko_pse_pq_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts0_s {
+               u64 pq_cxs_ram_sbe : 1;
+               u64 pq_cxd_ram_sbe : 1;
+               u64 irq_fifo_sram_sbe : 1;
+               u64 tp_sram_sbe : 1;
+               u64 pq_std_ram_sbe : 1;
+               u64 pq_st_ram_sbe : 1;
+               u64 pq_wmd_ram_sbe : 1;
+               u64 pq_wms_ram_sbe : 1;
+               u64 reserved_0_55 : 56;
+       } s;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts0_cn73xx {
+               u64 pq_cxs_ram_sbe : 1;
+               u64 pq_cxd_ram_sbe : 1;
+               u64 reserved_61_61 : 1;
+               u64 tp_sram_sbe : 1;
+               u64 pq_std_ram_sbe : 1;
+               u64 pq_st_ram_sbe : 1;
+               u64 pq_wmd_ram_sbe : 1;
+               u64 reserved_0_56 : 57;
+       } cn73xx;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_pq_ecc_sbe_sts0 cvmx_pko_pse_pq_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_pq_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pse_pq_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts_cmb0_s {
+               u64 pse_pq_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_pq_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_pq_ecc_sbe_sts_cmb0 cvmx_pko_pse_pq_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq1_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pse_sq1_bist_status {
+       u64 u64;
+       struct cvmx_pko_pse_sq1_bist_status_s {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 pc_sram : 1;
+               u64 xon_sram : 1;
+               u64 cc_sram : 1;
+               u64 vc1_sram : 1;
+               u64 vc0_sram : 1;
+               u64 reserved_21_22 : 2;
+               u64 tp1_sram : 1;
+               u64 tp0_sram : 1;
+               u64 xo_sram : 1;
+               u64 rt_sram : 1;
+               u64 reserved_9_16 : 8;
+               u64 tw1_cmd_fifo : 1;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 cxd_sram : 1;
+               u64 cxs_sram : 1;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } s;
+       struct cvmx_pko_pse_sq1_bist_status_cn73xx {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 pc_sram : 1;
+               u64 xon_sram : 1;
+               u64 cc_sram : 1;
+               u64 vc1_sram : 1;
+               u64 vc0_sram : 1;
+               u64 reserved_20_22 : 3;
+               u64 tp0_sram : 1;
+               u64 xo_sram : 1;
+               u64 rt_sram : 1;
+               u64 reserved_9_16 : 8;
+               u64 tw1_cmd_fifo : 1;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 cxd_sram : 1;
+               u64 cxs_sram : 1;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } cn73xx;
+       struct cvmx_pko_pse_sq1_bist_status_s cn78xx;
+       struct cvmx_pko_pse_sq1_bist_status_s cn78xxp1;
+       struct cvmx_pko_pse_sq1_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq1_bist_status cvmx_pko_pse_sq1_bist_status_t;
+
+/**
+ * cvmx_pko_pse_sq1_ecc_ctl0
+ */
+union cvmx_pko_pse_sq1_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq1_ecc_ctl0_s {
+               u64 cxs_ram_flip : 2;
+               u64 cxs_ram_cdis : 1;
+               u64 cxd_ram_flip : 2;
+               u64 cxd_ram_cdis : 1;
+               u64 vc1_sram_flip : 2;
+               u64 vc1_sram_cdis : 1;
+               u64 vc0_sram_flip : 2;
+               u64 vc0_sram_cdis : 1;
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 pc_ram_flip : 2;
+               u64 pc_ram_cdis : 1;
+               u64 tw1_cmd_fifo_ram_flip : 2;
+               u64 tw1_cmd_fifo_ram_cdis : 1;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 tp1_sram_flip : 2;
+               u64 tp1_sram_cdis : 1;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 sts1_ram_flip : 2;
+               u64 sts1_ram_cdis : 1;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 std1_ram_flip : 2;
+               u64 std1_ram_cdis : 1;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_9 : 10;
+       } s;
+       struct cvmx_pko_pse_sq1_ecc_ctl0_cn73xx {
+               u64 cxs_ram_flip : 2;
+               u64 cxs_ram_cdis : 1;
+               u64 cxd_ram_flip : 2;
+               u64 cxd_ram_cdis : 1;
+               u64 reserved_55_57 : 3;
+               u64 vc0_sram_flip : 2;
+               u64 vc0_sram_cdis : 1;
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 pc_ram_flip : 2;
+               u64 pc_ram_cdis : 1;
+               u64 reserved_37_39 : 3;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 reserved_31_33 : 3;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 reserved_25_27 : 3;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 reserved_19_21 : 3;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_9 : 10;
+       } cn73xx;
+       struct cvmx_pko_pse_sq1_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pse_sq1_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_pse_sq1_ecc_ctl0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq1_ecc_ctl0 cvmx_pko_pse_sq1_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pse_sq1_ecc_dbe_sts0
+ */
+union cvmx_pko_pse_sq1_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts0_s {
+               u64 cxs_ram_dbe : 1;
+               u64 cxd_ram_dbe : 1;
+               u64 vc1_sram_dbe : 1;
+               u64 vc0_sram_dbe : 1;
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 pc_ram_dbe : 1;
+               u64 tw1_cmd_fifo_ram_dbe : 1;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 tp1_sram_dbe : 1;
+               u64 tp0_sram_dbe : 1;
+               u64 sts1_ram_dbe : 1;
+               u64 sts0_ram_dbe : 1;
+               u64 std1_ram_dbe : 1;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_45 : 46;
+       } s;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts0_cn73xx {
+               u64 cxs_ram_dbe : 1;
+               u64 cxd_ram_dbe : 1;
+               u64 reserved_61_61 : 1;
+               u64 vc0_sram_dbe : 1;
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 pc_ram_dbe : 1;
+               u64 reserved_55_55 : 1;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 reserved_53_53 : 1;
+               u64 tp0_sram_dbe : 1;
+               u64 reserved_51_51 : 1;
+               u64 sts0_ram_dbe : 1;
+               u64 reserved_49_49 : 1;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_45 : 46;
+       } cn73xx;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq1_ecc_dbe_sts0 cvmx_pko_pse_sq1_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0_s {
+               u64 pse_sq1_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0 cvmx_pko_pse_sq1_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq1_ecc_sbe_sts0
+ */
+union cvmx_pko_pse_sq1_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts0_s {
+               u64 cxs_ram_sbe : 1;
+               u64 cxd_ram_sbe : 1;
+               u64 vc1_sram_sbe : 1;
+               u64 vc0_sram_sbe : 1;
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 pc_ram_sbe : 1;
+               u64 tw1_cmd_fifo_ram_sbe : 1;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 tp1_sram_sbe : 1;
+               u64 tp0_sram_sbe : 1;
+               u64 sts1_ram_sbe : 1;
+               u64 sts0_ram_sbe : 1;
+               u64 std1_ram_sbe : 1;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_45 : 46;
+       } s;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts0_cn73xx {
+               u64 cxs_ram_sbe : 1;
+               u64 cxd_ram_sbe : 1;
+               u64 reserved_61_61 : 1;
+               u64 vc0_sram_sbe : 1;
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 pc_ram_sbe : 1;
+               u64 reserved_55_55 : 1;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 reserved_53_53 : 1;
+               u64 tp0_sram_sbe : 1;
+               u64 reserved_51_51 : 1;
+               u64 sts0_ram_sbe : 1;
+               u64 reserved_49_49 : 1;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_45 : 46;
+       } cn73xx;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq1_ecc_sbe_sts0 cvmx_pko_pse_sq1_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0_s {
+               u64 pse_sq1_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0 cvmx_pko_pse_sq1_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq2_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pse_sq2_bist_status {
+       u64 u64;
+       struct cvmx_pko_pse_sq2_bist_status_s {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 reserved_21_27 : 7;
+               u64 tp1_sram : 1;
+               u64 tp0_sram : 1;
+               u64 reserved_18_18 : 1;
+               u64 rt_sram : 1;
+               u64 reserved_9_16 : 8;
+               u64 tw1_cmd_fifo : 1;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 reserved_3_4 : 2;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } s;
+       struct cvmx_pko_pse_sq2_bist_status_cn73xx {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 reserved_20_27 : 8;
+               u64 tp0_sram : 1;
+               u64 reserved_18_18 : 1;
+               u64 rt_sram : 1;
+               u64 reserved_8_16 : 9;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 reserved_3_4 : 2;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } cn73xx;
+       struct cvmx_pko_pse_sq2_bist_status_s cn78xx;
+       struct cvmx_pko_pse_sq2_bist_status_s cn78xxp1;
+       struct cvmx_pko_pse_sq2_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq2_bist_status cvmx_pko_pse_sq2_bist_status_t;
+
+/**
+ * cvmx_pko_pse_sq2_ecc_ctl0
+ */
+union cvmx_pko_pse_sq2_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq2_ecc_ctl0_s {
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 tw1_cmd_fifo_ram_flip : 2;
+               u64 tw1_cmd_fifo_ram_cdis : 1;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 tp1_sram_flip : 2;
+               u64 tp1_sram_cdis : 1;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 sts1_ram_flip : 2;
+               u64 sts1_ram_cdis : 1;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 std1_ram_flip : 2;
+               u64 std1_ram_cdis : 1;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_24 : 25;
+       } s;
+       struct cvmx_pko_pse_sq2_ecc_ctl0_cn73xx {
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 reserved_52_54 : 3;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 reserved_46_48 : 3;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 reserved_40_42 : 3;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 reserved_34_36 : 3;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_24 : 25;
+       } cn73xx;
+       struct cvmx_pko_pse_sq2_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pse_sq2_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_pse_sq2_ecc_ctl0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq2_ecc_ctl0 cvmx_pko_pse_sq2_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pse_sq2_ecc_dbe_sts0
+ */
+union cvmx_pko_pse_sq2_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts0_s {
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 tw1_cmd_fifo_ram_dbe : 1;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 tp1_sram_dbe : 1;
+               u64 tp0_sram_dbe : 1;
+               u64 sts1_ram_dbe : 1;
+               u64 sts0_ram_dbe : 1;
+               u64 std1_ram_dbe : 1;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_50 : 51;
+       } s;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts0_cn73xx {
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 reserved_60_60 : 1;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 reserved_58_58 : 1;
+               u64 tp0_sram_dbe : 1;
+               u64 reserved_56_56 : 1;
+               u64 sts0_ram_dbe : 1;
+               u64 reserved_54_54 : 1;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_50 : 51;
+       } cn73xx;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq2_ecc_dbe_sts0 cvmx_pko_pse_sq2_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0_s {
+               u64 pse_sq2_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0 cvmx_pko_pse_sq2_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq2_ecc_sbe_sts0
+ */
+union cvmx_pko_pse_sq2_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts0_s {
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 tw1_cmd_fifo_ram_sbe : 1;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 tp1_sram_sbe : 1;
+               u64 tp0_sram_sbe : 1;
+               u64 sts1_ram_sbe : 1;
+               u64 sts0_ram_sbe : 1;
+               u64 std1_ram_sbe : 1;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_50 : 51;
+       } s;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts0_cn73xx {
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 reserved_60_60 : 1;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 reserved_58_58 : 1;
+               u64 tp0_sram_sbe : 1;
+               u64 reserved_56_56 : 1;
+               u64 sts0_ram_sbe : 1;
+               u64 reserved_54_54 : 1;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_50 : 51;
+       } cn73xx;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq2_ecc_sbe_sts0 cvmx_pko_pse_sq2_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0_s {
+               u64 pse_sq2_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0 cvmx_pko_pse_sq2_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq3_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pse_sq3_bist_status {
+       u64 u64;
+       struct cvmx_pko_pse_sq3_bist_status_s {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 reserved_23_27 : 5;
+               u64 tp3_sram : 1;
+               u64 tp2_sram : 1;
+               u64 tp1_sram : 1;
+               u64 tp0_sram : 1;
+               u64 reserved_18_18 : 1;
+               u64 rt_sram : 1;
+               u64 reserved_15_16 : 2;
+               u64 tw3_cmd_fifo : 1;
+               u64 reserved_12_13 : 2;
+               u64 tw2_cmd_fifo : 1;
+               u64 reserved_9_10 : 2;
+               u64 tw1_cmd_fifo : 1;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 reserved_3_4 : 2;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } s;
+       struct cvmx_pko_pse_sq3_bist_status_cn73xx {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 reserved_20_27 : 8;
+               u64 tp0_sram : 1;
+               u64 reserved_18_18 : 1;
+               u64 rt_sram : 1;
+               u64 reserved_8_16 : 9;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 reserved_3_4 : 2;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } cn73xx;
+       struct cvmx_pko_pse_sq3_bist_status_s cn78xx;
+       struct cvmx_pko_pse_sq3_bist_status_s cn78xxp1;
+       struct cvmx_pko_pse_sq3_bist_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq3_bist_status cvmx_pko_pse_sq3_bist_status_t;
+
+/**
+ * cvmx_pko_pse_sq3_ecc_ctl0
+ */
+union cvmx_pko_pse_sq3_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq3_ecc_ctl0_s {
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 tw3_cmd_fifo_ram_flip : 2;
+               u64 tw3_cmd_fifo_ram_cdis : 1;
+               u64 tw2_cmd_fifo_ram_flip : 2;
+               u64 tw2_cmd_fifo_ram_cdis : 1;
+               u64 tw1_cmd_fifo_ram_flip : 2;
+               u64 tw1_cmd_fifo_ram_cdis : 1;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 tp3_sram_flip : 2;
+               u64 tp3_sram_cdis : 1;
+               u64 tp2_sram_flip : 2;
+               u64 tp2_sram_cdis : 1;
+               u64 tp1_sram_flip : 2;
+               u64 tp1_sram_cdis : 1;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 sts3_ram_flip : 2;
+               u64 sts3_ram_cdis : 1;
+               u64 sts2_ram_flip : 2;
+               u64 sts2_ram_cdis : 1;
+               u64 sts1_ram_flip : 2;
+               u64 sts1_ram_cdis : 1;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 std3_ram_flip : 2;
+               u64 std3_ram_cdis : 1;
+               u64 std2_ram_flip : 2;
+               u64 std2_ram_cdis : 1;
+               u64 std1_ram_flip : 2;
+               u64 std1_ram_cdis : 1;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_pse_sq3_ecc_ctl0_cn73xx {
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 reserved_46_54 : 9;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 reserved_34_42 : 9;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 reserved_22_30 : 9;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 reserved_10_18 : 9;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_pko_pse_sq3_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pse_sq3_ecc_ctl0_s cn78xxp1;
+       struct cvmx_pko_pse_sq3_ecc_ctl0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq3_ecc_ctl0 cvmx_pko_pse_sq3_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pse_sq3_ecc_dbe_sts0
+ */
+union cvmx_pko_pse_sq3_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts0_s {
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 tw3_cmd_fifo_ram_dbe : 1;
+               u64 tw2_cmd_fifo_ram_dbe : 1;
+               u64 tw1_cmd_fifo_ram_dbe : 1;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 tp3_sram_dbe : 1;
+               u64 tp2_sram_dbe : 1;
+               u64 tp1_sram_dbe : 1;
+               u64 tp0_sram_dbe : 1;
+               u64 sts3_ram_dbe : 1;
+               u64 sts2_ram_dbe : 1;
+               u64 sts1_ram_dbe : 1;
+               u64 sts0_ram_dbe : 1;
+               u64 std3_ram_dbe : 1;
+               u64 std2_ram_dbe : 1;
+               u64 std1_ram_dbe : 1;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_42 : 43;
+       } s;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts0_cn73xx {
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 reserved_58_60 : 3;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 reserved_54_56 : 3;
+               u64 tp0_sram_dbe : 1;
+               u64 reserved_50_52 : 3;
+               u64 sts0_ram_dbe : 1;
+               u64 reserved_46_48 : 3;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_42 : 43;
+       } cn73xx;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq3_ecc_dbe_sts0 cvmx_pko_pse_sq3_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0_s {
+               u64 pse_sq3_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0 cvmx_pko_pse_sq3_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq3_ecc_sbe_sts0
+ */
+union cvmx_pko_pse_sq3_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts0_s {
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 tw3_cmd_fifo_ram_sbe : 1;
+               u64 tw2_cmd_fifo_ram_sbe : 1;
+               u64 tw1_cmd_fifo_ram_sbe : 1;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 tp3_sram_sbe : 1;
+               u64 tp2_sram_sbe : 1;
+               u64 tp1_sram_sbe : 1;
+               u64 tp0_sram_sbe : 1;
+               u64 sts3_ram_sbe : 1;
+               u64 sts2_ram_sbe : 1;
+               u64 sts1_ram_sbe : 1;
+               u64 sts0_ram_sbe : 1;
+               u64 std3_ram_sbe : 1;
+               u64 std2_ram_sbe : 1;
+               u64 std1_ram_sbe : 1;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_42 : 43;
+       } s;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts0_cn73xx {
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 reserved_58_60 : 3;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 reserved_54_56 : 3;
+               u64 tp0_sram_sbe : 1;
+               u64 reserved_50_52 : 3;
+               u64 sts0_ram_sbe : 1;
+               u64 reserved_46_48 : 3;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_42 : 43;
+       } cn73xx;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts0_s cn78xxp1;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts0_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq3_ecc_sbe_sts0 cvmx_pko_pse_sq3_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0_s {
+               u64 pse_sq3_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0_s cn73xx;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0_s cn78xxp1;
+       struct cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0_s cnf75xx;
+};
+
+typedef union cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0 cvmx_pko_pse_sq3_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq4_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pse_sq4_bist_status {
+       u64 u64;
+       struct cvmx_pko_pse_sq4_bist_status_s {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 reserved_23_27 : 5;
+               u64 tp3_sram : 1;
+               u64 tp2_sram : 1;
+               u64 tp1_sram : 1;
+               u64 tp0_sram : 1;
+               u64 reserved_18_18 : 1;
+               u64 rt_sram : 1;
+               u64 reserved_15_16 : 2;
+               u64 tw3_cmd_fifo : 1;
+               u64 reserved_12_13 : 2;
+               u64 tw2_cmd_fifo : 1;
+               u64 reserved_9_10 : 2;
+               u64 tw1_cmd_fifo : 1;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 reserved_3_4 : 2;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } s;
+       struct cvmx_pko_pse_sq4_bist_status_s cn78xx;
+       struct cvmx_pko_pse_sq4_bist_status_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq4_bist_status cvmx_pko_pse_sq4_bist_status_t;
+
+/**
+ * cvmx_pko_pse_sq4_ecc_ctl0
+ */
+union cvmx_pko_pse_sq4_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq4_ecc_ctl0_s {
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 tw3_cmd_fifo_ram_flip : 2;
+               u64 tw3_cmd_fifo_ram_cdis : 1;
+               u64 tw2_cmd_fifo_ram_flip : 2;
+               u64 tw2_cmd_fifo_ram_cdis : 1;
+               u64 tw1_cmd_fifo_ram_flip : 2;
+               u64 tw1_cmd_fifo_ram_cdis : 1;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 tp3_sram_flip : 2;
+               u64 tp3_sram_cdis : 1;
+               u64 tp2_sram_flip : 2;
+               u64 tp2_sram_cdis : 1;
+               u64 tp1_sram_flip : 2;
+               u64 tp1_sram_cdis : 1;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 sts3_ram_flip : 2;
+               u64 sts3_ram_cdis : 1;
+               u64 sts2_ram_flip : 2;
+               u64 sts2_ram_cdis : 1;
+               u64 sts1_ram_flip : 2;
+               u64 sts1_ram_cdis : 1;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 std3_ram_flip : 2;
+               u64 std3_ram_cdis : 1;
+               u64 std2_ram_flip : 2;
+               u64 std2_ram_cdis : 1;
+               u64 std1_ram_flip : 2;
+               u64 std1_ram_cdis : 1;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_pse_sq4_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pse_sq4_ecc_ctl0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq4_ecc_ctl0 cvmx_pko_pse_sq4_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pse_sq4_ecc_dbe_sts0
+ */
+union cvmx_pko_pse_sq4_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq4_ecc_dbe_sts0_s {
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 tw3_cmd_fifo_ram_dbe : 1;
+               u64 tw2_cmd_fifo_ram_dbe : 1;
+               u64 tw1_cmd_fifo_ram_dbe : 1;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 tp3_sram_dbe : 1;
+               u64 tp2_sram_dbe : 1;
+               u64 tp1_sram_dbe : 1;
+               u64 tp0_sram_dbe : 1;
+               u64 sts3_ram_dbe : 1;
+               u64 sts2_ram_dbe : 1;
+               u64 sts1_ram_dbe : 1;
+               u64 sts0_ram_dbe : 1;
+               u64 std3_ram_dbe : 1;
+               u64 std2_ram_dbe : 1;
+               u64 std1_ram_dbe : 1;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_42 : 43;
+       } s;
+       struct cvmx_pko_pse_sq4_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq4_ecc_dbe_sts0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq4_ecc_dbe_sts0 cvmx_pko_pse_sq4_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq4_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq4_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq4_ecc_dbe_sts_cmb0_s {
+               u64 pse_sq4_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq4_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq4_ecc_dbe_sts_cmb0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq4_ecc_dbe_sts_cmb0 cvmx_pko_pse_sq4_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq4_ecc_sbe_sts0
+ */
+union cvmx_pko_pse_sq4_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq4_ecc_sbe_sts0_s {
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 tw3_cmd_fifo_ram_sbe : 1;
+               u64 tw2_cmd_fifo_ram_sbe : 1;
+               u64 tw1_cmd_fifo_ram_sbe : 1;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 tp3_sram_sbe : 1;
+               u64 tp2_sram_sbe : 1;
+               u64 tp1_sram_sbe : 1;
+               u64 tp0_sram_sbe : 1;
+               u64 sts3_ram_sbe : 1;
+               u64 sts2_ram_sbe : 1;
+               u64 sts1_ram_sbe : 1;
+               u64 sts0_ram_sbe : 1;
+               u64 std3_ram_sbe : 1;
+               u64 std2_ram_sbe : 1;
+               u64 std1_ram_sbe : 1;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_42 : 43;
+       } s;
+       struct cvmx_pko_pse_sq4_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq4_ecc_sbe_sts0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq4_ecc_sbe_sts0 cvmx_pko_pse_sq4_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq4_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq4_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq4_ecc_sbe_sts_cmb0_s {
+               u64 pse_sq4_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq4_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq4_ecc_sbe_sts_cmb0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq4_ecc_sbe_sts_cmb0 cvmx_pko_pse_sq4_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq5_bist_status
+ *
+ * Each bit is the BIST result of an individual memory (per bit, 0 = pass and 1 = fail).
+ *
+ */
+union cvmx_pko_pse_sq5_bist_status {
+       u64 u64;
+       struct cvmx_pko_pse_sq5_bist_status_s {
+               u64 reserved_29_63 : 35;
+               u64 sc_sram : 1;
+               u64 reserved_23_27 : 5;
+               u64 tp3_sram : 1;
+               u64 tp2_sram : 1;
+               u64 tp1_sram : 1;
+               u64 tp0_sram : 1;
+               u64 reserved_18_18 : 1;
+               u64 rt_sram : 1;
+               u64 reserved_15_16 : 2;
+               u64 tw3_cmd_fifo : 1;
+               u64 reserved_12_13 : 2;
+               u64 tw2_cmd_fifo : 1;
+               u64 reserved_9_10 : 2;
+               u64 tw1_cmd_fifo : 1;
+               u64 std_sram : 1;
+               u64 sts_sram : 1;
+               u64 tw0_cmd_fifo : 1;
+               u64 reserved_3_4 : 2;
+               u64 nt_sram : 1;
+               u64 pt_sram : 1;
+               u64 wt_sram : 1;
+       } s;
+       struct cvmx_pko_pse_sq5_bist_status_s cn78xx;
+       struct cvmx_pko_pse_sq5_bist_status_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq5_bist_status cvmx_pko_pse_sq5_bist_status_t;
+
+/**
+ * cvmx_pko_pse_sq5_ecc_ctl0
+ */
+union cvmx_pko_pse_sq5_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq5_ecc_ctl0_s {
+               u64 sq_pt_ram_flip : 2;
+               u64 sq_pt_ram_cdis : 1;
+               u64 sq_nt_ram_flip : 2;
+               u64 sq_nt_ram_cdis : 1;
+               u64 rt_ram_flip : 2;
+               u64 rt_ram_cdis : 1;
+               u64 tw3_cmd_fifo_ram_flip : 2;
+               u64 tw3_cmd_fifo_ram_cdis : 1;
+               u64 tw2_cmd_fifo_ram_flip : 2;
+               u64 tw2_cmd_fifo_ram_cdis : 1;
+               u64 tw1_cmd_fifo_ram_flip : 2;
+               u64 tw1_cmd_fifo_ram_cdis : 1;
+               u64 tw0_cmd_fifo_ram_flip : 2;
+               u64 tw0_cmd_fifo_ram_cdis : 1;
+               u64 tp3_sram_flip : 2;
+               u64 tp3_sram_cdis : 1;
+               u64 tp2_sram_flip : 2;
+               u64 tp2_sram_cdis : 1;
+               u64 tp1_sram_flip : 2;
+               u64 tp1_sram_cdis : 1;
+               u64 tp0_sram_flip : 2;
+               u64 tp0_sram_cdis : 1;
+               u64 sts3_ram_flip : 2;
+               u64 sts3_ram_cdis : 1;
+               u64 sts2_ram_flip : 2;
+               u64 sts2_ram_cdis : 1;
+               u64 sts1_ram_flip : 2;
+               u64 sts1_ram_cdis : 1;
+               u64 sts0_ram_flip : 2;
+               u64 sts0_ram_cdis : 1;
+               u64 std3_ram_flip : 2;
+               u64 std3_ram_cdis : 1;
+               u64 std2_ram_flip : 2;
+               u64 std2_ram_cdis : 1;
+               u64 std1_ram_flip : 2;
+               u64 std1_ram_cdis : 1;
+               u64 std0_ram_flip : 2;
+               u64 std0_ram_cdis : 1;
+               u64 wt_ram_flip : 2;
+               u64 wt_ram_cdis : 1;
+               u64 sc_ram_flip : 2;
+               u64 sc_ram_cdis : 1;
+               u64 reserved_0_0 : 1;
+       } s;
+       struct cvmx_pko_pse_sq5_ecc_ctl0_s cn78xx;
+       struct cvmx_pko_pse_sq5_ecc_ctl0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq5_ecc_ctl0 cvmx_pko_pse_sq5_ecc_ctl0_t;
+
+/**
+ * cvmx_pko_pse_sq5_ecc_dbe_sts0
+ */
+union cvmx_pko_pse_sq5_ecc_dbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq5_ecc_dbe_sts0_s {
+               u64 sq_pt_ram_dbe : 1;
+               u64 sq_nt_ram_dbe : 1;
+               u64 rt_ram_dbe : 1;
+               u64 tw3_cmd_fifo_ram_dbe : 1;
+               u64 tw2_cmd_fifo_ram_dbe : 1;
+               u64 tw1_cmd_fifo_ram_dbe : 1;
+               u64 tw0_cmd_fifo_ram_dbe : 1;
+               u64 tp3_sram_dbe : 1;
+               u64 tp2_sram_dbe : 1;
+               u64 tp1_sram_dbe : 1;
+               u64 tp0_sram_dbe : 1;
+               u64 sts3_ram_dbe : 1;
+               u64 sts2_ram_dbe : 1;
+               u64 sts1_ram_dbe : 1;
+               u64 sts0_ram_dbe : 1;
+               u64 std3_ram_dbe : 1;
+               u64 std2_ram_dbe : 1;
+               u64 std1_ram_dbe : 1;
+               u64 std0_ram_dbe : 1;
+               u64 wt_ram_dbe : 1;
+               u64 sc_ram_dbe : 1;
+               u64 reserved_0_42 : 43;
+       } s;
+       struct cvmx_pko_pse_sq5_ecc_dbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq5_ecc_dbe_sts0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq5_ecc_dbe_sts0 cvmx_pko_pse_sq5_ecc_dbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq5_ecc_dbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq5_ecc_dbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq5_ecc_dbe_sts_cmb0_s {
+               u64 pse_sq5_dbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq5_ecc_dbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq5_ecc_dbe_sts_cmb0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq5_ecc_dbe_sts_cmb0 cvmx_pko_pse_sq5_ecc_dbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_pse_sq5_ecc_sbe_sts0
+ */
+union cvmx_pko_pse_sq5_ecc_sbe_sts0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq5_ecc_sbe_sts0_s {
+               u64 sq_pt_ram_sbe : 1;
+               u64 sq_nt_ram_sbe : 1;
+               u64 rt_ram_sbe : 1;
+               u64 tw3_cmd_fifo_ram_sbe : 1;
+               u64 tw2_cmd_fifo_ram_sbe : 1;
+               u64 tw1_cmd_fifo_ram_sbe : 1;
+               u64 tw0_cmd_fifo_ram_sbe : 1;
+               u64 tp3_sram_sbe : 1;
+               u64 tp2_sram_sbe : 1;
+               u64 tp1_sram_sbe : 1;
+               u64 tp0_sram_sbe : 1;
+               u64 sts3_ram_sbe : 1;
+               u64 sts2_ram_sbe : 1;
+               u64 sts1_ram_sbe : 1;
+               u64 sts0_ram_sbe : 1;
+               u64 std3_ram_sbe : 1;
+               u64 std2_ram_sbe : 1;
+               u64 std1_ram_sbe : 1;
+               u64 std0_ram_sbe : 1;
+               u64 wt_ram_sbe : 1;
+               u64 sc_ram_sbe : 1;
+               u64 reserved_0_42 : 43;
+       } s;
+       struct cvmx_pko_pse_sq5_ecc_sbe_sts0_s cn78xx;
+       struct cvmx_pko_pse_sq5_ecc_sbe_sts0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq5_ecc_sbe_sts0 cvmx_pko_pse_sq5_ecc_sbe_sts0_t;
+
+/**
+ * cvmx_pko_pse_sq5_ecc_sbe_sts_cmb0
+ */
+union cvmx_pko_pse_sq5_ecc_sbe_sts_cmb0 {
+       u64 u64;
+       struct cvmx_pko_pse_sq5_ecc_sbe_sts_cmb0_s {
+               u64 pse_sq5_sbe_cmb0 : 1;
+               u64 reserved_0_62 : 63;
+       } s;
+       struct cvmx_pko_pse_sq5_ecc_sbe_sts_cmb0_s cn78xx;
+       struct cvmx_pko_pse_sq5_ecc_sbe_sts_cmb0_s cn78xxp1;
+};
+
+typedef union cvmx_pko_pse_sq5_ecc_sbe_sts_cmb0 cvmx_pko_pse_sq5_ecc_sbe_sts_cmb0_t;
+
+/**
+ * cvmx_pko_ptf#_status
+ */
+union cvmx_pko_ptfx_status {
+       u64 u64;
+       struct cvmx_pko_ptfx_status_s {
+               u64 reserved_30_63 : 34;
+               u64 tx_fifo_pkt_credit_cnt : 10;
+               u64 total_in_flight_cnt : 8;
+               u64 in_flight_cnt : 7;
+               u64 mac_num : 5;
+       } s;
+       struct cvmx_pko_ptfx_status_s cn73xx;
+       struct cvmx_pko_ptfx_status_s cn78xx;
+       struct cvmx_pko_ptfx_status_s cn78xxp1;
+       struct cvmx_pko_ptfx_status_s cnf75xx;
+};
+
+typedef union cvmx_pko_ptfx_status cvmx_pko_ptfx_status_t;
+
+/**
+ * cvmx_pko_ptf_iobp_cfg
+ */
+union cvmx_pko_ptf_iobp_cfg {
+       u64 u64;
+       struct cvmx_pko_ptf_iobp_cfg_s {
+               u64 reserved_44_63 : 20;
+               u64 iobp1_ds_opt : 1;
+               u64 iobp0_l2_allocate : 1;
+               u64 iobp1_magic_addr : 35;
+               u64 max_read_size : 7;
+       } s;
+       struct cvmx_pko_ptf_iobp_cfg_s cn73xx;
+       struct cvmx_pko_ptf_iobp_cfg_s cn78xx;
+       struct cvmx_pko_ptf_iobp_cfg_s cn78xxp1;
+       struct cvmx_pko_ptf_iobp_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pko_ptf_iobp_cfg cvmx_pko_ptf_iobp_cfg_t;
+
+/**
+ * cvmx_pko_ptgf#_cfg
+ *
+ * This register configures a PKO TX FIFO group. PKO supports up to 17 independent
+ * TX FIFOs, where 0-15 are physical and 16 is Virtual/NULL. (PKO drops packets
+ * targeting the NULL FIFO, returning their buffers to the FPA.) PKO puts each
+ * FIFO into one of five groups:
+ *
+ * <pre>
+ *    CSR Name       FIFO's in FIFO Group
+ *   ------------------------------------
+ *   PKO_PTGF0_CFG      0,  1,  2,  3
+ *   PKO_PTGF1_CFG      4,  5,  6,  7
+ *   PKO_PTGF2_CFG      8,  9, 10, 11
+ *   PKO_PTGF3_CFG     12, 13, 14, 15
+ *   PKO_PTGF4_CFG      Virtual/NULL
+ * </pre>
+ */
+union cvmx_pko_ptgfx_cfg {
+       u64 u64;
+       struct cvmx_pko_ptgfx_cfg_s {
+               u64 reserved_7_63 : 57;
+               u64 reset : 1;
+               u64 rate : 3;
+               u64 size : 3;
+       } s;
+       struct cvmx_pko_ptgfx_cfg_cn73xx {
+               u64 reserved_7_63 : 57;
+               u64 reset : 1;
+               u64 reserved_5_5 : 1;
+               u64 rate : 2;
+               u64 size : 3;
+       } cn73xx;
+       struct cvmx_pko_ptgfx_cfg_s cn78xx;
+       struct cvmx_pko_ptgfx_cfg_s cn78xxp1;
+       struct cvmx_pko_ptgfx_cfg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_ptgfx_cfg cvmx_pko_ptgfx_cfg_t;
+
+/**
+ * cvmx_pko_reg_bist_result
+ *
+ * Notes:
+ * Access to the internal BiST results
+ * Each bit is the BiST result of an individual memory (per bit, 0=pass and 1=fail).
+ */
+union cvmx_pko_reg_bist_result {
+       u64 u64;
+       struct cvmx_pko_reg_bist_result_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_pko_reg_bist_result_cn30xx {
+               u64 reserved_27_63 : 37;
+               u64 psb2 : 5;
+               u64 count : 1;
+               u64 rif : 1;
+               u64 wif : 1;
+               u64 ncb : 1;
+               u64 out : 1;
+               u64 crc : 1;
+               u64 chk : 1;
+               u64 qsb : 2;
+               u64 qcb : 2;
+               u64 pdb : 4;
+               u64 psb : 7;
+       } cn30xx;
+       struct cvmx_pko_reg_bist_result_cn30xx cn31xx;
+       struct cvmx_pko_reg_bist_result_cn30xx cn38xx;
+       struct cvmx_pko_reg_bist_result_cn30xx cn38xxp2;
+       struct cvmx_pko_reg_bist_result_cn50xx {
+               u64 reserved_33_63 : 31;
+               u64 csr : 1;
+               u64 iob : 1;
+               u64 out_crc : 1;
+               u64 out_ctl : 3;
+               u64 out_sta : 1;
+               u64 out_wif : 1;
+               u64 prt_chk : 3;
+               u64 prt_nxt : 1;
+               u64 prt_psb : 6;
+               u64 ncb_inb : 2;
+               u64 prt_qcb : 2;
+               u64 prt_qsb : 3;
+               u64 dat_dat : 4;
+               u64 dat_ptr : 4;
+       } cn50xx;
+       struct cvmx_pko_reg_bist_result_cn52xx {
+               u64 reserved_35_63 : 29;
+               u64 csr : 1;
+               u64 iob : 1;
+               u64 out_dat : 1;
+               u64 out_ctl : 3;
+               u64 out_sta : 1;
+               u64 out_wif : 1;
+               u64 prt_chk : 3;
+               u64 prt_nxt : 1;
+               u64 prt_psb : 8;
+               u64 ncb_inb : 2;
+               u64 prt_qcb : 2;
+               u64 prt_qsb : 3;
+               u64 prt_ctl : 2;
+               u64 dat_dat : 2;
+               u64 dat_ptr : 4;
+       } cn52xx;
+       struct cvmx_pko_reg_bist_result_cn52xx cn52xxp1;
+       struct cvmx_pko_reg_bist_result_cn52xx cn56xx;
+       struct cvmx_pko_reg_bist_result_cn52xx cn56xxp1;
+       struct cvmx_pko_reg_bist_result_cn50xx cn58xx;
+       struct cvmx_pko_reg_bist_result_cn50xx cn58xxp1;
+       struct cvmx_pko_reg_bist_result_cn52xx cn61xx;
+       struct cvmx_pko_reg_bist_result_cn52xx cn63xx;
+       struct cvmx_pko_reg_bist_result_cn52xx cn63xxp1;
+       struct cvmx_pko_reg_bist_result_cn52xx cn66xx;
+       struct cvmx_pko_reg_bist_result_cn68xx {
+               u64 reserved_36_63 : 28;
+               u64 crc : 1;
+               u64 csr : 1;
+               u64 iob : 1;
+               u64 out_dat : 1;
+               u64 reserved_31_31 : 1;
+               u64 out_ctl : 2;
+               u64 out_sta : 1;
+               u64 out_wif : 1;
+               u64 prt_chk : 3;
+               u64 prt_nxt : 1;
+               u64 prt_psb7 : 1;
+               u64 reserved_21_21 : 1;
+               u64 prt_psb : 6;
+               u64 ncb_inb : 2;
+               u64 prt_qcb : 2;
+               u64 prt_qsb : 3;
+               u64 prt_ctl : 2;
+               u64 dat_dat : 2;
+               u64 dat_ptr : 4;
+       } cn68xx;
+       struct cvmx_pko_reg_bist_result_cn68xxp1 {
+               u64 reserved_35_63 : 29;
+               u64 csr : 1;
+               u64 iob : 1;
+               u64 out_dat : 1;
+               u64 reserved_31_31 : 1;
+               u64 out_ctl : 2;
+               u64 out_sta : 1;
+               u64 out_wif : 1;
+               u64 prt_chk : 3;
+               u64 prt_nxt : 1;
+               u64 prt_psb7 : 1;
+               u64 reserved_21_21 : 1;
+               u64 prt_psb : 6;
+               u64 ncb_inb : 2;
+               u64 prt_qcb : 2;
+               u64 prt_qsb : 3;
+               u64 prt_ctl : 2;
+               u64 dat_dat : 2;
+               u64 dat_ptr : 4;
+       } cn68xxp1;
+       struct cvmx_pko_reg_bist_result_cn70xx {
+               u64 reserved_30_63 : 34;
+               u64 csr : 1;
+               u64 iob : 1;
+               u64 out_dat : 1;
+               u64 out_ctl : 1;
+               u64 out_sta : 1;
+               u64 out_wif : 1;
+               u64 prt_chk : 3;
+               u64 prt_nxt : 1;
+               u64 prt_psb : 8;
+               u64 ncb_inb : 1;
+               u64 prt_qcb : 1;
+               u64 prt_qsb : 2;
+               u64 prt_ctl : 2;
+               u64 dat_dat : 2;
+               u64 dat_ptr : 4;
+       } cn70xx;
+       struct cvmx_pko_reg_bist_result_cn70xx cn70xxp1;
+       struct cvmx_pko_reg_bist_result_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pko_reg_bist_result cvmx_pko_reg_bist_result_t;
+
+/**
+ * cvmx_pko_reg_cmd_buf
+ *
+ * Notes:
+ * Sets the command buffer parameters
+ * The size of the command buffer segments is measured in uint64s.  The pool specifies (1 of 8 free
+ * lists to be used when freeing command buffer segments.
+ */
+union cvmx_pko_reg_cmd_buf {
+       u64 u64;
+       struct cvmx_pko_reg_cmd_buf_s {
+               u64 reserved_23_63 : 41;
+               u64 pool : 3;
+               u64 reserved_13_19 : 7;
+               u64 size : 13;
+       } s;
+       struct cvmx_pko_reg_cmd_buf_s cn30xx;
+       struct cvmx_pko_reg_cmd_buf_s cn31xx;
+       struct cvmx_pko_reg_cmd_buf_s cn38xx;
+       struct cvmx_pko_reg_cmd_buf_s cn38xxp2;
+       struct cvmx_pko_reg_cmd_buf_s cn50xx;
+       struct cvmx_pko_reg_cmd_buf_s cn52xx;
+       struct cvmx_pko_reg_cmd_buf_s cn52xxp1;
+       struct cvmx_pko_reg_cmd_buf_s cn56xx;
+       struct cvmx_pko_reg_cmd_buf_s cn56xxp1;
+       struct cvmx_pko_reg_cmd_buf_s cn58xx;
+       struct cvmx_pko_reg_cmd_buf_s cn58xxp1;
+       struct cvmx_pko_reg_cmd_buf_s cn61xx;
+       struct cvmx_pko_reg_cmd_buf_s cn63xx;
+       struct cvmx_pko_reg_cmd_buf_s cn63xxp1;
+       struct cvmx_pko_reg_cmd_buf_s cn66xx;
+       struct cvmx_pko_reg_cmd_buf_s cn68xx;
+       struct cvmx_pko_reg_cmd_buf_s cn68xxp1;
+       struct cvmx_pko_reg_cmd_buf_cn70xx {
+               u64 reserved_23_63 : 41;
+               u64 pool : 3;
+               u64 reserved_19_13 : 7;
+               u64 size : 13;
+       } cn70xx;
+       struct cvmx_pko_reg_cmd_buf_cn70xx cn70xxp1;
+       struct cvmx_pko_reg_cmd_buf_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_cmd_buf cvmx_pko_reg_cmd_buf_t;
+
+/**
+ * cvmx_pko_reg_crc_ctl#
+ *
+ * Notes:
+ * Controls datapath reflection when calculating CRC
+ *
+ */
+union cvmx_pko_reg_crc_ctlx {
+       u64 u64;
+       struct cvmx_pko_reg_crc_ctlx_s {
+               u64 reserved_2_63 : 62;
+               u64 invres : 1;
+               u64 refin : 1;
+       } s;
+       struct cvmx_pko_reg_crc_ctlx_s cn38xx;
+       struct cvmx_pko_reg_crc_ctlx_s cn38xxp2;
+       struct cvmx_pko_reg_crc_ctlx_s cn58xx;
+       struct cvmx_pko_reg_crc_ctlx_s cn58xxp1;
+};
+
+typedef union cvmx_pko_reg_crc_ctlx cvmx_pko_reg_crc_ctlx_t;
+
+/**
+ * cvmx_pko_reg_crc_enable
+ *
+ * Notes:
+ * Enables CRC for the GMX ports.
+ *
+ */
+union cvmx_pko_reg_crc_enable {
+       u64 u64;
+       struct cvmx_pko_reg_crc_enable_s {
+               u64 reserved_32_63 : 32;
+               u64 enable : 32;
+       } s;
+       struct cvmx_pko_reg_crc_enable_s cn38xx;
+       struct cvmx_pko_reg_crc_enable_s cn38xxp2;
+       struct cvmx_pko_reg_crc_enable_s cn58xx;
+       struct cvmx_pko_reg_crc_enable_s cn58xxp1;
+};
+
+typedef union cvmx_pko_reg_crc_enable cvmx_pko_reg_crc_enable_t;
+
+/**
+ * cvmx_pko_reg_crc_iv#
+ *
+ * Notes:
+ * Determines the IV used by the CRC algorithm
+ * * PKO_CRC_IV
+ *  PKO_CRC_IV controls the initial state of the CRC algorithm.  Octane can
+ *  support a wide range of CRC algorithms and as such, the IV must be
+ *  carefully constructed to meet the specific algorithm.  The code below
+ *  determines the value to program into Octane based on the algorthim's IV
+ *  and width.  In the case of Octane, the width should always be 32.
+ *
+ *  PKO_CRC_IV0 sets the IV for ports 0-15 while PKO_CRC_IV1 sets the IV for
+ *  ports 16-31.
+ *
+ *   @verbatim
+ *   unsigned octane_crc_iv(unsigned algorithm_iv, unsigned poly, unsigned w)
+ *   [
+ *     int i;
+ *     int doit;
+ *     unsigned int current_val = algorithm_iv;
+ *
+ *     for(i = 0; i < w; i++) [
+ *       doit = current_val & 0x1;
+ *
+ *       if(doit) current_val ^= poly;
+ *       assert(!(current_val & 0x1));
+ *
+ *       current_val = (current_val >> 1) | (doit << (w-1));
+ *     ]
+ *
+ *     return current_val;
+ *   ]
+ *   @endverbatim
+ */
+union cvmx_pko_reg_crc_ivx {
+       u64 u64;
+       struct cvmx_pko_reg_crc_ivx_s {
+               u64 reserved_32_63 : 32;
+               u64 iv : 32;
+       } s;
+       struct cvmx_pko_reg_crc_ivx_s cn38xx;
+       struct cvmx_pko_reg_crc_ivx_s cn38xxp2;
+       struct cvmx_pko_reg_crc_ivx_s cn58xx;
+       struct cvmx_pko_reg_crc_ivx_s cn58xxp1;
+};
+
+typedef union cvmx_pko_reg_crc_ivx cvmx_pko_reg_crc_ivx_t;
+
+/**
+ * cvmx_pko_reg_debug0
+ *
+ * Notes:
+ * Note that this CSR is present only in chip revisions beginning with pass2.
+ *
+ */
+union cvmx_pko_reg_debug0 {
+       u64 u64;
+       struct cvmx_pko_reg_debug0_s {
+               u64 asserts : 64;
+       } s;
+       struct cvmx_pko_reg_debug0_cn30xx {
+               u64 reserved_17_63 : 47;
+               u64 asserts : 17;
+       } cn30xx;
+       struct cvmx_pko_reg_debug0_cn30xx cn31xx;
+       struct cvmx_pko_reg_debug0_cn30xx cn38xx;
+       struct cvmx_pko_reg_debug0_cn30xx cn38xxp2;
+       struct cvmx_pko_reg_debug0_s cn50xx;
+       struct cvmx_pko_reg_debug0_s cn52xx;
+       struct cvmx_pko_reg_debug0_s cn52xxp1;
+       struct cvmx_pko_reg_debug0_s cn56xx;
+       struct cvmx_pko_reg_debug0_s cn56xxp1;
+       struct cvmx_pko_reg_debug0_s cn58xx;
+       struct cvmx_pko_reg_debug0_s cn58xxp1;
+       struct cvmx_pko_reg_debug0_s cn61xx;
+       struct cvmx_pko_reg_debug0_s cn63xx;
+       struct cvmx_pko_reg_debug0_s cn63xxp1;
+       struct cvmx_pko_reg_debug0_s cn66xx;
+       struct cvmx_pko_reg_debug0_s cn68xx;
+       struct cvmx_pko_reg_debug0_s cn68xxp1;
+       struct cvmx_pko_reg_debug0_s cn70xx;
+       struct cvmx_pko_reg_debug0_s cn70xxp1;
+       struct cvmx_pko_reg_debug0_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_debug0 cvmx_pko_reg_debug0_t;
+
+/**
+ * cvmx_pko_reg_debug1
+ */
+union cvmx_pko_reg_debug1 {
+       u64 u64;
+       struct cvmx_pko_reg_debug1_s {
+               u64 asserts : 64;
+       } s;
+       struct cvmx_pko_reg_debug1_s cn50xx;
+       struct cvmx_pko_reg_debug1_s cn52xx;
+       struct cvmx_pko_reg_debug1_s cn52xxp1;
+       struct cvmx_pko_reg_debug1_s cn56xx;
+       struct cvmx_pko_reg_debug1_s cn56xxp1;
+       struct cvmx_pko_reg_debug1_s cn58xx;
+       struct cvmx_pko_reg_debug1_s cn58xxp1;
+       struct cvmx_pko_reg_debug1_s cn61xx;
+       struct cvmx_pko_reg_debug1_s cn63xx;
+       struct cvmx_pko_reg_debug1_s cn63xxp1;
+       struct cvmx_pko_reg_debug1_s cn66xx;
+       struct cvmx_pko_reg_debug1_s cn68xx;
+       struct cvmx_pko_reg_debug1_s cn68xxp1;
+       struct cvmx_pko_reg_debug1_s cn70xx;
+       struct cvmx_pko_reg_debug1_s cn70xxp1;
+       struct cvmx_pko_reg_debug1_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_debug1 cvmx_pko_reg_debug1_t;
+
+/**
+ * cvmx_pko_reg_debug2
+ */
+union cvmx_pko_reg_debug2 {
+       u64 u64;
+       struct cvmx_pko_reg_debug2_s {
+               u64 asserts : 64;
+       } s;
+       struct cvmx_pko_reg_debug2_s cn50xx;
+       struct cvmx_pko_reg_debug2_s cn52xx;
+       struct cvmx_pko_reg_debug2_s cn52xxp1;
+       struct cvmx_pko_reg_debug2_s cn56xx;
+       struct cvmx_pko_reg_debug2_s cn56xxp1;
+       struct cvmx_pko_reg_debug2_s cn58xx;
+       struct cvmx_pko_reg_debug2_s cn58xxp1;
+       struct cvmx_pko_reg_debug2_s cn61xx;
+       struct cvmx_pko_reg_debug2_s cn63xx;
+       struct cvmx_pko_reg_debug2_s cn63xxp1;
+       struct cvmx_pko_reg_debug2_s cn66xx;
+       struct cvmx_pko_reg_debug2_s cn68xx;
+       struct cvmx_pko_reg_debug2_s cn68xxp1;
+       struct cvmx_pko_reg_debug2_s cn70xx;
+       struct cvmx_pko_reg_debug2_s cn70xxp1;
+       struct cvmx_pko_reg_debug2_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_debug2 cvmx_pko_reg_debug2_t;
+
+/**
+ * cvmx_pko_reg_debug3
+ */
+union cvmx_pko_reg_debug3 {
+       u64 u64;
+       struct cvmx_pko_reg_debug3_s {
+               u64 asserts : 64;
+       } s;
+       struct cvmx_pko_reg_debug3_s cn50xx;
+       struct cvmx_pko_reg_debug3_s cn52xx;
+       struct cvmx_pko_reg_debug3_s cn52xxp1;
+       struct cvmx_pko_reg_debug3_s cn56xx;
+       struct cvmx_pko_reg_debug3_s cn56xxp1;
+       struct cvmx_pko_reg_debug3_s cn58xx;
+       struct cvmx_pko_reg_debug3_s cn58xxp1;
+       struct cvmx_pko_reg_debug3_s cn61xx;
+       struct cvmx_pko_reg_debug3_s cn63xx;
+       struct cvmx_pko_reg_debug3_s cn63xxp1;
+       struct cvmx_pko_reg_debug3_s cn66xx;
+       struct cvmx_pko_reg_debug3_s cn68xx;
+       struct cvmx_pko_reg_debug3_s cn68xxp1;
+       struct cvmx_pko_reg_debug3_s cn70xx;
+       struct cvmx_pko_reg_debug3_s cn70xxp1;
+       struct cvmx_pko_reg_debug3_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_debug3 cvmx_pko_reg_debug3_t;
+
+/**
+ * cvmx_pko_reg_debug4
+ */
+union cvmx_pko_reg_debug4 {
+       u64 u64;
+       struct cvmx_pko_reg_debug4_s {
+               u64 asserts : 64;
+       } s;
+       struct cvmx_pko_reg_debug4_s cn68xx;
+       struct cvmx_pko_reg_debug4_s cn68xxp1;
+};
+
+typedef union cvmx_pko_reg_debug4 cvmx_pko_reg_debug4_t;
+
+/**
+ * cvmx_pko_reg_engine_inflight
+ *
+ * Notes:
+ * Sets the maximum number of inflight packets, per engine.  Values greater than 4 are illegal.
+ * Setting an engine's value to 0 effectively stops the engine.
+ */
+union cvmx_pko_reg_engine_inflight {
+       u64 u64;
+       struct cvmx_pko_reg_engine_inflight_s {
+               u64 engine15 : 4;
+               u64 engine14 : 4;
+               u64 engine13 : 4;
+               u64 engine12 : 4;
+               u64 engine11 : 4;
+               u64 engine10 : 4;
+               u64 engine9 : 4;
+               u64 engine8 : 4;
+               u64 engine7 : 4;
+               u64 engine6 : 4;
+               u64 engine5 : 4;
+               u64 engine4 : 4;
+               u64 engine3 : 4;
+               u64 engine2 : 4;
+               u64 engine1 : 4;
+               u64 engine0 : 4;
+       } s;
+       struct cvmx_pko_reg_engine_inflight_cn52xx {
+               u64 reserved_40_63 : 24;
+               u64 engine9 : 4;
+               u64 engine8 : 4;
+               u64 engine7 : 4;
+               u64 engine6 : 4;
+               u64 engine5 : 4;
+               u64 engine4 : 4;
+               u64 engine3 : 4;
+               u64 engine2 : 4;
+               u64 engine1 : 4;
+               u64 engine0 : 4;
+       } cn52xx;
+       struct cvmx_pko_reg_engine_inflight_cn52xx cn52xxp1;
+       struct cvmx_pko_reg_engine_inflight_cn52xx cn56xx;
+       struct cvmx_pko_reg_engine_inflight_cn52xx cn56xxp1;
+       struct cvmx_pko_reg_engine_inflight_cn61xx {
+               u64 reserved_56_63 : 8;
+               u64 engine13 : 4;
+               u64 engine12 : 4;
+               u64 engine11 : 4;
+               u64 engine10 : 4;
+               u64 engine9 : 4;
+               u64 engine8 : 4;
+               u64 engine7 : 4;
+               u64 engine6 : 4;
+               u64 engine5 : 4;
+               u64 engine4 : 4;
+               u64 engine3 : 4;
+               u64 engine2 : 4;
+               u64 engine1 : 4;
+               u64 engine0 : 4;
+       } cn61xx;
+       struct cvmx_pko_reg_engine_inflight_cn63xx {
+               u64 reserved_48_63 : 16;
+               u64 engine11 : 4;
+               u64 engine10 : 4;
+               u64 engine9 : 4;
+               u64 engine8 : 4;
+               u64 engine7 : 4;
+               u64 engine6 : 4;
+               u64 engine5 : 4;
+               u64 engine4 : 4;
+               u64 engine3 : 4;
+               u64 engine2 : 4;
+               u64 engine1 : 4;
+               u64 engine0 : 4;
+       } cn63xx;
+       struct cvmx_pko_reg_engine_inflight_cn63xx cn63xxp1;
+       struct cvmx_pko_reg_engine_inflight_cn61xx cn66xx;
+       struct cvmx_pko_reg_engine_inflight_s cn68xx;
+       struct cvmx_pko_reg_engine_inflight_s cn68xxp1;
+       struct cvmx_pko_reg_engine_inflight_cn61xx cn70xx;
+       struct cvmx_pko_reg_engine_inflight_cn61xx cn70xxp1;
+       struct cvmx_pko_reg_engine_inflight_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pko_reg_engine_inflight cvmx_pko_reg_engine_inflight_t;
+
+/**
+ * cvmx_pko_reg_engine_inflight1
+ *
+ * Notes:
+ * Sets the maximum number of inflight packets, per engine.  Values greater than 8 are illegal.
+ * Setting an engine's value to 0 effectively stops the engine.
+ */
+union cvmx_pko_reg_engine_inflight1 {
+       u64 u64;
+       struct cvmx_pko_reg_engine_inflight1_s {
+               u64 reserved_16_63 : 48;
+               u64 engine19 : 4;
+               u64 engine18 : 4;
+               u64 engine17 : 4;
+               u64 engine16 : 4;
+       } s;
+       struct cvmx_pko_reg_engine_inflight1_s cn68xx;
+       struct cvmx_pko_reg_engine_inflight1_s cn68xxp1;
+};
+
+typedef union cvmx_pko_reg_engine_inflight1 cvmx_pko_reg_engine_inflight1_t;
+
+/**
+ * cvmx_pko_reg_engine_storage#
+ *
+ * Notes:
+ * The PKO has 40KB of local storage, consisting of 20, 2KB chunks.  Up to 15 contiguous chunks may be mapped per engine.
+ * The total of all mapped storage must not exceed 40KB.
+ */
+union cvmx_pko_reg_engine_storagex {
+       u64 u64;
+       struct cvmx_pko_reg_engine_storagex_s {
+               u64 engine15 : 4;
+               u64 engine14 : 4;
+               u64 engine13 : 4;
+               u64 engine12 : 4;
+               u64 engine11 : 4;
+               u64 engine10 : 4;
+               u64 engine9 : 4;
+               u64 engine8 : 4;
+               u64 engine7 : 4;
+               u64 engine6 : 4;
+               u64 engine5 : 4;
+               u64 engine4 : 4;
+               u64 engine3 : 4;
+               u64 engine2 : 4;
+               u64 engine1 : 4;
+               u64 engine0 : 4;
+       } s;
+       struct cvmx_pko_reg_engine_storagex_s cn68xx;
+       struct cvmx_pko_reg_engine_storagex_s cn68xxp1;
+};
+
+typedef union cvmx_pko_reg_engine_storagex cvmx_pko_reg_engine_storagex_t;
+
+/**
+ * cvmx_pko_reg_engine_thresh
+ *
+ * Notes:
+ * When not enabled, packet data may be sent as soon as it is written into PKO's internal buffers.
+ * When enabled and the packet fits entirely in the PKO's internal buffer, none of the packet data will
+ * be sent until all of it has been written into the PKO's internal buffer.  Note that a packet is
+ * considered to fit entirely only if the packet's size is <= BUFFER_SIZE-8.  When enabled and the
+ * packet does not fit entirely in the PKO's internal buffer, none of the packet data will be sent until
+ * at least BUFFER_SIZE-256 bytes of the packet have been written into the PKO's internal buffer
+ * (note that BUFFER_SIZE is a function of PKO_REG_GMX_PORT_MODE above)
+ */
+union cvmx_pko_reg_engine_thresh {
+       u64 u64;
+       struct cvmx_pko_reg_engine_thresh_s {
+               u64 reserved_20_63 : 44;
+               u64 mask : 20;
+       } s;
+       struct cvmx_pko_reg_engine_thresh_cn52xx {
+               u64 reserved_10_63 : 54;
+               u64 mask : 10;
+       } cn52xx;
+       struct cvmx_pko_reg_engine_thresh_cn52xx cn52xxp1;
+       struct cvmx_pko_reg_engine_thresh_cn52xx cn56xx;
+       struct cvmx_pko_reg_engine_thresh_cn52xx cn56xxp1;
+       struct cvmx_pko_reg_engine_thresh_cn61xx {
+               u64 reserved_14_63 : 50;
+               u64 mask : 14;
+       } cn61xx;
+       struct cvmx_pko_reg_engine_thresh_cn63xx {
+               u64 reserved_12_63 : 52;
+               u64 mask : 12;
+       } cn63xx;
+       struct cvmx_pko_reg_engine_thresh_cn63xx cn63xxp1;
+       struct cvmx_pko_reg_engine_thresh_cn61xx cn66xx;
+       struct cvmx_pko_reg_engine_thresh_s cn68xx;
+       struct cvmx_pko_reg_engine_thresh_s cn68xxp1;
+       struct cvmx_pko_reg_engine_thresh_cn61xx cn70xx;
+       struct cvmx_pko_reg_engine_thresh_cn61xx cn70xxp1;
+       struct cvmx_pko_reg_engine_thresh_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pko_reg_engine_thresh cvmx_pko_reg_engine_thresh_t;
+
+/**
+ * cvmx_pko_reg_error
+ *
+ * Notes:
+ * Note that this CSR is present only in chip revisions beginning with pass2.
+ *
+ */
+union cvmx_pko_reg_error {
+       u64 u64;
+       struct cvmx_pko_reg_error_s {
+               u64 reserved_4_63 : 60;
+               u64 loopback : 1;
+               u64 currzero : 1;
+               u64 doorbell : 1;
+               u64 parity : 1;
+       } s;
+       struct cvmx_pko_reg_error_cn30xx {
+               u64 reserved_2_63 : 62;
+               u64 doorbell : 1;
+               u64 parity : 1;
+       } cn30xx;
+       struct cvmx_pko_reg_error_cn30xx cn31xx;
+       struct cvmx_pko_reg_error_cn30xx cn38xx;
+       struct cvmx_pko_reg_error_cn30xx cn38xxp2;
+       struct cvmx_pko_reg_error_cn50xx {
+               u64 reserved_3_63 : 61;
+               u64 currzero : 1;
+               u64 doorbell : 1;
+               u64 parity : 1;
+       } cn50xx;
+       struct cvmx_pko_reg_error_cn50xx cn52xx;
+       struct cvmx_pko_reg_error_cn50xx cn52xxp1;
+       struct cvmx_pko_reg_error_cn50xx cn56xx;
+       struct cvmx_pko_reg_error_cn50xx cn56xxp1;
+       struct cvmx_pko_reg_error_cn50xx cn58xx;
+       struct cvmx_pko_reg_error_cn50xx cn58xxp1;
+       struct cvmx_pko_reg_error_cn50xx cn61xx;
+       struct cvmx_pko_reg_error_cn50xx cn63xx;
+       struct cvmx_pko_reg_error_cn50xx cn63xxp1;
+       struct cvmx_pko_reg_error_cn50xx cn66xx;
+       struct cvmx_pko_reg_error_s cn68xx;
+       struct cvmx_pko_reg_error_s cn68xxp1;
+       struct cvmx_pko_reg_error_cn50xx cn70xx;
+       struct cvmx_pko_reg_error_cn50xx cn70xxp1;
+       struct cvmx_pko_reg_error_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_reg_error cvmx_pko_reg_error_t;
+
+/**
+ * cvmx_pko_reg_flags
+ *
+ * Notes:
+ * When set, ENA_PKO enables the PKO picker and places the PKO in normal operation.  When set, ENA_DWB
+ * enables the use of DontWriteBacks during the buffer freeing operations.  When not set, STORE_BE inverts
+ * bits[2:0] of the STORE0 byte write address.  When set, RESET causes a 4-cycle reset pulse to the
+ * entire box.
+ */
+union cvmx_pko_reg_flags {
+       u64 u64;
+       struct cvmx_pko_reg_flags_s {
+               u64 reserved_9_63 : 55;
+               u64 dis_perf3 : 1;
+               u64 dis_perf2 : 1;
+               u64 dis_perf1 : 1;
+               u64 dis_perf0 : 1;
+               u64 ena_throttle : 1;
+               u64 reset : 1;
+               u64 store_be : 1;
+               u64 ena_dwb : 1;
+               u64 ena_pko : 1;
+       } s;
+       struct cvmx_pko_reg_flags_cn30xx {
+               u64 reserved_4_63 : 60;
+               u64 reset : 1;
+               u64 store_be : 1;
+               u64 ena_dwb : 1;
+               u64 ena_pko : 1;
+       } cn30xx;
+       struct cvmx_pko_reg_flags_cn30xx cn31xx;
+       struct cvmx_pko_reg_flags_cn30xx cn38xx;
+       struct cvmx_pko_reg_flags_cn30xx cn38xxp2;
+       struct cvmx_pko_reg_flags_cn30xx cn50xx;
+       struct cvmx_pko_reg_flags_cn30xx cn52xx;
+       struct cvmx_pko_reg_flags_cn30xx cn52xxp1;
+       struct cvmx_pko_reg_flags_cn30xx cn56xx;
+       struct cvmx_pko_reg_flags_cn30xx cn56xxp1;
+       struct cvmx_pko_reg_flags_cn30xx cn58xx;
+       struct cvmx_pko_reg_flags_cn30xx cn58xxp1;
+       struct cvmx_pko_reg_flags_cn61xx {
+               u64 reserved_9_63 : 55;
+               u64 dis_perf3 : 1;
+               u64 dis_perf2 : 1;
+               u64 reserved_4_6 : 3;
+               u64 reset : 1;
+               u64 store_be : 1;
+               u64 ena_dwb : 1;
+               u64 ena_pko : 1;
+       } cn61xx;
+       struct cvmx_pko_reg_flags_cn30xx cn63xx;
+       struct cvmx_pko_reg_flags_cn30xx cn63xxp1;
+       struct cvmx_pko_reg_flags_cn61xx cn66xx;
+       struct cvmx_pko_reg_flags_s cn68xx;
+       struct cvmx_pko_reg_flags_cn68xxp1 {
+               u64 reserved_7_63 : 57;
+               u64 dis_perf1 : 1;
+               u64 dis_perf0 : 1;
+               u64 ena_throttle : 1;
+               u64 reset : 1;
+               u64 store_be : 1;
+               u64 ena_dwb : 1;
+               u64 ena_pko : 1;
+       } cn68xxp1;
+       struct cvmx_pko_reg_flags_cn61xx cn70xx;
+       struct cvmx_pko_reg_flags_cn61xx cn70xxp1;
+       struct cvmx_pko_reg_flags_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pko_reg_flags cvmx_pko_reg_flags_t;
+
+/**
+ * cvmx_pko_reg_gmx_port_mode
+ *
+ * Notes:
+ * The system has a total of 2 + 4 + 4 ports and 2 + 1 + 1 engines (GM0 + PCI + LOOP).
+ * This CSR sets the number of GMX0 ports and amount of local storage per engine.
+ * It has no effect on the number of ports or amount of local storage per engine for PCI and LOOP.
+ * When both GMX ports are used (MODE0=3), each GMX engine has 10kB of local
+ * storage.  Increasing MODE0 to 4 decreases the number of GMX ports to 1 and
+ * increases the local storage for the one remaining PKO GMX engine to 20kB.
+ * MODE0 value 0, 1, and 2, or greater than 4 are illegal.
+ *
+ * MODE0   GMX0  PCI   LOOP  GMX0                       PCI            LOOP
+ *         ports ports ports storage/engine             storage/engine storage/engine
+ * 3       2     4     4      10.0kB                    2.5kB          2.5kB
+ * 4       1     4     4      20.0kB                    2.5kB          2.5kB
+ */
+union cvmx_pko_reg_gmx_port_mode {
+       u64 u64;
+       struct cvmx_pko_reg_gmx_port_mode_s {
+               u64 reserved_6_63 : 58;
+               u64 mode1 : 3;
+               u64 mode0 : 3;
+       } s;
+       struct cvmx_pko_reg_gmx_port_mode_s cn30xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn31xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn38xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn38xxp2;
+       struct cvmx_pko_reg_gmx_port_mode_s cn50xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn52xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn52xxp1;
+       struct cvmx_pko_reg_gmx_port_mode_s cn56xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn56xxp1;
+       struct cvmx_pko_reg_gmx_port_mode_s cn58xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn58xxp1;
+       struct cvmx_pko_reg_gmx_port_mode_s cn61xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn63xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn63xxp1;
+       struct cvmx_pko_reg_gmx_port_mode_s cn66xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn70xx;
+       struct cvmx_pko_reg_gmx_port_mode_s cn70xxp1;
+       struct cvmx_pko_reg_gmx_port_mode_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_gmx_port_mode cvmx_pko_reg_gmx_port_mode_t;
+
+/**
+ * cvmx_pko_reg_int_mask
+ *
+ * Notes:
+ * When a mask bit is set, the corresponding interrupt is enabled.
+ *
+ */
+union cvmx_pko_reg_int_mask {
+       u64 u64;
+       struct cvmx_pko_reg_int_mask_s {
+               u64 reserved_4_63 : 60;
+               u64 loopback : 1;
+               u64 currzero : 1;
+               u64 doorbell : 1;
+               u64 parity : 1;
+       } s;
+       struct cvmx_pko_reg_int_mask_cn30xx {
+               u64 reserved_2_63 : 62;
+               u64 doorbell : 1;
+               u64 parity : 1;
+       } cn30xx;
+       struct cvmx_pko_reg_int_mask_cn30xx cn31xx;
+       struct cvmx_pko_reg_int_mask_cn30xx cn38xx;
+       struct cvmx_pko_reg_int_mask_cn30xx cn38xxp2;
+       struct cvmx_pko_reg_int_mask_cn50xx {
+               u64 reserved_3_63 : 61;
+               u64 currzero : 1;
+               u64 doorbell : 1;
+               u64 parity : 1;
+       } cn50xx;
+       struct cvmx_pko_reg_int_mask_cn50xx cn52xx;
+       struct cvmx_pko_reg_int_mask_cn50xx cn52xxp1;
+       struct cvmx_pko_reg_int_mask_cn50xx cn56xx;
+       struct cvmx_pko_reg_int_mask_cn50xx cn56xxp1;
+       struct cvmx_pko_reg_int_mask_cn50xx cn58xx;
+       struct cvmx_pko_reg_int_mask_cn50xx cn58xxp1;
+       struct cvmx_pko_reg_int_mask_cn50xx cn61xx;
+       struct cvmx_pko_reg_int_mask_cn50xx cn63xx;
+       struct cvmx_pko_reg_int_mask_cn50xx cn63xxp1;
+       struct cvmx_pko_reg_int_mask_cn50xx cn66xx;
+       struct cvmx_pko_reg_int_mask_s cn68xx;
+       struct cvmx_pko_reg_int_mask_s cn68xxp1;
+       struct cvmx_pko_reg_int_mask_cn50xx cn70xx;
+       struct cvmx_pko_reg_int_mask_cn50xx cn70xxp1;
+       struct cvmx_pko_reg_int_mask_cn50xx cnf71xx;
+};
+
+typedef union cvmx_pko_reg_int_mask cvmx_pko_reg_int_mask_t;
+
+/**
+ * cvmx_pko_reg_loopback_bpid
+ *
+ * Notes:
+ * None.
+ *
+ */
+union cvmx_pko_reg_loopback_bpid {
+       u64 u64;
+       struct cvmx_pko_reg_loopback_bpid_s {
+               u64 reserved_59_63 : 5;
+               u64 bpid7 : 6;
+               u64 reserved_52_52 : 1;
+               u64 bpid6 : 6;
+               u64 reserved_45_45 : 1;
+               u64 bpid5 : 6;
+               u64 reserved_38_38 : 1;
+               u64 bpid4 : 6;
+               u64 reserved_31_31 : 1;
+               u64 bpid3 : 6;
+               u64 reserved_24_24 : 1;
+               u64 bpid2 : 6;
+               u64 reserved_17_17 : 1;
+               u64 bpid1 : 6;
+               u64 reserved_10_10 : 1;
+               u64 bpid0 : 6;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_pko_reg_loopback_bpid_s cn68xx;
+       struct cvmx_pko_reg_loopback_bpid_s cn68xxp1;
+};
+
+typedef union cvmx_pko_reg_loopback_bpid cvmx_pko_reg_loopback_bpid_t;
+
+/**
+ * cvmx_pko_reg_loopback_pkind
+ *
+ * Notes:
+ * None.
+ *
+ */
+union cvmx_pko_reg_loopback_pkind {
+       u64 u64;
+       struct cvmx_pko_reg_loopback_pkind_s {
+               u64 reserved_59_63 : 5;
+               u64 pkind7 : 6;
+               u64 reserved_52_52 : 1;
+               u64 pkind6 : 6;
+               u64 reserved_45_45 : 1;
+               u64 pkind5 : 6;
+               u64 reserved_38_38 : 1;
+               u64 pkind4 : 6;
+               u64 reserved_31_31 : 1;
+               u64 pkind3 : 6;
+               u64 reserved_24_24 : 1;
+               u64 pkind2 : 6;
+               u64 reserved_17_17 : 1;
+               u64 pkind1 : 6;
+               u64 reserved_10_10 : 1;
+               u64 pkind0 : 6;
+               u64 num_ports : 4;
+       } s;
+       struct cvmx_pko_reg_loopback_pkind_s cn68xx;
+       struct cvmx_pko_reg_loopback_pkind_s cn68xxp1;
+};
+
+typedef union cvmx_pko_reg_loopback_pkind cvmx_pko_reg_loopback_pkind_t;
+
+/**
+ * cvmx_pko_reg_min_pkt
+ *
+ * Notes:
+ * This CSR is used with PKO_MEM_IPORT_PTRS[MIN_PKT] to select the minimum packet size.  Packets whose
+ * size in bytes < (SIZEn+1) are zero-padded to (SIZEn+1) bytes.  Note that this does not include CRC bytes.
+ * SIZE0=0 is read-only and is used when no padding is desired.
+ */
+union cvmx_pko_reg_min_pkt {
+       u64 u64;
+       struct cvmx_pko_reg_min_pkt_s {
+               u64 size7 : 8;
+               u64 size6 : 8;
+               u64 size5 : 8;
+               u64 size4 : 8;
+               u64 size3 : 8;
+               u64 size2 : 8;
+               u64 size1 : 8;
+               u64 size0 : 8;
+       } s;
+       struct cvmx_pko_reg_min_pkt_s cn68xx;
+       struct cvmx_pko_reg_min_pkt_s cn68xxp1;
+};
+
+typedef union cvmx_pko_reg_min_pkt cvmx_pko_reg_min_pkt_t;
+
+/**
+ * cvmx_pko_reg_preempt
+ */
+union cvmx_pko_reg_preempt {
+       u64 u64;
+       struct cvmx_pko_reg_preempt_s {
+               u64 reserved_16_63 : 48;
+               u64 min_size : 16;
+       } s;
+       struct cvmx_pko_reg_preempt_s cn52xx;
+       struct cvmx_pko_reg_preempt_s cn52xxp1;
+       struct cvmx_pko_reg_preempt_s cn56xx;
+       struct cvmx_pko_reg_preempt_s cn56xxp1;
+       struct cvmx_pko_reg_preempt_s cn61xx;
+       struct cvmx_pko_reg_preempt_s cn63xx;
+       struct cvmx_pko_reg_preempt_s cn63xxp1;
+       struct cvmx_pko_reg_preempt_s cn66xx;
+       struct cvmx_pko_reg_preempt_s cn68xx;
+       struct cvmx_pko_reg_preempt_s cn68xxp1;
+       struct cvmx_pko_reg_preempt_s cn70xx;
+       struct cvmx_pko_reg_preempt_s cn70xxp1;
+       struct cvmx_pko_reg_preempt_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_preempt cvmx_pko_reg_preempt_t;
+
+/**
+ * cvmx_pko_reg_queue_mode
+ *
+ * Notes:
+ * Sets the number of queues and amount of local storage per queue
+ * The system has a total of 256 queues and (256*8) words of local command storage.  This CSR sets the
+ * number of queues that are used.  Increasing the value of MODE by 1 decreases the number of queues
+ * by a power of 2 and increases the local storage per queue by a power of 2.
+ * MODEn queues storage/queue
+ * 0     256     64B ( 8 words)
+ * 1     128    128B (16 words)
+ * 2      64    256B (32 words)
+ */
+union cvmx_pko_reg_queue_mode {
+       u64 u64;
+       struct cvmx_pko_reg_queue_mode_s {
+               u64 reserved_2_63 : 62;
+               u64 mode : 2;
+       } s;
+       struct cvmx_pko_reg_queue_mode_s cn30xx;
+       struct cvmx_pko_reg_queue_mode_s cn31xx;
+       struct cvmx_pko_reg_queue_mode_s cn38xx;
+       struct cvmx_pko_reg_queue_mode_s cn38xxp2;
+       struct cvmx_pko_reg_queue_mode_s cn50xx;
+       struct cvmx_pko_reg_queue_mode_s cn52xx;
+       struct cvmx_pko_reg_queue_mode_s cn52xxp1;
+       struct cvmx_pko_reg_queue_mode_s cn56xx;
+       struct cvmx_pko_reg_queue_mode_s cn56xxp1;
+       struct cvmx_pko_reg_queue_mode_s cn58xx;
+       struct cvmx_pko_reg_queue_mode_s cn58xxp1;
+       struct cvmx_pko_reg_queue_mode_s cn61xx;
+       struct cvmx_pko_reg_queue_mode_s cn63xx;
+       struct cvmx_pko_reg_queue_mode_s cn63xxp1;
+       struct cvmx_pko_reg_queue_mode_s cn66xx;
+       struct cvmx_pko_reg_queue_mode_s cn68xx;
+       struct cvmx_pko_reg_queue_mode_s cn68xxp1;
+       struct cvmx_pko_reg_queue_mode_s cn70xx;
+       struct cvmx_pko_reg_queue_mode_s cn70xxp1;
+       struct cvmx_pko_reg_queue_mode_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_queue_mode cvmx_pko_reg_queue_mode_t;
+
+/**
+ * cvmx_pko_reg_queue_preempt
+ *
+ * Notes:
+ * Per QID, setting both PREEMPTER=1 and PREEMPTEE=1 is illegal and sets only PREEMPTER=1.
+ * This CSR is used with PKO_MEM_QUEUE_PTRS and PKO_REG_QUEUE_PTRS1.  When programming queues, the
+ * programming sequence must first write PKO_REG_QUEUE_PREEMPT, then PKO_REG_QUEUE_PTRS1 and then
+ * PKO_MEM_QUEUE_PTRS for each queue.  Preemption is supported only on queues that are ultimately
+ * mapped to engines 0-7.  It is illegal to set preemptee or preempter for a queue that is ultimately
+ * mapped to engines 8-11.
+ *
+ * Also, PKO_REG_ENGINE_INFLIGHT must be at least 2 for any engine on which preemption is enabled.
+ *
+ * See the descriptions of PKO_MEM_QUEUE_PTRS for further explanation of queue programming.
+ */
+union cvmx_pko_reg_queue_preempt {
+       u64 u64;
+       struct cvmx_pko_reg_queue_preempt_s {
+               u64 reserved_2_63 : 62;
+               u64 preemptee : 1;
+               u64 preempter : 1;
+       } s;
+       struct cvmx_pko_reg_queue_preempt_s cn52xx;
+       struct cvmx_pko_reg_queue_preempt_s cn52xxp1;
+       struct cvmx_pko_reg_queue_preempt_s cn56xx;
+       struct cvmx_pko_reg_queue_preempt_s cn56xxp1;
+       struct cvmx_pko_reg_queue_preempt_s cn61xx;
+       struct cvmx_pko_reg_queue_preempt_s cn63xx;
+       struct cvmx_pko_reg_queue_preempt_s cn63xxp1;
+       struct cvmx_pko_reg_queue_preempt_s cn66xx;
+       struct cvmx_pko_reg_queue_preempt_s cn68xx;
+       struct cvmx_pko_reg_queue_preempt_s cn68xxp1;
+       struct cvmx_pko_reg_queue_preempt_s cn70xx;
+       struct cvmx_pko_reg_queue_preempt_s cn70xxp1;
+       struct cvmx_pko_reg_queue_preempt_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_queue_preempt cvmx_pko_reg_queue_preempt_t;
+
+/**
+ * cvmx_pko_reg_queue_ptrs1
+ *
+ * Notes:
+ * This CSR is used with PKO_MEM_QUEUE_PTRS and PKO_MEM_QUEUE_QOS to allow access to queues 128-255
+ * and to allow up mapping of up to 16 queues per port.  When programming queues 128-255, the
+ * programming sequence must first write PKO_REG_QUEUE_PTRS1 and then write PKO_MEM_QUEUE_PTRS or
+ * PKO_MEM_QUEUE_QOS for each queue.
+ * See the descriptions of PKO_MEM_QUEUE_PTRS and PKO_MEM_QUEUE_QOS for further explanation of queue
+ * programming.
+ */
+union cvmx_pko_reg_queue_ptrs1 {
+       u64 u64;
+       struct cvmx_pko_reg_queue_ptrs1_s {
+               u64 reserved_2_63 : 62;
+               u64 idx3 : 1;
+               u64 qid7 : 1;
+       } s;
+       struct cvmx_pko_reg_queue_ptrs1_s cn50xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn52xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn52xxp1;
+       struct cvmx_pko_reg_queue_ptrs1_s cn56xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn56xxp1;
+       struct cvmx_pko_reg_queue_ptrs1_s cn58xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn58xxp1;
+       struct cvmx_pko_reg_queue_ptrs1_s cn61xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn63xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn63xxp1;
+       struct cvmx_pko_reg_queue_ptrs1_s cn66xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn70xx;
+       struct cvmx_pko_reg_queue_ptrs1_s cn70xxp1;
+       struct cvmx_pko_reg_queue_ptrs1_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_queue_ptrs1 cvmx_pko_reg_queue_ptrs1_t;
+
+/**
+ * cvmx_pko_reg_read_idx
+ *
+ * Notes:
+ * Provides the read index during a CSR read operation to any of the CSRs that are physically stored
+ * as memories.  The names of these CSRs begin with the prefix "PKO_MEM_".
+ * IDX[7:0] is the read index.  INC[7:0] is an increment that is added to IDX[7:0] after any CSR read.
+ * The intended use is to initially write this CSR such that IDX=0 and INC=1.  Then, the entire
+ * contents of a CSR memory can be read with consecutive CSR read commands.
+ */
+union cvmx_pko_reg_read_idx {
+       u64 u64;
+       struct cvmx_pko_reg_read_idx_s {
+               u64 reserved_16_63 : 48;
+               u64 inc : 8;
+               u64 index : 8;
+       } s;
+       struct cvmx_pko_reg_read_idx_s cn30xx;
+       struct cvmx_pko_reg_read_idx_s cn31xx;
+       struct cvmx_pko_reg_read_idx_s cn38xx;
+       struct cvmx_pko_reg_read_idx_s cn38xxp2;
+       struct cvmx_pko_reg_read_idx_s cn50xx;
+       struct cvmx_pko_reg_read_idx_s cn52xx;
+       struct cvmx_pko_reg_read_idx_s cn52xxp1;
+       struct cvmx_pko_reg_read_idx_s cn56xx;
+       struct cvmx_pko_reg_read_idx_s cn56xxp1;
+       struct cvmx_pko_reg_read_idx_s cn58xx;
+       struct cvmx_pko_reg_read_idx_s cn58xxp1;
+       struct cvmx_pko_reg_read_idx_s cn61xx;
+       struct cvmx_pko_reg_read_idx_s cn63xx;
+       struct cvmx_pko_reg_read_idx_s cn63xxp1;
+       struct cvmx_pko_reg_read_idx_s cn66xx;
+       struct cvmx_pko_reg_read_idx_s cn68xx;
+       struct cvmx_pko_reg_read_idx_s cn68xxp1;
+       struct cvmx_pko_reg_read_idx_s cn70xx;
+       struct cvmx_pko_reg_read_idx_s cn70xxp1;
+       struct cvmx_pko_reg_read_idx_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_read_idx cvmx_pko_reg_read_idx_t;
+
+/**
+ * cvmx_pko_reg_throttle
+ *
+ * Notes:
+ * This CSR is used with PKO_MEM_THROTTLE_PIPE and PKO_MEM_THROTTLE_INT.  INT_MASK corresponds to the
+ * interfaces listed in the description for PKO_MEM_IPORT_PTRS[INT].  Set INT_MASK[N] to enable the
+ * updating of PKO_MEM_THROTTLE_PIPE and PKO_MEM_THROTTLE_INT counts for packets destined for
+ * interface N.  INT_MASK has no effect on the updates caused by CSR writes to PKO_MEM_THROTTLE_PIPE
+ * and PKO_MEM_THROTTLE_INT.  Note that this does not disable the throttle logic, just the updating of
+ * the interface counts.
+ */
+union cvmx_pko_reg_throttle {
+       u64 u64;
+       struct cvmx_pko_reg_throttle_s {
+               u64 reserved_32_63 : 32;
+               u64 int_mask : 32;
+       } s;
+       struct cvmx_pko_reg_throttle_s cn68xx;
+       struct cvmx_pko_reg_throttle_s cn68xxp1;
+};
+
+typedef union cvmx_pko_reg_throttle cvmx_pko_reg_throttle_t;
+
+/**
+ * cvmx_pko_reg_timestamp
+ *
+ * Notes:
+ * None.
+ *
+ */
+union cvmx_pko_reg_timestamp {
+       u64 u64;
+       struct cvmx_pko_reg_timestamp_s {
+               u64 reserved_4_63 : 60;
+               u64 wqe_word : 4;
+       } s;
+       struct cvmx_pko_reg_timestamp_s cn61xx;
+       struct cvmx_pko_reg_timestamp_s cn63xx;
+       struct cvmx_pko_reg_timestamp_s cn63xxp1;
+       struct cvmx_pko_reg_timestamp_s cn66xx;
+       struct cvmx_pko_reg_timestamp_s cn68xx;
+       struct cvmx_pko_reg_timestamp_s cn68xxp1;
+       struct cvmx_pko_reg_timestamp_s cn70xx;
+       struct cvmx_pko_reg_timestamp_s cn70xxp1;
+       struct cvmx_pko_reg_timestamp_s cnf71xx;
+};
+
+typedef union cvmx_pko_reg_timestamp cvmx_pko_reg_timestamp_t;
+
+/**
+ * cvmx_pko_shaper_cfg
+ */
+union cvmx_pko_shaper_cfg {
+       u64 u64;
+       struct cvmx_pko_shaper_cfg_s {
+               u64 reserved_2_63 : 62;
+               u64 color_aware : 1;
+               u64 red_send_as_yellow : 1;
+       } s;
+       struct cvmx_pko_shaper_cfg_s cn73xx;
+       struct cvmx_pko_shaper_cfg_s cn78xx;
+       struct cvmx_pko_shaper_cfg_s cn78xxp1;
+       struct cvmx_pko_shaper_cfg_s cnf75xx;
+};
+
+typedef union cvmx_pko_shaper_cfg cvmx_pko_shaper_cfg_t;
+
+/**
+ * cvmx_pko_state_uid_in_use#_rd
+ *
+ * For diagnostic use only.
+ *
+ */
+union cvmx_pko_state_uid_in_usex_rd {
+       u64 u64;
+       struct cvmx_pko_state_uid_in_usex_rd_s {
+               u64 in_use : 64;
+       } s;
+       struct cvmx_pko_state_uid_in_usex_rd_s cn73xx;
+       struct cvmx_pko_state_uid_in_usex_rd_s cn78xx;
+       struct cvmx_pko_state_uid_in_usex_rd_s cn78xxp1;
+       struct cvmx_pko_state_uid_in_usex_rd_s cnf75xx;
+};
+
+typedef union cvmx_pko_state_uid_in_usex_rd cvmx_pko_state_uid_in_usex_rd_t;
+
+/**
+ * cvmx_pko_status
+ */
+union cvmx_pko_status {
+       u64 u64;
+       struct cvmx_pko_status_s {
+               u64 pko_rdy : 1;
+               u64 reserved_24_62 : 39;
+               u64 c2qlut_rdy : 1;
+               u64 ppfi_rdy : 1;
+               u64 iobp1_rdy : 1;
+               u64 ncb_rdy : 1;
+               u64 pse_rdy : 1;
+               u64 pdm_rdy : 1;
+               u64 peb_rdy : 1;
+               u64 csi_rdy : 1;
+               u64 reserved_5_15 : 11;
+               u64 ncb_bist_status : 1;
+               u64 c2qlut_bist_status : 1;
+               u64 pdm_bist_status : 1;
+               u64 peb_bist_status : 1;
+               u64 pse_bist_status : 1;
+       } s;
+       struct cvmx_pko_status_cn73xx {
+               u64 pko_rdy : 1;
+               u64 reserved_62_24 : 39;
+               u64 c2qlut_rdy : 1;
+               u64 ppfi_rdy : 1;
+               u64 iobp1_rdy : 1;
+               u64 ncb_rdy : 1;
+               u64 pse_rdy : 1;
+               u64 pdm_rdy : 1;
+               u64 peb_rdy : 1;
+               u64 csi_rdy : 1;
+               u64 reserved_15_5 : 11;
+               u64 ncb_bist_status : 1;
+               u64 c2qlut_bist_status : 1;
+               u64 pdm_bist_status : 1;
+               u64 peb_bist_status : 1;
+               u64 pse_bist_status : 1;
+       } cn73xx;
+       struct cvmx_pko_status_cn73xx cn78xx;
+       struct cvmx_pko_status_cn73xx cn78xxp1;
+       struct cvmx_pko_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_pko_status cvmx_pko_status_t;
+
+/**
+ * cvmx_pko_txf#_pkt_cnt_rd
+ */
+union cvmx_pko_txfx_pkt_cnt_rd {
+       u64 u64;
+       struct cvmx_pko_txfx_pkt_cnt_rd_s {
+               u64 reserved_8_63 : 56;
+               u64 cnt : 8;
+       } s;
+       struct cvmx_pko_txfx_pkt_cnt_rd_s cn73xx;
+       struct cvmx_pko_txfx_pkt_cnt_rd_s cn78xx;
+       struct cvmx_pko_txfx_pkt_cnt_rd_s cn78xxp1;
+       struct cvmx_pko_txfx_pkt_cnt_rd_s cnf75xx;
+};
+
+typedef union cvmx_pko_txfx_pkt_cnt_rd cvmx_pko_txfx_pkt_cnt_rd_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pko-internal-ports-range.h b/arch/mips/mach-octeon/include/mach/cvmx-pko-internal-ports-range.h
new file mode 100644 (file)
index 0000000..1fb49b3
--- /dev/null
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_INTERNAL_PORTS_RANGE__
+#define __CVMX_INTERNAL_PORTS_RANGE__
+
+/*
+ * Allocated a block of internal ports for the specified interface/port
+ *
+ * @param  interface  the interface for which the internal ports are requested
+ * @param  port       the index of the port within in the interface for which the internal ports
+ *                    are requested.
+ * @param  count      the number of internal ports requested
+ *
+ * @return  0 on success
+ *         -1 on failure
+ */
+int cvmx_pko_internal_ports_alloc(int interface, int port, u64 count);
+
+/*
+ * Free the internal ports associated with the specified interface/port
+ *
+ * @param  interface  the interface for which the internal ports are requested
+ * @param  port       the index of the port within in the interface for which the internal ports
+ *                    are requested.
+ *
+ * @return  0 on success
+ *         -1 on failure
+ */
+int cvmx_pko_internal_ports_free(int interface, int port);
+
+/*
+ * Frees up all the allocated internal ports.
+ */
+void cvmx_pko_internal_ports_range_free_all(void);
+
+void cvmx_pko_internal_ports_range_show(void);
+
+int __cvmx_pko_internal_ports_range_init(void);
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pko3-queue.h b/arch/mips/mach-octeon/include/mach/cvmx-pko3-queue.h
new file mode 100644 (file)
index 0000000..5f83989
--- /dev/null
@@ -0,0 +1,175 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_PKO3_QUEUE_H__
+#define __CVMX_PKO3_QUEUE_H__
+
+/**
+ * @INTERNAL
+ *
+ * Find or allocate global port/dq map table
+ * which is a named table, contains entries for
+ * all possible OCI nodes.
+ *
+ * The table global pointer is stored in core-local variable
+ * so that every core will call this function once, on first use.
+ */
+int __cvmx_pko3_dq_table_setup(void);
+
+/*
+ * Get the base Descriptor Queue number for an IPD port on the local node
+ */
+int cvmx_pko3_get_queue_base(int ipd_port);
+
+/*
+ * Get the number of Descriptor Queues assigned for an IPD port
+ */
+int cvmx_pko3_get_queue_num(int ipd_port);
+
+/**
+ * Get L1/Port Queue number assigned to interface port.
+ *
+ * @param xiface is interface number.
+ * @param index is port index.
+ */
+int cvmx_pko3_get_port_queue(int xiface, int index);
+
+/*
+ * Configure L3 through L5 Scheduler Queues and Descriptor Queues
+ *
+ * The Scheduler Queues in Levels 3 to 5 and Descriptor Queues are
+ * configured one-to-one or many-to-one to a single parent Scheduler
+ * Queues. The level of the parent SQ is specified in an argument,
+ * as well as the number of children to attach to the specific parent.
+ * The children can have fair round-robin or priority-based scheduling
+ * when multiple children are assigned a single parent.
+ *
+ * @param node is the OCI node location for the queues to be configured
+ * @param parent_level is the level of the parent queue, 2 to 5.
+ * @param parent_queue is the number of the parent Scheduler Queue
+ * @param child_base is the number of the first child SQ or DQ to assign to
+ * @param parent
+ * @param child_count is the number of consecutive children to assign
+ * @param stat_prio_count is the priority setting for the children L2 SQs
+ *
+ * If <stat_prio_count> is -1, the Ln children will have equal Round-Robin
+ * relationship with eachother. If <stat_prio_count> is 0, all Ln children
+ * will be arranged in Weighted-Round-Robin, with the first having the most
+ * precedence. If <stat_prio_count> is between 1 and 8, it indicates how
+ * many children will have static priority settings (with the first having
+ * the most precedence), with the remaining Ln children having WRR scheduling.
+ *
+ * @returns 0 on success, -1 on failure.
+ *
+ * Note: this function supports the configuration of node-local unit.
+ */
+int cvmx_pko3_sq_config_children(unsigned int node, unsigned int parent_level,
+                                unsigned int parent_queue, unsigned int child_base,
+                                unsigned int child_count, int stat_prio_count);
+
+/*
+ * @INTERNAL
+ * Register a range of Descriptor Queues wth an interface port
+ *
+ * This function poulates the DQ-to-IPD translation table
+ * used by the application to retrieve the DQ range (typically ordered
+ * by priority) for a given IPD-port, which is either a physical port,
+ * or a channel on a channelized interface (i.e. ILK).
+ *
+ * @param xiface is the physical interface number
+ * @param index is either a physical port on an interface
+ * @param or a channel of an ILK interface
+ * @param dq_base is the first Descriptor Queue number in a consecutive range
+ * @param dq_count is the number of consecutive Descriptor Queues leading
+ * @param the same channel or port.
+ *
+ * Only a consecurive range of Descriptor Queues can be associated with any
+ * given channel/port, and usually they are ordered from most to least
+ * in terms of scheduling priority.
+ *
+ * Note: thus function only populates the node-local translation table.
+ *
+ * @returns 0 on success, -1 on failure.
+ */
+int __cvmx_pko3_ipd_dq_register(int xiface, int index, unsigned int dq_base, unsigned int dq_count);
+
+/**
+ * @INTERNAL
+ *
+ * Unregister DQs associated with CHAN_E (IPD port)
+ */
+int __cvmx_pko3_ipd_dq_unregister(int xiface, int index);
+
+/*
+ * Map channel number in PKO
+ *
+ * @param node is to specify the node to which this configuration is applied.
+ * @param pq_num specifies the Port Queue (i.e. L1) queue number.
+ * @param l2_l3_q_num  specifies L2/L3 queue number.
+ * @param channel specifies the channel number to map to the queue.
+ *
+ * The channel assignment applies to L2 or L3 Shaper Queues depending
+ * on the setting of channel credit level.
+ *
+ * @return returns none.
+ */
+void cvmx_pko3_map_channel(unsigned int node, unsigned int pq_num, unsigned int l2_l3_q_num,
+                          u16 channel);
+
+int cvmx_pko3_pq_config(unsigned int node, unsigned int mac_num, unsigned int pq_num);
+
+int cvmx_pko3_port_cir_set(unsigned int node, unsigned int pq_num, unsigned long rate_kbips,
+                          unsigned int burst_bytes, int adj_bytes);
+int cvmx_pko3_dq_cir_set(unsigned int node, unsigned int pq_num, unsigned long rate_kbips,
+                        unsigned int burst_bytes);
+int cvmx_pko3_dq_pir_set(unsigned int node, unsigned int pq_num, unsigned long rate_kbips,
+                        unsigned int burst_bytes);
+typedef enum {
+       CVMX_PKO3_SHAPE_RED_STALL,
+       CVMX_PKO3_SHAPE_RED_DISCARD,
+       CVMX_PKO3_SHAPE_RED_PASS
+} red_action_t;
+
+void cvmx_pko3_dq_red(unsigned int node, unsigned int dq_num, red_action_t red_act,
+                     int8_t len_adjust);
+
+/**
+ * Macros to deal with short floating point numbers,
+ * where unsigned exponent, and an unsigned normalized
+ * mantissa are represented each with a defined field width.
+ *
+ */
+#define CVMX_SHOFT_MANT_BITS 8
+#define CVMX_SHOFT_EXP_BITS  4
+
+/**
+ * Convert short-float to an unsigned integer
+ * Note that it will lose precision.
+ */
+#define CVMX_SHOFT_TO_U64(m, e)                                                                    \
+       ((((1ull << CVMX_SHOFT_MANT_BITS) | (m)) << (e)) >> CVMX_SHOFT_MANT_BITS)
+
+/**
+ * Convert to short-float from an unsigned integer
+ */
+#define CVMX_SHOFT_FROM_U64(ui, m, e)                                                              \
+       do {                                                                                       \
+               unsigned long long u;                                                              \
+               unsigned int k;                                                                    \
+               k = (1ull << (CVMX_SHOFT_MANT_BITS + 1)) - 1;                                      \
+               (e) = 0;                                                                           \
+               u = (ui) << CVMX_SHOFT_MANT_BITS;                                                  \
+               while ((u) > k) {                                                                  \
+                       u >>= 1;                                                                   \
+                       (e)++;                                                                     \
+               }                                                                                  \
+               (m) = u & (k >> 1);                                                                \
+       } while (0);
+
+#define CVMX_SHOFT_MAX()                                                                           \
+       CVMX_SHOFT_TO_U64((1 << CVMX_SHOFT_MANT_BITS) - 1, (1 << CVMX_SHOFT_EXP_BITS) - 1)
+#define CVMX_SHOFT_MIN() CVMX_SHOFT_TO_U64(0, 0)
+
+#endif /* __CVMX_PKO3_QUEUE_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pow-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-pow-defs.h
new file mode 100644 (file)
index 0000000..92e3723
--- /dev/null
@@ -0,0 +1,1135 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon pow.
+ */
+
+#ifndef __CVMX_POW_DEFS_H__
+#define __CVMX_POW_DEFS_H__
+
+#define CVMX_POW_BIST_STAT          (0x00016700000003F8ull)
+#define CVMX_POW_DS_PC              (0x0001670000000398ull)
+#define CVMX_POW_ECC_ERR            (0x0001670000000218ull)
+#define CVMX_POW_IQ_CNTX(offset)     (0x0001670000000340ull + ((offset) & 7) * 8)
+#define CVMX_POW_IQ_COM_CNT         (0x0001670000000388ull)
+#define CVMX_POW_IQ_INT                     (0x0001670000000238ull)
+#define CVMX_POW_IQ_INT_EN          (0x0001670000000240ull)
+#define CVMX_POW_IQ_THRX(offset)     (0x00016700000003A0ull + ((offset) & 7) * 8)
+#define CVMX_POW_NOS_CNT            (0x0001670000000228ull)
+#define CVMX_POW_NW_TIM                     (0x0001670000000210ull)
+#define CVMX_POW_PF_RST_MSK         (0x0001670000000230ull)
+#define CVMX_POW_PP_GRP_MSKX(offset) (0x0001670000000000ull + ((offset) & 15) * 8)
+#define CVMX_POW_QOS_RNDX(offset)    (0x00016700000001C0ull + ((offset) & 7) * 8)
+#define CVMX_POW_QOS_THRX(offset)    (0x0001670000000180ull + ((offset) & 7) * 8)
+#define CVMX_POW_TS_PC              (0x0001670000000390ull)
+#define CVMX_POW_WA_COM_PC          (0x0001670000000380ull)
+#define CVMX_POW_WA_PCX(offset)             (0x0001670000000300ull + ((offset) & 7) * 8)
+#define CVMX_POW_WQ_INT                     (0x0001670000000200ull)
+#define CVMX_POW_WQ_INT_CNTX(offset) (0x0001670000000100ull + ((offset) & 15) * 8)
+#define CVMX_POW_WQ_INT_PC          (0x0001670000000208ull)
+#define CVMX_POW_WQ_INT_THRX(offset) (0x0001670000000080ull + ((offset) & 15) * 8)
+#define CVMX_POW_WS_PCX(offset)             (0x0001670000000280ull + ((offset) & 15) * 8)
+
+/**
+ * cvmx_pow_bist_stat
+ *
+ * Contains the BIST status for the POW memories ('0' = pass, '1' = fail).
+ *
+ */
+union cvmx_pow_bist_stat {
+       u64 u64;
+       struct cvmx_pow_bist_stat_s {
+               u64 reserved_32_63 : 32;
+               u64 pp : 16;
+               u64 reserved_0_15 : 16;
+       } s;
+       struct cvmx_pow_bist_stat_cn30xx {
+               u64 reserved_17_63 : 47;
+               u64 pp : 1;
+               u64 reserved_9_15 : 7;
+               u64 cam : 1;
+               u64 nbt1 : 1;
+               u64 nbt0 : 1;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 nbr1 : 1;
+               u64 nbr0 : 1;
+               u64 pend : 1;
+               u64 adr : 1;
+       } cn30xx;
+       struct cvmx_pow_bist_stat_cn31xx {
+               u64 reserved_18_63 : 46;
+               u64 pp : 2;
+               u64 reserved_9_15 : 7;
+               u64 cam : 1;
+               u64 nbt1 : 1;
+               u64 nbt0 : 1;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 nbr1 : 1;
+               u64 nbr0 : 1;
+               u64 pend : 1;
+               u64 adr : 1;
+       } cn31xx;
+       struct cvmx_pow_bist_stat_cn38xx {
+               u64 reserved_32_63 : 32;
+               u64 pp : 16;
+               u64 reserved_10_15 : 6;
+               u64 cam : 1;
+               u64 nbt : 1;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 nbr1 : 1;
+               u64 nbr0 : 1;
+               u64 pend1 : 1;
+               u64 pend0 : 1;
+               u64 adr1 : 1;
+               u64 adr0 : 1;
+       } cn38xx;
+       struct cvmx_pow_bist_stat_cn38xx cn38xxp2;
+       struct cvmx_pow_bist_stat_cn31xx cn50xx;
+       struct cvmx_pow_bist_stat_cn52xx {
+               u64 reserved_20_63 : 44;
+               u64 pp : 4;
+               u64 reserved_9_15 : 7;
+               u64 cam : 1;
+               u64 nbt1 : 1;
+               u64 nbt0 : 1;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 nbr1 : 1;
+               u64 nbr0 : 1;
+               u64 pend : 1;
+               u64 adr : 1;
+       } cn52xx;
+       struct cvmx_pow_bist_stat_cn52xx cn52xxp1;
+       struct cvmx_pow_bist_stat_cn56xx {
+               u64 reserved_28_63 : 36;
+               u64 pp : 12;
+               u64 reserved_10_15 : 6;
+               u64 cam : 1;
+               u64 nbt : 1;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 nbr1 : 1;
+               u64 nbr0 : 1;
+               u64 pend1 : 1;
+               u64 pend0 : 1;
+               u64 adr1 : 1;
+               u64 adr0 : 1;
+       } cn56xx;
+       struct cvmx_pow_bist_stat_cn56xx cn56xxp1;
+       struct cvmx_pow_bist_stat_cn38xx cn58xx;
+       struct cvmx_pow_bist_stat_cn38xx cn58xxp1;
+       struct cvmx_pow_bist_stat_cn61xx {
+               u64 reserved_20_63 : 44;
+               u64 pp : 4;
+               u64 reserved_12_15 : 4;
+               u64 cam : 1;
+               u64 nbr : 3;
+               u64 nbt : 4;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 pend : 1;
+               u64 adr : 1;
+       } cn61xx;
+       struct cvmx_pow_bist_stat_cn63xx {
+               u64 reserved_22_63 : 42;
+               u64 pp : 6;
+               u64 reserved_12_15 : 4;
+               u64 cam : 1;
+               u64 nbr : 3;
+               u64 nbt : 4;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 pend : 1;
+               u64 adr : 1;
+       } cn63xx;
+       struct cvmx_pow_bist_stat_cn63xx cn63xxp1;
+       struct cvmx_pow_bist_stat_cn66xx {
+               u64 reserved_26_63 : 38;
+               u64 pp : 10;
+               u64 reserved_12_15 : 4;
+               u64 cam : 1;
+               u64 nbr : 3;
+               u64 nbt : 4;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 pend : 1;
+               u64 adr : 1;
+       } cn66xx;
+       struct cvmx_pow_bist_stat_cn70xx {
+               u64 reserved_12_63 : 52;
+               u64 cam : 1;
+               u64 reserved_10_10 : 1;
+               u64 nbr : 2;
+               u64 reserved_6_7 : 2;
+               u64 nbt : 2;
+               u64 index : 1;
+               u64 fidx : 1;
+               u64 pend : 1;
+               u64 adr : 1;
+       } cn70xx;
+       struct cvmx_pow_bist_stat_cn70xx cn70xxp1;
+       struct cvmx_pow_bist_stat_cn61xx cnf71xx;
+};
+
+typedef union cvmx_pow_bist_stat cvmx_pow_bist_stat_t;
+
+/**
+ * cvmx_pow_ds_pc
+ *
+ * Counts the number of de-schedule requests.  Write to clear.
+ *
+ */
+union cvmx_pow_ds_pc {
+       u64 u64;
+       struct cvmx_pow_ds_pc_s {
+               u64 reserved_32_63 : 32;
+               u64 ds_pc : 32;
+       } s;
+       struct cvmx_pow_ds_pc_s cn30xx;
+       struct cvmx_pow_ds_pc_s cn31xx;
+       struct cvmx_pow_ds_pc_s cn38xx;
+       struct cvmx_pow_ds_pc_s cn38xxp2;
+       struct cvmx_pow_ds_pc_s cn50xx;
+       struct cvmx_pow_ds_pc_s cn52xx;
+       struct cvmx_pow_ds_pc_s cn52xxp1;
+       struct cvmx_pow_ds_pc_s cn56xx;
+       struct cvmx_pow_ds_pc_s cn56xxp1;
+       struct cvmx_pow_ds_pc_s cn58xx;
+       struct cvmx_pow_ds_pc_s cn58xxp1;
+       struct cvmx_pow_ds_pc_s cn61xx;
+       struct cvmx_pow_ds_pc_s cn63xx;
+       struct cvmx_pow_ds_pc_s cn63xxp1;
+       struct cvmx_pow_ds_pc_s cn66xx;
+       struct cvmx_pow_ds_pc_s cn70xx;
+       struct cvmx_pow_ds_pc_s cn70xxp1;
+       struct cvmx_pow_ds_pc_s cnf71xx;
+};
+
+typedef union cvmx_pow_ds_pc cvmx_pow_ds_pc_t;
+
+/**
+ * cvmx_pow_ecc_err
+ *
+ * Contains the single and double error bits and the corresponding interrupt enables for the ECC-
+ * protected POW index memory.  Also contains the syndrome value in the event of an ECC error.
+ * Also contains the remote pointer error bit and interrupt enable.  RPE is set when the POW
+ * detected
+ * corruption on one or more of the input queue lists in L2/DRAM (POW's local copy of the tail
+ * pointer
+ * for the L2/DRAM input queue did not match the last entry on the the list).   This is caused by
+ * L2/DRAM corruption, and is generally a fatal error because it likely caused POW to load bad
+ * work
+ * queue entries.
+ * This register also contains the illegal operation error bits and the corresponding interrupt
+ * enables as follows:
+ *  <0> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP from PP in NULL_NULL state
+ *  <1> Received SWTAG/SWTAG_DESCH/DESCH/UPD_WQP from PP in NULL state
+ *  <2> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/GET_WORK from PP with pending tag switch to ORDERED
+ * or ATOMIC
+ *  <3> Received SWTAG/SWTAG_FULL/SWTAG_DESCH from PP with tag specified as NULL_NULL
+ *  <4> Received SWTAG_FULL/SWTAG_DESCH from PP with tag specified as NULL
+ *  <5> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP/GET_WORK/NULL_RD from PP with
+ * GET_WORK pending
+ *  <6> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP/GET_WORK/NULL_RD from PP with NULL_RD
+ * pending
+ *  <7> Received CLR_NSCHED from PP with SWTAG_DESCH/DESCH/CLR_NSCHED pending
+ *  <8> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP/GET_WORK/NULL_RD from PP with
+ * CLR_NSCHED pending
+ *  <9> Received illegal opcode
+ * <10> Received ADD_WORK with tag specified as NULL_NULL
+ * <11> Received DBG load from PP with DBG load pending
+ * <12> Received CSR load from PP with CSR load pending
+ */
+union cvmx_pow_ecc_err {
+       u64 u64;
+       struct cvmx_pow_ecc_err_s {
+               u64 reserved_45_63 : 19;
+               u64 iop_ie : 13;
+               u64 reserved_29_31 : 3;
+               u64 iop : 13;
+               u64 reserved_14_15 : 2;
+               u64 rpe_ie : 1;
+               u64 rpe : 1;
+               u64 reserved_9_11 : 3;
+               u64 syn : 5;
+               u64 dbe_ie : 1;
+               u64 sbe_ie : 1;
+               u64 dbe : 1;
+               u64 sbe : 1;
+       } s;
+       struct cvmx_pow_ecc_err_s cn30xx;
+       struct cvmx_pow_ecc_err_cn31xx {
+               u64 reserved_14_63 : 50;
+               u64 rpe_ie : 1;
+               u64 rpe : 1;
+               u64 reserved_9_11 : 3;
+               u64 syn : 5;
+               u64 dbe_ie : 1;
+               u64 sbe_ie : 1;
+               u64 dbe : 1;
+               u64 sbe : 1;
+       } cn31xx;
+       struct cvmx_pow_ecc_err_s cn38xx;
+       struct cvmx_pow_ecc_err_cn31xx cn38xxp2;
+       struct cvmx_pow_ecc_err_s cn50xx;
+       struct cvmx_pow_ecc_err_s cn52xx;
+       struct cvmx_pow_ecc_err_s cn52xxp1;
+       struct cvmx_pow_ecc_err_s cn56xx;
+       struct cvmx_pow_ecc_err_s cn56xxp1;
+       struct cvmx_pow_ecc_err_s cn58xx;
+       struct cvmx_pow_ecc_err_s cn58xxp1;
+       struct cvmx_pow_ecc_err_s cn61xx;
+       struct cvmx_pow_ecc_err_s cn63xx;
+       struct cvmx_pow_ecc_err_s cn63xxp1;
+       struct cvmx_pow_ecc_err_s cn66xx;
+       struct cvmx_pow_ecc_err_s cn70xx;
+       struct cvmx_pow_ecc_err_s cn70xxp1;
+       struct cvmx_pow_ecc_err_s cnf71xx;
+};
+
+typedef union cvmx_pow_ecc_err cvmx_pow_ecc_err_t;
+
+/**
+ * cvmx_pow_iq_cnt#
+ *
+ * Contains a read-only count of the number of work queue entries for each QOS level.
+ *
+ */
+union cvmx_pow_iq_cntx {
+       u64 u64;
+       struct cvmx_pow_iq_cntx_s {
+               u64 reserved_32_63 : 32;
+               u64 iq_cnt : 32;
+       } s;
+       struct cvmx_pow_iq_cntx_s cn30xx;
+       struct cvmx_pow_iq_cntx_s cn31xx;
+       struct cvmx_pow_iq_cntx_s cn38xx;
+       struct cvmx_pow_iq_cntx_s cn38xxp2;
+       struct cvmx_pow_iq_cntx_s cn50xx;
+       struct cvmx_pow_iq_cntx_s cn52xx;
+       struct cvmx_pow_iq_cntx_s cn52xxp1;
+       struct cvmx_pow_iq_cntx_s cn56xx;
+       struct cvmx_pow_iq_cntx_s cn56xxp1;
+       struct cvmx_pow_iq_cntx_s cn58xx;
+       struct cvmx_pow_iq_cntx_s cn58xxp1;
+       struct cvmx_pow_iq_cntx_s cn61xx;
+       struct cvmx_pow_iq_cntx_s cn63xx;
+       struct cvmx_pow_iq_cntx_s cn63xxp1;
+       struct cvmx_pow_iq_cntx_s cn66xx;
+       struct cvmx_pow_iq_cntx_s cn70xx;
+       struct cvmx_pow_iq_cntx_s cn70xxp1;
+       struct cvmx_pow_iq_cntx_s cnf71xx;
+};
+
+typedef union cvmx_pow_iq_cntx cvmx_pow_iq_cntx_t;
+
+/**
+ * cvmx_pow_iq_com_cnt
+ *
+ * Contains a read-only count of the total number of work queue entries in all QOS levels.
+ *
+ */
+union cvmx_pow_iq_com_cnt {
+       u64 u64;
+       struct cvmx_pow_iq_com_cnt_s {
+               u64 reserved_32_63 : 32;
+               u64 iq_cnt : 32;
+       } s;
+       struct cvmx_pow_iq_com_cnt_s cn30xx;
+       struct cvmx_pow_iq_com_cnt_s cn31xx;
+       struct cvmx_pow_iq_com_cnt_s cn38xx;
+       struct cvmx_pow_iq_com_cnt_s cn38xxp2;
+       struct cvmx_pow_iq_com_cnt_s cn50xx;
+       struct cvmx_pow_iq_com_cnt_s cn52xx;
+       struct cvmx_pow_iq_com_cnt_s cn52xxp1;
+       struct cvmx_pow_iq_com_cnt_s cn56xx;
+       struct cvmx_pow_iq_com_cnt_s cn56xxp1;
+       struct cvmx_pow_iq_com_cnt_s cn58xx;
+       struct cvmx_pow_iq_com_cnt_s cn58xxp1;
+       struct cvmx_pow_iq_com_cnt_s cn61xx;
+       struct cvmx_pow_iq_com_cnt_s cn63xx;
+       struct cvmx_pow_iq_com_cnt_s cn63xxp1;
+       struct cvmx_pow_iq_com_cnt_s cn66xx;
+       struct cvmx_pow_iq_com_cnt_s cn70xx;
+       struct cvmx_pow_iq_com_cnt_s cn70xxp1;
+       struct cvmx_pow_iq_com_cnt_s cnf71xx;
+};
+
+typedef union cvmx_pow_iq_com_cnt cvmx_pow_iq_com_cnt_t;
+
+/**
+ * cvmx_pow_iq_int
+ *
+ * "Contains the bits (1 per QOS level) that can trigger the input queue interrupt.  An IQ_INT
+ * bit
+ * will be set if POW_IQ_CNT#QOS# changes and the resulting value is equal to POW_IQ_THR#QOS#."
+ */
+union cvmx_pow_iq_int {
+       u64 u64;
+       struct cvmx_pow_iq_int_s {
+               u64 reserved_8_63 : 56;
+               u64 iq_int : 8;
+       } s;
+       struct cvmx_pow_iq_int_s cn52xx;
+       struct cvmx_pow_iq_int_s cn52xxp1;
+       struct cvmx_pow_iq_int_s cn56xx;
+       struct cvmx_pow_iq_int_s cn56xxp1;
+       struct cvmx_pow_iq_int_s cn61xx;
+       struct cvmx_pow_iq_int_s cn63xx;
+       struct cvmx_pow_iq_int_s cn63xxp1;
+       struct cvmx_pow_iq_int_s cn66xx;
+       struct cvmx_pow_iq_int_s cn70xx;
+       struct cvmx_pow_iq_int_s cn70xxp1;
+       struct cvmx_pow_iq_int_s cnf71xx;
+};
+
+typedef union cvmx_pow_iq_int cvmx_pow_iq_int_t;
+
+/**
+ * cvmx_pow_iq_int_en
+ *
+ * Contains the bits (1 per QOS level) that enable the input queue interrupt.
+ *
+ */
+union cvmx_pow_iq_int_en {
+       u64 u64;
+       struct cvmx_pow_iq_int_en_s {
+               u64 reserved_8_63 : 56;
+               u64 int_en : 8;
+       } s;
+       struct cvmx_pow_iq_int_en_s cn52xx;
+       struct cvmx_pow_iq_int_en_s cn52xxp1;
+       struct cvmx_pow_iq_int_en_s cn56xx;
+       struct cvmx_pow_iq_int_en_s cn56xxp1;
+       struct cvmx_pow_iq_int_en_s cn61xx;
+       struct cvmx_pow_iq_int_en_s cn63xx;
+       struct cvmx_pow_iq_int_en_s cn63xxp1;
+       struct cvmx_pow_iq_int_en_s cn66xx;
+       struct cvmx_pow_iq_int_en_s cn70xx;
+       struct cvmx_pow_iq_int_en_s cn70xxp1;
+       struct cvmx_pow_iq_int_en_s cnf71xx;
+};
+
+typedef union cvmx_pow_iq_int_en cvmx_pow_iq_int_en_t;
+
+/**
+ * cvmx_pow_iq_thr#
+ *
+ * Threshold value for triggering input queue interrupts.
+ *
+ */
+union cvmx_pow_iq_thrx {
+       u64 u64;
+       struct cvmx_pow_iq_thrx_s {
+               u64 reserved_32_63 : 32;
+               u64 iq_thr : 32;
+       } s;
+       struct cvmx_pow_iq_thrx_s cn52xx;
+       struct cvmx_pow_iq_thrx_s cn52xxp1;
+       struct cvmx_pow_iq_thrx_s cn56xx;
+       struct cvmx_pow_iq_thrx_s cn56xxp1;
+       struct cvmx_pow_iq_thrx_s cn61xx;
+       struct cvmx_pow_iq_thrx_s cn63xx;
+       struct cvmx_pow_iq_thrx_s cn63xxp1;
+       struct cvmx_pow_iq_thrx_s cn66xx;
+       struct cvmx_pow_iq_thrx_s cn70xx;
+       struct cvmx_pow_iq_thrx_s cn70xxp1;
+       struct cvmx_pow_iq_thrx_s cnf71xx;
+};
+
+typedef union cvmx_pow_iq_thrx cvmx_pow_iq_thrx_t;
+
+/**
+ * cvmx_pow_nos_cnt
+ *
+ * Contains the number of work queue entries on the no-schedule list.
+ *
+ */
+union cvmx_pow_nos_cnt {
+       u64 u64;
+       struct cvmx_pow_nos_cnt_s {
+               u64 reserved_12_63 : 52;
+               u64 nos_cnt : 12;
+       } s;
+       struct cvmx_pow_nos_cnt_cn30xx {
+               u64 reserved_7_63 : 57;
+               u64 nos_cnt : 7;
+       } cn30xx;
+       struct cvmx_pow_nos_cnt_cn31xx {
+               u64 reserved_9_63 : 55;
+               u64 nos_cnt : 9;
+       } cn31xx;
+       struct cvmx_pow_nos_cnt_s cn38xx;
+       struct cvmx_pow_nos_cnt_s cn38xxp2;
+       struct cvmx_pow_nos_cnt_cn31xx cn50xx;
+       struct cvmx_pow_nos_cnt_cn52xx {
+               u64 reserved_10_63 : 54;
+               u64 nos_cnt : 10;
+       } cn52xx;
+       struct cvmx_pow_nos_cnt_cn52xx cn52xxp1;
+       struct cvmx_pow_nos_cnt_s cn56xx;
+       struct cvmx_pow_nos_cnt_s cn56xxp1;
+       struct cvmx_pow_nos_cnt_s cn58xx;
+       struct cvmx_pow_nos_cnt_s cn58xxp1;
+       struct cvmx_pow_nos_cnt_cn52xx cn61xx;
+       struct cvmx_pow_nos_cnt_cn63xx {
+               u64 reserved_11_63 : 53;
+               u64 nos_cnt : 11;
+       } cn63xx;
+       struct cvmx_pow_nos_cnt_cn63xx cn63xxp1;
+       struct cvmx_pow_nos_cnt_cn63xx cn66xx;
+       struct cvmx_pow_nos_cnt_cn52xx cn70xx;
+       struct cvmx_pow_nos_cnt_cn52xx cn70xxp1;
+       struct cvmx_pow_nos_cnt_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pow_nos_cnt cvmx_pow_nos_cnt_t;
+
+/**
+ * cvmx_pow_nw_tim
+ *
+ * Sets the minimum period for a new work request timeout.  Period is specified in n-1 notation
+ * where the increment value is 1024 clock cycles.  Thus, a value of 0x0 in this register
+ * translates
+ * to 1024 cycles, 0x1 translates to 2048 cycles, 0x2 translates to 3072 cycles, etc...  Note:
+ * the
+ * maximum period for a new work request timeout is 2 times the minimum period.  Note: the new
+ * work
+ * request timeout counter is reset when this register is written.
+ * There are two new work request timeout cases:
+ * - WAIT bit clear.  The new work request can timeout if the timer expires before the pre-fetch
+ *   engine has reached the end of all work queues.  This can occur if the executable work queue
+ *   entry is deep in the queue and the pre-fetch engine is subject to many resets (i.e. high
+ * switch,
+ *   de-schedule, or new work load from other PP's).  Thus, it is possible for a PP to receive a
+ * work
+ *   response with the NO_WORK bit set even though there was at least one executable entry in the
+ *   work queues.  The other (and typical) scenario for receiving a NO_WORK response with the
+ * WAIT
+ *   bit clear is that the pre-fetch engine has reached the end of all work queues without
+ * finding
+ *   executable work.
+ * - WAIT bit set.  The new work request can timeout if the timer expires before the pre-fetch
+ *   engine has found executable work.  In this case, the only scenario where the PP will receive
+ * a
+ *   work response with the NO_WORK bit set is if the timer expires.  Note: it is still possible
+ * for
+ *   a PP to receive a NO_WORK response even though there was at least one executable entry in
+ * the
+ *   work queues.
+ * In either case, it's important to note that switches and de-schedules are higher priority
+ * operations that can cause the pre-fetch engine to reset.  Thus in a system with many switches
+ * or
+ * de-schedules occurring, it's possible for the new work timer to expire (resulting in NO_WORK
+ * responses) before the pre-fetch engine is able to get very deep into the work queues.
+ */
+union cvmx_pow_nw_tim {
+       u64 u64;
+       struct cvmx_pow_nw_tim_s {
+               u64 reserved_10_63 : 54;
+               u64 nw_tim : 10;
+       } s;
+       struct cvmx_pow_nw_tim_s cn30xx;
+       struct cvmx_pow_nw_tim_s cn31xx;
+       struct cvmx_pow_nw_tim_s cn38xx;
+       struct cvmx_pow_nw_tim_s cn38xxp2;
+       struct cvmx_pow_nw_tim_s cn50xx;
+       struct cvmx_pow_nw_tim_s cn52xx;
+       struct cvmx_pow_nw_tim_s cn52xxp1;
+       struct cvmx_pow_nw_tim_s cn56xx;
+       struct cvmx_pow_nw_tim_s cn56xxp1;
+       struct cvmx_pow_nw_tim_s cn58xx;
+       struct cvmx_pow_nw_tim_s cn58xxp1;
+       struct cvmx_pow_nw_tim_s cn61xx;
+       struct cvmx_pow_nw_tim_s cn63xx;
+       struct cvmx_pow_nw_tim_s cn63xxp1;
+       struct cvmx_pow_nw_tim_s cn66xx;
+       struct cvmx_pow_nw_tim_s cn70xx;
+       struct cvmx_pow_nw_tim_s cn70xxp1;
+       struct cvmx_pow_nw_tim_s cnf71xx;
+};
+
+typedef union cvmx_pow_nw_tim cvmx_pow_nw_tim_t;
+
+/**
+ * cvmx_pow_pf_rst_msk
+ *
+ * Resets the work prefetch engine when work is stored in an internal buffer (either when the add
+ * work arrives or when the work is reloaded from an external buffer) for an enabled QOS level
+ * (1 bit per QOS level).
+ */
+union cvmx_pow_pf_rst_msk {
+       u64 u64;
+       struct cvmx_pow_pf_rst_msk_s {
+               u64 reserved_8_63 : 56;
+               u64 rst_msk : 8;
+       } s;
+       struct cvmx_pow_pf_rst_msk_s cn50xx;
+       struct cvmx_pow_pf_rst_msk_s cn52xx;
+       struct cvmx_pow_pf_rst_msk_s cn52xxp1;
+       struct cvmx_pow_pf_rst_msk_s cn56xx;
+       struct cvmx_pow_pf_rst_msk_s cn56xxp1;
+       struct cvmx_pow_pf_rst_msk_s cn58xx;
+       struct cvmx_pow_pf_rst_msk_s cn58xxp1;
+       struct cvmx_pow_pf_rst_msk_s cn61xx;
+       struct cvmx_pow_pf_rst_msk_s cn63xx;
+       struct cvmx_pow_pf_rst_msk_s cn63xxp1;
+       struct cvmx_pow_pf_rst_msk_s cn66xx;
+       struct cvmx_pow_pf_rst_msk_s cn70xx;
+       struct cvmx_pow_pf_rst_msk_s cn70xxp1;
+       struct cvmx_pow_pf_rst_msk_s cnf71xx;
+};
+
+typedef union cvmx_pow_pf_rst_msk cvmx_pow_pf_rst_msk_t;
+
+/**
+ * cvmx_pow_pp_grp_msk#
+ *
+ * Selects which group(s) a PP belongs to.  A '1' in any bit position sets the PP's membership in
+ * the corresponding group.  A value of 0x0 will prevent the PP from receiving new work.  Note:
+ * disabled or non-existent PP's should have this field set to 0xffff (the reset value) in order
+ * to
+ * maximize POW performance.
+ * Also contains the QOS level priorities for each PP.  0x0 is highest priority, and 0x7 the
+ * lowest.
+ * Setting the priority to 0xf will prevent that PP from receiving work from that QOS level.
+ * Priority values 0x8 through 0xe are reserved and should not be used.  For a given PP,
+ * priorities
+ * should begin at 0x0 and remain contiguous throughout the range.
+ */
+union cvmx_pow_pp_grp_mskx {
+       u64 u64;
+       struct cvmx_pow_pp_grp_mskx_s {
+               u64 reserved_48_63 : 16;
+               u64 qos7_pri : 4;
+               u64 qos6_pri : 4;
+               u64 qos5_pri : 4;
+               u64 qos4_pri : 4;
+               u64 qos3_pri : 4;
+               u64 qos2_pri : 4;
+               u64 qos1_pri : 4;
+               u64 qos0_pri : 4;
+               u64 grp_msk : 16;
+       } s;
+       struct cvmx_pow_pp_grp_mskx_cn30xx {
+               u64 reserved_16_63 : 48;
+               u64 grp_msk : 16;
+       } cn30xx;
+       struct cvmx_pow_pp_grp_mskx_cn30xx cn31xx;
+       struct cvmx_pow_pp_grp_mskx_cn30xx cn38xx;
+       struct cvmx_pow_pp_grp_mskx_cn30xx cn38xxp2;
+       struct cvmx_pow_pp_grp_mskx_s cn50xx;
+       struct cvmx_pow_pp_grp_mskx_s cn52xx;
+       struct cvmx_pow_pp_grp_mskx_s cn52xxp1;
+       struct cvmx_pow_pp_grp_mskx_s cn56xx;
+       struct cvmx_pow_pp_grp_mskx_s cn56xxp1;
+       struct cvmx_pow_pp_grp_mskx_s cn58xx;
+       struct cvmx_pow_pp_grp_mskx_s cn58xxp1;
+       struct cvmx_pow_pp_grp_mskx_s cn61xx;
+       struct cvmx_pow_pp_grp_mskx_s cn63xx;
+       struct cvmx_pow_pp_grp_mskx_s cn63xxp1;
+       struct cvmx_pow_pp_grp_mskx_s cn66xx;
+       struct cvmx_pow_pp_grp_mskx_s cn70xx;
+       struct cvmx_pow_pp_grp_mskx_s cn70xxp1;
+       struct cvmx_pow_pp_grp_mskx_s cnf71xx;
+};
+
+typedef union cvmx_pow_pp_grp_mskx cvmx_pow_pp_grp_mskx_t;
+
+/**
+ * cvmx_pow_qos_rnd#
+ *
+ * Contains the round definitions for issuing new work.  Each round consists of 8 bits with each
+ * bit
+ * corresponding to a QOS level.  There are 4 rounds contained in each register for a total of 32
+ * rounds.  The issue logic traverses through the rounds sequentially (lowest round to highest
+ * round)
+ * in an attempt to find new work for each PP.  Within each round, the issue logic traverses
+ * through
+ * the QOS levels sequentially (highest QOS to lowest QOS) skipping over each QOS level with a
+ * clear
+ * bit in the round mask.  Note: setting a QOS level to all zeroes in all issue round registers
+ * will
+ * prevent work from being issued from that QOS level.
+ */
+union cvmx_pow_qos_rndx {
+       u64 u64;
+       struct cvmx_pow_qos_rndx_s {
+               u64 reserved_32_63 : 32;
+               u64 rnd_p3 : 8;
+               u64 rnd_p2 : 8;
+               u64 rnd_p1 : 8;
+               u64 rnd : 8;
+       } s;
+       struct cvmx_pow_qos_rndx_s cn30xx;
+       struct cvmx_pow_qos_rndx_s cn31xx;
+       struct cvmx_pow_qos_rndx_s cn38xx;
+       struct cvmx_pow_qos_rndx_s cn38xxp2;
+       struct cvmx_pow_qos_rndx_s cn50xx;
+       struct cvmx_pow_qos_rndx_s cn52xx;
+       struct cvmx_pow_qos_rndx_s cn52xxp1;
+       struct cvmx_pow_qos_rndx_s cn56xx;
+       struct cvmx_pow_qos_rndx_s cn56xxp1;
+       struct cvmx_pow_qos_rndx_s cn58xx;
+       struct cvmx_pow_qos_rndx_s cn58xxp1;
+       struct cvmx_pow_qos_rndx_s cn61xx;
+       struct cvmx_pow_qos_rndx_s cn63xx;
+       struct cvmx_pow_qos_rndx_s cn63xxp1;
+       struct cvmx_pow_qos_rndx_s cn66xx;
+       struct cvmx_pow_qos_rndx_s cn70xx;
+       struct cvmx_pow_qos_rndx_s cn70xxp1;
+       struct cvmx_pow_qos_rndx_s cnf71xx;
+};
+
+typedef union cvmx_pow_qos_rndx cvmx_pow_qos_rndx_t;
+
+/**
+ * cvmx_pow_qos_thr#
+ *
+ * Contains the thresholds for allocating POW internal storage buffers.  If the number of
+ * remaining
+ * free buffers drops below the minimum threshold (MIN_THR) or the number of allocated buffers
+ * for
+ * this QOS level rises above the maximum threshold (MAX_THR), future incoming work queue entries
+ * will be buffered externally rather than internally.  This register also contains a read-only
+ * count
+ * of the current number of free buffers (FREE_CNT), the number of internal buffers currently
+ * allocated to this QOS level (BUF_CNT), and the total number of buffers on the de-schedule list
+ * (DES_CNT) (which is not the same as the total number of de-scheduled buffers).
+ */
+union cvmx_pow_qos_thrx {
+       u64 u64;
+       struct cvmx_pow_qos_thrx_s {
+               u64 reserved_60_63 : 4;
+               u64 des_cnt : 12;
+               u64 buf_cnt : 12;
+               u64 free_cnt : 12;
+               u64 reserved_23_23 : 1;
+               u64 max_thr : 11;
+               u64 reserved_11_11 : 1;
+               u64 min_thr : 11;
+       } s;
+       struct cvmx_pow_qos_thrx_cn30xx {
+               u64 reserved_55_63 : 9;
+               u64 des_cnt : 7;
+               u64 reserved_43_47 : 5;
+               u64 buf_cnt : 7;
+               u64 reserved_31_35 : 5;
+               u64 free_cnt : 7;
+               u64 reserved_18_23 : 6;
+               u64 max_thr : 6;
+               u64 reserved_6_11 : 6;
+               u64 min_thr : 6;
+       } cn30xx;
+       struct cvmx_pow_qos_thrx_cn31xx {
+               u64 reserved_57_63 : 7;
+               u64 des_cnt : 9;
+               u64 reserved_45_47 : 3;
+               u64 buf_cnt : 9;
+               u64 reserved_33_35 : 3;
+               u64 free_cnt : 9;
+               u64 reserved_20_23 : 4;
+               u64 max_thr : 8;
+               u64 reserved_8_11 : 4;
+               u64 min_thr : 8;
+       } cn31xx;
+       struct cvmx_pow_qos_thrx_s cn38xx;
+       struct cvmx_pow_qos_thrx_s cn38xxp2;
+       struct cvmx_pow_qos_thrx_cn31xx cn50xx;
+       struct cvmx_pow_qos_thrx_cn52xx {
+               u64 reserved_58_63 : 6;
+               u64 des_cnt : 10;
+               u64 reserved_46_47 : 2;
+               u64 buf_cnt : 10;
+               u64 reserved_34_35 : 2;
+               u64 free_cnt : 10;
+               u64 reserved_21_23 : 3;
+               u64 max_thr : 9;
+               u64 reserved_9_11 : 3;
+               u64 min_thr : 9;
+       } cn52xx;
+       struct cvmx_pow_qos_thrx_cn52xx cn52xxp1;
+       struct cvmx_pow_qos_thrx_s cn56xx;
+       struct cvmx_pow_qos_thrx_s cn56xxp1;
+       struct cvmx_pow_qos_thrx_s cn58xx;
+       struct cvmx_pow_qos_thrx_s cn58xxp1;
+       struct cvmx_pow_qos_thrx_cn52xx cn61xx;
+       struct cvmx_pow_qos_thrx_cn63xx {
+               u64 reserved_59_63 : 5;
+               u64 des_cnt : 11;
+               u64 reserved_47_47 : 1;
+               u64 buf_cnt : 11;
+               u64 reserved_35_35 : 1;
+               u64 free_cnt : 11;
+               u64 reserved_22_23 : 2;
+               u64 max_thr : 10;
+               u64 reserved_10_11 : 2;
+               u64 min_thr : 10;
+       } cn63xx;
+       struct cvmx_pow_qos_thrx_cn63xx cn63xxp1;
+       struct cvmx_pow_qos_thrx_cn63xx cn66xx;
+       struct cvmx_pow_qos_thrx_cn52xx cn70xx;
+       struct cvmx_pow_qos_thrx_cn52xx cn70xxp1;
+       struct cvmx_pow_qos_thrx_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pow_qos_thrx cvmx_pow_qos_thrx_t;
+
+/**
+ * cvmx_pow_ts_pc
+ *
+ * Counts the number of tag switch requests.  Write to clear.
+ *
+ */
+union cvmx_pow_ts_pc {
+       u64 u64;
+       struct cvmx_pow_ts_pc_s {
+               u64 reserved_32_63 : 32;
+               u64 ts_pc : 32;
+       } s;
+       struct cvmx_pow_ts_pc_s cn30xx;
+       struct cvmx_pow_ts_pc_s cn31xx;
+       struct cvmx_pow_ts_pc_s cn38xx;
+       struct cvmx_pow_ts_pc_s cn38xxp2;
+       struct cvmx_pow_ts_pc_s cn50xx;
+       struct cvmx_pow_ts_pc_s cn52xx;
+       struct cvmx_pow_ts_pc_s cn52xxp1;
+       struct cvmx_pow_ts_pc_s cn56xx;
+       struct cvmx_pow_ts_pc_s cn56xxp1;
+       struct cvmx_pow_ts_pc_s cn58xx;
+       struct cvmx_pow_ts_pc_s cn58xxp1;
+       struct cvmx_pow_ts_pc_s cn61xx;
+       struct cvmx_pow_ts_pc_s cn63xx;
+       struct cvmx_pow_ts_pc_s cn63xxp1;
+       struct cvmx_pow_ts_pc_s cn66xx;
+       struct cvmx_pow_ts_pc_s cn70xx;
+       struct cvmx_pow_ts_pc_s cn70xxp1;
+       struct cvmx_pow_ts_pc_s cnf71xx;
+};
+
+typedef union cvmx_pow_ts_pc cvmx_pow_ts_pc_t;
+
+/**
+ * cvmx_pow_wa_com_pc
+ *
+ * Counts the number of add new work requests for all QOS levels.  Write to clear.
+ *
+ */
+union cvmx_pow_wa_com_pc {
+       u64 u64;
+       struct cvmx_pow_wa_com_pc_s {
+               u64 reserved_32_63 : 32;
+               u64 wa_pc : 32;
+       } s;
+       struct cvmx_pow_wa_com_pc_s cn30xx;
+       struct cvmx_pow_wa_com_pc_s cn31xx;
+       struct cvmx_pow_wa_com_pc_s cn38xx;
+       struct cvmx_pow_wa_com_pc_s cn38xxp2;
+       struct cvmx_pow_wa_com_pc_s cn50xx;
+       struct cvmx_pow_wa_com_pc_s cn52xx;
+       struct cvmx_pow_wa_com_pc_s cn52xxp1;
+       struct cvmx_pow_wa_com_pc_s cn56xx;
+       struct cvmx_pow_wa_com_pc_s cn56xxp1;
+       struct cvmx_pow_wa_com_pc_s cn58xx;
+       struct cvmx_pow_wa_com_pc_s cn58xxp1;
+       struct cvmx_pow_wa_com_pc_s cn61xx;
+       struct cvmx_pow_wa_com_pc_s cn63xx;
+       struct cvmx_pow_wa_com_pc_s cn63xxp1;
+       struct cvmx_pow_wa_com_pc_s cn66xx;
+       struct cvmx_pow_wa_com_pc_s cn70xx;
+       struct cvmx_pow_wa_com_pc_s cn70xxp1;
+       struct cvmx_pow_wa_com_pc_s cnf71xx;
+};
+
+typedef union cvmx_pow_wa_com_pc cvmx_pow_wa_com_pc_t;
+
+/**
+ * cvmx_pow_wa_pc#
+ *
+ * Counts the number of add new work requests for each QOS level.  Write to clear.
+ *
+ */
+union cvmx_pow_wa_pcx {
+       u64 u64;
+       struct cvmx_pow_wa_pcx_s {
+               u64 reserved_32_63 : 32;
+               u64 wa_pc : 32;
+       } s;
+       struct cvmx_pow_wa_pcx_s cn30xx;
+       struct cvmx_pow_wa_pcx_s cn31xx;
+       struct cvmx_pow_wa_pcx_s cn38xx;
+       struct cvmx_pow_wa_pcx_s cn38xxp2;
+       struct cvmx_pow_wa_pcx_s cn50xx;
+       struct cvmx_pow_wa_pcx_s cn52xx;
+       struct cvmx_pow_wa_pcx_s cn52xxp1;
+       struct cvmx_pow_wa_pcx_s cn56xx;
+       struct cvmx_pow_wa_pcx_s cn56xxp1;
+       struct cvmx_pow_wa_pcx_s cn58xx;
+       struct cvmx_pow_wa_pcx_s cn58xxp1;
+       struct cvmx_pow_wa_pcx_s cn61xx;
+       struct cvmx_pow_wa_pcx_s cn63xx;
+       struct cvmx_pow_wa_pcx_s cn63xxp1;
+       struct cvmx_pow_wa_pcx_s cn66xx;
+       struct cvmx_pow_wa_pcx_s cn70xx;
+       struct cvmx_pow_wa_pcx_s cn70xxp1;
+       struct cvmx_pow_wa_pcx_s cnf71xx;
+};
+
+typedef union cvmx_pow_wa_pcx cvmx_pow_wa_pcx_t;
+
+/**
+ * cvmx_pow_wq_int
+ *
+ * Contains the bits (1 per group) that set work queue interrupts and are used to clear these
+ * interrupts.  Also contains the input queue interrupt temporary disable bits (1 per group). For
+ * more information regarding this register, see the interrupt section.
+ */
+union cvmx_pow_wq_int {
+       u64 u64;
+       struct cvmx_pow_wq_int_s {
+               u64 reserved_32_63 : 32;
+               u64 iq_dis : 16;
+               u64 wq_int : 16;
+       } s;
+       struct cvmx_pow_wq_int_s cn30xx;
+       struct cvmx_pow_wq_int_s cn31xx;
+       struct cvmx_pow_wq_int_s cn38xx;
+       struct cvmx_pow_wq_int_s cn38xxp2;
+       struct cvmx_pow_wq_int_s cn50xx;
+       struct cvmx_pow_wq_int_s cn52xx;
+       struct cvmx_pow_wq_int_s cn52xxp1;
+       struct cvmx_pow_wq_int_s cn56xx;
+       struct cvmx_pow_wq_int_s cn56xxp1;
+       struct cvmx_pow_wq_int_s cn58xx;
+       struct cvmx_pow_wq_int_s cn58xxp1;
+       struct cvmx_pow_wq_int_s cn61xx;
+       struct cvmx_pow_wq_int_s cn63xx;
+       struct cvmx_pow_wq_int_s cn63xxp1;
+       struct cvmx_pow_wq_int_s cn66xx;
+       struct cvmx_pow_wq_int_s cn70xx;
+       struct cvmx_pow_wq_int_s cn70xxp1;
+       struct cvmx_pow_wq_int_s cnf71xx;
+};
+
+typedef union cvmx_pow_wq_int cvmx_pow_wq_int_t;
+
+/**
+ * cvmx_pow_wq_int_cnt#
+ *
+ * Contains a read-only copy of the counts used to trigger work queue interrupts.  For more
+ * information regarding this register, see the interrupt section.
+ */
+union cvmx_pow_wq_int_cntx {
+       u64 u64;
+       struct cvmx_pow_wq_int_cntx_s {
+               u64 reserved_28_63 : 36;
+               u64 tc_cnt : 4;
+               u64 ds_cnt : 12;
+               u64 iq_cnt : 12;
+       } s;
+       struct cvmx_pow_wq_int_cntx_cn30xx {
+               u64 reserved_28_63 : 36;
+               u64 tc_cnt : 4;
+               u64 reserved_19_23 : 5;
+               u64 ds_cnt : 7;
+               u64 reserved_7_11 : 5;
+               u64 iq_cnt : 7;
+       } cn30xx;
+       struct cvmx_pow_wq_int_cntx_cn31xx {
+               u64 reserved_28_63 : 36;
+               u64 tc_cnt : 4;
+               u64 reserved_21_23 : 3;
+               u64 ds_cnt : 9;
+               u64 reserved_9_11 : 3;
+               u64 iq_cnt : 9;
+       } cn31xx;
+       struct cvmx_pow_wq_int_cntx_s cn38xx;
+       struct cvmx_pow_wq_int_cntx_s cn38xxp2;
+       struct cvmx_pow_wq_int_cntx_cn31xx cn50xx;
+       struct cvmx_pow_wq_int_cntx_cn52xx {
+               u64 reserved_28_63 : 36;
+               u64 tc_cnt : 4;
+               u64 reserved_22_23 : 2;
+               u64 ds_cnt : 10;
+               u64 reserved_10_11 : 2;
+               u64 iq_cnt : 10;
+       } cn52xx;
+       struct cvmx_pow_wq_int_cntx_cn52xx cn52xxp1;
+       struct cvmx_pow_wq_int_cntx_s cn56xx;
+       struct cvmx_pow_wq_int_cntx_s cn56xxp1;
+       struct cvmx_pow_wq_int_cntx_s cn58xx;
+       struct cvmx_pow_wq_int_cntx_s cn58xxp1;
+       struct cvmx_pow_wq_int_cntx_cn52xx cn61xx;
+       struct cvmx_pow_wq_int_cntx_cn63xx {
+               u64 reserved_28_63 : 36;
+               u64 tc_cnt : 4;
+               u64 reserved_23_23 : 1;
+               u64 ds_cnt : 11;
+               u64 reserved_11_11 : 1;
+               u64 iq_cnt : 11;
+       } cn63xx;
+       struct cvmx_pow_wq_int_cntx_cn63xx cn63xxp1;
+       struct cvmx_pow_wq_int_cntx_cn63xx cn66xx;
+       struct cvmx_pow_wq_int_cntx_cn52xx cn70xx;
+       struct cvmx_pow_wq_int_cntx_cn52xx cn70xxp1;
+       struct cvmx_pow_wq_int_cntx_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pow_wq_int_cntx cvmx_pow_wq_int_cntx_t;
+
+/**
+ * cvmx_pow_wq_int_pc
+ *
+ * Contains the threshold value for the work queue interrupt periodic counter and also a read-
+ * only
+ * copy of the periodic counter.  For more information regarding this register, see the interrupt
+ * section.
+ */
+union cvmx_pow_wq_int_pc {
+       u64 u64;
+       struct cvmx_pow_wq_int_pc_s {
+               u64 reserved_60_63 : 4;
+               u64 pc : 28;
+               u64 reserved_28_31 : 4;
+               u64 pc_thr : 20;
+               u64 reserved_0_7 : 8;
+       } s;
+       struct cvmx_pow_wq_int_pc_s cn30xx;
+       struct cvmx_pow_wq_int_pc_s cn31xx;
+       struct cvmx_pow_wq_int_pc_s cn38xx;
+       struct cvmx_pow_wq_int_pc_s cn38xxp2;
+       struct cvmx_pow_wq_int_pc_s cn50xx;
+       struct cvmx_pow_wq_int_pc_s cn52xx;
+       struct cvmx_pow_wq_int_pc_s cn52xxp1;
+       struct cvmx_pow_wq_int_pc_s cn56xx;
+       struct cvmx_pow_wq_int_pc_s cn56xxp1;
+       struct cvmx_pow_wq_int_pc_s cn58xx;
+       struct cvmx_pow_wq_int_pc_s cn58xxp1;
+       struct cvmx_pow_wq_int_pc_s cn61xx;
+       struct cvmx_pow_wq_int_pc_s cn63xx;
+       struct cvmx_pow_wq_int_pc_s cn63xxp1;
+       struct cvmx_pow_wq_int_pc_s cn66xx;
+       struct cvmx_pow_wq_int_pc_s cn70xx;
+       struct cvmx_pow_wq_int_pc_s cn70xxp1;
+       struct cvmx_pow_wq_int_pc_s cnf71xx;
+};
+
+typedef union cvmx_pow_wq_int_pc cvmx_pow_wq_int_pc_t;
+
+/**
+ * cvmx_pow_wq_int_thr#
+ *
+ * Contains the thresholds for enabling and setting work queue interrupts.  For more information
+ * regarding this register, see the interrupt section.
+ * Note: Up to 4 of the POW's internal storage buffers can be allocated for hardware use and are
+ * therefore not available for incoming work queue entries.  Additionally, any PP that is not in
+ * the
+ * NULL_NULL state consumes a buffer.  Thus in a 4 PP system, it is not advisable to set either
+ * IQ_THR or DS_THR to greater than 512 - 4 - 4 = 504.  Doing so may prevent the interrupt from
+ * ever triggering.
+ */
+union cvmx_pow_wq_int_thrx {
+       u64 u64;
+       struct cvmx_pow_wq_int_thrx_s {
+               u64 reserved_29_63 : 35;
+               u64 tc_en : 1;
+               u64 tc_thr : 4;
+               u64 reserved_23_23 : 1;
+               u64 ds_thr : 11;
+               u64 reserved_11_11 : 1;
+               u64 iq_thr : 11;
+       } s;
+       struct cvmx_pow_wq_int_thrx_cn30xx {
+               u64 reserved_29_63 : 35;
+               u64 tc_en : 1;
+               u64 tc_thr : 4;
+               u64 reserved_18_23 : 6;
+               u64 ds_thr : 6;
+               u64 reserved_6_11 : 6;
+               u64 iq_thr : 6;
+       } cn30xx;
+       struct cvmx_pow_wq_int_thrx_cn31xx {
+               u64 reserved_29_63 : 35;
+               u64 tc_en : 1;
+               u64 tc_thr : 4;
+               u64 reserved_20_23 : 4;
+               u64 ds_thr : 8;
+               u64 reserved_8_11 : 4;
+               u64 iq_thr : 8;
+       } cn31xx;
+       struct cvmx_pow_wq_int_thrx_s cn38xx;
+       struct cvmx_pow_wq_int_thrx_s cn38xxp2;
+       struct cvmx_pow_wq_int_thrx_cn31xx cn50xx;
+       struct cvmx_pow_wq_int_thrx_cn52xx {
+               u64 reserved_29_63 : 35;
+               u64 tc_en : 1;
+               u64 tc_thr : 4;
+               u64 reserved_21_23 : 3;
+               u64 ds_thr : 9;
+               u64 reserved_9_11 : 3;
+               u64 iq_thr : 9;
+       } cn52xx;
+       struct cvmx_pow_wq_int_thrx_cn52xx cn52xxp1;
+       struct cvmx_pow_wq_int_thrx_s cn56xx;
+       struct cvmx_pow_wq_int_thrx_s cn56xxp1;
+       struct cvmx_pow_wq_int_thrx_s cn58xx;
+       struct cvmx_pow_wq_int_thrx_s cn58xxp1;
+       struct cvmx_pow_wq_int_thrx_cn52xx cn61xx;
+       struct cvmx_pow_wq_int_thrx_cn63xx {
+               u64 reserved_29_63 : 35;
+               u64 tc_en : 1;
+               u64 tc_thr : 4;
+               u64 reserved_22_23 : 2;
+               u64 ds_thr : 10;
+               u64 reserved_10_11 : 2;
+               u64 iq_thr : 10;
+       } cn63xx;
+       struct cvmx_pow_wq_int_thrx_cn63xx cn63xxp1;
+       struct cvmx_pow_wq_int_thrx_cn63xx cn66xx;
+       struct cvmx_pow_wq_int_thrx_cn52xx cn70xx;
+       struct cvmx_pow_wq_int_thrx_cn52xx cn70xxp1;
+       struct cvmx_pow_wq_int_thrx_cn52xx cnf71xx;
+};
+
+typedef union cvmx_pow_wq_int_thrx cvmx_pow_wq_int_thrx_t;
+
+/**
+ * cvmx_pow_ws_pc#
+ *
+ * Counts the number of work schedules for each group.  Write to clear.
+ *
+ */
+union cvmx_pow_ws_pcx {
+       u64 u64;
+       struct cvmx_pow_ws_pcx_s {
+               u64 reserved_32_63 : 32;
+               u64 ws_pc : 32;
+       } s;
+       struct cvmx_pow_ws_pcx_s cn30xx;
+       struct cvmx_pow_ws_pcx_s cn31xx;
+       struct cvmx_pow_ws_pcx_s cn38xx;
+       struct cvmx_pow_ws_pcx_s cn38xxp2;
+       struct cvmx_pow_ws_pcx_s cn50xx;
+       struct cvmx_pow_ws_pcx_s cn52xx;
+       struct cvmx_pow_ws_pcx_s cn52xxp1;
+       struct cvmx_pow_ws_pcx_s cn56xx;
+       struct cvmx_pow_ws_pcx_s cn56xxp1;
+       struct cvmx_pow_ws_pcx_s cn58xx;
+       struct cvmx_pow_ws_pcx_s cn58xxp1;
+       struct cvmx_pow_ws_pcx_s cn61xx;
+       struct cvmx_pow_ws_pcx_s cn63xx;
+       struct cvmx_pow_ws_pcx_s cn63xxp1;
+       struct cvmx_pow_ws_pcx_s cn66xx;
+       struct cvmx_pow_ws_pcx_s cn70xx;
+       struct cvmx_pow_ws_pcx_s cn70xxp1;
+       struct cvmx_pow_ws_pcx_s cnf71xx;
+};
+
+typedef union cvmx_pow_ws_pcx cvmx_pow_ws_pcx_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-pow.h b/arch/mips/mach-octeon/include/mach/cvmx-pow.h
new file mode 100644 (file)
index 0000000..0680ca2
--- /dev/null
@@ -0,0 +1,2991 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Interface to the hardware Scheduling unit.
+ *
+ * New, starting with SDK 1.7.0, cvmx-pow supports a number of
+ * extended consistency checks. The define
+ * CVMX_ENABLE_POW_CHECKS controls the runtime insertion of POW
+ * internal state checks to find common programming errors. If
+ * CVMX_ENABLE_POW_CHECKS is not defined, checks are by default
+ * enabled. For example, cvmx-pow will check for the following
+ * program errors or POW state inconsistency.
+ * - Requesting a POW operation with an active tag switch in
+ *   progress.
+ * - Waiting for a tag switch to complete for an excessively
+ *   long period. This is normally a sign of an error in locking
+ *   causing deadlock.
+ * - Illegal tag switches from NULL_NULL.
+ * - Illegal tag switches from NULL.
+ * - Illegal deschedule request.
+ * - WQE pointer not matching the one attached to the core by
+ *   the POW.
+ */
+
+#ifndef __CVMX_POW_H__
+#define __CVMX_POW_H__
+
+#include "cvmx-wqe.h"
+#include "cvmx-pow-defs.h"
+#include "cvmx-sso-defs.h"
+#include "cvmx-address.h"
+#include "cvmx-coremask.h"
+
+/* Default to having all POW constancy checks turned on */
+#ifndef CVMX_ENABLE_POW_CHECKS
+#define CVMX_ENABLE_POW_CHECKS 1
+#endif
+
+/*
+ * Special type for CN78XX style SSO groups (0..255),
+ * for distinction from legacy-style groups (0..15)
+ */
+typedef union {
+       u8 xgrp;
+       /* Fields that map XGRP for backwards compatibility */
+       struct __attribute__((__packed__)) {
+               u8 group : 5;
+               u8 qus : 3;
+       };
+} cvmx_xgrp_t;
+
+/*
+ * Softwsare-only structure to convey a return value
+ * containing multiple information fields about an work queue entry
+ */
+typedef struct {
+       u32 tag;
+       u16 index;
+       u8 grp; /* Legacy group # (0..15) */
+       u8 tag_type;
+} cvmx_pow_tag_info_t;
+
+/**
+ * Wait flag values for pow functions.
+ */
+typedef enum {
+       CVMX_POW_WAIT = 1,
+       CVMX_POW_NO_WAIT = 0,
+} cvmx_pow_wait_t;
+
+/**
+ *  POW tag operations.  These are used in the data stored to the POW.
+ */
+typedef enum {
+       CVMX_POW_TAG_OP_SWTAG = 0L,
+       CVMX_POW_TAG_OP_SWTAG_FULL = 1L,
+       CVMX_POW_TAG_OP_SWTAG_DESCH = 2L,
+       CVMX_POW_TAG_OP_DESCH = 3L,
+       CVMX_POW_TAG_OP_ADDWQ = 4L,
+       CVMX_POW_TAG_OP_UPDATE_WQP_GRP = 5L,
+       CVMX_POW_TAG_OP_SET_NSCHED = 6L,
+       CVMX_POW_TAG_OP_CLR_NSCHED = 7L,
+       CVMX_POW_TAG_OP_NOP = 15L
+} cvmx_pow_tag_op_t;
+
+/**
+ * This structure defines the store data on a store to POW
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 no_sched : 1;
+               u64 unused : 2;
+               u64 index : 13;
+               cvmx_pow_tag_op_t op : 4;
+               u64 unused2 : 2;
+               u64 qos : 3;
+               u64 grp : 4;
+               cvmx_pow_tag_type_t type : 3;
+               u64 tag : 32;
+       } s_cn38xx;
+       struct {
+               u64 no_sched : 1;
+               cvmx_pow_tag_op_t op : 4;
+               u64 unused1 : 4;
+               u64 index : 11;
+               u64 unused2 : 1;
+               u64 grp : 6;
+               u64 unused3 : 3;
+               cvmx_pow_tag_type_t type : 2;
+               u64 tag : 32;
+       } s_cn68xx_clr;
+       struct {
+               u64 no_sched : 1;
+               cvmx_pow_tag_op_t op : 4;
+               u64 unused1 : 12;
+               u64 qos : 3;
+               u64 unused2 : 1;
+               u64 grp : 6;
+               u64 unused3 : 3;
+               cvmx_pow_tag_type_t type : 2;
+               u64 tag : 32;
+       } s_cn68xx_add;
+       struct {
+               u64 no_sched : 1;
+               cvmx_pow_tag_op_t op : 4;
+               u64 unused1 : 16;
+               u64 grp : 6;
+               u64 unused3 : 3;
+               cvmx_pow_tag_type_t type : 2;
+               u64 tag : 32;
+       } s_cn68xx_other;
+       struct {
+               u64 rsvd_62_63 : 2;
+               u64 grp : 10;
+               cvmx_pow_tag_type_t type : 2;
+               u64 no_sched : 1;
+               u64 rsvd_48 : 1;
+               cvmx_pow_tag_op_t op : 4;
+               u64 rsvd_42_43 : 2;
+               u64 wqp : 42;
+       } s_cn78xx_other;
+
+} cvmx_pow_tag_req_t;
+
+union cvmx_pow_tag_req_addr {
+       u64 u64;
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 addr : 40;
+       } s;
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 node : 4;
+               u64 tag : 32;
+               u64 reserved_0_3 : 4;
+       } s_cn78xx;
+};
+
+/**
+ * This structure describes the address to load stuff from POW
+ */
+typedef union {
+       u64 u64;
+       /**
+        * Address for new work request loads (did<2:0> == 0)
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_4_39 : 36;
+               u64 wait : 1;
+               u64 reserved_0_2 : 3;
+       } swork;
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 node : 4;
+               u64 reserved_32_35 : 4;
+               u64 indexed : 1;
+               u64 grouped : 1;
+               u64 rtngrp : 1;
+               u64 reserved_16_28 : 13;
+               u64 index : 12;
+               u64 wait : 1;
+               u64 reserved_0_2 : 3;
+       } swork_78xx;
+       /**
+        * Address for loads to get POW internal status
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_10_39 : 30;
+               u64 coreid : 4;
+               u64 get_rev : 1;
+               u64 get_cur : 1;
+               u64 get_wqp : 1;
+               u64 reserved_0_2 : 3;
+       } sstatus;
+       /**
+        * Address for loads to get 68XX SS0 internal status
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_14_39 : 26;
+               u64 coreid : 5;
+               u64 reserved_6_8 : 3;
+               u64 opcode : 3;
+               u64 reserved_0_2 : 3;
+       } sstatus_cn68xx;
+       /**
+        * Address for memory loads to get POW internal state
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_16_39 : 24;
+               u64 index : 11;
+               u64 get_des : 1;
+               u64 get_wqp : 1;
+               u64 reserved_0_2 : 3;
+       } smemload;
+       /**
+        * Address for memory loads to get SSO internal state
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_20_39 : 20;
+               u64 index : 11;
+               u64 reserved_6_8 : 3;
+               u64 opcode : 3;
+               u64 reserved_0_2 : 3;
+       } smemload_cn68xx;
+       /**
+        * Address for index/pointer loads
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_9_39 : 31;
+               u64 qosgrp : 4;
+               u64 get_des_get_tail : 1;
+               u64 get_rmt : 1;
+               u64 reserved_0_2 : 3;
+       } sindexload;
+       /**
+        * Address for a Index/Pointer loads to get SSO internal state
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_15_39 : 25;
+               u64 qos_grp : 6;
+               u64 reserved_6_8 : 3;
+               u64 opcode : 3;
+               u64 reserved_0_2 : 3;
+       } sindexload_cn68xx;
+       /**
+        * Address for NULL_RD request (did<2:0> == 4)
+        * when this is read, HW attempts to change the state to NULL if it is NULL_NULL
+        * (the hardware cannot switch from NULL_NULL to NULL if a POW entry is not available -
+        * software may need to recover by finishing another piece of work before a POW
+        * entry can ever become available.)
+        */
+       struct {
+               u64 mem_region : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 reserved_0_39 : 40;
+       } snull_rd;
+} cvmx_pow_load_addr_t;
+
+/**
+ * This structure defines the response to a load/SENDSINGLE to POW (except CSR reads)
+ */
+typedef union {
+       u64 u64;
+       /**
+        * Response to new work request loads
+        */
+       struct {
+               u64 no_work : 1;
+               u64 pend_switch : 1;
+               u64 tt : 2;
+               u64 reserved_58_59 : 2;
+               u64 grp : 10;
+               u64 reserved_42_47 : 6;
+               u64 addr : 42;
+       } s_work;
+
+       /**
+        * Result for a POW Status Load (when get_cur==0 and get_wqp==0)
+        */
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 pend_switch : 1;
+               u64 pend_switch_full : 1;
+               u64 pend_switch_null : 1;
+               u64 pend_desched : 1;
+               u64 pend_desched_switch : 1;
+               u64 pend_nosched : 1;
+               u64 pend_new_work : 1;
+               u64 pend_new_work_wait : 1;
+               u64 pend_null_rd : 1;
+               u64 pend_nosched_clr : 1;
+               u64 reserved_51 : 1;
+               u64 pend_index : 11;
+               u64 pend_grp : 4;
+               u64 reserved_34_35 : 2;
+               u64 pend_type : 2;
+               u64 pend_tag : 32;
+       } s_sstatus0;
+       /**
+        * Result for a SSO Status Load (when opcode is SL_PENDTAG)
+        */
+       struct {
+               u64 pend_switch : 1;
+               u64 pend_get_work : 1;
+               u64 pend_get_work_wait : 1;
+               u64 pend_nosched : 1;
+               u64 pend_nosched_clr : 1;
+               u64 pend_desched : 1;
+               u64 pend_alloc_we : 1;
+               u64 reserved_48_56 : 9;
+               u64 pend_index : 11;
+               u64 reserved_34_36 : 3;
+               u64 pend_type : 2;
+               u64 pend_tag : 32;
+       } s_sstatus0_cn68xx;
+       /**
+        * Result for a POW Status Load (when get_cur==0 and get_wqp==1)
+        */
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 pend_switch : 1;
+               u64 pend_switch_full : 1;
+               u64 pend_switch_null : 1;
+               u64 pend_desched : 1;
+               u64 pend_desched_switch : 1;
+               u64 pend_nosched : 1;
+               u64 pend_new_work : 1;
+               u64 pend_new_work_wait : 1;
+               u64 pend_null_rd : 1;
+               u64 pend_nosched_clr : 1;
+               u64 reserved_51 : 1;
+               u64 pend_index : 11;
+               u64 pend_grp : 4;
+               u64 pend_wqp : 36;
+       } s_sstatus1;
+       /**
+        * Result for a SSO Status Load (when opcode is SL_PENDWQP)
+        */
+       struct {
+               u64 pend_switch : 1;
+               u64 pend_get_work : 1;
+               u64 pend_get_work_wait : 1;
+               u64 pend_nosched : 1;
+               u64 pend_nosched_clr : 1;
+               u64 pend_desched : 1;
+               u64 pend_alloc_we : 1;
+               u64 reserved_51_56 : 6;
+               u64 pend_index : 11;
+               u64 reserved_38_39 : 2;
+               u64 pend_wqp : 38;
+       } s_sstatus1_cn68xx;
+
+       struct {
+               u64 pend_switch : 1;
+               u64 pend_get_work : 1;
+               u64 pend_get_work_wait : 1;
+               u64 pend_nosched : 1;
+               u64 pend_nosched_clr : 1;
+               u64 pend_desched : 1;
+               u64 pend_alloc_we : 1;
+               u64 reserved_56 : 1;
+               u64 prep_index : 12;
+               u64 reserved_42_43 : 2;
+               u64 pend_tag : 42;
+       } s_sso_ppx_pendwqp_cn78xx;
+       /**
+        * Result for a POW Status Load (when get_cur==1, get_wqp==0, and get_rev==0)
+        */
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 link_index : 11;
+               u64 index : 11;
+               u64 grp : 4;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 tag_type : 2;
+               u64 tag : 32;
+       } s_sstatus2;
+       /**
+        * Result for a SSO Status Load (when opcode is SL_TAG)
+        */
+       struct {
+               u64 reserved_57_63 : 7;
+               u64 index : 11;
+               u64 reserved_45 : 1;
+               u64 grp : 6;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 reserved_34_36 : 3;
+               u64 tag_type : 2;
+               u64 tag : 32;
+       } s_sstatus2_cn68xx;
+
+       struct {
+               u64 tailc : 1;
+               u64 reserved_60_62 : 3;
+               u64 index : 12;
+               u64 reserved_46_47 : 2;
+               u64 grp : 10;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 tt : 2;
+               u64 tag : 32;
+       } s_sso_ppx_tag_cn78xx;
+       /**
+        * Result for a POW Status Load (when get_cur==1, get_wqp==0, and get_rev==1)
+        */
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 revlink_index : 11;
+               u64 index : 11;
+               u64 grp : 4;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 tag_type : 2;
+               u64 tag : 32;
+       } s_sstatus3;
+       /**
+        * Result for a SSO Status Load (when opcode is SL_WQP)
+        */
+       struct {
+               u64 reserved_58_63 : 6;
+               u64 index : 11;
+               u64 reserved_46 : 1;
+               u64 grp : 6;
+               u64 reserved_38_39 : 2;
+               u64 wqp : 38;
+       } s_sstatus3_cn68xx;
+
+       struct {
+               u64 reserved_58_63 : 6;
+               u64 grp : 10;
+               u64 reserved_42_47 : 6;
+               u64 tag : 42;
+       } s_sso_ppx_wqp_cn78xx;
+       /**
+        * Result for a POW Status Load (when get_cur==1, get_wqp==1, and get_rev==0)
+        */
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 link_index : 11;
+               u64 index : 11;
+               u64 grp : 4;
+               u64 wqp : 36;
+       } s_sstatus4;
+       /**
+        * Result for a SSO Status Load (when opcode is SL_LINKS)
+        */
+       struct {
+               u64 reserved_46_63 : 18;
+               u64 index : 11;
+               u64 reserved_34 : 1;
+               u64 grp : 6;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 reserved_24_25 : 2;
+               u64 revlink_index : 11;
+               u64 reserved_11_12 : 2;
+               u64 link_index : 11;
+       } s_sstatus4_cn68xx;
+
+       struct {
+               u64 tailc : 1;
+               u64 reserved_60_62 : 3;
+               u64 index : 12;
+               u64 reserved_38_47 : 10;
+               u64 grp : 10;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 reserved_25 : 1;
+               u64 revlink_index : 12;
+               u64 link_index_vld : 1;
+               u64 link_index : 12;
+       } s_sso_ppx_links_cn78xx;
+       /**
+        * Result for a POW Status Load (when get_cur==1, get_wqp==1, and get_rev==1)
+        */
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 revlink_index : 11;
+               u64 index : 11;
+               u64 grp : 4;
+               u64 wqp : 36;
+       } s_sstatus5;
+       /**
+        * Result For POW Memory Load (get_des == 0 and get_wqp == 0)
+        */
+       struct {
+               u64 reserved_51_63 : 13;
+               u64 next_index : 11;
+               u64 grp : 4;
+               u64 reserved_35 : 1;
+               u64 tail : 1;
+               u64 tag_type : 2;
+               u64 tag : 32;
+       } s_smemload0;
+       /**
+        * Result For SSO Memory Load (opcode is ML_TAG)
+        */
+       struct {
+               u64 reserved_38_63 : 26;
+               u64 tail : 1;
+               u64 reserved_34_36 : 3;
+               u64 tag_type : 2;
+               u64 tag : 32;
+       } s_smemload0_cn68xx;
+
+       struct {
+               u64 reserved_39_63 : 25;
+               u64 tail : 1;
+               u64 reserved_34_36 : 3;
+               u64 tag_type : 2;
+               u64 tag : 32;
+       } s_sso_iaq_ppx_tag_cn78xx;
+       /**
+        * Result For POW Memory Load (get_des == 0 and get_wqp == 1)
+        */
+       struct {
+               u64 reserved_51_63 : 13;
+               u64 next_index : 11;
+               u64 grp : 4;
+               u64 wqp : 36;
+       } s_smemload1;
+       /**
+        * Result For SSO Memory Load (opcode is ML_WQPGRP)
+        */
+       struct {
+               u64 reserved_48_63 : 16;
+               u64 nosched : 1;
+               u64 reserved_46 : 1;
+               u64 grp : 6;
+               u64 reserved_38_39 : 2;
+               u64 wqp : 38;
+       } s_smemload1_cn68xx;
+
+       /**
+        * Entry structures for the CN7XXX chips.
+        */
+       struct {
+               u64 reserved_39_63 : 25;
+               u64 tailc : 1;
+               u64 tail : 1;
+               u64 reserved_34_36 : 3;
+               u64 tt : 2;
+               u64 tag : 32;
+       } s_sso_ientx_tag_cn78xx;
+
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 head : 1;
+               u64 nosched : 1;
+               u64 reserved_56_59 : 4;
+               u64 grp : 8;
+               u64 reserved_42_47 : 6;
+               u64 wqp : 42;
+       } s_sso_ientx_wqpgrp_cn73xx;
+
+       struct {
+               u64 reserved_62_63 : 2;
+               u64 head : 1;
+               u64 nosched : 1;
+               u64 reserved_58_59 : 2;
+               u64 grp : 10;
+               u64 reserved_42_47 : 6;
+               u64 wqp : 42;
+       } s_sso_ientx_wqpgrp_cn78xx;
+
+       struct {
+               u64 reserved_38_63 : 26;
+               u64 pend_switch : 1;
+               u64 reserved_34_36 : 3;
+               u64 pend_tt : 2;
+               u64 pend_tag : 32;
+       } s_sso_ientx_pendtag_cn78xx;
+
+       struct {
+               u64 reserved_26_63 : 38;
+               u64 prev_index : 10;
+               u64 reserved_11_15 : 5;
+               u64 next_index_vld : 1;
+               u64 next_index : 10;
+       } s_sso_ientx_links_cn73xx;
+
+       struct {
+               u64 reserved_28_63 : 36;
+               u64 prev_index : 12;
+               u64 reserved_13_15 : 3;
+               u64 next_index_vld : 1;
+               u64 next_index : 12;
+       } s_sso_ientx_links_cn78xx;
+
+       /**
+        * Result For POW Memory Load (get_des == 1)
+        */
+       struct {
+               u64 reserved_51_63 : 13;
+               u64 fwd_index : 11;
+               u64 grp : 4;
+               u64 nosched : 1;
+               u64 pend_switch : 1;
+               u64 pend_type : 2;
+               u64 pend_tag : 32;
+       } s_smemload2;
+       /**
+        * Result For SSO Memory Load (opcode is ML_PENTAG)
+        */
+       struct {
+               u64 reserved_38_63 : 26;
+               u64 pend_switch : 1;
+               u64 reserved_34_36 : 3;
+               u64 pend_type : 2;
+               u64 pend_tag : 32;
+       } s_smemload2_cn68xx;
+
+       struct {
+               u64 pend_switch : 1;
+               u64 pend_get_work : 1;
+               u64 pend_get_work_wait : 1;
+               u64 pend_nosched : 1;
+               u64 pend_nosched_clr : 1;
+               u64 pend_desched : 1;
+               u64 pend_alloc_we : 1;
+               u64 reserved_34_56 : 23;
+               u64 pend_tt : 2;
+               u64 pend_tag : 32;
+       } s_sso_ppx_pendtag_cn78xx;
+       /**
+        * Result For SSO Memory Load (opcode is ML_LINKS)
+        */
+       struct {
+               u64 reserved_24_63 : 40;
+               u64 fwd_index : 11;
+               u64 reserved_11_12 : 2;
+               u64 next_index : 11;
+       } s_smemload3_cn68xx;
+
+       /**
+        * Result For POW Index/Pointer Load (get_rmt == 0/get_des_get_tail == 0)
+        */
+       struct {
+               u64 reserved_52_63 : 12;
+               u64 free_val : 1;
+               u64 free_one : 1;
+               u64 reserved_49 : 1;
+               u64 free_head : 11;
+               u64 reserved_37 : 1;
+               u64 free_tail : 11;
+               u64 loc_val : 1;
+               u64 loc_one : 1;
+               u64 reserved_23 : 1;
+               u64 loc_head : 11;
+               u64 reserved_11 : 1;
+               u64 loc_tail : 11;
+       } sindexload0;
+       /**
+        * Result for SSO Index/Pointer Load(opcode ==
+        * IPL_IQ/IPL_DESCHED/IPL_NOSCHED)
+        */
+       struct {
+               u64 reserved_28_63 : 36;
+               u64 queue_val : 1;
+               u64 queue_one : 1;
+               u64 reserved_24_25 : 2;
+               u64 queue_head : 11;
+               u64 reserved_11_12 : 2;
+               u64 queue_tail : 11;
+       } sindexload0_cn68xx;
+       /**
+        * Result For POW Index/Pointer Load (get_rmt == 0/get_des_get_tail == 1)
+        */
+       struct {
+               u64 reserved_52_63 : 12;
+               u64 nosched_val : 1;
+               u64 nosched_one : 1;
+               u64 reserved_49 : 1;
+               u64 nosched_head : 11;
+               u64 reserved_37 : 1;
+               u64 nosched_tail : 11;
+               u64 des_val : 1;
+               u64 des_one : 1;
+               u64 reserved_23 : 1;
+               u64 des_head : 11;
+               u64 reserved_11 : 1;
+               u64 des_tail : 11;
+       } sindexload1;
+       /**
+        * Result for SSO Index/Pointer Load(opcode == IPL_FREE0/IPL_FREE1/IPL_FREE2)
+        */
+       struct {
+               u64 reserved_60_63 : 4;
+               u64 qnum_head : 2;
+               u64 qnum_tail : 2;
+               u64 reserved_28_55 : 28;
+               u64 queue_val : 1;
+               u64 queue_one : 1;
+               u64 reserved_24_25 : 2;
+               u64 queue_head : 11;
+               u64 reserved_11_12 : 2;
+               u64 queue_tail : 11;
+       } sindexload1_cn68xx;
+       /**
+        * Result For POW Index/Pointer Load (get_rmt == 1/get_des_get_tail == 0)
+        */
+       struct {
+               u64 reserved_39_63 : 25;
+               u64 rmt_is_head : 1;
+               u64 rmt_val : 1;
+               u64 rmt_one : 1;
+               u64 rmt_head : 36;
+       } sindexload2;
+       /**
+        * Result For POW Index/Pointer Load (get_rmt == 1/get_des_get_tail == 1)
+        */
+       struct {
+               u64 reserved_39_63 : 25;
+               u64 rmt_is_head : 1;
+               u64 rmt_val : 1;
+               u64 rmt_one : 1;
+               u64 rmt_tail : 36;
+       } sindexload3;
+       /**
+        * Response to NULL_RD request loads
+        */
+       struct {
+               u64 unused : 62;
+               u64 state : 2;
+       } s_null_rd;
+
+} cvmx_pow_tag_load_resp_t;
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 reserved_57_63 : 7;
+               u64 index : 11;
+               u64 reserved_45 : 1;
+               u64 grp : 6;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 reserved_34_36 : 3;
+               u64 tag_type : 2;
+               u64 tag : 32;
+       } s;
+} cvmx_pow_sl_tag_resp_t;
+
+/**
+ * This structure describes the address used for stores to the POW.
+ *  The store address is meaningful on stores to the POW.  The hardware assumes that an aligned
+ *  64-bit store was used for all these stores.
+ *  Note the assumption that the work queue entry is aligned on an 8-byte
+ *  boundary (since the low-order 3 address bits must be zero).
+ *  Note that not all fields are used by all operations.
+ *
+ *  NOTE: The following is the behavior of the pending switch bit at the PP
+ *       for POW stores (i.e. when did<7:3> == 0xc)
+ *     - did<2:0> == 0      => pending switch bit is set
+ *     - did<2:0> == 1      => no affect on the pending switch bit
+ *     - did<2:0> == 3      => pending switch bit is cleared
+ *     - did<2:0> == 7      => no affect on the pending switch bit
+ *     - did<2:0> == others => must not be used
+ *     - No other loads/stores have an affect on the pending switch bit
+ *     - The switch bus from POW can clear the pending switch bit
+ *
+ *  NOTE: did<2:0> == 2 is used by the HW for a special single-cycle ADDWQ command
+ *  that only contains the pointer). SW must never use did<2:0> == 2.
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 mem_reg : 2;
+               u64 reserved_49_61 : 13;
+               u64 is_io : 1;
+               u64 did : 8;
+               u64 addr : 40;
+       } stag;
+} cvmx_pow_tag_store_addr_t; /* FIXME- this type is unused */
+
+/**
+ * Decode of the store data when an IOBDMA SENDSINGLE is sent to POW
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 scraddr : 8;
+               u64 len : 8;
+               u64 did : 8;
+               u64 unused : 36;
+               u64 wait : 1;
+               u64 unused2 : 3;
+       } s;
+       struct {
+               u64 scraddr : 8;
+               u64 len : 8;
+               u64 did : 8;
+               u64 node : 4;
+               u64 unused1 : 4;
+               u64 indexed : 1;
+               u64 grouped : 1;
+               u64 rtngrp : 1;
+               u64 unused2 : 13;
+               u64 index_grp_mask : 12;
+               u64 wait : 1;
+               u64 unused3 : 3;
+       } s_cn78xx;
+} cvmx_pow_iobdma_store_t;
+
+/* CSR typedefs have been moved to cvmx-pow-defs.h */
+
+/*enum for group priority parameters which needs modification*/
+enum cvmx_sso_group_modify_mask {
+       CVMX_SSO_MODIFY_GROUP_PRIORITY = 0x01,
+       CVMX_SSO_MODIFY_GROUP_WEIGHT = 0x02,
+       CVMX_SSO_MODIFY_GROUP_AFFINITY = 0x04
+};
+
+/**
+ * @INTERNAL
+ * Return the number of SSO groups for a given SoC model
+ */
+static inline unsigned int cvmx_sso_num_xgrp(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return 256;
+       if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return 64;
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return 64;
+       printf("ERROR: %s: Unknown model\n", __func__);
+       return 0;
+}
+
+/**
+ * @INTERNAL
+ * Return the number of POW groups on current model.
+ * In case of CN78XX/CN73XX this is the number of equivalent
+ * "legacy groups" on the chip when it is used in backward
+ * compatible mode.
+ */
+static inline unsigned int cvmx_pow_num_groups(void)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               return cvmx_sso_num_xgrp() >> 3;
+       else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               return 64;
+       else
+               return 16;
+}
+
+/**
+ * @INTERNAL
+ * Return the number of mask-set registers.
+ */
+static inline unsigned int cvmx_sso_num_maskset(void)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               return 2;
+       else
+               return 1;
+}
+
+/**
+ * Get the POW tag for this core. This returns the current
+ * tag type, tag, group, and POW entry index associated with
+ * this core. Index is only valid if the tag type isn't NULL_NULL.
+ * If a tag switch is pending this routine returns the tag before
+ * the tag switch, not after.
+ *
+ * @return Current tag
+ */
+static inline cvmx_pow_tag_info_t cvmx_pow_get_current_tag(void)
+{
+       cvmx_pow_load_addr_t load_addr;
+       cvmx_pow_tag_info_t result;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_sso_sl_ppx_tag_t sl_ppx_tag;
+               cvmx_xgrp_t xgrp;
+               int node, core;
+
+               CVMX_SYNCS;
+               node = cvmx_get_node_num();
+               core = cvmx_get_local_core_num();
+               sl_ppx_tag.u64 = csr_rd_node(node, CVMX_SSO_SL_PPX_TAG(core));
+               result.index = sl_ppx_tag.s.index;
+               result.tag_type = sl_ppx_tag.s.tt;
+               result.tag = sl_ppx_tag.s.tag;
+
+               /* Get native XGRP value */
+               xgrp.xgrp = sl_ppx_tag.s.grp;
+
+               /* Return legacy style group 0..15 */
+               result.grp = xgrp.group;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               cvmx_pow_sl_tag_resp_t load_resp;
+
+               load_addr.u64 = 0;
+               load_addr.sstatus_cn68xx.mem_region = CVMX_IO_SEG;
+               load_addr.sstatus_cn68xx.is_io = 1;
+               load_addr.sstatus_cn68xx.did = CVMX_OCT_DID_TAG_TAG5;
+               load_addr.sstatus_cn68xx.coreid = cvmx_get_core_num();
+               load_addr.sstatus_cn68xx.opcode = 3;
+               load_resp.u64 = csr_rd(load_addr.u64);
+               result.grp = load_resp.s.grp;
+               result.index = load_resp.s.index;
+               result.tag_type = load_resp.s.tag_type;
+               result.tag = load_resp.s.tag;
+       } else {
+               cvmx_pow_tag_load_resp_t load_resp;
+
+               load_addr.u64 = 0;
+               load_addr.sstatus.mem_region = CVMX_IO_SEG;
+               load_addr.sstatus.is_io = 1;
+               load_addr.sstatus.did = CVMX_OCT_DID_TAG_TAG1;
+               load_addr.sstatus.coreid = cvmx_get_core_num();
+               load_addr.sstatus.get_cur = 1;
+               load_resp.u64 = csr_rd(load_addr.u64);
+               result.grp = load_resp.s_sstatus2.grp;
+               result.index = load_resp.s_sstatus2.index;
+               result.tag_type = load_resp.s_sstatus2.tag_type;
+               result.tag = load_resp.s_sstatus2.tag;
+       }
+       return result;
+}
+
+/**
+ * Get the POW WQE for this core. This returns the work queue
+ * entry currently associated with this core.
+ *
+ * @return WQE pointer
+ */
+static inline cvmx_wqe_t *cvmx_pow_get_current_wqp(void)
+{
+       cvmx_pow_load_addr_t load_addr;
+       cvmx_pow_tag_load_resp_t load_resp;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_sso_sl_ppx_wqp_t sso_wqp;
+               int node = cvmx_get_node_num();
+               int core = cvmx_get_local_core_num();
+
+               sso_wqp.u64 = csr_rd_node(node, CVMX_SSO_SL_PPX_WQP(core));
+               if (sso_wqp.s.wqp)
+                       return (cvmx_wqe_t *)cvmx_phys_to_ptr(sso_wqp.s.wqp);
+               return (cvmx_wqe_t *)0;
+       }
+       if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               load_addr.u64 = 0;
+               load_addr.sstatus_cn68xx.mem_region = CVMX_IO_SEG;
+               load_addr.sstatus_cn68xx.is_io = 1;
+               load_addr.sstatus_cn68xx.did = CVMX_OCT_DID_TAG_TAG5;
+               load_addr.sstatus_cn68xx.coreid = cvmx_get_core_num();
+               load_addr.sstatus_cn68xx.opcode = 4;
+               load_resp.u64 = csr_rd(load_addr.u64);
+               if (load_resp.s_sstatus3_cn68xx.wqp)
+                       return (cvmx_wqe_t *)cvmx_phys_to_ptr(load_resp.s_sstatus3_cn68xx.wqp);
+               else
+                       return (cvmx_wqe_t *)0;
+       } else {
+               load_addr.u64 = 0;
+               load_addr.sstatus.mem_region = CVMX_IO_SEG;
+               load_addr.sstatus.is_io = 1;
+               load_addr.sstatus.did = CVMX_OCT_DID_TAG_TAG1;
+               load_addr.sstatus.coreid = cvmx_get_core_num();
+               load_addr.sstatus.get_cur = 1;
+               load_addr.sstatus.get_wqp = 1;
+               load_resp.u64 = csr_rd(load_addr.u64);
+               return (cvmx_wqe_t *)cvmx_phys_to_ptr(load_resp.s_sstatus4.wqp);
+       }
+}
+
+/**
+ * @INTERNAL
+ * Print a warning if a tag switch is pending for this core
+ *
+ * @param function Function name checking for a pending tag switch
+ */
+static inline void __cvmx_pow_warn_if_pending_switch(const char *function)
+{
+       u64 switch_complete;
+
+       CVMX_MF_CHORD(switch_complete);
+       cvmx_warn_if(!switch_complete, "%s called with tag switch in progress\n", function);
+}
+
+/**
+ * Waits for a tag switch to complete by polling the completion bit.
+ * Note that switches to NULL complete immediately and do not need
+ * to be waited for.
+ */
+static inline void cvmx_pow_tag_sw_wait(void)
+{
+       const u64 TIMEOUT_MS = 10; /* 10ms timeout */
+       u64 switch_complete;
+       u64 start_cycle;
+
+       if (CVMX_ENABLE_POW_CHECKS)
+               start_cycle = get_timer(0);
+
+       while (1) {
+               CVMX_MF_CHORD(switch_complete);
+               if (cvmx_likely(switch_complete))
+                       break;
+
+               if (CVMX_ENABLE_POW_CHECKS) {
+                       if (cvmx_unlikely(get_timer(start_cycle) > TIMEOUT_MS)) {
+                               debug("WARNING: %s: Tag switch is taking a long time, possible deadlock\n",
+                                     __func__);
+                       }
+               }
+       }
+}
+
+/**
+ * Synchronous work request.  Requests work from the POW.
+ * This function does NOT wait for previous tag switches to complete,
+ * so the caller must ensure that there is not a pending tag switch.
+ *
+ * @param wait   When set, call stalls until work becomes available, or
+ *               times out. If not set, returns immediately.
+ *
+ * @return Returns the WQE pointer from POW. Returns NULL if no work was
+ * available.
+ */
+static inline cvmx_wqe_t *cvmx_pow_work_request_sync_nocheck(cvmx_pow_wait_t wait)
+{
+       cvmx_pow_load_addr_t ptr;
+       cvmx_pow_tag_load_resp_t result;
+
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__func__);
+
+       ptr.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               ptr.swork_78xx.node = cvmx_get_node_num();
+               ptr.swork_78xx.mem_region = CVMX_IO_SEG;
+               ptr.swork_78xx.is_io = 1;
+               ptr.swork_78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+               ptr.swork_78xx.wait = wait;
+       } else {
+               ptr.swork.mem_region = CVMX_IO_SEG;
+               ptr.swork.is_io = 1;
+               ptr.swork.did = CVMX_OCT_DID_TAG_SWTAG;
+               ptr.swork.wait = wait;
+       }
+
+       result.u64 = csr_rd(ptr.u64);
+       if (result.s_work.no_work)
+               return NULL;
+       else
+               return (cvmx_wqe_t *)cvmx_phys_to_ptr(result.s_work.addr);
+}
+
+/**
+ * Synchronous work request.  Requests work from the POW.
+ * This function waits for any previous tag switch to complete before
+ * requesting the new work.
+ *
+ * @param wait   When set, call stalls until work becomes available, or
+ *               times out. If not set, returns immediately.
+ *
+ * @return Returns the WQE pointer from POW. Returns NULL if no work was
+ * available.
+ */
+static inline cvmx_wqe_t *cvmx_pow_work_request_sync(cvmx_pow_wait_t wait)
+{
+       /* Must not have a switch pending when requesting work */
+       cvmx_pow_tag_sw_wait();
+       return (cvmx_pow_work_request_sync_nocheck(wait));
+}
+
+/**
+ * Synchronous null_rd request.  Requests a switch out of NULL_NULL POW state.
+ * This function waits for any previous tag switch to complete before
+ * requesting the null_rd.
+ *
+ * @return Returns the POW state of type cvmx_pow_tag_type_t.
+ */
+static inline cvmx_pow_tag_type_t cvmx_pow_work_request_null_rd(void)
+{
+       cvmx_pow_load_addr_t ptr;
+       cvmx_pow_tag_load_resp_t result;
+
+       /* Must not have a switch pending when requesting work */
+       cvmx_pow_tag_sw_wait();
+
+       ptr.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               ptr.swork_78xx.mem_region = CVMX_IO_SEG;
+               ptr.swork_78xx.is_io = 1;
+               ptr.swork_78xx.did = CVMX_OCT_DID_TAG_NULL_RD;
+               ptr.swork_78xx.node = cvmx_get_node_num();
+       } else {
+               ptr.snull_rd.mem_region = CVMX_IO_SEG;
+               ptr.snull_rd.is_io = 1;
+               ptr.snull_rd.did = CVMX_OCT_DID_TAG_NULL_RD;
+       }
+       result.u64 = csr_rd(ptr.u64);
+       return (cvmx_pow_tag_type_t)result.s_null_rd.state;
+}
+
+/**
+ * Asynchronous work request.
+ * Work is requested from the POW unit, and should later be checked with
+ * function cvmx_pow_work_response_async.
+ * This function does NOT wait for previous tag switches to complete,
+ * so the caller must ensure that there is not a pending tag switch.
+ *
+ * @param scr_addr Scratch memory address that response will be returned to,
+ *     which is either a valid WQE, or a response with the invalid bit set.
+ *     Byte address, must be 8 byte aligned.
+ * @param wait 1 to cause response to wait for work to become available
+ *               (or timeout)
+ *             0 to cause response to return immediately
+ */
+static inline void cvmx_pow_work_request_async_nocheck(int scr_addr, cvmx_pow_wait_t wait)
+{
+       cvmx_pow_iobdma_store_t data;
+
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__func__);
+
+       /* scr_addr must be 8 byte aligned */
+       data.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               data.s_cn78xx.node = cvmx_get_node_num();
+               data.s_cn78xx.scraddr = scr_addr >> 3;
+               data.s_cn78xx.len = 1;
+               data.s_cn78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+               data.s_cn78xx.wait = wait;
+       } else {
+               data.s.scraddr = scr_addr >> 3;
+               data.s.len = 1;
+               data.s.did = CVMX_OCT_DID_TAG_SWTAG;
+               data.s.wait = wait;
+       }
+       cvmx_send_single(data.u64);
+}
+
+/**
+ * Asynchronous work request.
+ * Work is requested from the POW unit, and should later be checked with
+ * function cvmx_pow_work_response_async.
+ * This function waits for any previous tag switch to complete before
+ * requesting the new work.
+ *
+ * @param scr_addr Scratch memory address that response will be returned to,
+ *     which is either a valid WQE, or a response with the invalid bit set.
+ *     Byte address, must be 8 byte aligned.
+ * @param wait 1 to cause response to wait for work to become available
+ *               (or timeout)
+ *             0 to cause response to return immediately
+ */
+static inline void cvmx_pow_work_request_async(int scr_addr, cvmx_pow_wait_t wait)
+{
+       /* Must not have a switch pending when requesting work */
+       cvmx_pow_tag_sw_wait();
+       cvmx_pow_work_request_async_nocheck(scr_addr, wait);
+}
+
+/**
+ * Gets result of asynchronous work request.  Performs a IOBDMA sync
+ * to wait for the response.
+ *
+ * @param scr_addr Scratch memory address to get result from
+ *                  Byte address, must be 8 byte aligned.
+ * @return Returns the WQE from the scratch register, or NULL if no work was
+ *         available.
+ */
+static inline cvmx_wqe_t *cvmx_pow_work_response_async(int scr_addr)
+{
+       cvmx_pow_tag_load_resp_t result;
+
+       CVMX_SYNCIOBDMA;
+       result.u64 = cvmx_scratch_read64(scr_addr);
+       if (result.s_work.no_work)
+               return NULL;
+       else
+               return (cvmx_wqe_t *)cvmx_phys_to_ptr(result.s_work.addr);
+}
+
+/**
+ * Checks if a work queue entry pointer returned by a work
+ * request is valid.  It may be invalid due to no work
+ * being available or due to a timeout.
+ *
+ * @param wqe_ptr pointer to a work queue entry returned by the POW
+ *
+ * @return 0 if pointer is valid
+ *         1 if invalid (no work was returned)
+ */
+static inline u64 cvmx_pow_work_invalid(cvmx_wqe_t *wqe_ptr)
+{
+       return (!wqe_ptr); /* FIXME: improve */
+}
+
+/**
+ * Starts a tag switch to the provided tag value and tag type.  Completion for
+ * the tag switch must be checked for separately.
+ * This function does NOT update the
+ * work queue entry in dram to match tag value and type, so the application must
+ * keep track of these if they are important to the application.
+ * This tag switch command must not be used for switches to NULL, as the tag
+ * switch pending bit will be set by the switch request, but never cleared by
+ * the hardware.
+ *
+ * NOTE: This should not be used when switching from a NULL tag.  Use
+ * cvmx_pow_tag_sw_full() instead.
+ *
+ * This function does no checks, so the caller must ensure that any previous tag
+ * switch has completed.
+ *
+ * @param tag      new tag value
+ * @param tag_type new tag type (ordered or atomic)
+ */
+static inline void cvmx_pow_tag_sw_nocheck(u32 tag, cvmx_pow_tag_type_t tag_type)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL,
+                            "%s called with NULL tag\n", __func__);
+               cvmx_warn_if((current_tag.tag_type == tag_type) && (current_tag.tag == tag),
+                            "%s called to perform a tag switch to the same tag\n", __func__);
+               cvmx_warn_if(
+                       tag_type == CVMX_POW_TAG_TYPE_NULL,
+                       "%s called to perform a tag switch to NULL. Use cvmx_pow_tag_sw_null() instead\n",
+                       __func__);
+       }
+
+       /*
+        * Note that WQE in DRAM is not updated here, as the POW does not read
+        * from DRAM once the WQE is in flight.  See hardware manual for
+        * complete details.
+        * It is the application's responsibility to keep track of the
+        * current tag value if that is important.
+        */
+       tag_req.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_SWTAG;
+               tag_req.s_cn78xx_other.type = tag_type;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               tag_req.s_cn68xx_other.op = CVMX_POW_TAG_OP_SWTAG;
+               tag_req.s_cn68xx_other.tag = tag;
+               tag_req.s_cn68xx_other.type = tag_type;
+       } else {
+               tag_req.s_cn38xx.op = CVMX_POW_TAG_OP_SWTAG;
+               tag_req.s_cn38xx.tag = tag;
+               tag_req.s_cn38xx.type = tag_type;
+       }
+       ptr.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+               ptr.s_cn78xx.is_io = 1;
+               ptr.s_cn78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+               ptr.s_cn78xx.node = cvmx_get_node_num();
+               ptr.s_cn78xx.tag = tag;
+       } else {
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_SWTAG;
+       }
+       /* Once this store arrives at POW, it will attempt the switch
+          software must wait for the switch to complete separately */
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * Starts a tag switch to the provided tag value and tag type.  Completion for
+ * the tag switch must be checked for separately.
+ * This function does NOT update the
+ * work queue entry in dram to match tag value and type, so the application must
+ * keep track of these if they are important to the application.
+ * This tag switch command must not be used for switches to NULL, as the tag
+ * switch pending bit will be set by the switch request, but never cleared by
+ * the hardware.
+ *
+ * NOTE: This should not be used when switching from a NULL tag.  Use
+ * cvmx_pow_tag_sw_full() instead.
+ *
+ * This function waits for any previous tag switch to complete, and also
+ * displays an error on tag switches to NULL.
+ *
+ * @param tag      new tag value
+ * @param tag_type new tag type (ordered or atomic)
+ */
+static inline void cvmx_pow_tag_sw(u32 tag, cvmx_pow_tag_type_t tag_type)
+{
+       /*
+        * Note that WQE in DRAM is not updated here, as the POW does not read
+        * from DRAM once the WQE is in flight.  See hardware manual for
+        * complete details. It is the application's responsibility to keep
+        * track of the current tag value if that is important.
+        */
+
+       /*
+        * Ensure that there is not a pending tag switch, as a tag switch
+        * cannot be started if a previous switch is still pending.
+        */
+       cvmx_pow_tag_sw_wait();
+       cvmx_pow_tag_sw_nocheck(tag, tag_type);
+}
+
+/**
+ * Starts a tag switch to the provided tag value and tag type.  Completion for
+ * the tag switch must be checked for separately.
+ * This function does NOT update the
+ * work queue entry in dram to match tag value and type, so the application must
+ * keep track of these if they are important to the application.
+ * This tag switch command must not be used for switches to NULL, as the tag
+ * switch pending bit will be set by the switch request, but never cleared by
+ * the hardware.
+ *
+ * This function must be used for tag switches from NULL.
+ *
+ * This function does no checks, so the caller must ensure that any previous tag
+ * switch has completed.
+ *
+ * @param wqp      pointer to work queue entry to submit.  This entry is
+ *                 updated to match the other parameters
+ * @param tag      tag value to be assigned to work queue entry
+ * @param tag_type type of tag
+ * @param group    group value for the work queue entry.
+ */
+static inline void cvmx_pow_tag_sw_full_nocheck(cvmx_wqe_t *wqp, u32 tag,
+                                               cvmx_pow_tag_type_t tag_type, u64 group)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+       unsigned int node = cvmx_get_node_num();
+       u64 wqp_phys = cvmx_ptr_to_phys(wqp);
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if((current_tag.tag_type == tag_type) && (current_tag.tag == tag),
+                            "%s called to perform a tag switch to the same tag\n", __func__);
+               cvmx_warn_if(
+                       tag_type == CVMX_POW_TAG_TYPE_NULL,
+                       "%s called to perform a tag switch to NULL. Use cvmx_pow_tag_sw_null() instead\n",
+                       __func__);
+               if ((wqp != cvmx_phys_to_ptr(0x80)) && cvmx_pow_get_current_wqp())
+                       cvmx_warn_if(wqp != cvmx_pow_get_current_wqp(),
+                                    "%s passed WQE(%p) doesn't match the address in the POW(%p)\n",
+                                    __func__, wqp, cvmx_pow_get_current_wqp());
+       }
+
+       /*
+        * Note that WQE in DRAM is not updated here, as the POW does not
+        * read from DRAM once the WQE is in flight.  See hardware manual
+        * for complete details. It is the application's responsibility to
+        * keep track of the current tag value if that is important.
+        */
+       tag_req.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               unsigned int xgrp;
+
+               if (wqp_phys != 0x80) {
+                       /* If WQE is valid, use its XGRP:
+                        * WQE GRP is 10 bits, and is mapped
+                        * to legacy GRP + QoS, includes node number.
+                        */
+                       xgrp = wqp->word1.cn78xx.grp;
+                       /* Use XGRP[node] too */
+                       node = xgrp >> 8;
+                       /* Modify XGRP with legacy group # from arg */
+                       xgrp &= ~0xf8;
+                       xgrp |= 0xf8 & (group << 3);
+
+               } else {
+                       /* If no WQE, build XGRP with QoS=0 and current node */
+                       xgrp = group << 3;
+                       xgrp |= node << 8;
+               }
+               tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_SWTAG_FULL;
+               tag_req.s_cn78xx_other.type = tag_type;
+               tag_req.s_cn78xx_other.grp = xgrp;
+               tag_req.s_cn78xx_other.wqp = wqp_phys;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               tag_req.s_cn68xx_other.op = CVMX_POW_TAG_OP_SWTAG_FULL;
+               tag_req.s_cn68xx_other.tag = tag;
+               tag_req.s_cn68xx_other.type = tag_type;
+               tag_req.s_cn68xx_other.grp = group;
+       } else {
+               tag_req.s_cn38xx.op = CVMX_POW_TAG_OP_SWTAG_FULL;
+               tag_req.s_cn38xx.tag = tag;
+               tag_req.s_cn38xx.type = tag_type;
+               tag_req.s_cn38xx.grp = group;
+       }
+       ptr.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+               ptr.s_cn78xx.is_io = 1;
+               ptr.s_cn78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+               ptr.s_cn78xx.node = node;
+               ptr.s_cn78xx.tag = tag;
+       } else {
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_SWTAG;
+               ptr.s.addr = wqp_phys;
+       }
+       /* Once this store arrives at POW, it will attempt the switch
+          software must wait for the switch to complete separately */
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * Starts a tag switch to the provided tag value and tag type.
+ * Completion for the tag switch must be checked for separately.
+ * This function does NOT update the work queue entry in dram to match tag value
+ * and type, so the application must keep track of these if they are important
+ * to the application. This tag switch command must not be used for switches
+ * to NULL, as the tag switch pending bit will be set by the switch request,
+ * but never cleared by the hardware.
+ *
+ * This function must be used for tag switches from NULL.
+ *
+ * This function waits for any pending tag switches to complete
+ * before requesting the tag switch.
+ *
+ * @param wqp      Pointer to work queue entry to submit.
+ *     This entry is updated to match the other parameters
+ * @param tag      Tag value to be assigned to work queue entry
+ * @param tag_type Type of tag
+ * @param group    Group value for the work queue entry.
+ */
+static inline void cvmx_pow_tag_sw_full(cvmx_wqe_t *wqp, u32 tag, cvmx_pow_tag_type_t tag_type,
+                                       u64 group)
+{
+       /*
+        * Ensure that there is not a pending tag switch, as a tag switch cannot
+        * be started if a previous switch is still pending.
+        */
+       cvmx_pow_tag_sw_wait();
+       cvmx_pow_tag_sw_full_nocheck(wqp, tag, tag_type, group);
+}
+
+/**
+ * Switch to a NULL tag, which ends any ordering or
+ * synchronization provided by the POW for the current
+ * work queue entry.  This operation completes immediately,
+ * so completion should not be waited for.
+ * This function does NOT wait for previous tag switches to complete,
+ * so the caller must ensure that any previous tag switches have completed.
+ */
+static inline void cvmx_pow_tag_sw_null_nocheck(void)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL,
+                            "%s called when we already have a NULL tag\n", __func__);
+       }
+       tag_req.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_SWTAG;
+               tag_req.s_cn78xx_other.type = CVMX_POW_TAG_TYPE_NULL;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               tag_req.s_cn68xx_other.op = CVMX_POW_TAG_OP_SWTAG;
+               tag_req.s_cn68xx_other.type = CVMX_POW_TAG_TYPE_NULL;
+       } else {
+               tag_req.s_cn38xx.op = CVMX_POW_TAG_OP_SWTAG;
+               tag_req.s_cn38xx.type = CVMX_POW_TAG_TYPE_NULL;
+       }
+       ptr.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+               ptr.s_cn78xx.is_io = 1;
+               ptr.s_cn78xx.did = CVMX_OCT_DID_TAG_TAG1;
+               ptr.s_cn78xx.node = cvmx_get_node_num();
+       } else {
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_TAG1;
+       }
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * Switch to a NULL tag, which ends any ordering or
+ * synchronization provided by the POW for the current
+ * work queue entry.  This operation completes immediately,
+ * so completion should not be waited for.
+ * This function waits for any pending tag switches to complete
+ * before requesting the switch to NULL.
+ */
+static inline void cvmx_pow_tag_sw_null(void)
+{
+       /*
+        * Ensure that there is not a pending tag switch, as a tag switch cannot
+        * be started if a previous switch is still pending.
+        */
+       cvmx_pow_tag_sw_wait();
+       cvmx_pow_tag_sw_null_nocheck();
+}
+
+/**
+ * Submits work to an input queue.
+ * This function updates the work queue entry in DRAM to match the arguments given.
+ * Note that the tag provided is for the work queue entry submitted, and
+ * is unrelated to the tag that the core currently holds.
+ *
+ * @param wqp      pointer to work queue entry to submit.
+ *                 This entry is updated to match the other parameters
+ * @param tag      tag value to be assigned to work queue entry
+ * @param tag_type type of tag
+ * @param qos      Input queue to add to.
+ * @param grp      group value for the work queue entry.
+ */
+static inline void cvmx_pow_work_submit(cvmx_wqe_t *wqp, u32 tag, cvmx_pow_tag_type_t tag_type,
+                                       u64 qos, u64 grp)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       tag_req.u64 = 0;
+       ptr.u64 = 0;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               unsigned int node = cvmx_get_node_num();
+               unsigned int xgrp;
+
+               xgrp = (grp & 0x1f) << 3;
+               xgrp |= (qos & 7);
+               xgrp |= 0x300 & (node << 8);
+
+               wqp->word1.cn78xx.rsvd_0 = 0;
+               wqp->word1.cn78xx.rsvd_1 = 0;
+               wqp->word1.cn78xx.tag = tag;
+               wqp->word1.cn78xx.tag_type = tag_type;
+               wqp->word1.cn78xx.grp = xgrp;
+               CVMX_SYNCWS;
+
+               tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_ADDWQ;
+               tag_req.s_cn78xx_other.type = tag_type;
+               tag_req.s_cn78xx_other.wqp = cvmx_ptr_to_phys(wqp);
+               tag_req.s_cn78xx_other.grp = xgrp;
+
+               ptr.s_cn78xx.did = 0x66; // CVMX_OCT_DID_TAG_TAG6;
+               ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+               ptr.s_cn78xx.is_io = 1;
+               ptr.s_cn78xx.node = node;
+               ptr.s_cn78xx.tag = tag;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               /* Reset all reserved bits */
+               wqp->word1.cn68xx.zero_0 = 0;
+               wqp->word1.cn68xx.zero_1 = 0;
+               wqp->word1.cn68xx.zero_2 = 0;
+               wqp->word1.cn68xx.qos = qos;
+               wqp->word1.cn68xx.grp = grp;
+
+               wqp->word1.tag = tag;
+               wqp->word1.tag_type = tag_type;
+
+               tag_req.s_cn68xx_add.op = CVMX_POW_TAG_OP_ADDWQ;
+               tag_req.s_cn68xx_add.type = tag_type;
+               tag_req.s_cn68xx_add.tag = tag;
+               tag_req.s_cn68xx_add.qos = qos;
+               tag_req.s_cn68xx_add.grp = grp;
+
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_TAG1;
+               ptr.s.addr = cvmx_ptr_to_phys(wqp);
+       } else {
+               /* Reset all reserved bits */
+               wqp->word1.cn38xx.zero_2 = 0;
+               wqp->word1.cn38xx.qos = qos;
+               wqp->word1.cn38xx.grp = grp;
+
+               wqp->word1.tag = tag;
+               wqp->word1.tag_type = tag_type;
+
+               tag_req.s_cn38xx.op = CVMX_POW_TAG_OP_ADDWQ;
+               tag_req.s_cn38xx.type = tag_type;
+               tag_req.s_cn38xx.tag = tag;
+               tag_req.s_cn38xx.qos = qos;
+               tag_req.s_cn38xx.grp = grp;
+
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_TAG1;
+               ptr.s.addr = cvmx_ptr_to_phys(wqp);
+       }
+       /* SYNC write to memory before the work submit.
+        * This is necessary as POW may read values from DRAM at this time */
+       CVMX_SYNCWS;
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * This function sets the group mask for a core.  The group mask
+ * indicates which groups each core will accept work from. There are
+ * 16 groups.
+ *
+ * @param core_num   core to apply mask to
+ * @param mask   Group mask, one bit for up to 64 groups.
+ *               Each 1 bit in the mask enables the core to accept work from
+ *               the corresponding group.
+ *               The CN68XX supports 64 groups, earlier models only support
+ *               16 groups.
+ *
+ * The CN78XX in backwards compatibility mode allows up to 32 groups,
+ * so the 'mask' argument has one bit for every of the legacy
+ * groups, and a '1' in the mask causes a total of 8 groups
+ * which share the legacy group numbher and 8 qos levels,
+ * to be enabled for the calling processor core.
+ * A '0' in the mask will disable the current core
+ * from receiving work from the associated group.
+ */
+static inline void cvmx_pow_set_group_mask(u64 core_num, u64 mask)
+{
+       u64 valid_mask;
+       int num_groups = cvmx_pow_num_groups();
+
+       if (num_groups >= 64)
+               valid_mask = ~0ull;
+       else
+               valid_mask = (1ull << num_groups) - 1;
+
+       if ((mask & valid_mask) == 0) {
+               printf("ERROR: %s empty group mask disables work on core# %llu, ignored.\n",
+                      __func__, (unsigned long long)core_num);
+               return;
+       }
+       cvmx_warn_if(mask & (~valid_mask), "%s group number range exceeded: %#llx\n", __func__,
+                    (unsigned long long)mask);
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               unsigned int mask_set;
+               cvmx_sso_ppx_sx_grpmskx_t grp_msk;
+               unsigned int core, node;
+               unsigned int rix;  /* Register index */
+               unsigned int grp;  /* Legacy group # */
+               unsigned int bit;  /* bit index */
+               unsigned int xgrp; /* native group # */
+
+               node = cvmx_coremask_core_to_node(core_num);
+               core = cvmx_coremask_core_on_node(core_num);
+
+               /* 78xx: 256 groups divided into 4 X 64 bit registers */
+               /* 73xx: 64 groups are in one register */
+               for (rix = 0; rix < (cvmx_sso_num_xgrp() >> 6); rix++) {
+                       grp_msk.u64 = 0;
+                       for (bit = 0; bit < 64; bit++) {
+                               /* 8-bit native XGRP number */
+                               xgrp = (rix << 6) | bit;
+                               /* Legacy 5-bit group number */
+                               grp = (xgrp >> 3) & 0x1f;
+                               /* Inspect legacy mask by legacy group */
+                               if (mask & (1ull << grp))
+                                       grp_msk.s.grp_msk |= 1ull << bit;
+                               /* Pre-set to all 0's */
+                       }
+                       for (mask_set = 0; mask_set < cvmx_sso_num_maskset(); mask_set++) {
+                               csr_wr_node(node, CVMX_SSO_PPX_SX_GRPMSKX(core, mask_set, rix),
+                                           grp_msk.u64);
+                       }
+               }
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               cvmx_sso_ppx_grp_msk_t grp_msk;
+
+               grp_msk.s.grp_msk = mask;
+               csr_wr(CVMX_SSO_PPX_GRP_MSK(core_num), grp_msk.u64);
+       } else {
+               cvmx_pow_pp_grp_mskx_t grp_msk;
+
+               grp_msk.u64 = csr_rd(CVMX_POW_PP_GRP_MSKX(core_num));
+               grp_msk.s.grp_msk = mask & 0xffff;
+               csr_wr(CVMX_POW_PP_GRP_MSKX(core_num), grp_msk.u64);
+       }
+}
+
+/**
+ * This function gets the group mask for a core.  The group mask
+ * indicates which groups each core will accept work from.
+ *
+ * @param core_num   core to apply mask to
+ * @return     Group mask, one bit for up to 64 groups.
+ *               Each 1 bit in the mask enables the core to accept work from
+ *               the corresponding group.
+ *               The CN68XX supports 64 groups, earlier models only support
+ *               16 groups.
+ *
+ * The CN78XX in backwards compatibility mode allows up to 32 groups,
+ * so the 'mask' argument has one bit for every of the legacy
+ * groups, and a '1' in the mask causes a total of 8 groups
+ * which share the legacy group numbher and 8 qos levels,
+ * to be enabled for the calling processor core.
+ * A '0' in the mask will disable the current core
+ * from receiving work from the associated group.
+ */
+static inline u64 cvmx_pow_get_group_mask(u64 core_num)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_sso_ppx_sx_grpmskx_t grp_msk;
+               unsigned int core, node, i;
+               int rix; /* Register index */
+               u64 mask = 0;
+
+               node = cvmx_coremask_core_to_node(core_num);
+               core = cvmx_coremask_core_on_node(core_num);
+
+               /* 78xx: 256 groups divided into 4 X 64 bit registers */
+               /* 73xx: 64 groups are in one register */
+               for (rix = (cvmx_sso_num_xgrp() >> 6) - 1; rix >= 0; rix--) {
+                       /* read only mask_set=0 (both 'set' was written same) */
+                       grp_msk.u64 = csr_rd_node(node, CVMX_SSO_PPX_SX_GRPMSKX(core, 0, rix));
+                       /* ASSUME: (this is how mask bits got written) */
+                       /* grp_mask[7:0]: all bits 0..7 are same */
+                       /* grp_mask[15:8]: all bits 8..15 are same, etc */
+                       /* DO: mask[7:0] = grp_mask.u64[56,48,40,32,24,16,8,0] */
+                       for (i = 0; i < 8; i++)
+                               mask |= (grp_msk.u64 & ((u64)1 << (i * 8))) >> (7 * i);
+                       /* we collected 8 MSBs in mask[7:0], <<=8 and continue */
+                       if (cvmx_likely(rix != 0))
+                               mask <<= 8;
+               }
+               return mask & 0xFFFFFFFF;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               cvmx_sso_ppx_grp_msk_t grp_msk;
+
+               grp_msk.u64 = csr_rd(CVMX_SSO_PPX_GRP_MSK(core_num));
+               return grp_msk.u64;
+       } else {
+               cvmx_pow_pp_grp_mskx_t grp_msk;
+
+               grp_msk.u64 = csr_rd(CVMX_POW_PP_GRP_MSKX(core_num));
+               return grp_msk.u64 & 0xffff;
+       }
+}
+
+/*
+ * Returns 0 if 78xx(73xx,75xx) is not programmed in legacy compatible mode
+ * Returns 1 if 78xx(73xx,75xx) is programmed in legacy compatible mode
+ * Returns 1 if octeon model is not 78xx(73xx,75xx)
+ */
+static inline u64 cvmx_pow_is_legacy78mode(u64 core_num)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_sso_ppx_sx_grpmskx_t grp_msk0, grp_msk1;
+               unsigned int core, node, i;
+               int rix; /* Register index */
+               u64 mask = 0;
+
+               node = cvmx_coremask_core_to_node(core_num);
+               core = cvmx_coremask_core_on_node(core_num);
+
+               /* 78xx: 256 groups divided into 4 X 64 bit registers */
+               /* 73xx: 64 groups are in one register */
+               /* 1) in order for the 78_SSO to be in legacy compatible mode
+                * the both mask_sets should be programmed the same */
+               for (rix = (cvmx_sso_num_xgrp() >> 6) - 1; rix >= 0; rix--) {
+                       /* read mask_set=0 (both 'set' was written same) */
+                       grp_msk0.u64 = csr_rd_node(node, CVMX_SSO_PPX_SX_GRPMSKX(core, 0, rix));
+                       grp_msk1.u64 = csr_rd_node(node, CVMX_SSO_PPX_SX_GRPMSKX(core, 1, rix));
+                       if (grp_msk0.u64 != grp_msk1.u64) {
+                               return 0;
+                       }
+                       /* (this is how mask bits should be written) */
+                       /* grp_mask[7:0]: all bits 0..7 are same */
+                       /* grp_mask[15:8]: all bits 8..15 are same, etc */
+                       /* 2) in order for the 78_SSO to be in legacy compatible
+                        * mode above should be true (test only mask_set=0 */
+                       for (i = 0; i < 8; i++) {
+                               mask = (grp_msk0.u64 >> (i << 3)) & 0xFF;
+                               if (!(mask == 0 || mask == 0xFF)) {
+                                       return 0;
+                               }
+                       }
+               }
+               /* if we come here, the 78_SSO is in legacy compatible mode */
+       }
+       return 1; /* the SSO/POW is in legacy (or compatible) mode */
+}
+
+/**
+ * This function sets POW static priorities for a core. Each input queue has
+ * an associated priority value.
+ *
+ * @param core_num   core to apply priorities to
+ * @param priority   Vector of 8 priorities, one per POW Input Queue (0-7).
+ *                   Highest priority is 0 and lowest is 7. A priority value
+ *                   of 0xF instructs POW to skip the Input Queue when
+ *                   scheduling to this specific core.
+ *                   NOTE: priorities should not have gaps in values, meaning
+ *                         {0,1,1,1,1,1,1,1} is a valid configuration while
+ *                         {0,2,2,2,2,2,2,2} is not.
+ */
+static inline void cvmx_pow_set_priority(u64 core_num, const u8 priority[])
+{
+       /* Detect gaps between priorities and flag error */
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               int i;
+               u32 prio_mask = 0;
+
+               for (i = 0; i < 8; i++)
+                       if (priority[i] != 0xF)
+                               prio_mask |= 1 << priority[i];
+
+               if (prio_mask ^ ((1 << cvmx_pop(prio_mask)) - 1)) {
+                       debug("ERROR: POW static priorities should be contiguous (0x%llx)\n",
+                             (unsigned long long)prio_mask);
+                       return;
+               }
+       }
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               unsigned int group;
+               unsigned int node = cvmx_get_node_num();
+               cvmx_sso_grpx_pri_t grp_pri;
+
+               /*grp_pri.s.weight = 0x3f; these will be anyway overwritten */
+               /*grp_pri.s.affinity = 0xf; by the next csr_rd_node(..), */
+
+               for (group = 0; group < cvmx_sso_num_xgrp(); group++) {
+                       grp_pri.u64 = csr_rd_node(node, CVMX_SSO_GRPX_PRI(group));
+                       grp_pri.s.pri = priority[group & 0x7];
+                       csr_wr_node(node, CVMX_SSO_GRPX_PRI(group), grp_pri.u64);
+               }
+
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               cvmx_sso_ppx_qos_pri_t qos_pri;
+
+               qos_pri.u64 = csr_rd(CVMX_SSO_PPX_QOS_PRI(core_num));
+               qos_pri.s.qos0_pri = priority[0];
+               qos_pri.s.qos1_pri = priority[1];
+               qos_pri.s.qos2_pri = priority[2];
+               qos_pri.s.qos3_pri = priority[3];
+               qos_pri.s.qos4_pri = priority[4];
+               qos_pri.s.qos5_pri = priority[5];
+               qos_pri.s.qos6_pri = priority[6];
+               qos_pri.s.qos7_pri = priority[7];
+               csr_wr(CVMX_SSO_PPX_QOS_PRI(core_num), qos_pri.u64);
+       } else {
+               /* POW priorities on CN5xxx .. CN66XX */
+               cvmx_pow_pp_grp_mskx_t grp_msk;
+
+               grp_msk.u64 = csr_rd(CVMX_POW_PP_GRP_MSKX(core_num));
+               grp_msk.s.qos0_pri = priority[0];
+               grp_msk.s.qos1_pri = priority[1];
+               grp_msk.s.qos2_pri = priority[2];
+               grp_msk.s.qos3_pri = priority[3];
+               grp_msk.s.qos4_pri = priority[4];
+               grp_msk.s.qos5_pri = priority[5];
+               grp_msk.s.qos6_pri = priority[6];
+               grp_msk.s.qos7_pri = priority[7];
+
+               csr_wr(CVMX_POW_PP_GRP_MSKX(core_num), grp_msk.u64);
+       }
+}
+
+/**
+ * This function gets POW static priorities for a core. Each input queue has
+ * an associated priority value.
+ *
+ * @param[in]  core_num core to get priorities for
+ * @param[out] priority Pointer to u8[] where to return priorities
+ *                     Vector of 8 priorities, one per POW Input Queue (0-7).
+ *                     Highest priority is 0 and lowest is 7. A priority value
+ *                     of 0xF instructs POW to skip the Input Queue when
+ *                     scheduling to this specific core.
+ *                   NOTE: priorities should not have gaps in values, meaning
+ *                         {0,1,1,1,1,1,1,1} is a valid configuration while
+ *                         {0,2,2,2,2,2,2,2} is not.
+ */
+static inline void cvmx_pow_get_priority(u64 core_num, u8 priority[])
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               unsigned int group;
+               unsigned int node = cvmx_get_node_num();
+               cvmx_sso_grpx_pri_t grp_pri;
+
+               /* read priority only from the first 8 groups */
+               /* the next groups are programmed the same (periodicaly) */
+               for (group = 0; group < 8 /*cvmx_sso_num_xgrp() */; group++) {
+                       grp_pri.u64 = csr_rd_node(node, CVMX_SSO_GRPX_PRI(group));
+                       priority[group /* & 0x7 */] = grp_pri.s.pri;
+               }
+
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               cvmx_sso_ppx_qos_pri_t qos_pri;
+
+               qos_pri.u64 = csr_rd(CVMX_SSO_PPX_QOS_PRI(core_num));
+               priority[0] = qos_pri.s.qos0_pri;
+               priority[1] = qos_pri.s.qos1_pri;
+               priority[2] = qos_pri.s.qos2_pri;
+               priority[3] = qos_pri.s.qos3_pri;
+               priority[4] = qos_pri.s.qos4_pri;
+               priority[5] = qos_pri.s.qos5_pri;
+               priority[6] = qos_pri.s.qos6_pri;
+               priority[7] = qos_pri.s.qos7_pri;
+       } else {
+               /* POW priorities on CN5xxx .. CN66XX */
+               cvmx_pow_pp_grp_mskx_t grp_msk;
+
+               grp_msk.u64 = csr_rd(CVMX_POW_PP_GRP_MSKX(core_num));
+               priority[0] = grp_msk.s.qos0_pri;
+               priority[1] = grp_msk.s.qos1_pri;
+               priority[2] = grp_msk.s.qos2_pri;
+               priority[3] = grp_msk.s.qos3_pri;
+               priority[4] = grp_msk.s.qos4_pri;
+               priority[5] = grp_msk.s.qos5_pri;
+               priority[6] = grp_msk.s.qos6_pri;
+               priority[7] = grp_msk.s.qos7_pri;
+       }
+
+       /* Detect gaps between priorities and flag error - (optional) */
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               int i;
+               u32 prio_mask = 0;
+
+               for (i = 0; i < 8; i++)
+                       if (priority[i] != 0xF)
+                               prio_mask |= 1 << priority[i];
+
+               if (prio_mask ^ ((1 << cvmx_pop(prio_mask)) - 1)) {
+                       debug("ERROR:%s: POW static priorities should be contiguous (0x%llx)\n",
+                             __func__, (unsigned long long)prio_mask);
+                       return;
+               }
+       }
+}
+
+static inline void cvmx_sso_get_group_priority(int node, cvmx_xgrp_t xgrp, int *priority,
+                                              int *weight, int *affinity)
+{
+       cvmx_sso_grpx_pri_t grp_pri;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               debug("ERROR: %s is not supported on this chip)\n", __func__);
+               return;
+       }
+
+       grp_pri.u64 = csr_rd_node(node, CVMX_SSO_GRPX_PRI(xgrp.xgrp));
+       *affinity = grp_pri.s.affinity;
+       *priority = grp_pri.s.pri;
+       *weight = grp_pri.s.weight;
+}
+
+/**
+ * Performs a tag switch and then an immediate deschedule. This completes
+ * immediately, so completion must not be waited for.  This function does NOT
+ * update the wqe in DRAM to match arguments.
+ *
+ * This function does NOT wait for any prior tag switches to complete, so the
+ * calling code must do this.
+ *
+ * Note the following CAVEAT of the Octeon HW behavior when
+ * re-scheduling DE-SCHEDULEd items whose (next) state is
+ * ORDERED:
+ *   - If there are no switches pending at the time that the
+ *     HW executes the de-schedule, the HW will only re-schedule
+ *     the head of the FIFO associated with the given tag. This
+ *     means that in many respects, the HW treats this ORDERED
+ *     tag as an ATOMIC tag. Note that in the SWTAG_DESCH
+ *     case (to an ORDERED tag), the HW will do the switch
+ *     before the deschedule whenever it is possible to do
+ *     the switch immediately, so it may often look like
+ *     this case.
+ *   - If there is a pending switch to ORDERED at the time
+ *     the HW executes the de-schedule, the HW will perform
+ *     the switch at the time it re-schedules, and will be
+ *     able to reschedule any/all of the entries with the
+ *     same tag.
+ * Due to this behavior, the RECOMMENDATION to software is
+ * that they have a (next) state of ATOMIC when they
+ * DE-SCHEDULE. If an ORDERED tag is what was really desired,
+ * SW can choose to immediately switch to an ORDERED tag
+ * after the work (that has an ATOMIC tag) is re-scheduled.
+ * Note that since there are never any tag switches pending
+ * when the HW re-schedules, this switch can be IMMEDIATE upon
+ * the reception of the pointer during the re-schedule.
+ *
+ * @param tag      New tag value
+ * @param tag_type New tag type
+ * @param group    New group value
+ * @param no_sched Control whether this work queue entry will be rescheduled.
+ *                 - 1 : don't schedule this work
+ *                 - 0 : allow this work to be scheduled.
+ */
+static inline void cvmx_pow_tag_sw_desched_nocheck(u32 tag, cvmx_pow_tag_type_t tag_type, u64 group,
+                                                  u64 no_sched)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL,
+                            "%s called with NULL tag. Deschedule not allowed from NULL state\n",
+                            __func__);
+               cvmx_warn_if((current_tag.tag_type != CVMX_POW_TAG_TYPE_ATOMIC) &&
+                            (tag_type != CVMX_POW_TAG_TYPE_ATOMIC),
+                            "%s called where neither the before or after tag is ATOMIC\n",
+                            __func__);
+       }
+       tag_req.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_t *wqp = cvmx_pow_get_current_wqp();
+
+               if (!wqp) {
+                       debug("ERROR: Failed to get WQE, %s\n", __func__);
+                       return;
+               }
+               group &= 0x1f;
+               wqp->word1.cn78xx.tag = tag;
+               wqp->word1.cn78xx.tag_type = tag_type;
+               wqp->word1.cn78xx.grp = group << 3;
+               CVMX_SYNCWS;
+               tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_SWTAG_DESCH;
+               tag_req.s_cn78xx_other.type = tag_type;
+               tag_req.s_cn78xx_other.grp = group << 3;
+               tag_req.s_cn78xx_other.no_sched = no_sched;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               group &= 0x3f;
+               tag_req.s_cn68xx_other.op = CVMX_POW_TAG_OP_SWTAG_DESCH;
+               tag_req.s_cn68xx_other.tag = tag;
+               tag_req.s_cn68xx_other.type = tag_type;
+               tag_req.s_cn68xx_other.grp = group;
+               tag_req.s_cn68xx_other.no_sched = no_sched;
+       } else {
+               group &= 0x0f;
+               tag_req.s_cn38xx.op = CVMX_POW_TAG_OP_SWTAG_DESCH;
+               tag_req.s_cn38xx.tag = tag;
+               tag_req.s_cn38xx.type = tag_type;
+               tag_req.s_cn38xx.grp = group;
+               tag_req.s_cn38xx.no_sched = no_sched;
+       }
+       ptr.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_TAG3;
+               ptr.s_cn78xx.node = cvmx_get_node_num();
+               ptr.s_cn78xx.tag = tag;
+       } else {
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_TAG3;
+       }
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * Performs a tag switch and then an immediate deschedule. This completes
+ * immediately, so completion must not be waited for.  This function does NOT
+ * update the wqe in DRAM to match arguments.
+ *
+ * This function waits for any prior tag switches to complete, so the
+ * calling code may call this function with a pending tag switch.
+ *
+ * Note the following CAVEAT of the Octeon HW behavior when
+ * re-scheduling DE-SCHEDULEd items whose (next) state is
+ * ORDERED:
+ *   - If there are no switches pending at the time that the
+ *     HW executes the de-schedule, the HW will only re-schedule
+ *     the head of the FIFO associated with the given tag. This
+ *     means that in many respects, the HW treats this ORDERED
+ *     tag as an ATOMIC tag. Note that in the SWTAG_DESCH
+ *     case (to an ORDERED tag), the HW will do the switch
+ *     before the deschedule whenever it is possible to do
+ *     the switch immediately, so it may often look like
+ *     this case.
+ *   - If there is a pending switch to ORDERED at the time
+ *     the HW executes the de-schedule, the HW will perform
+ *     the switch at the time it re-schedules, and will be
+ *     able to reschedule any/all of the entries with the
+ *     same tag.
+ * Due to this behavior, the RECOMMENDATION to software is
+ * that they have a (next) state of ATOMIC when they
+ * DE-SCHEDULE. If an ORDERED tag is what was really desired,
+ * SW can choose to immediately switch to an ORDERED tag
+ * after the work (that has an ATOMIC tag) is re-scheduled.
+ * Note that since there are never any tag switches pending
+ * when the HW re-schedules, this switch can be IMMEDIATE upon
+ * the reception of the pointer during the re-schedule.
+ *
+ * @param tag      New tag value
+ * @param tag_type New tag type
+ * @param group    New group value
+ * @param no_sched Control whether this work queue entry will be rescheduled.
+ *                 - 1 : don't schedule this work
+ *                 - 0 : allow this work to be scheduled.
+ */
+static inline void cvmx_pow_tag_sw_desched(u32 tag, cvmx_pow_tag_type_t tag_type, u64 group,
+                                          u64 no_sched)
+{
+       /* Need to make sure any writes to the work queue entry are complete */
+       CVMX_SYNCWS;
+       /* Ensure that there is not a pending tag switch, as a tag switch cannot be started
+        * if a previous switch is still pending.  */
+       cvmx_pow_tag_sw_wait();
+       cvmx_pow_tag_sw_desched_nocheck(tag, tag_type, group, no_sched);
+}
+
+/**
+ * Descchedules the current work queue entry.
+ *
+ * @param no_sched no schedule flag value to be set on the work queue entry.
+ *     If this is set the entry will not be rescheduled.
+ */
+static inline void cvmx_pow_desched(u64 no_sched)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL,
+                            "%s called with NULL tag. Deschedule not expected from NULL state\n",
+                            __func__);
+       }
+       /* Need to make sure any writes to the work queue entry are complete */
+       CVMX_SYNCWS;
+
+       tag_req.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_DESCH;
+               tag_req.s_cn78xx_other.no_sched = no_sched;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               tag_req.s_cn68xx_other.op = CVMX_POW_TAG_OP_DESCH;
+               tag_req.s_cn68xx_other.no_sched = no_sched;
+       } else {
+               tag_req.s_cn38xx.op = CVMX_POW_TAG_OP_DESCH;
+               tag_req.s_cn38xx.no_sched = no_sched;
+       }
+       ptr.u64 = 0;
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+               ptr.s_cn78xx.is_io = 1;
+               ptr.s_cn78xx.did = CVMX_OCT_DID_TAG_TAG3;
+               ptr.s_cn78xx.node = cvmx_get_node_num();
+       } else {
+               ptr.s.mem_region = CVMX_IO_SEG;
+               ptr.s.is_io = 1;
+               ptr.s.did = CVMX_OCT_DID_TAG_TAG3;
+       }
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/******************************************************************************/
+/* OCTEON3-specific functions.                                                */
+/******************************************************************************/
+/**
+ * This function sets the the affinity of group to the cores in 78xx.
+ * It sets up all the cores in core_mask to accept work from the specified group.
+ *
+ * @param xgrp Group to accept work from, 0 - 255.
+ * @param core_mask    Mask of all the cores which will accept work from this group
+ * @param mask_set     Every core has set of 2 masks which can be set to accept work
+ *     from 256 groups. At the time of get_work, cores can choose which mask_set
+ *     to get work from. 'mask_set' values range from 0 to 3, where    each of the
+ *     two bits represents a mask set. Cores will be added to the mask set with
+ *     corresponding bit set, and removed from the mask set with corresponding
+ *     bit clear.
+ * Note: cores can only accept work from SSO groups on the same node,
+ * so the node number for the group is derived from the core number.
+ */
+static inline void cvmx_sso_set_group_core_affinity(cvmx_xgrp_t xgrp,
+                                                   const struct cvmx_coremask *core_mask,
+                                                   u8 mask_set)
+{
+       cvmx_sso_ppx_sx_grpmskx_t grp_msk;
+       int core;
+       int grp_index = xgrp.xgrp >> 6;
+       int bit_pos = xgrp.xgrp % 64;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               debug("ERROR: %s is not supported on this chip)\n", __func__);
+               return;
+       }
+       cvmx_coremask_for_each_core(core, core_mask)
+       {
+               unsigned int node, ncore;
+               u64 reg_addr;
+
+               node = cvmx_coremask_core_to_node(core);
+               ncore = cvmx_coremask_core_on_node(core);
+
+               reg_addr = CVMX_SSO_PPX_SX_GRPMSKX(ncore, 0, grp_index);
+               grp_msk.u64 = csr_rd_node(node, reg_addr);
+
+               if (mask_set & 1)
+                       grp_msk.s.grp_msk |= (1ull << bit_pos);
+               else
+                       grp_msk.s.grp_msk &= ~(1ull << bit_pos);
+
+               csr_wr_node(node, reg_addr, grp_msk.u64);
+
+               reg_addr = CVMX_SSO_PPX_SX_GRPMSKX(ncore, 1, grp_index);
+               grp_msk.u64 = csr_rd_node(node, reg_addr);
+
+               if (mask_set & 2)
+                       grp_msk.s.grp_msk |= (1ull << bit_pos);
+               else
+                       grp_msk.s.grp_msk &= ~(1ull << bit_pos);
+
+               csr_wr_node(node, reg_addr, grp_msk.u64);
+       }
+}
+
+/**
+ * This function sets the priority and group affinity arbitration for each group.
+ *
+ * @param node         Node number
+ * @param xgrp Group 0 - 255 to apply mask parameters to
+ * @param priority     Priority of the group relative to other groups
+ *     0x0 - highest priority
+ *     0x7 - lowest priority
+ * @param weight       Cross-group arbitration weight to apply to this group.
+ *     valid values are 1-63
+ *     h/w default is 0x3f
+ * @param affinity     Processor affinity arbitration weight to apply to this group.
+ *     If zero, affinity is disabled.
+ *     valid values are 0-15
+ *     h/w default which is 0xf.
+ * @param modify_mask   mask of the parameters which needs to be modified.
+ *     enum cvmx_sso_group_modify_mask
+ *     to modify only priority -- set bit0
+ *     to modify only weight   -- set bit1
+ *     to modify only affinity -- set bit2
+ */
+static inline void cvmx_sso_set_group_priority(int node, cvmx_xgrp_t xgrp, int priority, int weight,
+                                              int affinity,
+                                              enum cvmx_sso_group_modify_mask modify_mask)
+{
+       cvmx_sso_grpx_pri_t grp_pri;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               debug("ERROR: %s is not supported on this chip)\n", __func__);
+               return;
+       }
+       if (weight <= 0)
+               weight = 0x3f; /* Force HW default when out of range */
+
+       grp_pri.u64 = csr_rd_node(node, CVMX_SSO_GRPX_PRI(xgrp.xgrp));
+       if (grp_pri.s.weight == 0)
+               grp_pri.s.weight = 0x3f;
+       if (modify_mask & CVMX_SSO_MODIFY_GROUP_PRIORITY)
+               grp_pri.s.pri = priority;
+       if (modify_mask & CVMX_SSO_MODIFY_GROUP_WEIGHT)
+               grp_pri.s.weight = weight;
+       if (modify_mask & CVMX_SSO_MODIFY_GROUP_AFFINITY)
+               grp_pri.s.affinity = affinity;
+       csr_wr_node(node, CVMX_SSO_GRPX_PRI(xgrp.xgrp), grp_pri.u64);
+}
+
+/**
+ * Asynchronous work request.
+ * Only works on CN78XX style SSO.
+ *
+ * Work is requested from the SSO unit, and should later be checked with
+ * function cvmx_pow_work_response_async.
+ * This function does NOT wait for previous tag switches to complete,
+ * so the caller must ensure that there is not a pending tag switch.
+ *
+ * @param scr_addr Scratch memory address that response will be returned to,
+ *     which is either a valid WQE, or a response with the invalid bit set.
+ *     Byte address, must be 8 byte aligned.
+ * @param xgrp  Group to receive work for (0-255).
+ * @param wait
+ *     1 to cause response to wait for work to become available (or timeout)
+ *     0 to cause response to return immediately
+ */
+static inline void cvmx_sso_work_request_grp_async_nocheck(int scr_addr, cvmx_xgrp_t xgrp,
+                                                          cvmx_pow_wait_t wait)
+{
+       cvmx_pow_iobdma_store_t data;
+       unsigned int node = cvmx_get_node_num();
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               cvmx_warn_if(!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE), "Not CN78XX");
+       }
+       /* scr_addr must be 8 byte aligned */
+       data.u64 = 0;
+       data.s_cn78xx.scraddr = scr_addr >> 3;
+       data.s_cn78xx.len = 1;
+       data.s_cn78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+       data.s_cn78xx.grouped = 1;
+       data.s_cn78xx.index_grp_mask = (node << 8) | xgrp.xgrp;
+       data.s_cn78xx.wait = wait;
+       data.s_cn78xx.node = node;
+
+       cvmx_send_single(data.u64);
+}
+
+/**
+ * Synchronous work request from the node-local SSO without verifying
+ * pending tag switch. It requests work from a specific SSO group.
+ *
+ * @param lgrp The local group number (within the SSO of the node of the caller)
+ *     from which to get the work.
+ * @param wait When set, call stalls until work becomes available, or times out.
+ *     If not set, returns immediately.
+ *
+ * @return Returns the WQE pointer from SSO.
+ *     Returns NULL if no work was available.
+ */
+static inline void *cvmx_sso_work_request_grp_sync_nocheck(unsigned int lgrp, cvmx_pow_wait_t wait)
+{
+       cvmx_pow_load_addr_t ptr;
+       cvmx_pow_tag_load_resp_t result;
+       unsigned int node = cvmx_get_node_num() & 3;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               cvmx_warn_if(!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE), "Not CN78XX");
+       }
+       ptr.u64 = 0;
+       ptr.swork_78xx.mem_region = CVMX_IO_SEG;
+       ptr.swork_78xx.is_io = 1;
+       ptr.swork_78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+       ptr.swork_78xx.node = node;
+       ptr.swork_78xx.grouped = 1;
+       ptr.swork_78xx.index = (lgrp & 0xff) | node << 8;
+       ptr.swork_78xx.wait = wait;
+
+       result.u64 = csr_rd(ptr.u64);
+       if (result.s_work.no_work)
+               return NULL;
+       else
+               return cvmx_phys_to_ptr(result.s_work.addr);
+}
+
+/**
+ * Synchronous work request from the node-local SSO.
+ * It requests work from a specific SSO group.
+ * This function waits for any previous tag switch to complete before
+ * requesting the new work.
+ *
+ * @param lgrp The node-local group number from which to get the work.
+ * @param wait When set, call stalls until work becomes available, or times out.
+ *     If not set, returns immediately.
+ *
+ * @return The WQE pointer or NULL, if work is not available.
+ */
+static inline void *cvmx_sso_work_request_grp_sync(unsigned int lgrp, cvmx_pow_wait_t wait)
+{
+       cvmx_pow_tag_sw_wait();
+       return cvmx_sso_work_request_grp_sync_nocheck(lgrp, wait);
+}
+
+/**
+ * This function sets the group mask for a core.  The group mask bits
+ * indicate which groups each core will accept work from.
+ *
+ * @param core_num     Processor core to apply mask to.
+ * @param mask_set     7XXX has 2 sets of masks per core.
+ *     Bit 0 represents the first mask set, bit 1 -- the second.
+ * @param xgrp_mask    Group mask array.
+ *     Total number of groups is divided into a number of
+ *     64-bits mask sets. Each bit in the mask, if set, enables
+ *     the core to accept work from the corresponding group.
+ *
+ * NOTE: Each core can be configured to accept work in accordance to both
+ * mask sets, with the first having higher precedence over the second,
+ * or to accept work in accordance to just one of the two mask sets.
+ * The 'core_num' argument represents a processor core on any node
+ * in a coherent multi-chip system.
+ *
+ * If the 'mask_set' argument is 3, both mask sets are configured
+ * with the same value (which is not typically the intention),
+ * so keep in mind the function needs to be called twice
+ * to set a different value into each of the mask sets,
+ * once with 'mask_set=1' and second time with 'mask_set=2'.
+ */
+static inline void cvmx_pow_set_xgrp_mask(u64 core_num, u8 mask_set, const u64 xgrp_mask[])
+{
+       unsigned int grp, node, core;
+       u64 reg_addr;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               debug("ERROR: %s is not supported on this chip)\n", __func__);
+               return;
+       }
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_warn_if(((mask_set < 1) || (mask_set > 3)), "Invalid mask set");
+       }
+
+       if ((mask_set < 1) || (mask_set > 3))
+               mask_set = 3;
+
+       node = cvmx_coremask_core_to_node(core_num);
+       core = cvmx_coremask_core_on_node(core_num);
+
+       for (grp = 0; grp < (cvmx_sso_num_xgrp() >> 6); grp++) {
+               if (mask_set & 1) {
+                       reg_addr = CVMX_SSO_PPX_SX_GRPMSKX(core, 0, grp),
+                       csr_wr_node(node, reg_addr, xgrp_mask[grp]);
+               }
+               if (mask_set & 2) {
+                       reg_addr = CVMX_SSO_PPX_SX_GRPMSKX(core, 1, grp),
+                       csr_wr_node(node, reg_addr, xgrp_mask[grp]);
+               }
+       }
+}
+
+/**
+ * This function gets the group mask for a core.  The group mask bits
+ * indicate which groups each core will accept work from.
+ *
+ * @param core_num     Processor core to apply mask to.
+ * @param mask_set     7XXX has 2 sets of masks per core.
+ *     Bit 0 represents the first mask set, bit 1 -- the second.
+ * @param xgrp_mask    Provide pointer to u64 mask[8] output array.
+ *     Total number of groups is divided into a number of
+ *     64-bits mask sets. Each bit in the mask represents
+ *     the core accepts work from the corresponding group.
+ *
+ * NOTE: Each core can be configured to accept work in accordance to both
+ * mask sets, with the first having higher precedence over the second,
+ * or to accept work in accordance to just one of the two mask sets.
+ * The 'core_num' argument represents a processor core on any node
+ * in a coherent multi-chip system.
+ */
+static inline void cvmx_pow_get_xgrp_mask(u64 core_num, u8 mask_set, u64 *xgrp_mask)
+{
+       cvmx_sso_ppx_sx_grpmskx_t grp_msk;
+       unsigned int grp, node, core;
+       u64 reg_addr;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               debug("ERROR: %s is not supported on this chip)\n", __func__);
+               return;
+       }
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_warn_if(mask_set != 1 && mask_set != 2, "Invalid mask set");
+       }
+
+       node = cvmx_coremask_core_to_node(core_num);
+       core = cvmx_coremask_core_on_node(core_num);
+
+       for (grp = 0; grp < cvmx_sso_num_xgrp() >> 6; grp++) {
+               if (mask_set & 1) {
+                       reg_addr = CVMX_SSO_PPX_SX_GRPMSKX(core, 0, grp),
+                       grp_msk.u64 = csr_rd_node(node, reg_addr);
+                       xgrp_mask[grp] = grp_msk.s.grp_msk;
+               }
+               if (mask_set & 2) {
+                       reg_addr = CVMX_SSO_PPX_SX_GRPMSKX(core, 1, grp),
+                       grp_msk.u64 = csr_rd_node(node, reg_addr);
+                       xgrp_mask[grp] = grp_msk.s.grp_msk;
+               }
+       }
+}
+
+/**
+ * Executes SSO SWTAG command.
+ * This is similar to cvmx_pow_tag_sw() function, but uses linear
+ * (vs. integrated group-qos) group index.
+ */
+static inline void cvmx_pow_tag_sw_node(cvmx_wqe_t *wqp, u32 tag, cvmx_pow_tag_type_t tag_type,
+                                       int node)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (cvmx_unlikely(!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))) {
+               debug("ERROR: %s is supported on OCTEON3 only\n", __func__);
+               return;
+       }
+       CVMX_SYNCWS;
+       cvmx_pow_tag_sw_wait();
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL,
+                            "%s called with NULL tag\n", __func__);
+               cvmx_warn_if((current_tag.tag_type == tag_type) && (current_tag.tag == tag),
+                            "%s called to perform a tag switch to the same tag\n", __func__);
+               cvmx_warn_if(
+                       tag_type == CVMX_POW_TAG_TYPE_NULL,
+                       "%s called to perform a tag switch to NULL. Use cvmx_pow_tag_sw_null() instead\n",
+                       __func__);
+       }
+       wqp->word1.cn78xx.tag = tag;
+       wqp->word1.cn78xx.tag_type = tag_type;
+       CVMX_SYNCWS;
+
+       tag_req.u64 = 0;
+       tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_SWTAG;
+       tag_req.s_cn78xx_other.type = tag_type;
+
+       ptr.u64 = 0;
+       ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+       ptr.s_cn78xx.is_io = 1;
+       ptr.s_cn78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+       ptr.s_cn78xx.node = node;
+       ptr.s_cn78xx.tag = tag;
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * Executes SSO SWTAG_FULL command.
+ * This is similar to cvmx_pow_tag_sw_full() function, but
+ * uses linear (vs. integrated group-qos) group index.
+ */
+static inline void cvmx_pow_tag_sw_full_node(cvmx_wqe_t *wqp, u32 tag, cvmx_pow_tag_type_t tag_type,
+                                            u8 xgrp, int node)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+       u16 gxgrp;
+
+       if (cvmx_unlikely(!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))) {
+               debug("ERROR: %s is supported on OCTEON3 only\n", __func__);
+               return;
+       }
+       /* Ensure that there is not a pending tag switch, as a tag switch cannot be
+        * started, if a previous switch is still pending. */
+       CVMX_SYNCWS;
+       cvmx_pow_tag_sw_wait();
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if((current_tag.tag_type == tag_type) && (current_tag.tag == tag),
+                            "%s called to perform a tag switch to the same tag\n", __func__);
+               cvmx_warn_if(
+                       tag_type == CVMX_POW_TAG_TYPE_NULL,
+                       "%s called to perform a tag switch to NULL. Use cvmx_pow_tag_sw_null() instead\n",
+                       __func__);
+               if ((wqp != cvmx_phys_to_ptr(0x80)) && cvmx_pow_get_current_wqp())
+                       cvmx_warn_if(wqp != cvmx_pow_get_current_wqp(),
+                                    "%s passed WQE(%p) doesn't match the address in the POW(%p)\n",
+                                    __func__, wqp, cvmx_pow_get_current_wqp());
+       }
+       gxgrp = node;
+       gxgrp = gxgrp << 8 | xgrp;
+       wqp->word1.cn78xx.grp = gxgrp;
+       wqp->word1.cn78xx.tag = tag;
+       wqp->word1.cn78xx.tag_type = tag_type;
+       CVMX_SYNCWS;
+
+       tag_req.u64 = 0;
+       tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_SWTAG_FULL;
+       tag_req.s_cn78xx_other.type = tag_type;
+       tag_req.s_cn78xx_other.grp = gxgrp;
+       tag_req.s_cn78xx_other.wqp = cvmx_ptr_to_phys(wqp);
+
+       ptr.u64 = 0;
+       ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+       ptr.s_cn78xx.is_io = 1;
+       ptr.s_cn78xx.did = CVMX_OCT_DID_TAG_SWTAG;
+       ptr.s_cn78xx.node = node;
+       ptr.s_cn78xx.tag = tag;
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * Submits work to an SSO group on any OCI node.
+ * This function updates the work queue entry in DRAM to match
+ * the arguments given.
+ * Note that the tag provided is for the work queue entry submitted,
+ * and is unrelated to the tag that the core currently holds.
+ *
+ * @param wqp pointer to work queue entry to submit.
+ * This entry is updated to match the other parameters
+ * @param tag tag value to be assigned to work queue entry
+ * @param tag_type type of tag
+ * @param xgrp native CN78XX group in the range 0..255
+ * @param node The OCI node number for the target group
+ *
+ * When this function is called on a model prior to CN78XX, which does
+ * not support OCI nodes, the 'node' argument is ignored, and the 'xgrp'
+ * parameter is converted into 'qos' (the lower 3 bits) and 'grp' (the higher
+ * 5 bits), following the backward-compatibility scheme of translating
+ * between new and old style group numbers.
+ */
+static inline void cvmx_pow_work_submit_node(cvmx_wqe_t *wqp, u32 tag, cvmx_pow_tag_type_t tag_type,
+                                            u8 xgrp, u8 node)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+       u16 group;
+
+       if (cvmx_unlikely(!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))) {
+               debug("ERROR: %s is supported on OCTEON3 only\n", __func__);
+               return;
+       }
+       group = node;
+       group = group << 8 | xgrp;
+       wqp->word1.cn78xx.tag = tag;
+       wqp->word1.cn78xx.tag_type = tag_type;
+       wqp->word1.cn78xx.grp = group;
+       CVMX_SYNCWS;
+
+       tag_req.u64 = 0;
+       tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_ADDWQ;
+       tag_req.s_cn78xx_other.type = tag_type;
+       tag_req.s_cn78xx_other.wqp = cvmx_ptr_to_phys(wqp);
+       tag_req.s_cn78xx_other.grp = group;
+
+       ptr.u64 = 0;
+       ptr.s_cn78xx.did = 0x66; // CVMX_OCT_DID_TAG_TAG6;
+       ptr.s_cn78xx.mem_region = CVMX_IO_SEG;
+       ptr.s_cn78xx.is_io = 1;
+       ptr.s_cn78xx.node = node;
+       ptr.s_cn78xx.tag = tag;
+
+       /* SYNC write to memory before the work submit.  This is necessary
+        ** as POW may read values from DRAM at this time */
+       CVMX_SYNCWS;
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/**
+ * Executes the SSO SWTAG_DESCHED operation.
+ * This is similar to the cvmx_pow_tag_sw_desched() function, but
+ * uses linear (vs. unified group-qos) group index.
+ */
+static inline void cvmx_pow_tag_sw_desched_node(cvmx_wqe_t *wqe, u32 tag,
+                                               cvmx_pow_tag_type_t tag_type, u8 xgrp, u64 no_sched,
+                                               u8 node)
+{
+       union cvmx_pow_tag_req_addr ptr;
+       cvmx_pow_tag_req_t tag_req;
+       u16 group;
+
+       if (cvmx_unlikely(!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))) {
+               debug("ERROR: %s is supported on OCTEON3 only\n", __func__);
+               return;
+       }
+       /* Need to make sure any writes to the work queue entry are complete */
+       CVMX_SYNCWS;
+       /*
+        * Ensure that there is not a pending tag switch, as a tag switch cannot
+        * be started if a previous switch is still pending.
+        */
+       cvmx_pow_tag_sw_wait();
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_info_t current_tag;
+
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL_NULL,
+                            "%s called with NULL_NULL tag\n", __func__);
+               cvmx_warn_if(current_tag.tag_type == CVMX_POW_TAG_TYPE_NULL,
+                            "%s called with NULL tag. Deschedule not allowed from NULL state\n",
+                            __func__);
+               cvmx_warn_if((current_tag.tag_type != CVMX_POW_TAG_TYPE_ATOMIC) &&
+                            (tag_type != CVMX_POW_TAG_TYPE_ATOMIC),
+                            "%s called where neither the before or after tag is ATOMIC\n",
+                            __func__);
+       }
+       group = node;
+       group = group << 8 | xgrp;
+       wqe->word1.cn78xx.tag = tag;
+       wqe->word1.cn78xx.tag_type = tag_type;
+       wqe->word1.cn78xx.grp = group;
+       CVMX_SYNCWS;
+
+       tag_req.u64 = 0;
+       tag_req.s_cn78xx_other.op = CVMX_POW_TAG_OP_SWTAG_DESCH;
+       tag_req.s_cn78xx_other.type = tag_type;
+       tag_req.s_cn78xx_other.grp = group;
+       tag_req.s_cn78xx_other.no_sched = no_sched;
+
+       ptr.u64 = 0;
+       ptr.s.mem_region = CVMX_IO_SEG;
+       ptr.s.is_io = 1;
+       ptr.s.did = CVMX_OCT_DID_TAG_TAG3;
+       ptr.s_cn78xx.node = node;
+       ptr.s_cn78xx.tag = tag;
+       cvmx_write_io(ptr.u64, tag_req.u64);
+}
+
+/* Executes the UPD_WQP_GRP SSO operation.
+ *
+ * @param wqp  Pointer to the new work queue entry to switch to.
+ * @param xgrp SSO group in the range 0..255
+ *
+ * NOTE: The operation can be performed only on the local node.
+ */
+static inline void cvmx_sso_update_wqp_group(cvmx_wqe_t *wqp, u8 xgrp)
+{
+       union cvmx_pow_tag_req_addr addr;
+       cvmx_pow_tag_req_t data;
+       int node = cvmx_get_node_num();
+       int group = node << 8 | xgrp;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               debug("ERROR: %s is not supported on this chip)\n", __func__);
+               return;
+       }
+       wqp->word1.cn78xx.grp = group;
+       CVMX_SYNCWS;
+
+       data.u64 = 0;
+       data.s_cn78xx_other.op = CVMX_POW_TAG_OP_UPDATE_WQP_GRP;
+       data.s_cn78xx_other.grp = group;
+       data.s_cn78xx_other.wqp = cvmx_ptr_to_phys(wqp);
+
+       addr.u64 = 0;
+       addr.s_cn78xx.mem_region = CVMX_IO_SEG;
+       addr.s_cn78xx.is_io = 1;
+       addr.s_cn78xx.did = CVMX_OCT_DID_TAG_TAG1;
+       addr.s_cn78xx.node = node;
+       cvmx_write_io(addr.u64, data.u64);
+}
+
+/******************************************************************************/
+/* Define usage of bits within the 32 bit tag values.                         */
+/******************************************************************************/
+/*
+ * Number of bits of the tag used by software.  The SW bits
+ * are always a contiguous block of the high starting at bit 31.
+ * The hardware bits are always the low bits.  By default, the top 8 bits
+ * of the tag are reserved for software, and the low 24 are set by the IPD unit.
+ */
+#define CVMX_TAG_SW_BITS  (8)
+#define CVMX_TAG_SW_SHIFT (32 - CVMX_TAG_SW_BITS)
+
+/* Below is the list of values for the top 8 bits of the tag. */
+/*
+ * Tag values with top byte of this value are reserved for internal executive
+ * uses
+ */
+#define CVMX_TAG_SW_BITS_INTERNAL 0x1
+
+/*
+ * The executive divides the remaining 24 bits as follows:
+ * the upper 8 bits (bits 23 - 16 of the tag) define a subgroup
+ * the lower 16 bits (bits 15 - 0 of the tag) define are the value with
+ * the subgroup. Note that this section describes the format of tags generated
+ * by software - refer to the hardware documentation for a description of the
+ * tags values generated by the packet input hardware.
+ * Subgroups are defined here
+ */
+
+/* Mask for the value portion of the tag */
+#define CVMX_TAG_SUBGROUP_MASK 0xFFFF
+#define CVMX_TAG_SUBGROUP_SHIFT 16
+#define CVMX_TAG_SUBGROUP_PKO  0x1
+
+/* End of executive tag subgroup definitions */
+
+/* The remaining values software bit values 0x2 - 0xff are available
+ * for application use */
+
+/**
+ * This function creates a 32 bit tag value from the two values provided.
+ *
+ * @param sw_bits The upper bits (number depends on configuration) are set
+ *     to this value.  The remainder of bits are set by the hw_bits parameter.
+ * @param hw_bits The lower bits (number depends on configuration) are set
+ *     to this value.  The remainder of bits are set by the sw_bits parameter.
+ *
+ * @return 32 bit value of the combined hw and sw bits.
+ */
+static inline u32 cvmx_pow_tag_compose(u64 sw_bits, u64 hw_bits)
+{
+       return (((sw_bits & cvmx_build_mask(CVMX_TAG_SW_BITS)) << CVMX_TAG_SW_SHIFT) |
+               (hw_bits & cvmx_build_mask(32 - CVMX_TAG_SW_BITS)));
+}
+
+/**
+ * Extracts the bits allocated for software use from the tag
+ *
+ * @param tag    32 bit tag value
+ *
+ * @return N bit software tag value, where N is configurable with
+ *     the CVMX_TAG_SW_BITS define
+ */
+static inline u32 cvmx_pow_tag_get_sw_bits(u64 tag)
+{
+       return ((tag >> (32 - CVMX_TAG_SW_BITS)) & cvmx_build_mask(CVMX_TAG_SW_BITS));
+}
+
+/**
+ *
+ * Extracts the bits allocated for hardware use from the tag
+ *
+ * @param tag    32 bit tag value
+ *
+ * @return (32 - N) bit software tag value, where N is configurable with
+ *     the CVMX_TAG_SW_BITS define
+ */
+static inline u32 cvmx_pow_tag_get_hw_bits(u64 tag)
+{
+       return (tag & cvmx_build_mask(32 - CVMX_TAG_SW_BITS));
+}
+
+static inline u64 cvmx_sso3_get_wqe_count(int node)
+{
+       cvmx_sso_grpx_aq_cnt_t aq_cnt;
+       unsigned int grp = 0;
+       u64 cnt = 0;
+
+       for (grp = 0; grp < cvmx_sso_num_xgrp(); grp++) {
+               aq_cnt.u64 = csr_rd_node(node, CVMX_SSO_GRPX_AQ_CNT(grp));
+               cnt += aq_cnt.s.aq_cnt;
+       }
+       return cnt;
+}
+
+static inline u64 cvmx_sso_get_total_wqe_count(void)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               int node = cvmx_get_node_num();
+
+               return cvmx_sso3_get_wqe_count(node);
+       } else if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
+               cvmx_sso_iq_com_cnt_t sso_iq_com_cnt;
+
+               sso_iq_com_cnt.u64 = csr_rd(CVMX_SSO_IQ_COM_CNT);
+               return (sso_iq_com_cnt.s.iq_cnt);
+       } else {
+               cvmx_pow_iq_com_cnt_t pow_iq_com_cnt;
+
+               pow_iq_com_cnt.u64 = csr_rd(CVMX_POW_IQ_COM_CNT);
+               return (pow_iq_com_cnt.s.iq_cnt);
+       }
+}
+
+/**
+ * Store the current POW internal state into the supplied
+ * buffer. It is recommended that you pass a buffer of at least
+ * 128KB. The format of the capture may change based on SDK
+ * version and Octeon chip.
+ *
+ * @param buffer Buffer to store capture into
+ * @param buffer_size The size of the supplied buffer
+ *
+ * @return Zero on success, negative on failure
+ */
+int cvmx_pow_capture(void *buffer, int buffer_size);
+
+/**
+ * Dump a POW capture to the console in a human readable format.
+ *
+ * @param buffer POW capture from cvmx_pow_capture()
+ * @param buffer_size Size of the buffer
+ */
+void cvmx_pow_display(void *buffer, int buffer_size);
+
+/**
+ * Return the number of POW entries supported by this chip
+ *
+ * @return Number of POW entries
+ */
+int cvmx_pow_get_num_entries(void);
+int cvmx_pow_get_dump_size(void);
+
+/**
+ * This will allocate count number of SSO groups on the specified node to the
+ * calling application. These groups will be for exclusive use of the
+ * application until they are freed.
+ * @param node The numa node for the allocation.
+ * @param base_group Pointer to the initial group, -1 to allocate anywhere.
+ * @param count  The number of consecutive groups to allocate.
+ * @return 0 on success and -1 on failure.
+ */
+int cvmx_sso_reserve_group_range(int node, int *base_group, int count);
+#define cvmx_sso_allocate_group_range cvmx_sso_reserve_group_range
+int cvmx_sso_reserve_group(int node);
+#define cvmx_sso_allocate_group cvmx_sso_reserve_group
+int cvmx_sso_release_group_range(int node, int base_group, int count);
+int cvmx_sso_release_group(int node, int group);
+
+/**
+ * Show integrated SSO configuration.
+ *
+ * @param node    node number
+ */
+int cvmx_sso_config_dump(unsigned int node);
+
+/**
+ * Show integrated SSO statistics.
+ *
+ * @param node    node number
+ */
+int cvmx_sso_stats_dump(unsigned int node);
+
+/**
+ * Clear integrated SSO statistics.
+ *
+ * @param node    node number
+ */
+int cvmx_sso_stats_clear(unsigned int node);
+
+/**
+ * Show SSO core-group affinity and priority per node (multi-node systems)
+ */
+void cvmx_pow_mask_priority_dump_node(unsigned int node, struct cvmx_coremask *avail_coremask);
+
+/**
+ * Show POW/SSO core-group affinity and priority (legacy, single-node systems)
+ */
+static inline void cvmx_pow_mask_priority_dump(struct cvmx_coremask *avail_coremask)
+{
+       cvmx_pow_mask_priority_dump_node(0 /*node */, avail_coremask);
+}
+
+/**
+ * Show SSO performance counters (multi-node systems)
+ */
+void cvmx_pow_show_perf_counters_node(unsigned int node);
+
+/**
+ * Show POW/SSO performance counters (legacy, single-node systems)
+ */
+static inline void cvmx_pow_show_perf_counters(void)
+{
+       cvmx_pow_show_perf_counters_node(0 /*node */);
+}
+
+#endif /* __CVMX_POW_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-qlm.h b/arch/mips/mach-octeon/include/mach/cvmx-qlm.h
new file mode 100644 (file)
index 0000000..19915eb
--- /dev/null
@@ -0,0 +1,304 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_QLM_H__
+#define __CVMX_QLM_H__
+
+/*
+ * Interface 0 on the 78xx can be connected to qlm 0 or qlm 2. When interface
+ * 0 is connected to qlm 0, this macro must be set to 0. When interface 0 is
+ * connected to qlm 2, this macro must be set to 1.
+ */
+#define MUX_78XX_IFACE0 0
+
+/*
+ * Interface 1 on the 78xx can be connected to qlm 1 or qlm 3. When interface
+ * 1 is connected to qlm 1, this macro must be set to 0. When interface 1 is
+ * connected to qlm 3, this macro must be set to 1.
+ */
+#define MUX_78XX_IFACE1 0
+
+/* Uncomment this line to print QLM JTAG state */
+/* #define CVMX_QLM_DUMP_STATE 1 */
+
+typedef struct {
+       const char *name;
+       int stop_bit;
+       int start_bit;
+} __cvmx_qlm_jtag_field_t;
+
+/**
+ * Return the number of QLMs supported by the chip
+ *
+ * @return  Number of QLMs
+ */
+int cvmx_qlm_get_num(void);
+
+/**
+ * Return the qlm number based on the interface
+ *
+ * @param xiface  Interface to look
+ */
+int cvmx_qlm_interface(int xiface);
+
+/**
+ * Return the qlm number based for a port in the interface
+ *
+ * @param xiface  interface to look up
+ * @param index  index in an interface
+ *
+ * @return the qlm number based on the xiface
+ */
+int cvmx_qlm_lmac(int xiface, int index);
+
+/**
+ * Return if only DLM5/DLM6/DLM5+DLM6 is used by BGX
+ *
+ * @param BGX  BGX to search for.
+ *
+ * @return muxes used 0 = DLM5+DLM6, 1 = DLM5, 2 = DLM6.
+ */
+int cvmx_qlm_mux_interface(int bgx);
+
+/**
+ * Return number of lanes for a given qlm
+ *
+ * @param qlm QLM block to query
+ *
+ * @return  Number of lanes
+ */
+int cvmx_qlm_get_lanes(int qlm);
+
+/**
+ * Get the QLM JTAG fields based on Octeon model on the supported chips.
+ *
+ * @return  qlm_jtag_field_t structure
+ */
+const __cvmx_qlm_jtag_field_t *cvmx_qlm_jtag_get_field(void);
+
+/**
+ * Get the QLM JTAG length by going through qlm_jtag_field for each
+ * Octeon model that is supported
+ *
+ * @return return the length.
+ */
+int cvmx_qlm_jtag_get_length(void);
+
+/**
+ * Initialize the QLM layer
+ */
+void cvmx_qlm_init(void);
+
+/**
+ * Get a field in a QLM JTAG chain
+ *
+ * @param qlm    QLM to get
+ * @param lane   Lane in QLM to get
+ * @param name   String name of field
+ *
+ * @return JTAG field value
+ */
+u64 cvmx_qlm_jtag_get(int qlm, int lane, const char *name);
+
+/**
+ * Set a field in a QLM JTAG chain
+ *
+ * @param qlm    QLM to set
+ * @param lane   Lane in QLM to set, or -1 for all lanes
+ * @param name   String name of field
+ * @param value  Value of the field
+ */
+void cvmx_qlm_jtag_set(int qlm, int lane, const char *name, u64 value);
+
+/**
+ * Errata G-16094: QLM Gen2 Equalizer Default Setting Change.
+ * CN68XX pass 1.x and CN66XX pass 1.x QLM tweak. This function tweaks the
+ * JTAG setting for a QLMs to run better at 5 and 6.25Ghz.
+ */
+void __cvmx_qlm_speed_tweak(void);
+
+/**
+ * Errata G-16174: QLM Gen2 PCIe IDLE DAC change.
+ * CN68XX pass 1.x, CN66XX pass 1.x and CN63XX pass 1.0-2.2 QLM tweak.
+ * This function tweaks the JTAG setting for a QLMs for PCIe to run better.
+ */
+void __cvmx_qlm_pcie_idle_dac_tweak(void);
+
+void __cvmx_qlm_pcie_cfg_rxd_set_tweak(int qlm, int lane);
+
+/**
+ * Get the speed (Gbaud) of the QLM in Mhz.
+ *
+ * @param qlm    QLM to examine
+ *
+ * @return Speed in Mhz
+ */
+int cvmx_qlm_get_gbaud_mhz(int qlm);
+/**
+ * Get the speed (Gbaud) of the QLM in Mhz on specific node.
+ *
+ * @param node   Target QLM node
+ * @param qlm    QLM to examine
+ *
+ * @return Speed in Mhz
+ */
+int cvmx_qlm_get_gbaud_mhz_node(int node, int qlm);
+
+enum cvmx_qlm_mode {
+       CVMX_QLM_MODE_DISABLED = -1,
+       CVMX_QLM_MODE_SGMII = 1,
+       CVMX_QLM_MODE_XAUI,
+       CVMX_QLM_MODE_RXAUI,
+       CVMX_QLM_MODE_PCIE,     /* gen3 / gen2 / gen1 */
+       CVMX_QLM_MODE_PCIE_1X2, /* 1x2 gen2 / gen1 */
+       CVMX_QLM_MODE_PCIE_2X1, /* 2x1 gen2 / gen1 */
+       CVMX_QLM_MODE_PCIE_1X1, /* 1x1 gen2 / gen1 */
+       CVMX_QLM_MODE_SRIO_1X4, /* 1x4 short / long */
+       CVMX_QLM_MODE_SRIO_2X2, /* 2x2 short / long */
+       CVMX_QLM_MODE_SRIO_4X1, /* 4x1 short / long */
+       CVMX_QLM_MODE_ILK,
+       CVMX_QLM_MODE_QSGMII,
+       CVMX_QLM_MODE_SGMII_SGMII,
+       CVMX_QLM_MODE_SGMII_DISABLED,
+       CVMX_QLM_MODE_DISABLED_SGMII,
+       CVMX_QLM_MODE_SGMII_QSGMII,
+       CVMX_QLM_MODE_QSGMII_QSGMII,
+       CVMX_QLM_MODE_QSGMII_DISABLED,
+       CVMX_QLM_MODE_DISABLED_QSGMII,
+       CVMX_QLM_MODE_QSGMII_SGMII,
+       CVMX_QLM_MODE_RXAUI_1X2,
+       CVMX_QLM_MODE_SATA_2X1,
+       CVMX_QLM_MODE_XLAUI,
+       CVMX_QLM_MODE_XFI,
+       CVMX_QLM_MODE_10G_KR,
+       CVMX_QLM_MODE_40G_KR4,
+       CVMX_QLM_MODE_PCIE_1X8, /* 1x8 gen3 / gen2 / gen1 */
+       CVMX_QLM_MODE_RGMII_SGMII,
+       CVMX_QLM_MODE_RGMII_XFI,
+       CVMX_QLM_MODE_RGMII_10G_KR,
+       CVMX_QLM_MODE_RGMII_RXAUI,
+       CVMX_QLM_MODE_RGMII_XAUI,
+       CVMX_QLM_MODE_RGMII_XLAUI,
+       CVMX_QLM_MODE_RGMII_40G_KR4,
+       CVMX_QLM_MODE_MIXED,            /* BGX2 is mixed mode, DLM5(SGMII) & DLM6(XFI) */
+       CVMX_QLM_MODE_SGMII_2X1,        /* Configure BGX2 separate for DLM5 & DLM6 */
+       CVMX_QLM_MODE_10G_KR_1X2,       /* Configure BGX2 separate for DLM5 & DLM6 */
+       CVMX_QLM_MODE_XFI_1X2,          /* Configure BGX2 separate for DLM5 & DLM6 */
+       CVMX_QLM_MODE_RGMII_SGMII_1X1,  /* Configure BGX2, applies to DLM5 */
+       CVMX_QLM_MODE_RGMII_SGMII_2X1,  /* Configure BGX2, applies to DLM6 */
+       CVMX_QLM_MODE_RGMII_10G_KR_1X1, /* Configure BGX2, applies to DLM6 */
+       CVMX_QLM_MODE_RGMII_XFI_1X1,    /* Configure BGX2, applies to DLM6 */
+       CVMX_QLM_MODE_SDL,              /* RMAC Pipe */
+       CVMX_QLM_MODE_CPRI,             /* RMAC */
+       CVMX_QLM_MODE_OCI
+};
+
+enum cvmx_gmx_inf_mode {
+       CVMX_GMX_INF_MODE_DISABLED = 0,
+       CVMX_GMX_INF_MODE_SGMII = 1,  /* Other interface can be SGMII or QSGMII */
+       CVMX_GMX_INF_MODE_QSGMII = 2, /* Other interface can be SGMII or QSGMII */
+       CVMX_GMX_INF_MODE_RXAUI = 3,  /* Only interface 0, interface 1 must be DISABLED */
+};
+
+/**
+ * Eye diagram captures are stored in the following structure
+ */
+typedef struct {
+       int width;         /* Width in the x direction (time) */
+       int height;        /* Height in the y direction (voltage) */
+       u32 data[64][128]; /* Error count at location, saturates as max */
+} cvmx_qlm_eye_t;
+
+/**
+ * These apply to DLM1 and DLM2 if its not in SATA mode
+ * Manual refers to lanes as follows:
+ *  DML 0 lane 0 == GSER0 lane 0
+ *  DML 0 lane 1 == GSER0 lane 1
+ *  DML 1 lane 2 == GSER1 lane 0
+ *  DML 1 lane 3 == GSER1 lane 1
+ *  DML 2 lane 4 == GSER2 lane 0
+ *  DML 2 lane 5 == GSER2 lane 1
+ */
+enum cvmx_pemx_cfg_mode {
+       CVMX_PEM_MD_GEN2_2LANE = 0, /* Valid for PEM0(DLM1), PEM1(DLM2) */
+       CVMX_PEM_MD_GEN2_1LANE = 1, /* Valid for PEM0(DLM1.0), PEM1(DLM1.1,DLM2.0), PEM2(DLM2.1) */
+       CVMX_PEM_MD_GEN2_4LANE = 2, /* Valid for PEM0(DLM1-2) */
+       /* Reserved */
+       CVMX_PEM_MD_GEN1_2LANE = 4, /* Valid for PEM0(DLM1), PEM1(DLM2) */
+       CVMX_PEM_MD_GEN1_1LANE = 5, /* Valid for PEM0(DLM1.0), PEM1(DLM1.1,DLM2.0), PEM2(DLM2.1) */
+       CVMX_PEM_MD_GEN1_4LANE = 6, /* Valid for PEM0(DLM1-2) */
+       /* Reserved */
+};
+
+/*
+ * Read QLM and return mode.
+ */
+enum cvmx_qlm_mode cvmx_qlm_get_mode(int qlm);
+enum cvmx_qlm_mode cvmx_qlm_get_mode_cn78xx(int node, int qlm);
+enum cvmx_qlm_mode cvmx_qlm_get_dlm_mode(int dlm_mode, int interface);
+void __cvmx_qlm_set_mult(int qlm, int baud_mhz, int old_multiplier);
+
+void cvmx_qlm_display_registers(int qlm);
+
+int cvmx_qlm_measure_clock(int qlm);
+
+/**
+ * Measure the reference clock of a QLM on a multi-node setup
+ *
+ * @param node   node to measure
+ * @param qlm    QLM to measure
+ *
+ * @return Clock rate in Hz
+ */
+int cvmx_qlm_measure_clock_node(int node, int qlm);
+
+/*
+ * Perform RX equalization on a QLM
+ *
+ * @param node Node the QLM is on
+ * @param qlm  QLM to perform RX equalization on
+ * @param lane Lane to use, or -1 for all lanes
+ *
+ * @return Zero on success, negative if any lane failed RX equalization
+ */
+int __cvmx_qlm_rx_equalization(int node, int qlm, int lane);
+
+/**
+ * Errata GSER-27882 -GSER 10GBASE-KR Transmit Equalizer
+ * Training may not update PHY Tx Taps. This function is not static
+ * so we can share it with BGX KR
+ *
+ * @param node Node to apply errata workaround
+ * @param qlm  QLM to apply errata workaround
+ * @param lane Lane to apply the errata
+ */
+int cvmx_qlm_gser_errata_27882(int node, int qlm, int lane);
+
+void cvmx_qlm_gser_errata_25992(int node, int qlm);
+
+#ifdef CVMX_DUMP_GSER
+/**
+ * Dump GSER configuration for node 0
+ */
+int cvmx_dump_gser_config(unsigned int gser);
+/**
+ * Dump GSER status for node 0
+ */
+int cvmx_dump_gser_status(unsigned int gser);
+/**
+ * Dump GSER configuration
+ */
+int cvmx_dump_gser_config_node(unsigned int node, unsigned int gser);
+/**
+ * Dump GSER status
+ */
+int cvmx_dump_gser_status_node(unsigned int node, unsigned int gser);
+#endif
+
+int cvmx_qlm_eye_display(int node, int qlm, int qlm_lane, int format, const cvmx_qlm_eye_t *eye);
+
+void cvmx_prbs_process_cmd(int node, int qlm, int mode);
+
+#endif /* __CVMX_QLM_H__ */
index b84fc9f..9e86be8 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/bitfield.h>
 #include <linux/bitops.h>
 #include <linux/io.h>
+#include <mach/cvmx-address.h>
 
 /* General defines */
 #define CVMX_MAX_CORES         48
 
 #define MAX_CORE_TADS          8
 
-#define CAST_ULL(v)            ((unsigned long long)(v))
 #define CASTPTR(type, v)       ((type *)(long)(v))
+#define CAST64(v)              ((long long)(long)(v))
 
 /* Regs */
-#define CVMX_CIU_PP_RST                0x0001010000000100ULL
 #define CVMX_CIU3_NMI          0x0001010000000160ULL
-#define CVMX_CIU_FUSE          0x00010100000001a0ULL
-#define CVMX_CIU_NMI           0x0001070000000718ULL
 
 #define CVMX_MIO_BOOT_LOC_CFGX(x) (0x0001180000000080ULL + ((x) & 1) * 8)
-#define MIO_BOOT_LOC_CFG_BASE          GENMASK_ULL(27, 3)
-#define MIO_BOOT_LOC_CFG_EN            BIT_ULL(31)
+#define MIO_BOOT_LOC_CFG_BASE  GENMASK_ULL(27, 3)
+#define MIO_BOOT_LOC_CFG_EN    BIT_ULL(31)
 
 #define CVMX_MIO_BOOT_LOC_ADR  0x0001180000000090ULL
-#define MIO_BOOT_LOC_ADR_ADR           GENMASK_ULL(7, 3)
+#define MIO_BOOT_LOC_ADR_ADR   GENMASK_ULL(7, 3)
 
 #define CVMX_MIO_BOOT_LOC_DAT  0x0001180000000098ULL
 
 #define CVMX_MIO_FUS_DAT2      0x0001180000001410ULL
-#define MIO_FUS_DAT2_NOCRYPTO          BIT_ULL(26)
-#define MIO_FUS_DAT2_NOMUL             BIT_ULL(27)
-#define MIO_FUS_DAT2_DORM_CRYPTO       BIT_ULL(34)
+#define MIO_FUS_DAT2_NOCRYPTO  BIT_ULL(26)
+#define MIO_FUS_DAT2_NOMUL     BIT_ULL(27)
+#define MIO_FUS_DAT2_DORM_CRYPTO BIT_ULL(34)
 
 #define CVMX_MIO_FUS_RCMD      0x0001180000001500ULL
-#define MIO_FUS_RCMD_ADDR              GENMASK_ULL(7, 0)
-#define MIO_FUS_RCMD_PEND              BIT_ULL(12)
-#define MIO_FUS_RCMD_DAT               GENMASK_ULL(23, 16)
+#define MIO_FUS_RCMD_ADDR      GENMASK_ULL(7, 0)
+#define MIO_FUS_RCMD_PEND      BIT_ULL(12)
+#define MIO_FUS_RCMD_DAT       GENMASK_ULL(23, 16)
 
 #define CVMX_RNM_CTL_STATUS    0x0001180040000000ULL
-#define RNM_CTL_STATUS_EER_VAL         BIT_ULL(9)
+#define RNM_CTL_STATUS_EER_VAL BIT_ULL(9)
+
+#define CVMX_IOBDMA_ORDERED_IO_ADDR 0xffffffffffffa200ull
 
 /* turn the variable name into a string */
 #define CVMX_TMP_STR(x)                CVMX_TMP_STR2(x)
 #define CVMX_TMP_STR2(x)       #x
 
+#define CVMX_RDHWR(result, regstr)                                     \
+       asm volatile("rdhwr %[rt],$" CVMX_TMP_STR(regstr) : [rt] "=d"(result))
 #define CVMX_RDHWRNV(result, regstr)                                   \
-       asm volatile ("rdhwr %[rt],$" CVMX_TMP_STR(regstr) : [rt] "=d" (result))
+       asm("rdhwr %[rt],$" CVMX_TMP_STR(regstr) : [rt] "=d"(result))
+#define CVMX_POP(result, input)                                                \
+       asm("pop %[rd],%[rs]" : [rd] "=d"(result) : [rs] "d"(input))
+
+#define CVMX_SYNC   asm volatile("sync\n" : : : "memory")
+#define CVMX_SYNCW  asm volatile("syncw\nsyncw\n" : : : "memory")
+#define CVMX_SYNCS  asm volatile("syncs\n" : : : "memory")
+#define CVMX_SYNCWS asm volatile("syncws\n" : : : "memory")
+
+#define CVMX_CACHE_LINE_SIZE   128                        // In bytes
+#define CVMX_CACHE_LINE_MASK   (CVMX_CACHE_LINE_SIZE - 1) // In bytes
+#define CVMX_CACHE_LINE_ALIGNED __aligned(CVMX_CACHE_LINE_SIZE)
+
+#define CVMX_SYNCIOBDMA                asm volatile("synciobdma" : : : "memory")
+
+#define CVMX_MF_CHORD(dest)    CVMX_RDHWR(dest, 30)
+
+/*
+ * The macros cvmx_likely and cvmx_unlikely use the
+ * __builtin_expect GCC operation to control branch
+ * probabilities for a conditional. For example, an "if"
+ * statement in the code that will almost always be
+ * executed should be written as "if (cvmx_likely(...))".
+ * If the "else" section of an if statement is more
+ * probable, use "if (cvmx_unlikey(...))".
+ */
+#define cvmx_likely(x)  __builtin_expect(!!(x), 1)
+#define cvmx_unlikely(x) __builtin_expect(!!(x), 0)
+
+#define CVMX_WAIT_FOR_FIELD64(address, type, field, op, value, to_us)  \
+       ({                                                              \
+               int result;                                             \
+               do {                                                    \
+                       u64 done = get_timer(0);                        \
+                       type c;                                         \
+                       while (1) {                                     \
+                               c.u64 = csr_rd(address);                \
+                               if ((c.s.field)op(value)) {             \
+                                       result = 0;                     \
+                                       break;                          \
+                               } else if (get_timer(done) > ((to_us) / 1000)) { \
+                                       result = -1;                    \
+                                       break;                          \
+                               } else                                  \
+                                       udelay(100);                    \
+                       }                                               \
+               } while (0);                                            \
+               result;                                                 \
+       })
 
-#define CVMX_SYNCW                                     \
-       asm volatile ("syncw\nsyncw\n" : : : "memory")
+#define CVMX_WAIT_FOR_FIELD64_NODE(node, address, type, field, op, value, to_us) \
+       ({                                                              \
+               int result;                                             \
+               do {                                                    \
+                       u64 done = get_timer(0);                        \
+                       type c;                                         \
+                       while (1) {                                     \
+                               c.u64 = csr_rd(address);                \
+                               if ((c.s.field)op(value)) {             \
+                                       result = 0;                     \
+                                       break;                          \
+                               } else if (get_timer(done) > ((to_us) / 1000)) { \
+                                       result = -1;                    \
+                                       break;                          \
+                               } else                                  \
+                                       udelay(100);                    \
+                       }                                               \
+               } while (0);                                            \
+               result;                                                 \
+       })
 
 /* ToDo: Currently only node = 0 supported */
+#define cvmx_get_node_num()    0
+
 static inline u64 csr_rd_node(int node, u64 addr)
 {
        void __iomem *base;
@@ -76,11 +146,24 @@ static inline u64 csr_rd_node(int node, u64 addr)
        return ioread64(base);
 }
 
+static inline u32 csr_rd32_node(int node, u64 addr)
+{
+       void __iomem *base;
+
+       base = ioremap_nocache(addr, 0x100);
+       return ioread32(base);
+}
+
 static inline u64 csr_rd(u64 addr)
 {
        return csr_rd_node(0, addr);
 }
 
+static inline u32 csr_rd32(u64 addr)
+{
+       return csr_rd32_node(0, addr);
+}
+
 static inline void csr_wr_node(int node, u64 addr, u64 val)
 {
        void __iomem *base;
@@ -89,11 +172,24 @@ static inline void csr_wr_node(int node, u64 addr, u64 val)
        iowrite64(val, base);
 }
 
+static inline void csr_wr32_node(int node, u64 addr, u32 val)
+{
+       void __iomem *base;
+
+       base = ioremap_nocache(addr, 0x100);
+       iowrite32(val, base);
+}
+
 static inline void csr_wr(u64 addr, u64 val)
 {
        csr_wr_node(0, addr, val);
 }
 
+static inline void csr_wr32(u64 addr, u32 val)
+{
+       csr_wr32_node(0, addr, val);
+}
+
 /*
  * We need to use the volatile access here, otherwise the IO accessor
  * functions might swap the bytes
@@ -103,21 +199,173 @@ static inline u64 cvmx_read64_uint64(u64 addr)
        return *(volatile u64 *)addr;
 }
 
+static inline s64 cvmx_read64_int64(u64 addr)
+{
+       return *(volatile s64 *)addr;
+}
+
 static inline void cvmx_write64_uint64(u64 addr, u64 val)
 {
        *(volatile u64 *)addr = val;
 }
 
+static inline void cvmx_write64_int64(u64 addr, s64 val)
+{
+       *(volatile s64 *)addr = val;
+}
+
 static inline u32 cvmx_read64_uint32(u64 addr)
 {
        return *(volatile u32 *)addr;
 }
 
+static inline s32 cvmx_read64_int32(u64 addr)
+{
+       return *(volatile s32 *)addr;
+}
+
 static inline void cvmx_write64_uint32(u64 addr, u32 val)
 {
        *(volatile u32 *)addr = val;
 }
 
+static inline void cvmx_write64_int32(u64 addr, s32 val)
+{
+       *(volatile s32 *)addr = val;
+}
+
+static inline void cvmx_write64_int16(u64 addr, s16 val)
+{
+       *(volatile s16 *)addr = val;
+}
+
+static inline void cvmx_write64_uint16(u64 addr, u16 val)
+{
+       *(volatile u16 *)addr = val;
+}
+
+static inline void cvmx_write64_int8(u64 addr, int8_t val)
+{
+       *(volatile int8_t *)addr = val;
+}
+
+static inline void cvmx_write64_uint8(u64 addr, u8 val)
+{
+       *(volatile u8 *)addr = val;
+}
+
+static inline s16 cvmx_read64_int16(u64 addr)
+{
+       return *(volatile s16 *)addr;
+}
+
+static inline u16 cvmx_read64_uint16(u64 addr)
+{
+       return *(volatile u16 *)addr;
+}
+
+static inline int8_t cvmx_read64_int8(u64 addr)
+{
+       return *(volatile int8_t *)addr;
+}
+
+static inline u8 cvmx_read64_uint8(u64 addr)
+{
+       return *(volatile u8 *)addr;
+}
+
+static inline void cvmx_send_single(u64 data)
+{
+       cvmx_write64_uint64(CVMX_IOBDMA_ORDERED_IO_ADDR, data);
+}
+
+/**
+ * Perform a 64-bit write to an IO address
+ *
+ * @param io_addr      I/O address to write to
+ * @param val          64-bit value to write
+ */
+static inline void cvmx_write_io(u64 io_addr, u64 val)
+{
+       cvmx_write64_uint64(io_addr, val);
+}
+
+/**
+ * Builds a memory address for I/O based on the Major and Sub DID.
+ *
+ * @param major_did 5 bit major did
+ * @param sub_did   3 bit sub did
+ * @return I/O base address
+ */
+static inline u64 cvmx_build_io_address(u64 major_did, u64 sub_did)
+{
+       return ((0x1ull << 48) | (major_did << 43) | (sub_did << 40));
+}
+
+/**
+ * Builds a bit mask given the required size in bits.
+ *
+ * @param bits   Number of bits in the mask
+ * @return The mask
+ */
+static inline u64 cvmx_build_mask(u64 bits)
+{
+       if (bits == 64)
+               return -1;
+
+       return ~((~0x0ull) << bits);
+}
+
+/**
+ * Extract bits out of a number
+ *
+ * @param input  Number to extract from
+ * @param lsb    Starting bit, least significant (0-63)
+ * @param width  Width in bits (1-64)
+ *
+ * @return Extracted number
+ */
+static inline u64 cvmx_bit_extract(u64 input, int lsb, int width)
+{
+       u64 result = input >> lsb;
+
+       result &= cvmx_build_mask(width);
+
+       return result;
+}
+
+/**
+ * Perform mask and shift to place the supplied value into
+ * the supplied bit rage.
+ *
+ * Example: cvmx_build_bits(39,24,value)
+ * <pre>
+ * 6       5       4       3       3       2       1
+ * 3       5       7       9       1       3       5       7      0
+ * +-------+-------+-------+-------+-------+-------+-------+------+
+ * 000000000000000000000000___________value000000000000000000000000
+ * </pre>
+ *
+ * @param high_bit Highest bit value can occupy (inclusive) 0-63
+ * @param low_bit  Lowest bit value can occupy inclusive 0-high_bit
+ * @param value    Value to use
+ * @return Value masked and shifted
+ */
+static inline u64 cvmx_build_bits(u64 high_bit, u64 low_bit, u64 value)
+{
+       return ((value & cvmx_build_mask(high_bit - low_bit + 1)) << low_bit);
+}
+
+static inline u64 cvmx_mask_to_localaddr(u64 addr)
+{
+       return (addr & 0xffffffffff);
+}
+
+static inline u64 cvmx_addr_on_node(u64 node, u64 addr)
+{
+       return (node << 40) | cvmx_mask_to_localaddr(addr);
+}
+
 static inline void *cvmx_phys_to_ptr(u64 addr)
 {
        return (void *)CKSEG0ADDR(addr);
@@ -141,4 +389,53 @@ static inline unsigned int cvmx_get_core_num(void)
        return core_num;
 }
 
+/**
+ * Node-local number of the core on which the program is currently running.
+ *
+ * @return core number on local node
+ */
+static inline unsigned int cvmx_get_local_core_num(void)
+{
+       unsigned int core_num, core_mask;
+
+       CVMX_RDHWRNV(core_num, 0);
+       /* note that MAX_CORES may not be power of 2 */
+       core_mask = (1 << CVMX_NODE_NO_SHIFT) - 1;
+
+       return core_num & core_mask;
+}
+
+/**
+ * Returns the number of bits set in the provided value.
+ * Simple wrapper for POP instruction.
+ *
+ * @param val    32 bit value to count set bits in
+ *
+ * @return Number of bits set
+ */
+static inline u32 cvmx_pop(u32 val)
+{
+       u32 pop;
+
+       CVMX_POP(pop, val);
+
+       return pop;
+}
+
+#define cvmx_read_csr_node(node, addr)      csr_rd(addr)
+#define cvmx_write_csr_node(node, addr, val) csr_wr(addr, val)
+
+#define cvmx_printf  printf
+#define cvmx_vprintf vprintf
+
+#if defined(DEBUG)
+void cvmx_warn(const char *format, ...) __printf(1, 2);
+#else
+void cvmx_warn(const char *format, ...);
+#endif
+
+#define cvmx_warn_if(expression, format, ...)                          \
+       if (expression)                                                 \
+               cvmx_warn(format, ##__VA_ARGS__)
+
 #endif /* __CVMX_REGS_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-rst-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-rst-defs.h
new file mode 100644 (file)
index 0000000..943e160
--- /dev/null
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_RST_DEFS_H__
+#define __CVMX_RST_DEFS_H__
+
+#define CVMX_RST_CTLX(offset)      (0x0001180006001640ull + ((offset) & 3) * 8)
+#define CVMX_RST_SOFT_PRSTX(offset) (0x00011800060016C0ull + ((offset) & 3) * 8)
+
+/**
+ * cvmx_rst_ctl#
+ */
+union cvmx_rst_ctlx {
+       u64 u64;
+       struct cvmx_rst_ctlx_s {
+               u64 reserved_10_63 : 54;
+               u64 prst_link : 1;
+               u64 rst_done : 1;
+               u64 rst_link : 1;
+               u64 host_mode : 1;
+               u64 reserved_4_5 : 2;
+               u64 rst_drv : 1;
+               u64 rst_rcv : 1;
+               u64 rst_chip : 1;
+               u64 rst_val : 1;
+       } s;
+       struct cvmx_rst_ctlx_s cn70xx;
+       struct cvmx_rst_ctlx_s cn70xxp1;
+       struct cvmx_rst_ctlx_s cn73xx;
+       struct cvmx_rst_ctlx_s cn78xx;
+       struct cvmx_rst_ctlx_s cn78xxp1;
+       struct cvmx_rst_ctlx_s cnf75xx;
+};
+
+typedef union cvmx_rst_ctlx cvmx_rst_ctlx_t;
+
+/**
+ * cvmx_rst_soft_prst#
+ */
+union cvmx_rst_soft_prstx {
+       u64 u64;
+       struct cvmx_rst_soft_prstx_s {
+               u64 reserved_1_63 : 63;
+               u64 soft_prst : 1;
+       } s;
+       struct cvmx_rst_soft_prstx_s cn70xx;
+       struct cvmx_rst_soft_prstx_s cn70xxp1;
+       struct cvmx_rst_soft_prstx_s cn73xx;
+       struct cvmx_rst_soft_prstx_s cn78xx;
+       struct cvmx_rst_soft_prstx_s cn78xxp1;
+       struct cvmx_rst_soft_prstx_s cnf75xx;
+};
+
+typedef union cvmx_rst_soft_prstx cvmx_rst_soft_prstx_t;
+
+/**
+ * cvmx_rst_soft_rst
+ */
+union cvmx_rst_soft_rst {
+       u64 u64;
+       struct cvmx_rst_soft_rst_s {
+               u64 reserved_1_63 : 63;
+               u64 soft_rst : 1;
+       } s;
+       struct cvmx_rst_soft_rst_s cn70xx;
+       struct cvmx_rst_soft_rst_s cn70xxp1;
+       struct cvmx_rst_soft_rst_s cn73xx;
+       struct cvmx_rst_soft_rst_s cn78xx;
+       struct cvmx_rst_soft_rst_s cn78xxp1;
+       struct cvmx_rst_soft_rst_s cnf75xx;
+};
+
+typedef union cvmx_rst_soft_rst cvmx_rst_soft_rst_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-sata-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-sata-defs.h
new file mode 100644 (file)
index 0000000..77af0e3
--- /dev/null
@@ -0,0 +1,311 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_SATA_DEFS_H__
+#define __CVMX_SATA_DEFS_H__
+
+#define CVMX_SATA_UCTL_CTL        (0x000118006C000000ull)
+#define CVMX_SATA_UCTL_SHIM_CFG           (0x000118006C0000E8ull)
+#define CVMX_SATA_UCTL_BIST_STATUS (0x000118006C000008ull)
+
+#define CVMX_SATA_UAHC_GBL_PI      (0x00016C000000000Cull)
+#define CVMX_SATA_UAHC_GBL_TIMER1MS (0x00016C00000000E0ull)
+#define CVMX_SATA_UAHC_GBL_CAP     (0x00016C0000000000ull)
+
+#define CVMX_SATA_UAHC_PX_CMD(offset)  (0x00016C0000000118ull + ((offset) & 1) * 128)
+#define CVMX_SATA_UAHC_PX_SCTL(offset) (0x00016C000000012Cull + ((offset) & 1) * 128)
+#define CVMX_SATA_UAHC_PX_SERR(offset) (0x00016C0000000130ull + ((offset) & 1) * 128)
+#define CVMX_SATA_UAHC_PX_IS(offset)   (0x00016C0000000110ull + ((offset) & 1) * 128)
+#define CVMX_SATA_UAHC_PX_SSTS(offset) (0x00016C0000000128ull + ((offset) & 1) * 128)
+#define CVMX_SATA_UAHC_PX_TFD(offset)  (0x00016C0000000120ull + ((offset) & 1) * 128)
+
+/**
+ * cvmx_sata_uctl_ctl
+ *
+ * This register controls clocks, resets, power, and BIST for the SATA.
+ *
+ * Accessible always.
+ *
+ * Reset by IOI reset.
+ */
+union cvmx_sata_uctl_ctl {
+       u64 u64;
+       struct cvmx_sata_uctl_ctl_s {
+               u64 clear_bist : 1;
+               u64 start_bist : 1;
+               u64 reserved_31_61 : 31;
+               u64 a_clk_en : 1;
+               u64 a_clk_byp_sel : 1;
+               u64 a_clkdiv_rst : 1;
+               u64 reserved_27_27 : 1;
+               u64 a_clkdiv_sel : 3;
+               u64 reserved_5_23 : 19;
+               u64 csclk_en : 1;
+               u64 reserved_2_3 : 2;
+               u64 sata_uahc_rst : 1;
+               u64 sata_uctl_rst : 1;
+       } s;
+       struct cvmx_sata_uctl_ctl_s cn70xx;
+       struct cvmx_sata_uctl_ctl_s cn70xxp1;
+       struct cvmx_sata_uctl_ctl_s cn73xx;
+};
+
+typedef union cvmx_sata_uctl_ctl cvmx_sata_uctl_ctl_t;
+
+/**
+ * cvmx_sata_uctl_bist_status
+ *
+ * Results from BIST runs of SATA's memories.
+ * Wait for NDONE==0, then look at defect indication.
+ *
+ * Accessible always.
+ *
+ * Reset by IOI reset.
+ */
+union cvmx_sata_uctl_bist_status {
+       u64 u64;
+       struct cvmx_sata_uctl_bist_status_s {
+               u64 reserved_42_63 : 22;
+               u64 uctl_xm_r_bist_ndone : 1;
+               u64 uctl_xm_w_bist_ndone : 1;
+               u64 reserved_36_39 : 4;
+               u64 uahc_p0_rxram_bist_ndone : 1;
+               u64 uahc_p1_rxram_bist_ndone : 1;
+               u64 uahc_p0_txram_bist_ndone : 1;
+               u64 uahc_p1_txram_bist_ndone : 1;
+               u64 reserved_10_31 : 22;
+               u64 uctl_xm_r_bist_status : 1;
+               u64 uctl_xm_w_bist_status : 1;
+               u64 reserved_4_7 : 4;
+               u64 uahc_p0_rxram_bist_status : 1;
+               u64 uahc_p1_rxram_bist_status : 1;
+               u64 uahc_p0_txram_bist_status : 1;
+               u64 uahc_p1_txram_bist_status : 1;
+       } s;
+       struct cvmx_sata_uctl_bist_status_s cn70xx;
+       struct cvmx_sata_uctl_bist_status_s cn70xxp1;
+       struct cvmx_sata_uctl_bist_status_s cn73xx;
+};
+
+typedef union cvmx_sata_uctl_bist_status cvmx_sata_uctl_bist_status_t;
+
+/**
+ * cvmx_sata_uctl_shim_cfg
+ *
+ * This register allows configuration of various shim (UCTL) features.
+ *
+ * Fields XS_NCB_OOB_* are captured when there are no outstanding OOB errors indicated in INTSTAT
+ * and a new OOB error arrives.
+ *
+ * Fields XS_BAD_DMA_* are captured when there are no outstanding DMA errors indicated in INTSTAT
+ * and a new DMA error arrives.
+ *
+ * Accessible only when SATA_UCTL_CTL[A_CLK_EN].
+ *
+ * Reset by IOI reset or SATA_UCTL_CTL[SATA_UCTL_RST].
+ */
+union cvmx_sata_uctl_shim_cfg {
+       u64 u64;
+       struct cvmx_sata_uctl_shim_cfg_s {
+               u64 xs_ncb_oob_wrn : 1;
+               u64 reserved_60_62 : 3;
+               u64 xs_ncb_oob_osrc : 12;
+               u64 xm_bad_dma_wrn : 1;
+               u64 reserved_44_46 : 3;
+               u64 xm_bad_dma_type : 4;
+               u64 reserved_14_39 : 26;
+               u64 dma_read_cmd : 2;
+               u64 reserved_11_11 : 1;
+               u64 dma_write_cmd : 1;
+               u64 dma_endian_mode : 2;
+               u64 reserved_2_7 : 6;
+               u64 csr_endian_mode : 2;
+       } s;
+       struct cvmx_sata_uctl_shim_cfg_cn70xx {
+               u64 xs_ncb_oob_wrn : 1;
+               u64 reserved_57_62 : 6;
+               u64 xs_ncb_oob_osrc : 9;
+               u64 xm_bad_dma_wrn : 1;
+               u64 reserved_44_46 : 3;
+               u64 xm_bad_dma_type : 4;
+               u64 reserved_13_39 : 27;
+               u64 dma_read_cmd : 1;
+               u64 reserved_10_11 : 2;
+               u64 dma_endian_mode : 2;
+               u64 reserved_2_7 : 6;
+               u64 csr_endian_mode : 2;
+       } cn70xx;
+       struct cvmx_sata_uctl_shim_cfg_cn70xx cn70xxp1;
+       struct cvmx_sata_uctl_shim_cfg_s cn73xx;
+};
+
+typedef union cvmx_sata_uctl_shim_cfg cvmx_sata_uctl_shim_cfg_t;
+
+/**
+ * cvmx_sata_uahc_gbl_cap
+ *
+ * See AHCI specification v1.3 section 3.1
+ *
+ */
+union cvmx_sata_uahc_gbl_cap {
+       u32 u32;
+       struct cvmx_sata_uahc_gbl_cap_s {
+               u32 s64a : 1;
+               u32 sncq : 1;
+               u32 ssntf : 1;
+               u32 smps : 1;
+               u32 sss : 1;
+               u32 salp : 1;
+               u32 sal : 1;
+               u32 sclo : 1;
+               u32 iss : 4;
+               u32 snzo : 1;
+               u32 sam : 1;
+               u32 spm : 1;
+               u32 fbss : 1;
+               u32 pmd : 1;
+               u32 ssc : 1;
+               u32 psc : 1;
+               u32 ncs : 5;
+               u32 cccs : 1;
+               u32 ems : 1;
+               u32 sxs : 1;
+               u32 np : 5;
+       } s;
+       struct cvmx_sata_uahc_gbl_cap_s cn70xx;
+       struct cvmx_sata_uahc_gbl_cap_s cn70xxp1;
+       struct cvmx_sata_uahc_gbl_cap_s cn73xx;
+};
+
+typedef union cvmx_sata_uahc_gbl_cap cvmx_sata_uahc_gbl_cap_t;
+
+/**
+ * cvmx_sata_uahc_p#_sctl
+ */
+union cvmx_sata_uahc_px_sctl {
+       u32 u32;
+       struct cvmx_sata_uahc_px_sctl_s {
+               u32 reserved_10_31 : 22;
+               u32 ipm : 2;
+               u32 reserved_6_7 : 2;
+               u32 spd : 2;
+               u32 reserved_3_3 : 1;
+               u32 det : 3;
+       } s;
+       struct cvmx_sata_uahc_px_sctl_s cn70xx;
+       struct cvmx_sata_uahc_px_sctl_s cn70xxp1;
+       struct cvmx_sata_uahc_px_sctl_s cn73xx;
+};
+
+typedef union cvmx_sata_uahc_px_sctl cvmx_sata_uahc_px_sctl_t;
+
+/**
+ * cvmx_sata_uahc_p#_cmd
+ */
+union cvmx_sata_uahc_px_cmd {
+       u32 u32;
+       struct cvmx_sata_uahc_px_cmd_s {
+               u32 icc : 4;
+               u32 asp : 1;
+               u32 alpe : 1;
+               u32 dlae : 1;
+               u32 atapi : 1;
+               u32 apste : 1;
+               u32 fbscp : 1;
+               u32 esp : 1;
+               u32 cpd : 1;
+               u32 mpsp : 1;
+               u32 hpcp : 1;
+               u32 pma : 1;
+               u32 cps : 1;
+               u32 cr : 1;
+               u32 fr : 1;
+               u32 mpss : 1;
+               u32 ccs : 5;
+               u32 reserved_5_7 : 3;
+               u32 fre : 1;
+               u32 clo : 1;
+               u32 pod : 1;
+               u32 sud : 1;
+               u32 st : 1;
+       } s;
+       struct cvmx_sata_uahc_px_cmd_s cn70xx;
+       struct cvmx_sata_uahc_px_cmd_s cn70xxp1;
+       struct cvmx_sata_uahc_px_cmd_s cn73xx;
+};
+
+typedef union cvmx_sata_uahc_px_cmd cvmx_sata_uahc_px_cmd_t;
+
+/**
+ * cvmx_sata_uahc_gbl_pi
+ *
+ * See AHCI specification v1.3 section 3.1.
+ *
+ */
+union cvmx_sata_uahc_gbl_pi {
+       u32 u32;
+       struct cvmx_sata_uahc_gbl_pi_s {
+               u32 reserved_2_31 : 30;
+               u32 pi : 2;
+       } s;
+       struct cvmx_sata_uahc_gbl_pi_s cn70xx;
+       struct cvmx_sata_uahc_gbl_pi_s cn70xxp1;
+       struct cvmx_sata_uahc_gbl_pi_s cn73xx;
+};
+
+typedef union cvmx_sata_uahc_gbl_pi cvmx_sata_uahc_gbl_pi_t;
+
+/**
+ * cvmx_sata_uahc_p#_ssts
+ */
+union cvmx_sata_uahc_px_ssts {
+       u32 u32;
+       struct cvmx_sata_uahc_px_ssts_s {
+               u32 reserved_12_31 : 20;
+               u32 ipm : 4;
+               u32 spd : 4;
+               u32 det : 4;
+       } s;
+       struct cvmx_sata_uahc_px_ssts_s cn70xx;
+       struct cvmx_sata_uahc_px_ssts_s cn70xxp1;
+       struct cvmx_sata_uahc_px_ssts_s cn73xx;
+};
+
+typedef union cvmx_sata_uahc_px_ssts cvmx_sata_uahc_px_ssts_t;
+
+/**
+ * cvmx_sata_uahc_p#_tfd
+ */
+union cvmx_sata_uahc_px_tfd {
+       u32 u32;
+       struct cvmx_sata_uahc_px_tfd_s {
+               u32 reserved_16_31 : 16;
+               u32 tferr : 8;
+               u32 sts : 8;
+       } s;
+       struct cvmx_sata_uahc_px_tfd_s cn70xx;
+       struct cvmx_sata_uahc_px_tfd_s cn70xxp1;
+       struct cvmx_sata_uahc_px_tfd_s cn73xx;
+};
+
+typedef union cvmx_sata_uahc_px_tfd cvmx_sata_uahc_px_tfd_t;
+
+/**
+ * cvmx_sata_uahc_gbl_timer1ms
+ */
+union cvmx_sata_uahc_gbl_timer1ms {
+       u32 u32;
+       struct cvmx_sata_uahc_gbl_timer1ms_s {
+               u32 reserved_20_31 : 12;
+               u32 timv : 20;
+       } s;
+       struct cvmx_sata_uahc_gbl_timer1ms_s cn70xx;
+       struct cvmx_sata_uahc_gbl_timer1ms_s cn70xxp1;
+       struct cvmx_sata_uahc_gbl_timer1ms_s cn73xx;
+};
+
+typedef union cvmx_sata_uahc_gbl_timer1ms cvmx_sata_uahc_gbl_timer1ms_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-scratch.h b/arch/mips/mach-octeon/include/mach/cvmx-scratch.h
new file mode 100644 (file)
index 0000000..d567a84
--- /dev/null
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * This file provides support for the processor local scratch memory.
+ * Scratch memory is byte addressable - all addresses are byte addresses.
+ */
+
+#ifndef __CVMX_SCRATCH_H__
+#define __CVMX_SCRATCH_H__
+
+/* Note: This define must be a long, not a long long in order to compile
+       without warnings for both 32bit and 64bit. */
+#define CVMX_SCRATCH_BASE (-32768l) /* 0xffffffffffff8000 */
+
+/* Scratch line for LMTST/LMTDMA on Octeon3 models */
+#ifdef CVMX_CAVIUM_OCTEON3
+#define CVMX_PKO_LMTLINE 2ull
+#endif
+
+/**
+ * Reads an 8 bit value from the processor local scratchpad memory.
+ *
+ * @param address byte address to read from
+ *
+ * @return value read
+ */
+static inline u8 cvmx_scratch_read8(u64 address)
+{
+       return *CASTPTR(volatile u8, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Reads a 16 bit value from the processor local scratchpad memory.
+ *
+ * @param address byte address to read from
+ *
+ * @return value read
+ */
+static inline u16 cvmx_scratch_read16(u64 address)
+{
+       return *CASTPTR(volatile u16, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Reads a 32 bit value from the processor local scratchpad memory.
+ *
+ * @param address byte address to read from
+ *
+ * @return value read
+ */
+static inline u32 cvmx_scratch_read32(u64 address)
+{
+       return *CASTPTR(volatile u32, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Reads a 64 bit value from the processor local scratchpad memory.
+ *
+ * @param address byte address to read from
+ *
+ * @return value read
+ */
+static inline u64 cvmx_scratch_read64(u64 address)
+{
+       return *CASTPTR(volatile u64, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Writes an 8 bit value to the processor local scratchpad memory.
+ *
+ * @param address byte address to write to
+ * @param value   value to write
+ */
+static inline void cvmx_scratch_write8(u64 address, u64 value)
+{
+       *CASTPTR(volatile u8, CVMX_SCRATCH_BASE + address) = (u8)value;
+}
+
+/**
+ * Writes a 32 bit value to the processor local scratchpad memory.
+ *
+ * @param address byte address to write to
+ * @param value   value to write
+ */
+static inline void cvmx_scratch_write16(u64 address, u64 value)
+{
+       *CASTPTR(volatile u16, CVMX_SCRATCH_BASE + address) = (u16)value;
+}
+
+/**
+ * Writes a 16 bit value to the processor local scratchpad memory.
+ *
+ * @param address byte address to write to
+ * @param value   value to write
+ */
+static inline void cvmx_scratch_write32(u64 address, u64 value)
+{
+       *CASTPTR(volatile u32, CVMX_SCRATCH_BASE + address) = (u32)value;
+}
+
+/**
+ * Writes a 64 bit value to the processor local scratchpad memory.
+ *
+ * @param address byte address to write to
+ * @param value   value to write
+ */
+static inline void cvmx_scratch_write64(u64 address, u64 value)
+{
+       *CASTPTR(volatile u64, CVMX_SCRATCH_BASE + address) = value;
+}
+
+#endif /* __CVMX_SCRATCH_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-sli-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-sli-defs.h
new file mode 100644 (file)
index 0000000..221ed1b
--- /dev/null
@@ -0,0 +1,6548 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon sli.
+ */
+
+#ifndef __CVMX_SLI_DEFS_H__
+#define __CVMX_SLI_DEFS_H__
+
+#define CVMX_SLI_BIST_STATUS CVMX_SLI_BIST_STATUS_FUNC()
+static inline u64 CVMX_SLI_BIST_STATUS_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000580ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000580ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028580ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028580ull;
+       }
+       return 0x0000000000028580ull;
+}
+
+#define CVMX_SLI_CIU_INT_ENB (0x00011F0000027110ull)
+#define CVMX_SLI_CIU_INT_SUM (0x00011F0000027100ull)
+static inline u64 CVMX_SLI_CTL_PORTX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000050ull + (offset) * 16;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010050ull + (offset) * 16;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000050ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000006E0ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000286E0ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000286E0ull + (offset) * 16;
+       }
+       return 0x00000000000286E0ull + (offset) * 16;
+}
+
+#define CVMX_SLI_CTL_STATUS CVMX_SLI_CTL_STATUS_FUNC()
+static inline u64 CVMX_SLI_CTL_STATUS_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000570ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000570ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028570ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028570ull;
+       }
+       return 0x0000000000028570ull;
+}
+
+#define CVMX_SLI_DATA_OUT_CNT CVMX_SLI_DATA_OUT_CNT_FUNC()
+static inline u64 CVMX_SLI_DATA_OUT_CNT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000005F0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000005F0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000285F0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000285F0ull;
+       }
+       return 0x00000000000285F0ull;
+}
+
+#define CVMX_SLI_DBG_DATA   (0x0000000000000310ull)
+#define CVMX_SLI_DBG_SELECT (0x0000000000000300ull)
+static inline u64 CVMX_SLI_DMAX_CNT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000400ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028400ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028400ull + (offset) * 16;
+       }
+       return 0x0000000000028400ull + (offset) * 16;
+}
+
+static inline u64 CVMX_SLI_DMAX_INT_LEVEL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000003E0ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000003E0ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000283E0ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000283E0ull + (offset) * 16;
+       }
+       return 0x00000000000283E0ull + (offset) * 16;
+}
+
+static inline u64 CVMX_SLI_DMAX_TIM(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000420ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000420ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028420ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028420ull + (offset) * 16;
+       }
+       return 0x0000000000028420ull + (offset) * 16;
+}
+
+#define CVMX_SLI_INT_ENB_CIU          (0x0000000000003CD0ull)
+#define CVMX_SLI_INT_ENB_PORTX(offset) (0x0000000000000340ull + ((offset) & 3) * 16)
+#define CVMX_SLI_INT_SUM              (0x0000000000000330ull)
+#define CVMX_SLI_LAST_WIN_RDATA0       (0x0000000000000600ull)
+#define CVMX_SLI_LAST_WIN_RDATA1       (0x0000000000000610ull)
+#define CVMX_SLI_LAST_WIN_RDATA2       (0x00000000000006C0ull)
+#define CVMX_SLI_LAST_WIN_RDATA3       (0x00000000000006D0ull)
+#define CVMX_SLI_MACX_PFX_DMA_VF_INT(offset, block_id)                                             \
+       (0x0000000000027280ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_DMA_VF_INT_ENB(offset, block_id)                                         \
+       (0x0000000000027500ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_FLR_VF_INT(offset, block_id)                                             \
+       (0x0000000000027400ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_INT_ENB(offset, block_id)                                                \
+       (0x0000000000027080ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_INT_SUM(offset, block_id)                                                \
+       (0x0000000000027000ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_MBOX_INT(offset, block_id)                                               \
+       (0x0000000000027380ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_PKT_VF_INT(offset, block_id)                                             \
+       (0x0000000000027300ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_PKT_VF_INT_ENB(offset, block_id)                                         \
+       (0x0000000000027580ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_PP_VF_INT(offset, block_id)                                              \
+       (0x0000000000027200ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MACX_PFX_PP_VF_INT_ENB(offset, block_id)                                          \
+       (0x0000000000027480ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_MAC_CREDIT_CNT CVMX_SLI_MAC_CREDIT_CNT_FUNC()
+static inline u64 CVMX_SLI_MAC_CREDIT_CNT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003D70ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003D70ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023D70ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023D70ull;
+       }
+       return 0x0000000000023D70ull;
+}
+
+#define CVMX_SLI_MAC_CREDIT_CNT2 CVMX_SLI_MAC_CREDIT_CNT2_FUNC()
+static inline u64 CVMX_SLI_MAC_CREDIT_CNT2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000013E10ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003E10ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023E10ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023E10ull;
+       }
+       return 0x0000000000023E10ull;
+}
+
+#define CVMX_SLI_MAC_NUMBER CVMX_SLI_MAC_NUMBER_FUNC()
+static inline u64 CVMX_SLI_MAC_NUMBER_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003E00ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003E00ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000020050ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000020050ull;
+       }
+       return 0x0000000000020050ull;
+}
+
+#define CVMX_SLI_MEM_ACCESS_CTL CVMX_SLI_MEM_ACCESS_CTL_FUNC()
+static inline u64 CVMX_SLI_MEM_ACCESS_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000002F0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000002F0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000282F0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000282F0ull;
+       }
+       return 0x00000000000282F0ull;
+}
+
+static inline u64 CVMX_SLI_MEM_ACCESS_SUBIDX(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000000E0ull + (offset) * 16 - 16 * 12;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000000E0ull + (offset) * 16 - 16 * 12;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000280E0ull + (offset) * 16 - 16 * 12;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000280E0ull + (offset) * 16 - 16 * 12;
+       }
+       return 0x00000000000280E0ull + (offset) * 16 - 16 * 12;
+}
+
+#define CVMX_SLI_MEM_CTL CVMX_SLI_MEM_CTL_FUNC()
+static inline u64 CVMX_SLI_MEM_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000005E0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000285E0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000285E0ull;
+       }
+       return 0x00000000000285E0ull;
+}
+
+#define CVMX_SLI_MEM_INT_SUM CVMX_SLI_MEM_INT_SUM_FUNC()
+static inline u64 CVMX_SLI_MEM_INT_SUM_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000005D0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000285D0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000285D0ull;
+       }
+       return 0x00000000000285D0ull;
+}
+
+static inline u64 CVMX_SLI_MSIXX_TABLE_ADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000006000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000000000ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000000ull + (offset) * 16;
+       }
+       return 0x0000000000000000ull + (offset) * 16;
+}
+
+static inline u64 CVMX_SLI_MSIXX_TABLE_DATA(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000006008ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000000008ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000008ull + (offset) * 16;
+       }
+       return 0x0000000000000008ull + (offset) * 16;
+}
+
+#define CVMX_SLI_MSIX_MACX_PF_TABLE_ADDR(offset) (0x0000000000007C00ull + ((offset) & 3) * 16)
+#define CVMX_SLI_MSIX_MACX_PF_TABLE_DATA(offset) (0x0000000000007C08ull + ((offset) & 3) * 16)
+#define CVMX_SLI_MSIX_PBA0                      CVMX_SLI_MSIX_PBA0_FUNC()
+static inline u64 CVMX_SLI_MSIX_PBA0_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000007000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000001000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001000ull;
+       }
+       return 0x0000000000001000ull;
+}
+
+#define CVMX_SLI_MSIX_PBA1 CVMX_SLI_MSIX_PBA1_FUNC()
+static inline u64 CVMX_SLI_MSIX_PBA1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000007010ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000001008ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001008ull;
+       }
+       return 0x0000000000001008ull;
+}
+
+#define CVMX_SLI_MSI_ENB0 (0x0000000000003C50ull)
+#define CVMX_SLI_MSI_ENB1 (0x0000000000003C60ull)
+#define CVMX_SLI_MSI_ENB2 (0x0000000000003C70ull)
+#define CVMX_SLI_MSI_ENB3 (0x0000000000003C80ull)
+#define CVMX_SLI_MSI_RCV0 CVMX_SLI_MSI_RCV0_FUNC()
+static inline u64 CVMX_SLI_MSI_RCV0_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003C10ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003C10ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023C10ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023C10ull;
+       }
+       return 0x0000000000023C10ull;
+}
+
+#define CVMX_SLI_MSI_RCV1 CVMX_SLI_MSI_RCV1_FUNC()
+static inline u64 CVMX_SLI_MSI_RCV1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003C20ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003C20ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023C20ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023C20ull;
+       }
+       return 0x0000000000023C20ull;
+}
+
+#define CVMX_SLI_MSI_RCV2 CVMX_SLI_MSI_RCV2_FUNC()
+static inline u64 CVMX_SLI_MSI_RCV2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003C30ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003C30ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023C30ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023C30ull;
+       }
+       return 0x0000000000023C30ull;
+}
+
+#define CVMX_SLI_MSI_RCV3 CVMX_SLI_MSI_RCV3_FUNC()
+static inline u64 CVMX_SLI_MSI_RCV3_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003C40ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003C40ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023C40ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023C40ull;
+       }
+       return 0x0000000000023C40ull;
+}
+
+#define CVMX_SLI_MSI_RD_MAP CVMX_SLI_MSI_RD_MAP_FUNC()
+static inline u64 CVMX_SLI_MSI_RD_MAP_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003CA0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003CA0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023CA0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023CA0ull;
+       }
+       return 0x0000000000023CA0ull;
+}
+
+#define CVMX_SLI_MSI_W1C_ENB0 (0x0000000000003CF0ull)
+#define CVMX_SLI_MSI_W1C_ENB1 (0x0000000000003D00ull)
+#define CVMX_SLI_MSI_W1C_ENB2 (0x0000000000003D10ull)
+#define CVMX_SLI_MSI_W1C_ENB3 (0x0000000000003D20ull)
+#define CVMX_SLI_MSI_W1S_ENB0 (0x0000000000003D30ull)
+#define CVMX_SLI_MSI_W1S_ENB1 (0x0000000000003D40ull)
+#define CVMX_SLI_MSI_W1S_ENB2 (0x0000000000003D50ull)
+#define CVMX_SLI_MSI_W1S_ENB3 (0x0000000000003D60ull)
+#define CVMX_SLI_MSI_WR_MAP   CVMX_SLI_MSI_WR_MAP_FUNC()
+static inline u64 CVMX_SLI_MSI_WR_MAP_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003C90ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003C90ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023C90ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023C90ull;
+       }
+       return 0x0000000000023C90ull;
+}
+
+#define CVMX_SLI_NQM_RSP_ERR_SND_DBG (0x00011F0000028800ull)
+#define CVMX_SLI_PCIE_MSI_RCV       CVMX_SLI_PCIE_MSI_RCV_FUNC()
+static inline u64 CVMX_SLI_PCIE_MSI_RCV_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003CB0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003CB0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023CB0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023CB0ull;
+       }
+       return 0x0000000000023CB0ull;
+}
+
+#define CVMX_SLI_PCIE_MSI_RCV_B1 CVMX_SLI_PCIE_MSI_RCV_B1_FUNC()
+static inline u64 CVMX_SLI_PCIE_MSI_RCV_B1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000650ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000650ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028650ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028650ull;
+       }
+       return 0x0000000000028650ull;
+}
+
+#define CVMX_SLI_PCIE_MSI_RCV_B2 CVMX_SLI_PCIE_MSI_RCV_B2_FUNC()
+static inline u64 CVMX_SLI_PCIE_MSI_RCV_B2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000660ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000660ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028660ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028660ull;
+       }
+       return 0x0000000000028660ull;
+}
+
+#define CVMX_SLI_PCIE_MSI_RCV_B3 CVMX_SLI_PCIE_MSI_RCV_B3_FUNC()
+static inline u64 CVMX_SLI_PCIE_MSI_RCV_B3_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000670ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000670ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028670ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028670ull;
+       }
+       return 0x0000000000028670ull;
+}
+
+static inline u64 CVMX_SLI_PKTX_CNTS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000002400ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000002400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000100B0ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000100B0ull + (offset) * 0x20000ull;
+       }
+       return 0x00000000000100B0ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_SLI_PKTX_ERROR_INFO(offset) (0x00000000000100C0ull + ((offset) & 63) * 0x20000ull)
+static inline u64 CVMX_SLI_PKTX_INPUT_CONTROL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000004000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010000ull + (offset) * 0x20000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010000ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010000ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_SLI_PKTX_INSTR_BADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000002800ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000002800ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010010ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010010ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010010ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_SLI_PKTX_INSTR_BAOFF_DBELL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000002C00ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000002C00ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010020ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010020ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010020ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_SLI_PKTX_INSTR_FIFO_RSIZE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003000ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010030ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010030ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010030ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_SLI_PKTX_INSTR_HEADER(offset) (0x0000000000003400ull + ((offset) & 31) * 16)
+static inline u64 CVMX_SLI_PKTX_INT_LEVELS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000004400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000100A0ull + (offset) * 0x20000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000100A0ull + (offset) * 0x20000ull;
+       }
+       return 0x00000000000100A0ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_SLI_PKTX_IN_BP(offset)    (0x0000000000003800ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_MBOX_INT(offset) (0x0000000000010210ull + ((offset) & 63) * 0x20000ull)
+static inline u64 CVMX_SLI_PKTX_OUTPUT_CONTROL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000004800ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010050ull + (offset) * 0x20000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010050ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010050ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_SLI_PKTX_OUT_SIZE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000C00ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000C00ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010060ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010060ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010060ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_SLI_PKTX_PF_VF_MBOX_SIGX(offset, block_id)                                            \
+       (0x0000000000010200ull + (((offset) & 1) + ((block_id) & 63) * 0x4000ull) * 8)
+static inline u64 CVMX_SLI_PKTX_SLIST_BADDR(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001400ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001400ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010070ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010070ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010070ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_SLI_PKTX_SLIST_BAOFF_DBELL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001800ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001800ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010080ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010080ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010080ull + (offset) * 0x20000ull;
+}
+
+static inline u64 CVMX_SLI_PKTX_SLIST_FIFO_RSIZE(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001C00ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001C00ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010090ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010090ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010090ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_SLI_PKTX_VF_INT_SUM(offset) (0x00000000000100D0ull + ((offset) & 63) * 0x20000ull)
+#define CVMX_SLI_PKTX_VF_SIG(offset)    (0x0000000000004C00ull + ((offset) & 63) * 16)
+#define CVMX_SLI_PKT_BIST_STATUS        (0x0000000000029220ull)
+#define CVMX_SLI_PKT_CNT_INT            CVMX_SLI_PKT_CNT_INT_FUNC()
+static inline u64 CVMX_SLI_PKT_CNT_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001130ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001130ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000029130ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000029130ull;
+       }
+       return 0x0000000000029130ull;
+}
+
+#define CVMX_SLI_PKT_CNT_INT_ENB   (0x0000000000001150ull)
+#define CVMX_SLI_PKT_CTL          (0x0000000000001220ull)
+#define CVMX_SLI_PKT_DATA_OUT_ES   (0x00000000000010B0ull)
+#define CVMX_SLI_PKT_DATA_OUT_NS   (0x00000000000010A0ull)
+#define CVMX_SLI_PKT_DATA_OUT_ROR  (0x0000000000001090ull)
+#define CVMX_SLI_PKT_DPADDR       (0x0000000000001080ull)
+#define CVMX_SLI_PKT_GBL_CONTROL   (0x0000000000029210ull)
+#define CVMX_SLI_PKT_INPUT_CONTROL (0x0000000000001170ull)
+#define CVMX_SLI_PKT_INSTR_ENB    (0x0000000000001000ull)
+#define CVMX_SLI_PKT_INSTR_RD_SIZE (0x00000000000011A0ull)
+#define CVMX_SLI_PKT_INSTR_SIZE           (0x0000000000001020ull)
+#define CVMX_SLI_PKT_INT          CVMX_SLI_PKT_INT_FUNC()
+static inline u64 CVMX_SLI_PKT_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001160ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000029160ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000029160ull;
+       }
+       return 0x0000000000029160ull;
+}
+
+#define CVMX_SLI_PKT_INT_LEVELS (0x0000000000001120ull)
+#define CVMX_SLI_PKT_IN_BP     (0x0000000000001210ull)
+static inline u64 CVMX_SLI_PKT_IN_DONEX_CNTS(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000002000ull + (offset) * 16;
+
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000002000ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000010040ull + (offset) * 0x20000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000010040ull + (offset) * 0x20000ull;
+       }
+       return 0x0000000000010040ull + (offset) * 0x20000ull;
+}
+
+#define CVMX_SLI_PKT_IN_INSTR_COUNTS CVMX_SLI_PKT_IN_INSTR_COUNTS_FUNC()
+static inline u64 CVMX_SLI_PKT_IN_INSTR_COUNTS_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001200ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001200ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000029200ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000029200ull;
+       }
+       return 0x0000000000029200ull;
+}
+
+#define CVMX_SLI_PKT_IN_INT CVMX_SLI_PKT_IN_INT_FUNC()
+static inline u64 CVMX_SLI_PKT_IN_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001150ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000029150ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000029150ull;
+       }
+       return 0x0000000000029150ull;
+}
+
+#define CVMX_SLI_PKT_IN_JABBER   (0x0000000000029170ull)
+#define CVMX_SLI_PKT_IN_PCIE_PORT (0x00000000000011B0ull)
+#define CVMX_SLI_PKT_IPTR        (0x0000000000001070ull)
+#define CVMX_SLI_PKT_MAC0_SIG0   (0x0000000000001300ull)
+#define CVMX_SLI_PKT_MAC0_SIG1   (0x0000000000001310ull)
+#define CVMX_SLI_PKT_MAC1_SIG0   (0x0000000000001320ull)
+#define CVMX_SLI_PKT_MAC1_SIG1   (0x0000000000001330ull)
+#define CVMX_SLI_PKT_MACX_PFX_RINFO(offset, block_id)                                              \
+       (0x0000000000029030ull + (((offset) & 1) + ((block_id) & 3) * 0x2ull) * 16)
+#define CVMX_SLI_PKT_MACX_RINFO(offset) (0x0000000000001030ull + ((offset) & 3) * 16)
+#define CVMX_SLI_PKT_MEM_CTL           CVMX_SLI_PKT_MEM_CTL_FUNC()
+static inline u64 CVMX_SLI_PKT_MEM_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001120ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000029120ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000029120ull;
+       }
+       return 0x0000000000029120ull;
+}
+
+#define CVMX_SLI_PKT_OUTPUT_WMARK CVMX_SLI_PKT_OUTPUT_WMARK_FUNC()
+static inline u64 CVMX_SLI_PKT_OUTPUT_WMARK_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001180ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001180ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000029180ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000029180ull;
+       }
+       return 0x0000000000029180ull;
+}
+
+#define CVMX_SLI_PKT_OUT_BMODE     (0x00000000000010D0ull)
+#define CVMX_SLI_PKT_OUT_BP_EN     (0x0000000000001240ull)
+#define CVMX_SLI_PKT_OUT_BP_EN2_W1C (0x0000000000029290ull)
+#define CVMX_SLI_PKT_OUT_BP_EN2_W1S (0x0000000000029270ull)
+#define CVMX_SLI_PKT_OUT_BP_EN_W1C  (0x0000000000029280ull)
+#define CVMX_SLI_PKT_OUT_BP_EN_W1S  (0x0000000000029260ull)
+#define CVMX_SLI_PKT_OUT_ENB       (0x0000000000001010ull)
+#define CVMX_SLI_PKT_PCIE_PORT     (0x00000000000010E0ull)
+#define CVMX_SLI_PKT_PKIND_VALID    (0x0000000000029190ull)
+#define CVMX_SLI_PKT_PORT_IN_RST    (0x00000000000011F0ull)
+#define CVMX_SLI_PKT_RING_RST      CVMX_SLI_PKT_RING_RST_FUNC()
+static inline u64 CVMX_SLI_PKT_RING_RST_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000011E0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000291E0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000291E0ull;
+       }
+       return 0x00000000000291E0ull;
+}
+
+#define CVMX_SLI_PKT_SLIST_ES  (0x0000000000001050ull)
+#define CVMX_SLI_PKT_SLIST_NS  (0x0000000000001040ull)
+#define CVMX_SLI_PKT_SLIST_ROR (0x0000000000001030ull)
+#define CVMX_SLI_PKT_TIME_INT  CVMX_SLI_PKT_TIME_INT_FUNC()
+static inline u64 CVMX_SLI_PKT_TIME_INT_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000001140ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000001140ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000029140ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000029140ull;
+       }
+       return 0x0000000000029140ull;
+}
+
+#define CVMX_SLI_PKT_TIME_INT_ENB    (0x0000000000001160ull)
+#define CVMX_SLI_PORTX_PKIND(offset) (0x0000000000000800ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PP_PKT_CSR_CONTROL  (0x00011F00000282D0ull)
+#define CVMX_SLI_S2C_END_MERGE      CVMX_SLI_S2C_END_MERGE_FUNC()
+static inline u64 CVMX_SLI_S2C_END_MERGE_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00011F0000015000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00011F0000025000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00011F0000025000ull;
+       }
+       return 0x00011F0000025000ull;
+}
+
+static inline u64 CVMX_SLI_S2M_PORTX_CTL(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003D80ull + (offset) * 16;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000003D80ull + (offset) * 16;
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000013D80ull + (offset) * 16;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000003D80ull + (offset) * 16;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000023D80ull + (offset) * 16;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000023D80ull + (offset) * 16;
+       }
+       return 0x0000000000023D80ull + (offset) * 16;
+}
+
+#define CVMX_SLI_SCRATCH_1 CVMX_SLI_SCRATCH_1_FUNC()
+static inline u64 CVMX_SLI_SCRATCH_1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000003C0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000003C0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000283C0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000283C0ull;
+       }
+       return 0x00000000000283C0ull;
+}
+
+#define CVMX_SLI_SCRATCH_2 CVMX_SLI_SCRATCH_2_FUNC()
+static inline u64 CVMX_SLI_SCRATCH_2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000003D0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000003D0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000283D0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000283D0ull;
+       }
+       return 0x00000000000283D0ull;
+}
+
+#define CVMX_SLI_STATE1 CVMX_SLI_STATE1_FUNC()
+static inline u64 CVMX_SLI_STATE1_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000620ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000620ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028620ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028620ull;
+       }
+       return 0x0000000000028620ull;
+}
+
+#define CVMX_SLI_STATE2 CVMX_SLI_STATE2_FUNC()
+static inline u64 CVMX_SLI_STATE2_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000630ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000630ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028630ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028630ull;
+       }
+       return 0x0000000000028630ull;
+}
+
+#define CVMX_SLI_STATE3 CVMX_SLI_STATE3_FUNC()
+static inline u64 CVMX_SLI_STATE3_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000640ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000640ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000028640ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000028640ull;
+       }
+       return 0x0000000000028640ull;
+}
+
+#define CVMX_SLI_TX_PIPE    (0x0000000000001230ull)
+#define CVMX_SLI_WINDOW_CTL CVMX_SLI_WINDOW_CTL_FUNC()
+static inline u64 CVMX_SLI_WINDOW_CTL_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000002E0ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00000000000002E0ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00000000000282E0ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00000000000282E0ull;
+       }
+       return 0x00000000000282E0ull;
+}
+
+#define CVMX_SLI_WIN_RD_ADDR CVMX_SLI_WIN_RD_ADDR_FUNC()
+static inline u64 CVMX_SLI_WIN_RD_ADDR_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000010ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000010ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000020010ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000020010ull;
+       }
+       return 0x0000000000020010ull;
+}
+
+#define CVMX_SLI_WIN_RD_DATA CVMX_SLI_WIN_RD_DATA_FUNC()
+static inline u64 CVMX_SLI_WIN_RD_DATA_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000040ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000040ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000020040ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000020040ull;
+       }
+       return 0x0000000000020040ull;
+}
+
+#define CVMX_SLI_WIN_WR_ADDR CVMX_SLI_WIN_WR_ADDR_FUNC()
+static inline u64 CVMX_SLI_WIN_WR_ADDR_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000000ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000000ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000020000ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000020000ull;
+       }
+       return 0x0000000000020000ull;
+}
+
+#define CVMX_SLI_WIN_WR_DATA CVMX_SLI_WIN_WR_DATA_FUNC()
+static inline u64 CVMX_SLI_WIN_WR_DATA_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000020ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000020ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000020020ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000020020ull;
+       }
+       return 0x0000000000020020ull;
+}
+
+#define CVMX_SLI_WIN_WR_MASK CVMX_SLI_WIN_WR_MASK_FUNC()
+static inline u64 CVMX_SLI_WIN_WR_MASK_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000030ull;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0000000000000030ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0000000000020030ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000020030ull;
+       }
+       return 0x0000000000020030ull;
+}
+
+/**
+ * cvmx_sli_bist_status
+ *
+ * This register contains results from BIST runs of MAC's memories: 0 = pass (or BIST in
+ * progress/never run), 1 = fail.
+ */
+union cvmx_sli_bist_status {
+       u64 u64;
+       struct cvmx_sli_bist_status_s {
+               u64 reserved_32_63 : 32;
+               u64 ncb_req : 1;
+               u64 n2p0_c : 1;
+               u64 n2p0_o : 1;
+               u64 n2p1_c : 1;
+               u64 n2p1_o : 1;
+               u64 cpl_p0 : 1;
+               u64 cpl_p1 : 1;
+               u64 reserved_19_24 : 6;
+               u64 p2n0_c0 : 1;
+               u64 p2n0_c1 : 1;
+               u64 p2n0_n : 1;
+               u64 p2n0_p0 : 1;
+               u64 p2n0_p1 : 1;
+               u64 p2n1_c0 : 1;
+               u64 p2n1_c1 : 1;
+               u64 p2n1_n : 1;
+               u64 p2n1_p0 : 1;
+               u64 p2n1_p1 : 1;
+               u64 reserved_6_8 : 3;
+               u64 dsi1_1 : 1;
+               u64 dsi1_0 : 1;
+               u64 dsi0_1 : 1;
+               u64 dsi0_0 : 1;
+               u64 msi : 1;
+               u64 ncb_cmd : 1;
+       } s;
+       struct cvmx_sli_bist_status_cn61xx {
+               u64 reserved_31_63 : 33;
+               u64 n2p0_c : 1;
+               u64 n2p0_o : 1;
+               u64 reserved_27_28 : 2;
+               u64 cpl_p0 : 1;
+               u64 cpl_p1 : 1;
+               u64 reserved_19_24 : 6;
+               u64 p2n0_c0 : 1;
+               u64 p2n0_c1 : 1;
+               u64 p2n0_n : 1;
+               u64 p2n0_p0 : 1;
+               u64 p2n0_p1 : 1;
+               u64 p2n1_c0 : 1;
+               u64 p2n1_c1 : 1;
+               u64 p2n1_n : 1;
+               u64 p2n1_p0 : 1;
+               u64 p2n1_p1 : 1;
+               u64 reserved_6_8 : 3;
+               u64 dsi1_1 : 1;
+               u64 dsi1_0 : 1;
+               u64 dsi0_1 : 1;
+               u64 dsi0_0 : 1;
+               u64 msi : 1;
+               u64 ncb_cmd : 1;
+       } cn61xx;
+       struct cvmx_sli_bist_status_cn63xx {
+               u64 reserved_31_63 : 33;
+               u64 n2p0_c : 1;
+               u64 n2p0_o : 1;
+               u64 n2p1_c : 1;
+               u64 n2p1_o : 1;
+               u64 cpl_p0 : 1;
+               u64 cpl_p1 : 1;
+               u64 reserved_19_24 : 6;
+               u64 p2n0_c0 : 1;
+               u64 p2n0_c1 : 1;
+               u64 p2n0_n : 1;
+               u64 p2n0_p0 : 1;
+               u64 p2n0_p1 : 1;
+               u64 p2n1_c0 : 1;
+               u64 p2n1_c1 : 1;
+               u64 p2n1_n : 1;
+               u64 p2n1_p0 : 1;
+               u64 p2n1_p1 : 1;
+               u64 reserved_6_8 : 3;
+               u64 dsi1_1 : 1;
+               u64 dsi1_0 : 1;
+               u64 dsi0_1 : 1;
+               u64 dsi0_0 : 1;
+               u64 msi : 1;
+               u64 ncb_cmd : 1;
+       } cn63xx;
+       struct cvmx_sli_bist_status_cn63xx cn63xxp1;
+       struct cvmx_sli_bist_status_cn61xx cn66xx;
+       struct cvmx_sli_bist_status_s cn68xx;
+       struct cvmx_sli_bist_status_s cn68xxp1;
+       struct cvmx_sli_bist_status_cn70xx {
+               u64 reserved_31_63 : 33;
+               u64 n2p0_c : 1;
+               u64 n2p0_o : 1;
+               u64 reserved_27_28 : 2;
+               u64 cpl_p0 : 1;
+               u64 cpl_p1 : 1;
+               u64 reserved_19_24 : 6;
+               u64 p2n0_c0 : 1;
+               u64 reserved_17_17 : 1;
+               u64 p2n0_n : 1;
+               u64 p2n0_p0 : 1;
+               u64 reserved_14_14 : 1;
+               u64 p2n1_c0 : 1;
+               u64 reserved_12_12 : 1;
+               u64 p2n1_n : 1;
+               u64 p2n1_p0 : 1;
+               u64 reserved_6_9 : 4;
+               u64 dsi1_1 : 1;
+               u64 dsi1_0 : 1;
+               u64 dsi0_1 : 1;
+               u64 dsi0_0 : 1;
+               u64 msi : 1;
+               u64 ncb_cmd : 1;
+       } cn70xx;
+       struct cvmx_sli_bist_status_cn70xx cn70xxp1;
+       struct cvmx_sli_bist_status_s cn73xx;
+       struct cvmx_sli_bist_status_s cn78xx;
+       struct cvmx_sli_bist_status_s cn78xxp1;
+       struct cvmx_sli_bist_status_cn61xx cnf71xx;
+       struct cvmx_sli_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_sli_bist_status cvmx_sli_bist_status_t;
+
+/**
+ * cvmx_sli_ciu_int_enb
+ *
+ * Interrupt enable register for a given SLI_CIU_INT_SUM register.
+ *
+ */
+union cvmx_sli_ciu_int_enb {
+       u64 u64;
+       struct cvmx_sli_ciu_int_enb_s {
+               u64 reserved_51_63 : 13;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 m3p0_pppf_err : 1;
+               u64 m3p0_pktpf_err : 1;
+               u64 m3p0_dmapf_err : 1;
+               u64 m2p0_pppf_err : 1;
+               u64 m2p0_ppvf_err : 1;
+               u64 m2p0_pktpf_err : 1;
+               u64 m2p0_pktvf_err : 1;
+               u64 m2p0_dmapf_err : 1;
+               u64 m2p0_dmavf_err : 1;
+               u64 m1p0_pppf_err : 1;
+               u64 m1p0_pktpf_err : 1;
+               u64 m1p0_dmapf_err : 1;
+               u64 m0p1_pppf_err : 1;
+               u64 m0p1_ppvf_err : 1;
+               u64 m0p1_pktpf_err : 1;
+               u64 m0p1_pktvf_err : 1;
+               u64 m0p1_dmapf_err : 1;
+               u64 m0p1_dmavf_err : 1;
+               u64 m0p0_pppf_err : 1;
+               u64 m0p0_ppvf_err : 1;
+               u64 m0p0_pktpf_err : 1;
+               u64 m0p0_pktvf_err : 1;
+               u64 m0p0_dmapf_err : 1;
+               u64 m0p0_dmavf_err : 1;
+               u64 m2v0_flr : 1;
+               u64 m2p0_flr : 1;
+               u64 reserved_5_8 : 4;
+               u64 m0v1_flr : 1;
+               u64 m0p1_flr : 1;
+               u64 m0v0_flr : 1;
+               u64 m0p0_flr : 1;
+               u64 rml_to : 1;
+       } s;
+       struct cvmx_sli_ciu_int_enb_s cn73xx;
+       struct cvmx_sli_ciu_int_enb_s cn78xx;
+       struct cvmx_sli_ciu_int_enb_s cnf75xx;
+};
+
+typedef union cvmx_sli_ciu_int_enb cvmx_sli_ciu_int_enb_t;
+
+/**
+ * cvmx_sli_ciu_int_sum
+ *
+ * The fields in this register are set when an interrupt condition occurs; write 1 to clear.
+ * A bit set in this register will send and interrupt to CIU
+ */
+union cvmx_sli_ciu_int_sum {
+       u64 u64;
+       struct cvmx_sli_ciu_int_sum_s {
+               u64 reserved_51_63 : 13;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 m3p0_pppf_err : 1;
+               u64 m3p0_pktpf_err : 1;
+               u64 m3p0_dmapf_err : 1;
+               u64 m2p0_pppf_err : 1;
+               u64 m2p0_ppvf_err : 1;
+               u64 m2p0_pktpf_err : 1;
+               u64 m2p0_pktvf_err : 1;
+               u64 m2p0_dmapf_err : 1;
+               u64 m2p0_dmavf_err : 1;
+               u64 m1p0_pppf_err : 1;
+               u64 m1p0_pktpf_err : 1;
+               u64 m1p0_dmapf_err : 1;
+               u64 m0p1_pppf_err : 1;
+               u64 m0p1_ppvf_err : 1;
+               u64 m0p1_pktpf_err : 1;
+               u64 m0p1_pktvf_err : 1;
+               u64 m0p1_dmapf_err : 1;
+               u64 m0p1_dmavf_err : 1;
+               u64 m0p0_pppf_err : 1;
+               u64 m0p0_ppvf_err : 1;
+               u64 m0p0_pktpf_err : 1;
+               u64 m0p0_pktvf_err : 1;
+               u64 m0p0_dmapf_err : 1;
+               u64 m0p0_dmavf_err : 1;
+               u64 m2v0_flr : 1;
+               u64 m2p0_flr : 1;
+               u64 reserved_5_8 : 4;
+               u64 m0v1_flr : 1;
+               u64 m0p1_flr : 1;
+               u64 m0v0_flr : 1;
+               u64 m0p0_flr : 1;
+               u64 rml_to : 1;
+       } s;
+       struct cvmx_sli_ciu_int_sum_s cn73xx;
+       struct cvmx_sli_ciu_int_sum_s cn78xx;
+       struct cvmx_sli_ciu_int_sum_s cnf75xx;
+};
+
+typedef union cvmx_sli_ciu_int_sum cvmx_sli_ciu_int_sum_t;
+
+/**
+ * cvmx_sli_ctl_port#
+ *
+ * These registers contains control information for access to ports. Indexed by SLI_PORT_E.
+ * Note: SLI_CTL_PORT0 controls PF0.
+ */
+union cvmx_sli_ctl_portx {
+       u64 u64;
+       struct cvmx_sli_ctl_portx_s {
+               u64 reserved_22_63 : 42;
+               u64 intd : 1;
+               u64 intc : 1;
+               u64 intb : 1;
+               u64 inta : 1;
+               u64 dis_port : 1;
+               u64 waitl_com : 1;
+               u64 intd_map : 2;
+               u64 intc_map : 2;
+               u64 intb_map : 2;
+               u64 inta_map : 2;
+               u64 ctlp_ro : 1;
+               u64 reserved_6_6 : 1;
+               u64 ptlp_ro : 1;
+               u64 reserved_1_4 : 4;
+               u64 wait_com : 1;
+       } s;
+       struct cvmx_sli_ctl_portx_s cn61xx;
+       struct cvmx_sli_ctl_portx_s cn63xx;
+       struct cvmx_sli_ctl_portx_s cn63xxp1;
+       struct cvmx_sli_ctl_portx_s cn66xx;
+       struct cvmx_sli_ctl_portx_s cn68xx;
+       struct cvmx_sli_ctl_portx_s cn68xxp1;
+       struct cvmx_sli_ctl_portx_cn70xx {
+               u64 reserved_22_63 : 42;
+               u64 intd : 1;
+               u64 intc : 1;
+               u64 intb : 1;
+               u64 inta : 1;
+               u64 dis_port : 1;
+               u64 waitl_com : 1;
+               u64 intd_map : 2;
+               u64 intc_map : 2;
+               u64 intb_map : 2;
+               u64 inta_map : 2;
+               u64 ctlp_ro : 1;
+               u64 reserved_6_6 : 1;
+               u64 ptlp_ro : 1;
+               u64 reserved_4_1 : 4;
+               u64 wait_com : 1;
+       } cn70xx;
+       struct cvmx_sli_ctl_portx_cn70xx cn70xxp1;
+       struct cvmx_sli_ctl_portx_cn73xx {
+               u64 reserved_18_63 : 46;
+               u64 dis_port : 1;
+               u64 waitl_com : 1;
+               u64 reserved_8_15 : 8;
+               u64 ctlp_ro : 1;
+               u64 reserved_6_6 : 1;
+               u64 ptlp_ro : 1;
+               u64 reserved_1_4 : 4;
+               u64 wait_com : 1;
+       } cn73xx;
+       struct cvmx_sli_ctl_portx_cn73xx cn78xx;
+       struct cvmx_sli_ctl_portx_cn73xx cn78xxp1;
+       struct cvmx_sli_ctl_portx_s cnf71xx;
+       struct cvmx_sli_ctl_portx_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_ctl_portx cvmx_sli_ctl_portx_t;
+
+/**
+ * cvmx_sli_ctl_status
+ *
+ * This register contains control and status for SLI. Write operations to this register are not
+ * ordered with write/read operations to the MAC memory space. To ensure that a write has
+ * completed, software must read the register before making an access (i.e. MAC memory space)
+ * that requires the value of this register to be updated.
+ */
+union cvmx_sli_ctl_status {
+       u64 u64;
+       struct cvmx_sli_ctl_status_s {
+               u64 reserved_32_63 : 32;
+               u64 m2s1_ncbi : 4;
+               u64 m2s0_ncbi : 4;
+               u64 oci_id : 4;
+               u64 p1_ntags : 6;
+               u64 p0_ntags : 6;
+               u64 chip_rev : 8;
+       } s;
+       struct cvmx_sli_ctl_status_cn61xx {
+               u64 reserved_14_63 : 50;
+               u64 p0_ntags : 6;
+               u64 chip_rev : 8;
+       } cn61xx;
+       struct cvmx_sli_ctl_status_cn63xx {
+               u64 reserved_20_63 : 44;
+               u64 p1_ntags : 6;
+               u64 p0_ntags : 6;
+               u64 chip_rev : 8;
+       } cn63xx;
+       struct cvmx_sli_ctl_status_cn63xx cn63xxp1;
+       struct cvmx_sli_ctl_status_cn61xx cn66xx;
+       struct cvmx_sli_ctl_status_cn63xx cn68xx;
+       struct cvmx_sli_ctl_status_cn63xx cn68xxp1;
+       struct cvmx_sli_ctl_status_cn63xx cn70xx;
+       struct cvmx_sli_ctl_status_cn63xx cn70xxp1;
+       struct cvmx_sli_ctl_status_cn73xx {
+               u64 reserved_32_63 : 32;
+               u64 m2s1_ncbi : 4;
+               u64 m2s0_ncbi : 4;
+               u64 reserved_20_23 : 4;
+               u64 p1_ntags : 6;
+               u64 p0_ntags : 6;
+               u64 chip_rev : 8;
+       } cn73xx;
+       struct cvmx_sli_ctl_status_s cn78xx;
+       struct cvmx_sli_ctl_status_s cn78xxp1;
+       struct cvmx_sli_ctl_status_cn61xx cnf71xx;
+       struct cvmx_sli_ctl_status_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_ctl_status cvmx_sli_ctl_status_t;
+
+/**
+ * cvmx_sli_data_out_cnt
+ *
+ * This register contains the EXEC data out FIFO count and the data unload counter.
+ *
+ */
+union cvmx_sli_data_out_cnt {
+       u64 u64;
+       struct cvmx_sli_data_out_cnt_s {
+               u64 reserved_44_63 : 20;
+               u64 p1_ucnt : 16;
+               u64 p1_fcnt : 6;
+               u64 p0_ucnt : 16;
+               u64 p0_fcnt : 6;
+       } s;
+       struct cvmx_sli_data_out_cnt_s cn61xx;
+       struct cvmx_sli_data_out_cnt_s cn63xx;
+       struct cvmx_sli_data_out_cnt_s cn63xxp1;
+       struct cvmx_sli_data_out_cnt_s cn66xx;
+       struct cvmx_sli_data_out_cnt_s cn68xx;
+       struct cvmx_sli_data_out_cnt_s cn68xxp1;
+       struct cvmx_sli_data_out_cnt_s cn70xx;
+       struct cvmx_sli_data_out_cnt_s cn70xxp1;
+       struct cvmx_sli_data_out_cnt_s cn73xx;
+       struct cvmx_sli_data_out_cnt_s cn78xx;
+       struct cvmx_sli_data_out_cnt_s cn78xxp1;
+       struct cvmx_sli_data_out_cnt_s cnf71xx;
+       struct cvmx_sli_data_out_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sli_data_out_cnt cvmx_sli_data_out_cnt_t;
+
+/**
+ * cvmx_sli_dbg_data
+ *
+ * SLI_DBG_DATA = SLI Debug Data Register
+ *
+ * Value returned on the debug-data lines from the RSLs
+ */
+union cvmx_sli_dbg_data {
+       u64 u64;
+       struct cvmx_sli_dbg_data_s {
+               u64 reserved_18_63 : 46;
+               u64 dsel_ext : 1;
+               u64 data : 17;
+       } s;
+       struct cvmx_sli_dbg_data_s cn61xx;
+       struct cvmx_sli_dbg_data_s cn63xx;
+       struct cvmx_sli_dbg_data_s cn63xxp1;
+       struct cvmx_sli_dbg_data_s cn66xx;
+       struct cvmx_sli_dbg_data_s cn68xx;
+       struct cvmx_sli_dbg_data_s cn68xxp1;
+       struct cvmx_sli_dbg_data_s cnf71xx;
+};
+
+typedef union cvmx_sli_dbg_data cvmx_sli_dbg_data_t;
+
+/**
+ * cvmx_sli_dbg_select
+ *
+ * SLI_DBG_SELECT = Debug Select Register
+ *
+ * Contains the debug select value last written to the RSLs.
+ */
+union cvmx_sli_dbg_select {
+       u64 u64;
+       struct cvmx_sli_dbg_select_s {
+               u64 reserved_33_63 : 31;
+               u64 adbg_sel : 1;
+               u64 dbg_sel : 32;
+       } s;
+       struct cvmx_sli_dbg_select_s cn61xx;
+       struct cvmx_sli_dbg_select_s cn63xx;
+       struct cvmx_sli_dbg_select_s cn63xxp1;
+       struct cvmx_sli_dbg_select_s cn66xx;
+       struct cvmx_sli_dbg_select_s cn68xx;
+       struct cvmx_sli_dbg_select_s cn68xxp1;
+       struct cvmx_sli_dbg_select_s cnf71xx;
+};
+
+typedef union cvmx_sli_dbg_select cvmx_sli_dbg_select_t;
+
+/**
+ * cvmx_sli_dma#_cnt
+ *
+ * These registers contain the DMA count values.
+ *
+ */
+union cvmx_sli_dmax_cnt {
+       u64 u64;
+       struct cvmx_sli_dmax_cnt_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sli_dmax_cnt_s cn61xx;
+       struct cvmx_sli_dmax_cnt_s cn63xx;
+       struct cvmx_sli_dmax_cnt_s cn63xxp1;
+       struct cvmx_sli_dmax_cnt_s cn66xx;
+       struct cvmx_sli_dmax_cnt_s cn68xx;
+       struct cvmx_sli_dmax_cnt_s cn68xxp1;
+       struct cvmx_sli_dmax_cnt_s cn70xx;
+       struct cvmx_sli_dmax_cnt_s cn70xxp1;
+       struct cvmx_sli_dmax_cnt_s cn73xx;
+       struct cvmx_sli_dmax_cnt_s cn78xx;
+       struct cvmx_sli_dmax_cnt_s cn78xxp1;
+       struct cvmx_sli_dmax_cnt_s cnf71xx;
+       struct cvmx_sli_dmax_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sli_dmax_cnt cvmx_sli_dmax_cnt_t;
+
+/**
+ * cvmx_sli_dma#_int_level
+ *
+ * These registers contain the thresholds for DMA count and timer interrupts.
+ *
+ */
+union cvmx_sli_dmax_int_level {
+       u64 u64;
+       struct cvmx_sli_dmax_int_level_s {
+               u64 time : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sli_dmax_int_level_s cn61xx;
+       struct cvmx_sli_dmax_int_level_s cn63xx;
+       struct cvmx_sli_dmax_int_level_s cn63xxp1;
+       struct cvmx_sli_dmax_int_level_s cn66xx;
+       struct cvmx_sli_dmax_int_level_s cn68xx;
+       struct cvmx_sli_dmax_int_level_s cn68xxp1;
+       struct cvmx_sli_dmax_int_level_s cn70xx;
+       struct cvmx_sli_dmax_int_level_s cn70xxp1;
+       struct cvmx_sli_dmax_int_level_s cn73xx;
+       struct cvmx_sli_dmax_int_level_s cn78xx;
+       struct cvmx_sli_dmax_int_level_s cn78xxp1;
+       struct cvmx_sli_dmax_int_level_s cnf71xx;
+       struct cvmx_sli_dmax_int_level_s cnf75xx;
+};
+
+typedef union cvmx_sli_dmax_int_level cvmx_sli_dmax_int_level_t;
+
+/**
+ * cvmx_sli_dma#_tim
+ *
+ * These registers contain the DMA timer values.
+ *
+ */
+union cvmx_sli_dmax_tim {
+       u64 u64;
+       struct cvmx_sli_dmax_tim_s {
+               u64 reserved_32_63 : 32;
+               u64 tim : 32;
+       } s;
+       struct cvmx_sli_dmax_tim_s cn61xx;
+       struct cvmx_sli_dmax_tim_s cn63xx;
+       struct cvmx_sli_dmax_tim_s cn63xxp1;
+       struct cvmx_sli_dmax_tim_s cn66xx;
+       struct cvmx_sli_dmax_tim_s cn68xx;
+       struct cvmx_sli_dmax_tim_s cn68xxp1;
+       struct cvmx_sli_dmax_tim_s cn70xx;
+       struct cvmx_sli_dmax_tim_s cn70xxp1;
+       struct cvmx_sli_dmax_tim_s cn73xx;
+       struct cvmx_sli_dmax_tim_s cn78xx;
+       struct cvmx_sli_dmax_tim_s cn78xxp1;
+       struct cvmx_sli_dmax_tim_s cnf71xx;
+       struct cvmx_sli_dmax_tim_s cnf75xx;
+};
+
+typedef union cvmx_sli_dmax_tim cvmx_sli_dmax_tim_t;
+
+/**
+ * cvmx_sli_int_enb_ciu
+ *
+ * Used to enable the various interrupting conditions of SLI
+ *
+ */
+union cvmx_sli_int_enb_ciu {
+       u64 u64;
+       struct cvmx_sli_int_enb_ciu_s {
+               u64 reserved_62_63 : 2;
+               u64 pipe_err : 1;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_29_31 : 3;
+               u64 mio_int2 : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 reserved_18_19 : 2;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } s;
+       struct cvmx_sli_int_enb_ciu_cn61xx {
+               u64 reserved_61_63 : 3;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_28_31 : 4;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 reserved_18_19 : 2;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn61xx;
+       struct cvmx_sli_int_enb_ciu_cn63xx {
+               u64 reserved_61_63 : 3;
+               u64 ill_pad : 1;
+               u64 reserved_58_59 : 2;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_18_31 : 14;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn63xx;
+       struct cvmx_sli_int_enb_ciu_cn63xx cn63xxp1;
+       struct cvmx_sli_int_enb_ciu_cn61xx cn66xx;
+       struct cvmx_sli_int_enb_ciu_cn68xx {
+               u64 reserved_62_63 : 2;
+               u64 pipe_err : 1;
+               u64 ill_pad : 1;
+               u64 reserved_58_59 : 2;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 reserved_51_51 : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_18_31 : 14;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn68xx;
+       struct cvmx_sli_int_enb_ciu_cn68xx cn68xxp1;
+       struct cvmx_sli_int_enb_ciu_cn70xx {
+               u64 reserved_63_61 : 3;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_47_38 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_31_29 : 3;
+               u64 mio_int2 : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 reserved_19_18 : 2;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_7_6 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn70xx;
+       struct cvmx_sli_int_enb_ciu_cn70xx cn70xxp1;
+       struct cvmx_sli_int_enb_ciu_cn61xx cnf71xx;
+};
+
+typedef union cvmx_sli_int_enb_ciu cvmx_sli_int_enb_ciu_t;
+
+/**
+ * cvmx_sli_int_enb_port#
+ *
+ * When a field in this register is set, and a corresponding interrupt condition asserts in
+ * SLI_INT_SUM, an interrupt is generated. Interrupts can be sent to PCIe0 or PCIe1.
+ */
+union cvmx_sli_int_enb_portx {
+       u64 u64;
+       struct cvmx_sli_int_enb_portx_s {
+               u64 reserved_62_63 : 2;
+               u64 pipe_err : 1;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_30_31 : 2;
+               u64 mac2_int : 1;
+               u64 reserved_28_28 : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 mio_int3 : 1;
+               u64 reserved_6_6 : 1;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } s;
+       struct cvmx_sli_int_enb_portx_cn61xx {
+               u64 reserved_61_63 : 3;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_28_31 : 4;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn61xx;
+       struct cvmx_sli_int_enb_portx_cn63xx {
+               u64 reserved_61_63 : 3;
+               u64 ill_pad : 1;
+               u64 reserved_58_59 : 2;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_20_31 : 12;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn63xx;
+       struct cvmx_sli_int_enb_portx_cn63xx cn63xxp1;
+       struct cvmx_sli_int_enb_portx_cn61xx cn66xx;
+       struct cvmx_sli_int_enb_portx_cn68xx {
+               u64 reserved_62_63 : 2;
+               u64 pipe_err : 1;
+               u64 ill_pad : 1;
+               u64 reserved_58_59 : 2;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 reserved_51_51 : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_20_31 : 12;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn68xx;
+       struct cvmx_sli_int_enb_portx_cn68xx cn68xxp1;
+       struct cvmx_sli_int_enb_portx_cn70xx {
+               u64 reserved_63_61 : 3;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_47_38 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_31_30 : 2;
+               u64 mac2_int : 1;
+               u64 mio_int2 : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_7_6 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn70xx;
+       struct cvmx_sli_int_enb_portx_cn70xx cn70xxp1;
+       struct cvmx_sli_int_enb_portx_cn78xxp1 {
+               u64 reserved_60_63 : 4;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 reserved_50_51 : 2;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_29_31 : 3;
+               u64 vf_err : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 reserved_18_19 : 2;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 mio_int3 : 1;
+               u64 mio_int2 : 1;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 reserved_1_3 : 3;
+               u64 rml_to : 1;
+       } cn78xxp1;
+       struct cvmx_sli_int_enb_portx_cn61xx cnf71xx;
+};
+
+typedef union cvmx_sli_int_enb_portx cvmx_sli_int_enb_portx_t;
+
+/**
+ * cvmx_sli_int_sum
+ *
+ * The fields in this register are set when an interrupt condition occurs; write 1 to clear. All
+ * fields of the register are valid when a PF reads the register. Not available to VFs, and
+ * writes by the
+ * VF do not modify the register.
+ */
+union cvmx_sli_int_sum {
+       u64 u64;
+       struct cvmx_sli_int_sum_s {
+               u64 reserved_62_63 : 2;
+               u64 pipe_err : 1;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_30_31 : 2;
+               u64 mac2_int : 1;
+               u64 reserved_28_28 : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 mio_int3 : 1;
+               u64 reserved_6_6 : 1;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } s;
+       struct cvmx_sli_int_sum_cn61xx {
+               u64 reserved_61_63 : 3;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_28_31 : 4;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn61xx;
+       struct cvmx_sli_int_sum_cn63xx {
+               u64 reserved_61_63 : 3;
+               u64 ill_pad : 1;
+               u64 reserved_58_59 : 2;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_20_31 : 12;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn63xx;
+       struct cvmx_sli_int_sum_cn63xx cn63xxp1;
+       struct cvmx_sli_int_sum_cn61xx cn66xx;
+       struct cvmx_sli_int_sum_cn68xx {
+               u64 reserved_62_63 : 2;
+               u64 pipe_err : 1;
+               u64 ill_pad : 1;
+               u64 reserved_58_59 : 2;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 reserved_51_51 : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_20_31 : 12;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn68xx;
+       struct cvmx_sli_int_sum_cn68xx cn68xxp1;
+       struct cvmx_sli_int_sum_cn70xx {
+               u64 reserved_61_63 : 3;
+               u64 ill_pad : 1;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 pin_bp : 1;
+               u64 pout_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_30_31 : 2;
+               u64 mac2_int : 1;
+               u64 mio_int2 : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 mac1_int : 1;
+               u64 mac0_int : 1;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 iob2big : 1;
+               u64 bar0_to : 1;
+               u64 reserved_1_1 : 1;
+               u64 rml_to : 1;
+       } cn70xx;
+       struct cvmx_sli_int_sum_cn70xx cn70xxp1;
+       struct cvmx_sli_int_sum_cn78xxp1 {
+               u64 reserved_60_63 : 4;
+               u64 sprt3_err : 1;
+               u64 sprt2_err : 1;
+               u64 sprt1_err : 1;
+               u64 sprt0_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 reserved_50_51 : 2;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+               u64 reserved_38_47 : 10;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_29_31 : 3;
+               u64 vf_err : 1;
+               u64 m3_un_wi : 1;
+               u64 m3_un_b0 : 1;
+               u64 m3_up_wi : 1;
+               u64 m3_up_b0 : 1;
+               u64 m2_un_wi : 1;
+               u64 m2_un_b0 : 1;
+               u64 m2_up_wi : 1;
+               u64 m2_up_b0 : 1;
+               u64 reserved_18_19 : 2;
+               u64 mio_int1 : 1;
+               u64 mio_int0 : 1;
+               u64 m1_un_wi : 1;
+               u64 m1_un_b0 : 1;
+               u64 m1_up_wi : 1;
+               u64 m1_up_b0 : 1;
+               u64 m0_un_wi : 1;
+               u64 m0_un_b0 : 1;
+               u64 m0_up_wi : 1;
+               u64 m0_up_b0 : 1;
+               u64 mio_int3 : 1;
+               u64 mio_int2 : 1;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 reserved_1_3 : 3;
+               u64 rml_to : 1;
+       } cn78xxp1;
+       struct cvmx_sli_int_sum_cn61xx cnf71xx;
+};
+
+typedef union cvmx_sli_int_sum cvmx_sli_int_sum_t;
+
+/**
+ * cvmx_sli_last_win_rdata0
+ *
+ * The data from the last initiated window read by MAC 0.
+ *
+ */
+union cvmx_sli_last_win_rdata0 {
+       u64 u64;
+       struct cvmx_sli_last_win_rdata0_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_last_win_rdata0_s cn61xx;
+       struct cvmx_sli_last_win_rdata0_s cn63xx;
+       struct cvmx_sli_last_win_rdata0_s cn63xxp1;
+       struct cvmx_sli_last_win_rdata0_s cn66xx;
+       struct cvmx_sli_last_win_rdata0_s cn68xx;
+       struct cvmx_sli_last_win_rdata0_s cn68xxp1;
+       struct cvmx_sli_last_win_rdata0_s cn70xx;
+       struct cvmx_sli_last_win_rdata0_s cn70xxp1;
+       struct cvmx_sli_last_win_rdata0_s cnf71xx;
+};
+
+typedef union cvmx_sli_last_win_rdata0 cvmx_sli_last_win_rdata0_t;
+
+/**
+ * cvmx_sli_last_win_rdata1
+ *
+ * The data from the last initiated window read by MAC 1.
+ *
+ */
+union cvmx_sli_last_win_rdata1 {
+       u64 u64;
+       struct cvmx_sli_last_win_rdata1_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_last_win_rdata1_s cn61xx;
+       struct cvmx_sli_last_win_rdata1_s cn63xx;
+       struct cvmx_sli_last_win_rdata1_s cn63xxp1;
+       struct cvmx_sli_last_win_rdata1_s cn66xx;
+       struct cvmx_sli_last_win_rdata1_s cn68xx;
+       struct cvmx_sli_last_win_rdata1_s cn68xxp1;
+       struct cvmx_sli_last_win_rdata1_s cn70xx;
+       struct cvmx_sli_last_win_rdata1_s cn70xxp1;
+       struct cvmx_sli_last_win_rdata1_s cnf71xx;
+};
+
+typedef union cvmx_sli_last_win_rdata1 cvmx_sli_last_win_rdata1_t;
+
+/**
+ * cvmx_sli_last_win_rdata2
+ *
+ * The data from the last initiated window read by MAC 2.
+ *
+ */
+union cvmx_sli_last_win_rdata2 {
+       u64 u64;
+       struct cvmx_sli_last_win_rdata2_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_last_win_rdata2_s cn61xx;
+       struct cvmx_sli_last_win_rdata2_s cn66xx;
+       struct cvmx_sli_last_win_rdata2_s cn70xx;
+       struct cvmx_sli_last_win_rdata2_s cn70xxp1;
+       struct cvmx_sli_last_win_rdata2_s cnf71xx;
+};
+
+typedef union cvmx_sli_last_win_rdata2 cvmx_sli_last_win_rdata2_t;
+
+/**
+ * cvmx_sli_last_win_rdata3
+ *
+ * The data from the last initiated window read by MAC 3.
+ *
+ */
+union cvmx_sli_last_win_rdata3 {
+       u64 u64;
+       struct cvmx_sli_last_win_rdata3_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_last_win_rdata3_s cn61xx;
+       struct cvmx_sli_last_win_rdata3_s cn66xx;
+       struct cvmx_sli_last_win_rdata3_s cn70xx;
+       struct cvmx_sli_last_win_rdata3_s cn70xxp1;
+       struct cvmx_sli_last_win_rdata3_s cnf71xx;
+};
+
+typedef union cvmx_sli_last_win_rdata3 cvmx_sli_last_win_rdata3_t;
+
+/**
+ * cvmx_sli_mac#_pf#_dma_vf_int
+ *
+ * When an error response is received for a VF DMA transaction read, the appropriate VF indexed
+ * bit is set.  The appropriate PF should read the appropriate register.
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_dma_vf_int {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_dma_vf_int_s {
+               u64 vf_int : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_dma_vf_int_s cn73xx;
+       struct cvmx_sli_macx_pfx_dma_vf_int_s cn78xx;
+       struct cvmx_sli_macx_pfx_dma_vf_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_dma_vf_int cvmx_sli_macx_pfx_dma_vf_int_t;
+
+/**
+ * cvmx_sli_mac#_pf#_dma_vf_int_enb
+ *
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_dma_vf_int_enb {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_dma_vf_int_enb_s {
+               u64 vf_int_enb : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_dma_vf_int_enb_s cn73xx;
+       struct cvmx_sli_macx_pfx_dma_vf_int_enb_s cn78xx;
+       struct cvmx_sli_macx_pfx_dma_vf_int_enb_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_dma_vf_int_enb cvmx_sli_macx_pfx_dma_vf_int_enb_t;
+
+/**
+ * cvmx_sli_mac#_pf#_flr_vf_int
+ *
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_flr_vf_int {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_flr_vf_int_s {
+               u64 vf_int : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_flr_vf_int_s cn73xx;
+       struct cvmx_sli_macx_pfx_flr_vf_int_s cn78xx;
+       struct cvmx_sli_macx_pfx_flr_vf_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_flr_vf_int cvmx_sli_macx_pfx_flr_vf_int_t;
+
+/**
+ * cvmx_sli_mac#_pf#_int_enb
+ *
+ * Interrupt enable register for a given PF SLI_MAC()_PF()_INT_SUM register.
+ * Indexed by (MAC index) SLI_PORT_E.
+ */
+union cvmx_sli_macx_pfx_int_enb {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_int_enb_s {
+               u64 pppf_err : 1;
+               u64 ppvf_err : 1;
+               u64 pktpf_err : 1;
+               u64 pktvf_err : 1;
+               u64 dmapf_err : 1;
+               u64 dmavf_err : 1;
+               u64 vf_mbox : 1;
+               u64 reserved_38_56 : 19;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_12_31 : 20;
+               u64 un_wi : 1;
+               u64 un_b0 : 1;
+               u64 up_wi : 1;
+               u64 up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 reserved_2_3 : 2;
+               u64 mio_int : 1;
+               u64 rml_to : 1;
+       } s;
+       struct cvmx_sli_macx_pfx_int_enb_s cn73xx;
+       struct cvmx_sli_macx_pfx_int_enb_s cn78xx;
+       struct cvmx_sli_macx_pfx_int_enb_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_int_enb cvmx_sli_macx_pfx_int_enb_t;
+
+/**
+ * cvmx_sli_mac#_pf#_int_sum
+ *
+ * Interrupt summary register for a given PF. Indexed (MAC index) by SLI_PORT_E.
+ * The fields in this register are set when an interrupt condition occurs; write 1 to clear.
+ */
+union cvmx_sli_macx_pfx_int_sum {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_int_sum_s {
+               u64 pppf_err : 1;
+               u64 ppvf_err : 1;
+               u64 pktpf_err : 1;
+               u64 pktvf_err : 1;
+               u64 dmapf_err : 1;
+               u64 dmavf_err : 1;
+               u64 vf_mbox : 1;
+               u64 reserved_38_56 : 19;
+               u64 dtime : 2;
+               u64 dcnt : 2;
+               u64 dmafi : 2;
+               u64 reserved_12_31 : 20;
+               u64 un_wi : 1;
+               u64 un_b0 : 1;
+               u64 up_wi : 1;
+               u64 up_b0 : 1;
+               u64 reserved_6_7 : 2;
+               u64 ptime : 1;
+               u64 pcnt : 1;
+               u64 reserved_2_3 : 2;
+               u64 mio_int : 1;
+               u64 rml_to : 1;
+       } s;
+       struct cvmx_sli_macx_pfx_int_sum_s cn73xx;
+       struct cvmx_sli_macx_pfx_int_sum_s cn78xx;
+       struct cvmx_sli_macx_pfx_int_sum_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_int_sum cvmx_sli_macx_pfx_int_sum_t;
+
+/**
+ * cvmx_sli_mac#_pf#_mbox_int
+ *
+ * When a VF to PF MBOX write occurs the appropriate bit is set.
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_mbox_int {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_mbox_int_s {
+               u64 vf_int : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_mbox_int_s cn73xx;
+       struct cvmx_sli_macx_pfx_mbox_int_s cn78xx;
+       struct cvmx_sli_macx_pfx_mbox_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_mbox_int cvmx_sli_macx_pfx_mbox_int_t;
+
+/**
+ * cvmx_sli_mac#_pf#_pkt_vf_int
+ *
+ * When an error response is received for a VF PP transaction read, a doorbell
+ * overflow for a ring associated with a VF occurs or an illegal memory access from a VF occurs,
+ * the appropriate VF indexed bit is set.  The appropriate PF should read the appropriate
+ * register.
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_pkt_vf_int {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_s {
+               u64 vf_int : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_s cn73xx;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_s cn78xx;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_pkt_vf_int cvmx_sli_macx_pfx_pkt_vf_int_t;
+
+/**
+ * cvmx_sli_mac#_pf#_pkt_vf_int_enb
+ *
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_pkt_vf_int_enb {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_enb_s {
+               u64 vf_int_enb : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_enb_s cn73xx;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_enb_s cn78xx;
+       struct cvmx_sli_macx_pfx_pkt_vf_int_enb_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_pkt_vf_int_enb cvmx_sli_macx_pfx_pkt_vf_int_enb_t;
+
+/**
+ * cvmx_sli_mac#_pf#_pp_vf_int
+ *
+ * When an error response is received for a VF PP transaction read, the appropriate VF indexed
+ * bit is set.  The appropriate PF should read the appropriate register.
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_pp_vf_int {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_pp_vf_int_s {
+               u64 vf_int : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_pp_vf_int_s cn73xx;
+       struct cvmx_sli_macx_pfx_pp_vf_int_s cn78xx;
+       struct cvmx_sli_macx_pfx_pp_vf_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_pp_vf_int cvmx_sli_macx_pfx_pp_vf_int_t;
+
+/**
+ * cvmx_sli_mac#_pf#_pp_vf_int_enb
+ *
+ * Indexed by (MAC index) SLI_PORT_E.
+ * This CSR array is valid only for SLI_PORT_E::PEM0 PF0.
+ */
+union cvmx_sli_macx_pfx_pp_vf_int_enb {
+       u64 u64;
+       struct cvmx_sli_macx_pfx_pp_vf_int_enb_s {
+               u64 vf_int_enb : 64;
+       } s;
+       struct cvmx_sli_macx_pfx_pp_vf_int_enb_s cn73xx;
+       struct cvmx_sli_macx_pfx_pp_vf_int_enb_s cn78xx;
+       struct cvmx_sli_macx_pfx_pp_vf_int_enb_s cnf75xx;
+};
+
+typedef union cvmx_sli_macx_pfx_pp_vf_int_enb cvmx_sli_macx_pfx_pp_vf_int_enb_t;
+
+/**
+ * cvmx_sli_mac_credit_cnt
+ *
+ * This register contains the number of credits for the MAC port FIFOs used by the SLI. This
+ * value needs to be set before S2M traffic flow starts. A write operation to this register
+ * causes the credit counts in the SLI for the MAC ports to be reset to the value in this
+ * register if the corresponding disable bit in this register is set to 0.
+ */
+union cvmx_sli_mac_credit_cnt {
+       u64 u64;
+       struct cvmx_sli_mac_credit_cnt_s {
+               u64 reserved_54_63 : 10;
+               u64 p1_c_d : 1;
+               u64 p1_n_d : 1;
+               u64 p1_p_d : 1;
+               u64 p0_c_d : 1;
+               u64 p0_n_d : 1;
+               u64 p0_p_d : 1;
+               u64 p1_ccnt : 8;
+               u64 p1_ncnt : 8;
+               u64 p1_pcnt : 8;
+               u64 p0_ccnt : 8;
+               u64 p0_ncnt : 8;
+               u64 p0_pcnt : 8;
+       } s;
+       struct cvmx_sli_mac_credit_cnt_s cn61xx;
+       struct cvmx_sli_mac_credit_cnt_s cn63xx;
+       struct cvmx_sli_mac_credit_cnt_cn63xxp1 {
+               u64 reserved_48_63 : 16;
+               u64 p1_ccnt : 8;
+               u64 p1_ncnt : 8;
+               u64 p1_pcnt : 8;
+               u64 p0_ccnt : 8;
+               u64 p0_ncnt : 8;
+               u64 p0_pcnt : 8;
+       } cn63xxp1;
+       struct cvmx_sli_mac_credit_cnt_s cn66xx;
+       struct cvmx_sli_mac_credit_cnt_s cn68xx;
+       struct cvmx_sli_mac_credit_cnt_s cn68xxp1;
+       struct cvmx_sli_mac_credit_cnt_s cn70xx;
+       struct cvmx_sli_mac_credit_cnt_s cn70xxp1;
+       struct cvmx_sli_mac_credit_cnt_s cn73xx;
+       struct cvmx_sli_mac_credit_cnt_s cn78xx;
+       struct cvmx_sli_mac_credit_cnt_s cn78xxp1;
+       struct cvmx_sli_mac_credit_cnt_s cnf71xx;
+       struct cvmx_sli_mac_credit_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sli_mac_credit_cnt cvmx_sli_mac_credit_cnt_t;
+
+/**
+ * cvmx_sli_mac_credit_cnt2
+ *
+ * This register contains the number of credits for the MAC port FIFOs (for MACs 2 and 3) used by
+ * the SLI. This value must be set before S2M traffic flow starts. A write to this register
+ * causes the credit counts in the SLI for the MAC ports to be reset to the value in this
+ * register.
+ */
+union cvmx_sli_mac_credit_cnt2 {
+       u64 u64;
+       struct cvmx_sli_mac_credit_cnt2_s {
+               u64 reserved_54_63 : 10;
+               u64 p3_c_d : 1;
+               u64 p3_n_d : 1;
+               u64 p3_p_d : 1;
+               u64 p2_c_d : 1;
+               u64 p2_n_d : 1;
+               u64 p2_p_d : 1;
+               u64 p3_ccnt : 8;
+               u64 p3_ncnt : 8;
+               u64 p3_pcnt : 8;
+               u64 p2_ccnt : 8;
+               u64 p2_ncnt : 8;
+               u64 p2_pcnt : 8;
+       } s;
+       struct cvmx_sli_mac_credit_cnt2_s cn61xx;
+       struct cvmx_sli_mac_credit_cnt2_s cn66xx;
+       struct cvmx_sli_mac_credit_cnt2_s cn70xx;
+       struct cvmx_sli_mac_credit_cnt2_s cn70xxp1;
+       struct cvmx_sli_mac_credit_cnt2_s cn73xx;
+       struct cvmx_sli_mac_credit_cnt2_s cn78xx;
+       struct cvmx_sli_mac_credit_cnt2_s cn78xxp1;
+       struct cvmx_sli_mac_credit_cnt2_s cnf71xx;
+       struct cvmx_sli_mac_credit_cnt2_s cnf75xx;
+};
+
+typedef union cvmx_sli_mac_credit_cnt2 cvmx_sli_mac_credit_cnt2_t;
+
+/**
+ * cvmx_sli_mac_number
+ *
+ * When read from a MAC port, this register returns the MAC's port number, otherwise returns zero.
+ *
+ */
+union cvmx_sli_mac_number {
+       u64 u64;
+       struct cvmx_sli_mac_number_s {
+               u64 reserved_9_63 : 55;
+               u64 a_mode : 1;
+               u64 num : 8;
+       } s;
+       struct cvmx_sli_mac_number_s cn61xx;
+       struct cvmx_sli_mac_number_cn63xx {
+               u64 reserved_8_63 : 56;
+               u64 num : 8;
+       } cn63xx;
+       struct cvmx_sli_mac_number_s cn66xx;
+       struct cvmx_sli_mac_number_cn63xx cn68xx;
+       struct cvmx_sli_mac_number_cn63xx cn68xxp1;
+       struct cvmx_sli_mac_number_s cn70xx;
+       struct cvmx_sli_mac_number_s cn70xxp1;
+       struct cvmx_sli_mac_number_s cn73xx;
+       struct cvmx_sli_mac_number_s cn78xx;
+       struct cvmx_sli_mac_number_s cn78xxp1;
+       struct cvmx_sli_mac_number_s cnf71xx;
+       struct cvmx_sli_mac_number_s cnf75xx;
+};
+
+typedef union cvmx_sli_mac_number cvmx_sli_mac_number_t;
+
+/**
+ * cvmx_sli_mem_access_ctl
+ *
+ * This register contains control signals for access to the MAC address space.
+ *
+ */
+union cvmx_sli_mem_access_ctl {
+       u64 u64;
+       struct cvmx_sli_mem_access_ctl_s {
+               u64 reserved_14_63 : 50;
+               u64 max_word : 4;
+               u64 timer : 10;
+       } s;
+       struct cvmx_sli_mem_access_ctl_s cn61xx;
+       struct cvmx_sli_mem_access_ctl_s cn63xx;
+       struct cvmx_sli_mem_access_ctl_s cn63xxp1;
+       struct cvmx_sli_mem_access_ctl_s cn66xx;
+       struct cvmx_sli_mem_access_ctl_s cn68xx;
+       struct cvmx_sli_mem_access_ctl_s cn68xxp1;
+       struct cvmx_sli_mem_access_ctl_s cn70xx;
+       struct cvmx_sli_mem_access_ctl_s cn70xxp1;
+       struct cvmx_sli_mem_access_ctl_s cn73xx;
+       struct cvmx_sli_mem_access_ctl_s cn78xx;
+       struct cvmx_sli_mem_access_ctl_s cn78xxp1;
+       struct cvmx_sli_mem_access_ctl_s cnf71xx;
+       struct cvmx_sli_mem_access_ctl_s cnf75xx;
+};
+
+typedef union cvmx_sli_mem_access_ctl cvmx_sli_mem_access_ctl_t;
+
+/**
+ * cvmx_sli_mem_access_subid#
+ *
+ * These registers contains address index and control bits for access to memory from cores.
+ *
+ */
+union cvmx_sli_mem_access_subidx {
+       u64 u64;
+       struct cvmx_sli_mem_access_subidx_s {
+               u64 reserved_60_63 : 4;
+               u64 pvf : 16;
+               u64 reserved_43_43 : 1;
+               u64 zero : 1;
+               u64 port : 3;
+               u64 nmerge : 1;
+               u64 esr : 2;
+               u64 esw : 2;
+               u64 wtype : 2;
+               u64 rtype : 2;
+               u64 reserved_0_29 : 30;
+       } s;
+       struct cvmx_sli_mem_access_subidx_cn61xx {
+               u64 reserved_43_63 : 21;
+               u64 zero : 1;
+               u64 port : 3;
+               u64 nmerge : 1;
+               u64 esr : 2;
+               u64 esw : 2;
+               u64 wtype : 2;
+               u64 rtype : 2;
+               u64 ba : 30;
+       } cn61xx;
+       struct cvmx_sli_mem_access_subidx_cn61xx cn63xx;
+       struct cvmx_sli_mem_access_subidx_cn61xx cn63xxp1;
+       struct cvmx_sli_mem_access_subidx_cn61xx cn66xx;
+       struct cvmx_sli_mem_access_subidx_cn68xx {
+               u64 reserved_43_63 : 21;
+               u64 zero : 1;
+               u64 port : 3;
+               u64 nmerge : 1;
+               u64 esr : 2;
+               u64 esw : 2;
+               u64 wtype : 2;
+               u64 rtype : 2;
+               u64 ba : 28;
+               u64 reserved_0_1 : 2;
+       } cn68xx;
+       struct cvmx_sli_mem_access_subidx_cn68xx cn68xxp1;
+       struct cvmx_sli_mem_access_subidx_cn61xx cn70xx;
+       struct cvmx_sli_mem_access_subidx_cn61xx cn70xxp1;
+       struct cvmx_sli_mem_access_subidx_cn73xx {
+               u64 reserved_60_63 : 4;
+               u64 pvf : 16;
+               u64 reserved_43_43 : 1;
+               u64 zero : 1;
+               u64 port : 3;
+               u64 nmerge : 1;
+               u64 esr : 2;
+               u64 esw : 2;
+               u64 wtype : 2;
+               u64 rtype : 2;
+               u64 ba : 30;
+       } cn73xx;
+       struct cvmx_sli_mem_access_subidx_cn73xx cn78xx;
+       struct cvmx_sli_mem_access_subidx_cn61xx cn78xxp1;
+       struct cvmx_sli_mem_access_subidx_cn61xx cnf71xx;
+       struct cvmx_sli_mem_access_subidx_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_mem_access_subidx cvmx_sli_mem_access_subidx_t;
+
+/**
+ * cvmx_sli_mem_ctl
+ *
+ * This register controls the ECC of the SLI memories.
+ *
+ */
+union cvmx_sli_mem_ctl {
+       u64 u64;
+       struct cvmx_sli_mem_ctl_s {
+               u64 reserved_27_63 : 37;
+               u64 tlpn1_fs : 2;
+               u64 tlpn1_ecc : 1;
+               u64 tlpp1_fs : 2;
+               u64 tlpp1_ecc : 1;
+               u64 tlpc1_fs : 2;
+               u64 tlpc1_ecc : 1;
+               u64 tlpn0_fs : 2;
+               u64 tlpn0_ecc : 1;
+               u64 tlpp0_fs : 2;
+               u64 tlpp0_ecc : 1;
+               u64 tlpc0_fs : 2;
+               u64 tlpc0_ecc : 1;
+               u64 nppr_fs : 2;
+               u64 nppr_ecc : 1;
+               u64 cpl1_fs : 2;
+               u64 cpl1_ecc : 1;
+               u64 cpl0_fs : 2;
+               u64 cpl0_ecc : 1;
+       } s;
+       struct cvmx_sli_mem_ctl_s cn73xx;
+       struct cvmx_sli_mem_ctl_s cn78xx;
+       struct cvmx_sli_mem_ctl_s cn78xxp1;
+       struct cvmx_sli_mem_ctl_s cnf75xx;
+};
+
+typedef union cvmx_sli_mem_ctl cvmx_sli_mem_ctl_t;
+
+/**
+ * cvmx_sli_mem_int_sum
+ *
+ * Set when an interrupt condition occurs; write one to clear.
+ *
+ */
+union cvmx_sli_mem_int_sum {
+       u64 u64;
+       struct cvmx_sli_mem_int_sum_s {
+               u64 reserved_18_63 : 46;
+               u64 tlpn1_dbe : 1;
+               u64 tlpn1_sbe : 1;
+               u64 tlpp1_dbe : 1;
+               u64 tlpp1_sbe : 1;
+               u64 tlpc1_dbe : 1;
+               u64 tlpc1_sbe : 1;
+               u64 tlpn0_dbe : 1;
+               u64 tlpn0_sbe : 1;
+               u64 tlpp0_dbe : 1;
+               u64 tlpp0_sbe : 1;
+               u64 tlpc0_dbe : 1;
+               u64 tlpc0_sbe : 1;
+               u64 nppr_dbe : 1;
+               u64 nppr_sbe : 1;
+               u64 cpl1_dbe : 1;
+               u64 cpl1_sbe : 1;
+               u64 cpl0_dbe : 1;
+               u64 cpl0_sbe : 1;
+       } s;
+       struct cvmx_sli_mem_int_sum_s cn73xx;
+       struct cvmx_sli_mem_int_sum_s cn78xx;
+       struct cvmx_sli_mem_int_sum_s cn78xxp1;
+       struct cvmx_sli_mem_int_sum_s cnf75xx;
+};
+
+typedef union cvmx_sli_mem_int_sum cvmx_sli_mem_int_sum_t;
+
+/**
+ * cvmx_sli_msi_enb0
+ *
+ * Used to enable the interrupt generation for the bits in the SLI_MSI_RCV0.
+ *
+ */
+union cvmx_sli_msi_enb0 {
+       u64 u64;
+       struct cvmx_sli_msi_enb0_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_sli_msi_enb0_s cn61xx;
+       struct cvmx_sli_msi_enb0_s cn63xx;
+       struct cvmx_sli_msi_enb0_s cn63xxp1;
+       struct cvmx_sli_msi_enb0_s cn66xx;
+       struct cvmx_sli_msi_enb0_s cn68xx;
+       struct cvmx_sli_msi_enb0_s cn68xxp1;
+       struct cvmx_sli_msi_enb0_s cn70xx;
+       struct cvmx_sli_msi_enb0_s cn70xxp1;
+       struct cvmx_sli_msi_enb0_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_enb0 cvmx_sli_msi_enb0_t;
+
+/**
+ * cvmx_sli_msi_enb1
+ *
+ * Used to enable the interrupt generation for the bits in the SLI_MSI_RCV1.
+ *
+ */
+union cvmx_sli_msi_enb1 {
+       u64 u64;
+       struct cvmx_sli_msi_enb1_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_sli_msi_enb1_s cn61xx;
+       struct cvmx_sli_msi_enb1_s cn63xx;
+       struct cvmx_sli_msi_enb1_s cn63xxp1;
+       struct cvmx_sli_msi_enb1_s cn66xx;
+       struct cvmx_sli_msi_enb1_s cn68xx;
+       struct cvmx_sli_msi_enb1_s cn68xxp1;
+       struct cvmx_sli_msi_enb1_s cn70xx;
+       struct cvmx_sli_msi_enb1_s cn70xxp1;
+       struct cvmx_sli_msi_enb1_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_enb1 cvmx_sli_msi_enb1_t;
+
+/**
+ * cvmx_sli_msi_enb2
+ *
+ * Used to enable the interrupt generation for the bits in the SLI_MSI_RCV2.
+ *
+ */
+union cvmx_sli_msi_enb2 {
+       u64 u64;
+       struct cvmx_sli_msi_enb2_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_sli_msi_enb2_s cn61xx;
+       struct cvmx_sli_msi_enb2_s cn63xx;
+       struct cvmx_sli_msi_enb2_s cn63xxp1;
+       struct cvmx_sli_msi_enb2_s cn66xx;
+       struct cvmx_sli_msi_enb2_s cn68xx;
+       struct cvmx_sli_msi_enb2_s cn68xxp1;
+       struct cvmx_sli_msi_enb2_s cn70xx;
+       struct cvmx_sli_msi_enb2_s cn70xxp1;
+       struct cvmx_sli_msi_enb2_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_enb2 cvmx_sli_msi_enb2_t;
+
+/**
+ * cvmx_sli_msi_enb3
+ *
+ * Used to enable the interrupt generation for the bits in the SLI_MSI_RCV3.
+ *
+ */
+union cvmx_sli_msi_enb3 {
+       u64 u64;
+       struct cvmx_sli_msi_enb3_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_sli_msi_enb3_s cn61xx;
+       struct cvmx_sli_msi_enb3_s cn63xx;
+       struct cvmx_sli_msi_enb3_s cn63xxp1;
+       struct cvmx_sli_msi_enb3_s cn66xx;
+       struct cvmx_sli_msi_enb3_s cn68xx;
+       struct cvmx_sli_msi_enb3_s cn68xxp1;
+       struct cvmx_sli_msi_enb3_s cn70xx;
+       struct cvmx_sli_msi_enb3_s cn70xxp1;
+       struct cvmx_sli_msi_enb3_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_enb3 cvmx_sli_msi_enb3_t;
+
+/**
+ * cvmx_sli_msi_rcv0
+ *
+ * This register contains bits <63:0> of the 256 bits of MSI interrupts.
+ *
+ */
+union cvmx_sli_msi_rcv0 {
+       u64 u64;
+       struct cvmx_sli_msi_rcv0_s {
+               u64 intr : 64;
+       } s;
+       struct cvmx_sli_msi_rcv0_s cn61xx;
+       struct cvmx_sli_msi_rcv0_s cn63xx;
+       struct cvmx_sli_msi_rcv0_s cn63xxp1;
+       struct cvmx_sli_msi_rcv0_s cn66xx;
+       struct cvmx_sli_msi_rcv0_s cn68xx;
+       struct cvmx_sli_msi_rcv0_s cn68xxp1;
+       struct cvmx_sli_msi_rcv0_s cn70xx;
+       struct cvmx_sli_msi_rcv0_s cn70xxp1;
+       struct cvmx_sli_msi_rcv0_s cn73xx;
+       struct cvmx_sli_msi_rcv0_s cn78xx;
+       struct cvmx_sli_msi_rcv0_s cn78xxp1;
+       struct cvmx_sli_msi_rcv0_s cnf71xx;
+       struct cvmx_sli_msi_rcv0_s cnf75xx;
+};
+
+typedef union cvmx_sli_msi_rcv0 cvmx_sli_msi_rcv0_t;
+
+/**
+ * cvmx_sli_msi_rcv1
+ *
+ * This register contains bits <127:64> of the 256 bits of MSI interrupts.
+ *
+ */
+union cvmx_sli_msi_rcv1 {
+       u64 u64;
+       struct cvmx_sli_msi_rcv1_s {
+               u64 intr : 64;
+       } s;
+       struct cvmx_sli_msi_rcv1_s cn61xx;
+       struct cvmx_sli_msi_rcv1_s cn63xx;
+       struct cvmx_sli_msi_rcv1_s cn63xxp1;
+       struct cvmx_sli_msi_rcv1_s cn66xx;
+       struct cvmx_sli_msi_rcv1_s cn68xx;
+       struct cvmx_sli_msi_rcv1_s cn68xxp1;
+       struct cvmx_sli_msi_rcv1_s cn70xx;
+       struct cvmx_sli_msi_rcv1_s cn70xxp1;
+       struct cvmx_sli_msi_rcv1_s cn73xx;
+       struct cvmx_sli_msi_rcv1_s cn78xx;
+       struct cvmx_sli_msi_rcv1_s cn78xxp1;
+       struct cvmx_sli_msi_rcv1_s cnf71xx;
+       struct cvmx_sli_msi_rcv1_s cnf75xx;
+};
+
+typedef union cvmx_sli_msi_rcv1 cvmx_sli_msi_rcv1_t;
+
+/**
+ * cvmx_sli_msi_rcv2
+ *
+ * This register contains bits <191:128> of the 256 bits of MSI interrupts.
+ *
+ */
+union cvmx_sli_msi_rcv2 {
+       u64 u64;
+       struct cvmx_sli_msi_rcv2_s {
+               u64 intr : 64;
+       } s;
+       struct cvmx_sli_msi_rcv2_s cn61xx;
+       struct cvmx_sli_msi_rcv2_s cn63xx;
+       struct cvmx_sli_msi_rcv2_s cn63xxp1;
+       struct cvmx_sli_msi_rcv2_s cn66xx;
+       struct cvmx_sli_msi_rcv2_s cn68xx;
+       struct cvmx_sli_msi_rcv2_s cn68xxp1;
+       struct cvmx_sli_msi_rcv2_s cn70xx;
+       struct cvmx_sli_msi_rcv2_s cn70xxp1;
+       struct cvmx_sli_msi_rcv2_s cn73xx;
+       struct cvmx_sli_msi_rcv2_s cn78xx;
+       struct cvmx_sli_msi_rcv2_s cn78xxp1;
+       struct cvmx_sli_msi_rcv2_s cnf71xx;
+       struct cvmx_sli_msi_rcv2_s cnf75xx;
+};
+
+typedef union cvmx_sli_msi_rcv2 cvmx_sli_msi_rcv2_t;
+
+/**
+ * cvmx_sli_msi_rcv3
+ *
+ * This register contains bits <255:192> of the 256 bits of MSI interrupts.
+ *
+ */
+union cvmx_sli_msi_rcv3 {
+       u64 u64;
+       struct cvmx_sli_msi_rcv3_s {
+               u64 intr : 64;
+       } s;
+       struct cvmx_sli_msi_rcv3_s cn61xx;
+       struct cvmx_sli_msi_rcv3_s cn63xx;
+       struct cvmx_sli_msi_rcv3_s cn63xxp1;
+       struct cvmx_sli_msi_rcv3_s cn66xx;
+       struct cvmx_sli_msi_rcv3_s cn68xx;
+       struct cvmx_sli_msi_rcv3_s cn68xxp1;
+       struct cvmx_sli_msi_rcv3_s cn70xx;
+       struct cvmx_sli_msi_rcv3_s cn70xxp1;
+       struct cvmx_sli_msi_rcv3_s cn73xx;
+       struct cvmx_sli_msi_rcv3_s cn78xx;
+       struct cvmx_sli_msi_rcv3_s cn78xxp1;
+       struct cvmx_sli_msi_rcv3_s cnf71xx;
+       struct cvmx_sli_msi_rcv3_s cnf75xx;
+};
+
+typedef union cvmx_sli_msi_rcv3 cvmx_sli_msi_rcv3_t;
+
+/**
+ * cvmx_sli_msi_rd_map
+ *
+ * This register is used to read the mapping function of the SLI_PCIE_MSI_RCV to SLI_MSI_RCV
+ * registers.
+ */
+union cvmx_sli_msi_rd_map {
+       u64 u64;
+       struct cvmx_sli_msi_rd_map_s {
+               u64 reserved_16_63 : 48;
+               u64 rd_int : 8;
+               u64 msi_int : 8;
+       } s;
+       struct cvmx_sli_msi_rd_map_s cn61xx;
+       struct cvmx_sli_msi_rd_map_s cn63xx;
+       struct cvmx_sli_msi_rd_map_s cn63xxp1;
+       struct cvmx_sli_msi_rd_map_s cn66xx;
+       struct cvmx_sli_msi_rd_map_s cn68xx;
+       struct cvmx_sli_msi_rd_map_s cn68xxp1;
+       struct cvmx_sli_msi_rd_map_s cn70xx;
+       struct cvmx_sli_msi_rd_map_s cn70xxp1;
+       struct cvmx_sli_msi_rd_map_s cn73xx;
+       struct cvmx_sli_msi_rd_map_s cn78xx;
+       struct cvmx_sli_msi_rd_map_s cn78xxp1;
+       struct cvmx_sli_msi_rd_map_s cnf71xx;
+       struct cvmx_sli_msi_rd_map_s cnf75xx;
+};
+
+typedef union cvmx_sli_msi_rd_map cvmx_sli_msi_rd_map_t;
+
+/**
+ * cvmx_sli_msi_w1c_enb0
+ *
+ * Used to clear bits in SLI_MSI_ENB0.
+ *
+ */
+union cvmx_sli_msi_w1c_enb0 {
+       u64 u64;
+       struct cvmx_sli_msi_w1c_enb0_s {
+               u64 clr : 64;
+       } s;
+       struct cvmx_sli_msi_w1c_enb0_s cn61xx;
+       struct cvmx_sli_msi_w1c_enb0_s cn63xx;
+       struct cvmx_sli_msi_w1c_enb0_s cn63xxp1;
+       struct cvmx_sli_msi_w1c_enb0_s cn66xx;
+       struct cvmx_sli_msi_w1c_enb0_s cn68xx;
+       struct cvmx_sli_msi_w1c_enb0_s cn68xxp1;
+       struct cvmx_sli_msi_w1c_enb0_s cn70xx;
+       struct cvmx_sli_msi_w1c_enb0_s cn70xxp1;
+       struct cvmx_sli_msi_w1c_enb0_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1c_enb0 cvmx_sli_msi_w1c_enb0_t;
+
+/**
+ * cvmx_sli_msi_w1c_enb1
+ *
+ * Used to clear bits in SLI_MSI_ENB1.
+ *
+ */
+union cvmx_sli_msi_w1c_enb1 {
+       u64 u64;
+       struct cvmx_sli_msi_w1c_enb1_s {
+               u64 clr : 64;
+       } s;
+       struct cvmx_sli_msi_w1c_enb1_s cn61xx;
+       struct cvmx_sli_msi_w1c_enb1_s cn63xx;
+       struct cvmx_sli_msi_w1c_enb1_s cn63xxp1;
+       struct cvmx_sli_msi_w1c_enb1_s cn66xx;
+       struct cvmx_sli_msi_w1c_enb1_s cn68xx;
+       struct cvmx_sli_msi_w1c_enb1_s cn68xxp1;
+       struct cvmx_sli_msi_w1c_enb1_s cn70xx;
+       struct cvmx_sli_msi_w1c_enb1_s cn70xxp1;
+       struct cvmx_sli_msi_w1c_enb1_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1c_enb1 cvmx_sli_msi_w1c_enb1_t;
+
+/**
+ * cvmx_sli_msi_w1c_enb2
+ *
+ * Used to clear bits in SLI_MSI_ENB2.
+ *
+ */
+union cvmx_sli_msi_w1c_enb2 {
+       u64 u64;
+       struct cvmx_sli_msi_w1c_enb2_s {
+               u64 clr : 64;
+       } s;
+       struct cvmx_sli_msi_w1c_enb2_s cn61xx;
+       struct cvmx_sli_msi_w1c_enb2_s cn63xx;
+       struct cvmx_sli_msi_w1c_enb2_s cn63xxp1;
+       struct cvmx_sli_msi_w1c_enb2_s cn66xx;
+       struct cvmx_sli_msi_w1c_enb2_s cn68xx;
+       struct cvmx_sli_msi_w1c_enb2_s cn68xxp1;
+       struct cvmx_sli_msi_w1c_enb2_s cn70xx;
+       struct cvmx_sli_msi_w1c_enb2_s cn70xxp1;
+       struct cvmx_sli_msi_w1c_enb2_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1c_enb2 cvmx_sli_msi_w1c_enb2_t;
+
+/**
+ * cvmx_sli_msi_w1c_enb3
+ *
+ * Used to clear bits in SLI_MSI_ENB3.
+ *
+ */
+union cvmx_sli_msi_w1c_enb3 {
+       u64 u64;
+       struct cvmx_sli_msi_w1c_enb3_s {
+               u64 clr : 64;
+       } s;
+       struct cvmx_sli_msi_w1c_enb3_s cn61xx;
+       struct cvmx_sli_msi_w1c_enb3_s cn63xx;
+       struct cvmx_sli_msi_w1c_enb3_s cn63xxp1;
+       struct cvmx_sli_msi_w1c_enb3_s cn66xx;
+       struct cvmx_sli_msi_w1c_enb3_s cn68xx;
+       struct cvmx_sli_msi_w1c_enb3_s cn68xxp1;
+       struct cvmx_sli_msi_w1c_enb3_s cn70xx;
+       struct cvmx_sli_msi_w1c_enb3_s cn70xxp1;
+       struct cvmx_sli_msi_w1c_enb3_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1c_enb3 cvmx_sli_msi_w1c_enb3_t;
+
+/**
+ * cvmx_sli_msi_w1s_enb0
+ *
+ * Used to set bits in SLI_MSI_ENB0.
+ *
+ */
+union cvmx_sli_msi_w1s_enb0 {
+       u64 u64;
+       struct cvmx_sli_msi_w1s_enb0_s {
+               u64 set : 64;
+       } s;
+       struct cvmx_sli_msi_w1s_enb0_s cn61xx;
+       struct cvmx_sli_msi_w1s_enb0_s cn63xx;
+       struct cvmx_sli_msi_w1s_enb0_s cn63xxp1;
+       struct cvmx_sli_msi_w1s_enb0_s cn66xx;
+       struct cvmx_sli_msi_w1s_enb0_s cn68xx;
+       struct cvmx_sli_msi_w1s_enb0_s cn68xxp1;
+       struct cvmx_sli_msi_w1s_enb0_s cn70xx;
+       struct cvmx_sli_msi_w1s_enb0_s cn70xxp1;
+       struct cvmx_sli_msi_w1s_enb0_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1s_enb0 cvmx_sli_msi_w1s_enb0_t;
+
+/**
+ * cvmx_sli_msi_w1s_enb1
+ *
+ * SLI_MSI_W1S_ENB0 = SLI MSI Write 1 To Set Enable1
+ * Used to set bits in SLI_MSI_ENB1.
+ */
+union cvmx_sli_msi_w1s_enb1 {
+       u64 u64;
+       struct cvmx_sli_msi_w1s_enb1_s {
+               u64 set : 64;
+       } s;
+       struct cvmx_sli_msi_w1s_enb1_s cn61xx;
+       struct cvmx_sli_msi_w1s_enb1_s cn63xx;
+       struct cvmx_sli_msi_w1s_enb1_s cn63xxp1;
+       struct cvmx_sli_msi_w1s_enb1_s cn66xx;
+       struct cvmx_sli_msi_w1s_enb1_s cn68xx;
+       struct cvmx_sli_msi_w1s_enb1_s cn68xxp1;
+       struct cvmx_sli_msi_w1s_enb1_s cn70xx;
+       struct cvmx_sli_msi_w1s_enb1_s cn70xxp1;
+       struct cvmx_sli_msi_w1s_enb1_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1s_enb1 cvmx_sli_msi_w1s_enb1_t;
+
+/**
+ * cvmx_sli_msi_w1s_enb2
+ *
+ * Used to set bits in SLI_MSI_ENB2.
+ *
+ */
+union cvmx_sli_msi_w1s_enb2 {
+       u64 u64;
+       struct cvmx_sli_msi_w1s_enb2_s {
+               u64 set : 64;
+       } s;
+       struct cvmx_sli_msi_w1s_enb2_s cn61xx;
+       struct cvmx_sli_msi_w1s_enb2_s cn63xx;
+       struct cvmx_sli_msi_w1s_enb2_s cn63xxp1;
+       struct cvmx_sli_msi_w1s_enb2_s cn66xx;
+       struct cvmx_sli_msi_w1s_enb2_s cn68xx;
+       struct cvmx_sli_msi_w1s_enb2_s cn68xxp1;
+       struct cvmx_sli_msi_w1s_enb2_s cn70xx;
+       struct cvmx_sli_msi_w1s_enb2_s cn70xxp1;
+       struct cvmx_sli_msi_w1s_enb2_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1s_enb2 cvmx_sli_msi_w1s_enb2_t;
+
+/**
+ * cvmx_sli_msi_w1s_enb3
+ *
+ * Used to set bits in SLI_MSI_ENB3.
+ *
+ */
+union cvmx_sli_msi_w1s_enb3 {
+       u64 u64;
+       struct cvmx_sli_msi_w1s_enb3_s {
+               u64 set : 64;
+       } s;
+       struct cvmx_sli_msi_w1s_enb3_s cn61xx;
+       struct cvmx_sli_msi_w1s_enb3_s cn63xx;
+       struct cvmx_sli_msi_w1s_enb3_s cn63xxp1;
+       struct cvmx_sli_msi_w1s_enb3_s cn66xx;
+       struct cvmx_sli_msi_w1s_enb3_s cn68xx;
+       struct cvmx_sli_msi_w1s_enb3_s cn68xxp1;
+       struct cvmx_sli_msi_w1s_enb3_s cn70xx;
+       struct cvmx_sli_msi_w1s_enb3_s cn70xxp1;
+       struct cvmx_sli_msi_w1s_enb3_s cnf71xx;
+};
+
+typedef union cvmx_sli_msi_w1s_enb3 cvmx_sli_msi_w1s_enb3_t;
+
+/**
+ * cvmx_sli_msi_wr_map
+ *
+ * This register is used to write the mapping function of the SLI_PCIE_MSI_RCV to SLI_MSI_RCV
+ * registers. At reset, the mapping function is one-to-one, that is MSI_INT 1 maps to CIU_INT 1,
+ * 2 to 2, 3 to 3, etc.
+ */
+union cvmx_sli_msi_wr_map {
+       u64 u64;
+       struct cvmx_sli_msi_wr_map_s {
+               u64 reserved_16_63 : 48;
+               u64 ciu_int : 8;
+               u64 msi_int : 8;
+       } s;
+       struct cvmx_sli_msi_wr_map_s cn61xx;
+       struct cvmx_sli_msi_wr_map_s cn63xx;
+       struct cvmx_sli_msi_wr_map_s cn63xxp1;
+       struct cvmx_sli_msi_wr_map_s cn66xx;
+       struct cvmx_sli_msi_wr_map_s cn68xx;
+       struct cvmx_sli_msi_wr_map_s cn68xxp1;
+       struct cvmx_sli_msi_wr_map_s cn70xx;
+       struct cvmx_sli_msi_wr_map_s cn70xxp1;
+       struct cvmx_sli_msi_wr_map_s cn73xx;
+       struct cvmx_sli_msi_wr_map_s cn78xx;
+       struct cvmx_sli_msi_wr_map_s cn78xxp1;
+       struct cvmx_sli_msi_wr_map_s cnf71xx;
+       struct cvmx_sli_msi_wr_map_s cnf75xx;
+};
+
+typedef union cvmx_sli_msi_wr_map cvmx_sli_msi_wr_map_t;
+
+/**
+ * cvmx_sli_msix#_table_addr
+ *
+ * The MSI-X table cannot be burst read or written.
+ *
+ * The combination of all MSI-X Tables contain (64 + 4) entries - one per
+ * ring plus one per PF. (i.e. 64 plus one per valid SLI_MAC()_PF()_INT_SUM
+ * present.)
+ *
+ * The MSI-X table for an individual PF has SLI_PKT_MAC()_PF()_RINFO[TRS]
+ * entries for the rings associated to the PF (up to 64 max) plus one
+ * more table entry for SLI_MAC()_PF()_INT_SUM. The
+ * SLI_MAC()_PF()_INT_SUM-related MSI-X table entry is
+ * always entry SLI_MSIX(SLI_PKT_MAC()_PF()_RINFO[TRS])_TABLE_ADDR and
+ * always present and valid. All earlier SLI_MSIX()_TABLE_ADDR entries
+ * correspond to rings. When SLI_PKT_MAC()_PF()_RINFO[NVFS]=0, SR-IOV
+ * virtual functions cannot be used, and all SLI_PKT_MAC()_PF()_RINFO[TRS]+1
+ * entries in the PF MSI-X table are present and valid for use by the PF.
+ * When SLI_PKT_MAC()_PF()_RINFO[NVFS]!=0, SR-IOV virtual functions may
+ * be used, and the first
+ *   SLI_PKT_MAC()_PF()_RINFO[NVFS]*SLI_PKT_MAC()_PF()_RINFO[RPVF]
+ * entries of the PF MSI-X table are present but not valid, and
+ * should never be accessed by the PF.
+ *
+ * The MSI-X table for an individual VF has SLI_PKT_MAC()_PF()_RINFO[RPVF]
+ * entries (up to 8 max), all valid, one per ring that the VF owns.
+ */
+union cvmx_sli_msixx_table_addr {
+       u64 u64;
+       struct cvmx_sli_msixx_table_addr_s {
+               u64 addr : 64;
+       } s;
+       struct cvmx_sli_msixx_table_addr_s cn73xx;
+       struct cvmx_sli_msixx_table_addr_s cn78xx;
+       struct cvmx_sli_msixx_table_addr_s cn78xxp1;
+       struct cvmx_sli_msixx_table_addr_s cnf75xx;
+};
+
+typedef union cvmx_sli_msixx_table_addr cvmx_sli_msixx_table_addr_t;
+
+/**
+ * cvmx_sli_msix#_table_data
+ *
+ * The MSI-X table cannot be burst read or written. VF/PF access is the same as
+ * described for the SLI_MSIX()_TABLE_ADDR.
+ */
+union cvmx_sli_msixx_table_data {
+       u64 u64;
+       struct cvmx_sli_msixx_table_data_s {
+               u64 reserved_33_63 : 31;
+               u64 vector_ctl : 1;
+               u64 data : 32;
+       } s;
+       struct cvmx_sli_msixx_table_data_s cn73xx;
+       struct cvmx_sli_msixx_table_data_s cn78xx;
+       struct cvmx_sli_msixx_table_data_s cn78xxp1;
+       struct cvmx_sli_msixx_table_data_s cnf75xx;
+};
+
+typedef union cvmx_sli_msixx_table_data cvmx_sli_msixx_table_data_t;
+
+/**
+ * cvmx_sli_msix_mac#_pf_table_addr
+ *
+ * These registers shadow the four physical MSIX PF ERR entries.
+ * Each MAC sees its entry at its own TRS offset.
+ */
+union cvmx_sli_msix_macx_pf_table_addr {
+       u64 u64;
+       struct cvmx_sli_msix_macx_pf_table_addr_s {
+               u64 addr : 64;
+       } s;
+       struct cvmx_sli_msix_macx_pf_table_addr_s cn78xxp1;
+};
+
+typedef union cvmx_sli_msix_macx_pf_table_addr cvmx_sli_msix_macx_pf_table_addr_t;
+
+/**
+ * cvmx_sli_msix_mac#_pf_table_data
+ *
+ * These registers shadow four physical MSIX PF ERR entries.
+ * Each MAC sees its entry at its own TRS offset.
+ */
+union cvmx_sli_msix_macx_pf_table_data {
+       u64 u64;
+       struct cvmx_sli_msix_macx_pf_table_data_s {
+               u64 reserved_33_63 : 31;
+               u64 vector_ctl : 1;
+               u64 data : 32;
+       } s;
+       struct cvmx_sli_msix_macx_pf_table_data_s cn78xxp1;
+};
+
+typedef union cvmx_sli_msix_macx_pf_table_data cvmx_sli_msix_macx_pf_table_data_t;
+
+/**
+ * cvmx_sli_msix_pba0
+ *
+ * The MSI-X pending bit array cannot be burst read.
+ * In SR-IOV mode, a VF will find its pending completion interrupts in bit
+ * positions [(RPVF-1):0]. If RPVF<64, bits [63:RPVF] are returned as zero.
+ *
+ * Each VF can read their own pending completion interrupts based on the ring/VF
+ * configuration. Therefore, a VF sees the PBA as smaller than what is shown below
+ * (unless it owns all 64 entries).  Unassigned bits will return zeros.
+ *
+ * <pre>
+ *    RPVF  Interrupts per VF   Pending bits returned
+ *    ----  -----------------   ---------------------
+ *      0            0          0
+ *      1            1          MSG_PND0
+ *      2            2          MSG_PND1  - MSG_PND0
+ *      4            4          MSG_PND3  - MSG_PND0
+ *      8            8          MSG_PND7  - MSG_PND0
+ * </pre>
+ *
+ * If SLI_PKT_MAC()_PF()_RINFO[TRS]=63 (i.e. 64 total DPI Packet Rings configured), a PF will
+ * find its pending completion interrupts in bit positions [63:0]. When
+ * SLI_PKT_MAC()_PF()_RINFO[TRS]=63,
+ * the PF will find its PCIe error interrupt in SLI_MSIX_PBA1, bit position 0.
+ *
+ * If SLI_PKT_MAC()_PF()_RINFO[TRS]<63 (i.e. 0, 1, 2, 4, or 8 rings configured), a PF will find
+ * its ring pending completion interrupts in bit positions [TNR:0]. It will find its PCIe
+ * error interrupt in bit position [(TNR+1)]. Bits [63:(TNR+2)] are returned as zero.
+ * When SLI_PKT_MAC()_PF()_RINFO[TRS]<63, SLI_MSIX_PBA1 is not used and returns zeros.
+ *
+ * If SR-IOV Mode is off there is no virtual function support, but the PF can configure up to 65
+ * entries (up to 64 DPI Packet Rings plus 1 PF ring) for itself.
+ */
+union cvmx_sli_msix_pba0 {
+       u64 u64;
+       struct cvmx_sli_msix_pba0_s {
+               u64 msg_pnd : 64;
+       } s;
+       struct cvmx_sli_msix_pba0_s cn73xx;
+       struct cvmx_sli_msix_pba0_s cn78xx;
+       struct cvmx_sli_msix_pba0_s cn78xxp1;
+       struct cvmx_sli_msix_pba0_s cnf75xx;
+};
+
+typedef union cvmx_sli_msix_pba0 cvmx_sli_msix_pba0_t;
+
+/**
+ * cvmx_sli_msix_pba1
+ *
+ * The MSI-X pending bit array cannot be burst read.
+ *
+ * PF_PND is assigned to PCIe related errors. The error bit can only be found in PBA1 when
+ * SLI_PKT_MAC()_PF()_RINFO[TRS]=63 (i.e. 64 total DPI Packet Rings configured).
+ *
+ * This register is accessible by the PF. A read by a particular PF only
+ * returns its own pending status. That is, any PF can read this register, but the hardware
+ * ensures
+ * that the PF only sees its own status.
+ */
+union cvmx_sli_msix_pba1 {
+       u64 u64;
+       struct cvmx_sli_msix_pba1_s {
+               u64 reserved_1_63 : 63;
+               u64 pf_pnd : 1;
+       } s;
+       struct cvmx_sli_msix_pba1_s cn73xx;
+       struct cvmx_sli_msix_pba1_s cn78xx;
+       struct cvmx_sli_msix_pba1_s cn78xxp1;
+       struct cvmx_sli_msix_pba1_s cnf75xx;
+};
+
+typedef union cvmx_sli_msix_pba1 cvmx_sli_msix_pba1_t;
+
+/**
+ * cvmx_sli_nqm_rsp_err_snd_dbg
+ *
+ * This register is for diagnostic use only.
+ *
+ */
+union cvmx_sli_nqm_rsp_err_snd_dbg {
+       u64 u64;
+       struct cvmx_sli_nqm_rsp_err_snd_dbg_s {
+               u64 reserved_12_63 : 52;
+               u64 vf_index : 12;
+       } s;
+       struct cvmx_sli_nqm_rsp_err_snd_dbg_s cn73xx;
+       struct cvmx_sli_nqm_rsp_err_snd_dbg_s cn78xx;
+       struct cvmx_sli_nqm_rsp_err_snd_dbg_s cnf75xx;
+};
+
+typedef union cvmx_sli_nqm_rsp_err_snd_dbg cvmx_sli_nqm_rsp_err_snd_dbg_t;
+
+/**
+ * cvmx_sli_pcie_msi_rcv
+ *
+ * This is the register where MSI write operations are directed from the MAC.
+ *
+ */
+union cvmx_sli_pcie_msi_rcv {
+       u64 u64;
+       struct cvmx_sli_pcie_msi_rcv_s {
+               u64 reserved_8_63 : 56;
+               u64 intr : 8;
+       } s;
+       struct cvmx_sli_pcie_msi_rcv_s cn61xx;
+       struct cvmx_sli_pcie_msi_rcv_s cn63xx;
+       struct cvmx_sli_pcie_msi_rcv_s cn63xxp1;
+       struct cvmx_sli_pcie_msi_rcv_s cn66xx;
+       struct cvmx_sli_pcie_msi_rcv_s cn68xx;
+       struct cvmx_sli_pcie_msi_rcv_s cn68xxp1;
+       struct cvmx_sli_pcie_msi_rcv_s cn70xx;
+       struct cvmx_sli_pcie_msi_rcv_s cn70xxp1;
+       struct cvmx_sli_pcie_msi_rcv_s cn73xx;
+       struct cvmx_sli_pcie_msi_rcv_s cn78xx;
+       struct cvmx_sli_pcie_msi_rcv_s cn78xxp1;
+       struct cvmx_sli_pcie_msi_rcv_s cnf71xx;
+       struct cvmx_sli_pcie_msi_rcv_s cnf75xx;
+};
+
+typedef union cvmx_sli_pcie_msi_rcv cvmx_sli_pcie_msi_rcv_t;
+
+/**
+ * cvmx_sli_pcie_msi_rcv_b1
+ *
+ * This register is where MSI write operations are directed from the MAC. This register can be
+ * used by the PCIe and SRIO MACs.
+ */
+union cvmx_sli_pcie_msi_rcv_b1 {
+       u64 u64;
+       struct cvmx_sli_pcie_msi_rcv_b1_s {
+               u64 reserved_16_63 : 48;
+               u64 intr : 8;
+               u64 reserved_0_7 : 8;
+       } s;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn61xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn63xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn63xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn66xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn68xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn68xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn70xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn70xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn73xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn78xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cn78xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cnf71xx;
+       struct cvmx_sli_pcie_msi_rcv_b1_s cnf75xx;
+};
+
+typedef union cvmx_sli_pcie_msi_rcv_b1 cvmx_sli_pcie_msi_rcv_b1_t;
+
+/**
+ * cvmx_sli_pcie_msi_rcv_b2
+ *
+ * This register is where MSI write operations are directed from the MAC.  This register can be
+ * used by PCIe and SRIO MACs.
+ */
+union cvmx_sli_pcie_msi_rcv_b2 {
+       u64 u64;
+       struct cvmx_sli_pcie_msi_rcv_b2_s {
+               u64 reserved_24_63 : 40;
+               u64 intr : 8;
+               u64 reserved_0_15 : 16;
+       } s;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn61xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn63xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn63xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn66xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn68xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn68xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn70xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn70xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn73xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn78xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cn78xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cnf71xx;
+       struct cvmx_sli_pcie_msi_rcv_b2_s cnf75xx;
+};
+
+typedef union cvmx_sli_pcie_msi_rcv_b2 cvmx_sli_pcie_msi_rcv_b2_t;
+
+/**
+ * cvmx_sli_pcie_msi_rcv_b3
+ *
+ * This register is where MSI write operations are directed from the MAC. This register can be
+ * used by PCIe and SRIO MACs.
+ */
+union cvmx_sli_pcie_msi_rcv_b3 {
+       u64 u64;
+       struct cvmx_sli_pcie_msi_rcv_b3_s {
+               u64 reserved_32_63 : 32;
+               u64 intr : 8;
+               u64 reserved_0_23 : 24;
+       } s;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn61xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn63xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn63xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn66xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn68xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn68xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn70xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn70xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn73xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn78xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cn78xxp1;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cnf71xx;
+       struct cvmx_sli_pcie_msi_rcv_b3_s cnf75xx;
+};
+
+typedef union cvmx_sli_pcie_msi_rcv_b3 cvmx_sli_pcie_msi_rcv_b3_t;
+
+/**
+ * cvmx_sli_pkt#_cnts
+ *
+ * This register contains the counters for output rings.
+ *
+ */
+union cvmx_sli_pktx_cnts {
+       u64 u64;
+       struct cvmx_sli_pktx_cnts_s {
+               u64 po_int : 1;
+               u64 pi_int : 1;
+               u64 mbox_int : 1;
+               u64 resend : 1;
+               u64 reserved_54_59 : 6;
+               u64 timer : 22;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sli_pktx_cnts_cn61xx {
+               u64 reserved_54_63 : 10;
+               u64 timer : 22;
+               u64 cnt : 32;
+       } cn61xx;
+       struct cvmx_sli_pktx_cnts_cn61xx cn63xx;
+       struct cvmx_sli_pktx_cnts_cn61xx cn63xxp1;
+       struct cvmx_sli_pktx_cnts_cn61xx cn66xx;
+       struct cvmx_sli_pktx_cnts_cn61xx cn68xx;
+       struct cvmx_sli_pktx_cnts_cn61xx cn68xxp1;
+       struct cvmx_sli_pktx_cnts_cn70xx {
+               u64 reserved_63_54 : 10;
+               u64 timer : 22;
+               u64 cnt : 32;
+       } cn70xx;
+       struct cvmx_sli_pktx_cnts_cn70xx cn70xxp1;
+       struct cvmx_sli_pktx_cnts_s cn73xx;
+       struct cvmx_sli_pktx_cnts_s cn78xx;
+       struct cvmx_sli_pktx_cnts_cn78xxp1 {
+               u64 po_int : 1;
+               u64 pi_int : 1;
+               u64 reserved_61_54 : 8;
+               u64 timer : 22;
+               u64 cnt : 32;
+       } cn78xxp1;
+       struct cvmx_sli_pktx_cnts_cn61xx cnf71xx;
+       struct cvmx_sli_pktx_cnts_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_cnts cvmx_sli_pktx_cnts_t;
+
+/**
+ * cvmx_sli_pkt#_error_info
+ *
+ * The fields in this register are set when an error conditions occur and can be cleared.
+ * These fields are for information purpose only and do NOT generate interrupts.
+ */
+union cvmx_sli_pktx_error_info {
+       u64 u64;
+       struct cvmx_sli_pktx_error_info_s {
+               u64 reserved_8_63 : 56;
+               u64 osize_err : 1;
+               u64 nobdell_err : 1;
+               u64 pins_err : 1;
+               u64 pop_err : 1;
+               u64 pdi_err : 1;
+               u64 pgl_err : 1;
+               u64 psldbof : 1;
+               u64 pidbof : 1;
+       } s;
+       struct cvmx_sli_pktx_error_info_s cn73xx;
+       struct cvmx_sli_pktx_error_info_s cn78xx;
+       struct cvmx_sli_pktx_error_info_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_error_info cvmx_sli_pktx_error_info_t;
+
+/**
+ * cvmx_sli_pkt#_in_bp
+ *
+ * "SLI_PKT[0..31]_IN_BP = SLI Packet ring# Input Backpressure
+ * The counters and thresholds for input packets to apply backpressure to processing of the
+ * packets."
+ */
+union cvmx_sli_pktx_in_bp {
+       u64 u64;
+       struct cvmx_sli_pktx_in_bp_s {
+               u64 wmark : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sli_pktx_in_bp_s cn61xx;
+       struct cvmx_sli_pktx_in_bp_s cn63xx;
+       struct cvmx_sli_pktx_in_bp_s cn63xxp1;
+       struct cvmx_sli_pktx_in_bp_s cn66xx;
+       struct cvmx_sli_pktx_in_bp_s cn70xx;
+       struct cvmx_sli_pktx_in_bp_s cn70xxp1;
+       struct cvmx_sli_pktx_in_bp_s cnf71xx;
+};
+
+typedef union cvmx_sli_pktx_in_bp cvmx_sli_pktx_in_bp_t;
+
+/**
+ * cvmx_sli_pkt#_input_control
+ *
+ * This register is the control for read operations for gather list and instructions.
+ *
+ */
+union cvmx_sli_pktx_input_control {
+       u64 u64;
+       struct cvmx_sli_pktx_input_control_s {
+               u64 reserved_55_63 : 9;
+               u64 rpvf : 7;
+               u64 reserved_31_47 : 17;
+               u64 mac_num : 2;
+               u64 quiet : 1;
+               u64 reserved_27_27 : 1;
+               u64 rdsize : 2;
+               u64 is_64b : 1;
+               u64 rst : 1;
+               u64 enb : 1;
+               u64 pbp_dhi : 13;
+               u64 d_nsr : 1;
+               u64 d_esr : 2;
+               u64 d_ror : 1;
+               u64 use_csr : 1;
+               u64 nsr : 1;
+               u64 esr : 2;
+               u64 ror : 1;
+       } s;
+       struct cvmx_sli_pktx_input_control_cn73xx {
+               u64 reserved_55_63 : 9;
+               u64 rpvf : 7;
+               u64 pvf_num : 16;
+               u64 reserved_31_31 : 1;
+               u64 mac_num : 2;
+               u64 quiet : 1;
+               u64 reserved_27_27 : 1;
+               u64 rdsize : 2;
+               u64 is_64b : 1;
+               u64 rst : 1;
+               u64 enb : 1;
+               u64 pbp_dhi : 13;
+               u64 d_nsr : 1;
+               u64 d_esr : 2;
+               u64 d_ror : 1;
+               u64 use_csr : 1;
+               u64 nsr : 1;
+               u64 esr : 2;
+               u64 ror : 1;
+       } cn73xx;
+       struct cvmx_sli_pktx_input_control_cn73xx cn78xx;
+       struct cvmx_sli_pktx_input_control_cn78xxp1 {
+               u64 reserved_39_63 : 25;
+               u64 vf_num : 7;
+               u64 reserved_31_31 : 1;
+               u64 mac_num : 2;
+               u64 reserved_27_28 : 2;
+               u64 rdsize : 2;
+               u64 is_64b : 1;
+               u64 rst : 1;
+               u64 enb : 1;
+               u64 pbp_dhi : 13;
+               u64 d_nsr : 1;
+               u64 d_esr : 2;
+               u64 d_ror : 1;
+               u64 use_csr : 1;
+               u64 nsr : 1;
+               u64 esr : 2;
+               u64 ror : 1;
+       } cn78xxp1;
+       struct cvmx_sli_pktx_input_control_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_input_control cvmx_sli_pktx_input_control_t;
+
+/**
+ * cvmx_sli_pkt#_instr_baddr
+ *
+ * This register contains the start-of-instruction for input packets. The address must be
+ * addressed-aligned to the size of the instruction.
+ */
+union cvmx_sli_pktx_instr_baddr {
+       u64 u64;
+       struct cvmx_sli_pktx_instr_baddr_s {
+               u64 addr : 61;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_sli_pktx_instr_baddr_s cn61xx;
+       struct cvmx_sli_pktx_instr_baddr_s cn63xx;
+       struct cvmx_sli_pktx_instr_baddr_s cn63xxp1;
+       struct cvmx_sli_pktx_instr_baddr_s cn66xx;
+       struct cvmx_sli_pktx_instr_baddr_s cn68xx;
+       struct cvmx_sli_pktx_instr_baddr_s cn68xxp1;
+       struct cvmx_sli_pktx_instr_baddr_s cn70xx;
+       struct cvmx_sli_pktx_instr_baddr_s cn70xxp1;
+       struct cvmx_sli_pktx_instr_baddr_s cn73xx;
+       struct cvmx_sli_pktx_instr_baddr_s cn78xx;
+       struct cvmx_sli_pktx_instr_baddr_s cn78xxp1;
+       struct cvmx_sli_pktx_instr_baddr_s cnf71xx;
+       struct cvmx_sli_pktx_instr_baddr_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_instr_baddr cvmx_sli_pktx_instr_baddr_t;
+
+/**
+ * cvmx_sli_pkt#_instr_baoff_dbell
+ *
+ * This register contains the doorbell and base address offset for the next read.
+ *
+ */
+union cvmx_sli_pktx_instr_baoff_dbell {
+       u64 u64;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s {
+               u64 aoff : 32;
+               u64 dbell : 32;
+       } s;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn61xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn63xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn63xxp1;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn66xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn68xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn68xxp1;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn70xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn70xxp1;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn73xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn78xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cn78xxp1;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cnf71xx;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_instr_baoff_dbell cvmx_sli_pktx_instr_baoff_dbell_t;
+
+/**
+ * cvmx_sli_pkt#_instr_fifo_rsize
+ *
+ * This register contains the FIFO field and ring size for instructions.
+ *
+ */
+union cvmx_sli_pktx_instr_fifo_rsize {
+       u64 u64;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s {
+               u64 max : 9;
+               u64 rrp : 9;
+               u64 wrp : 9;
+               u64 fcnt : 5;
+               u64 rsize : 32;
+       } s;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn61xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn63xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn63xxp1;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn66xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn68xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn68xxp1;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn70xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn70xxp1;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn73xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn78xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cn78xxp1;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cnf71xx;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_instr_fifo_rsize cvmx_sli_pktx_instr_fifo_rsize_t;
+
+/**
+ * cvmx_sli_pkt#_instr_header
+ *
+ * "SLI_PKT[0..31]_INSTR_HEADER = SLI Packet ring# Instruction Header.
+ * VAlues used to build input packet header."
+ */
+union cvmx_sli_pktx_instr_header {
+       u64 u64;
+       struct cvmx_sli_pktx_instr_header_s {
+               u64 reserved_44_63 : 20;
+               u64 pbp : 1;
+               u64 reserved_38_42 : 5;
+               u64 rparmode : 2;
+               u64 reserved_35_35 : 1;
+               u64 rskp_len : 7;
+               u64 rngrpext : 2;
+               u64 rnqos : 1;
+               u64 rngrp : 1;
+               u64 rntt : 1;
+               u64 rntag : 1;
+               u64 use_ihdr : 1;
+               u64 reserved_16_20 : 5;
+               u64 par_mode : 2;
+               u64 reserved_13_13 : 1;
+               u64 skp_len : 7;
+               u64 ngrpext : 2;
+               u64 nqos : 1;
+               u64 ngrp : 1;
+               u64 ntt : 1;
+               u64 ntag : 1;
+       } s;
+       struct cvmx_sli_pktx_instr_header_cn61xx {
+               u64 reserved_44_63 : 20;
+               u64 pbp : 1;
+               u64 reserved_38_42 : 5;
+               u64 rparmode : 2;
+               u64 reserved_35_35 : 1;
+               u64 rskp_len : 7;
+               u64 reserved_26_27 : 2;
+               u64 rnqos : 1;
+               u64 rngrp : 1;
+               u64 rntt : 1;
+               u64 rntag : 1;
+               u64 use_ihdr : 1;
+               u64 reserved_16_20 : 5;
+               u64 par_mode : 2;
+               u64 reserved_13_13 : 1;
+               u64 skp_len : 7;
+               u64 reserved_4_5 : 2;
+               u64 nqos : 1;
+               u64 ngrp : 1;
+               u64 ntt : 1;
+               u64 ntag : 1;
+       } cn61xx;
+       struct cvmx_sli_pktx_instr_header_cn61xx cn63xx;
+       struct cvmx_sli_pktx_instr_header_cn61xx cn63xxp1;
+       struct cvmx_sli_pktx_instr_header_cn61xx cn66xx;
+       struct cvmx_sli_pktx_instr_header_s cn68xx;
+       struct cvmx_sli_pktx_instr_header_cn61xx cn68xxp1;
+       struct cvmx_sli_pktx_instr_header_cn70xx {
+               u64 reserved_44_63 : 20;
+               u64 pbp : 1;
+               u64 reserved_38_42 : 5;
+               u64 rparmode : 2;
+               u64 reserved_35_35 : 1;
+               u64 rskp_len : 7;
+               u64 reserved_27_26 : 2;
+               u64 rnqos : 1;
+               u64 rngrp : 1;
+               u64 rntt : 1;
+               u64 rntag : 1;
+               u64 use_ihdr : 1;
+               u64 reserved_20_16 : 5;
+               u64 par_mode : 2;
+               u64 reserved_13_13 : 1;
+               u64 skp_len : 7;
+               u64 reserved_5_4 : 2;
+               u64 nqos : 1;
+               u64 ngrp : 1;
+               u64 ntt : 1;
+               u64 ntag : 1;
+       } cn70xx;
+       struct cvmx_sli_pktx_instr_header_cn70xx cn70xxp1;
+       struct cvmx_sli_pktx_instr_header_cn61xx cnf71xx;
+};
+
+typedef union cvmx_sli_pktx_instr_header cvmx_sli_pktx_instr_header_t;
+
+/**
+ * cvmx_sli_pkt#_int_levels
+ *
+ * This register contains output-packet interrupt levels.
+ *
+ */
+union cvmx_sli_pktx_int_levels {
+       u64 u64;
+       struct cvmx_sli_pktx_int_levels_s {
+               u64 reserved_54_63 : 10;
+               u64 time : 22;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sli_pktx_int_levels_s cn73xx;
+       struct cvmx_sli_pktx_int_levels_s cn78xx;
+       struct cvmx_sli_pktx_int_levels_s cn78xxp1;
+       struct cvmx_sli_pktx_int_levels_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_int_levels cvmx_sli_pktx_int_levels_t;
+
+/**
+ * cvmx_sli_pkt#_mbox_int
+ *
+ * This register contains information to service mbox interrupts to the VF
+ * when the PF writes SLI_PKT()_PF_VF_MBOX_SIG(0).
+ */
+union cvmx_sli_pktx_mbox_int {
+       u64 u64;
+       struct cvmx_sli_pktx_mbox_int_s {
+               u64 po_int : 1;
+               u64 pi_int : 1;
+               u64 mbox_int : 1;
+               u64 resend : 1;
+               u64 reserved_1_59 : 59;
+               u64 mbox_en : 1;
+       } s;
+       struct cvmx_sli_pktx_mbox_int_s cn73xx;
+       struct cvmx_sli_pktx_mbox_int_s cn78xx;
+       struct cvmx_sli_pktx_mbox_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_mbox_int cvmx_sli_pktx_mbox_int_t;
+
+/**
+ * cvmx_sli_pkt#_out_size
+ *
+ * This register contains the BSIZE and ISIZE for output packet rings.
+ *
+ */
+union cvmx_sli_pktx_out_size {
+       u64 u64;
+       struct cvmx_sli_pktx_out_size_s {
+               u64 reserved_23_63 : 41;
+               u64 isize : 7;
+               u64 bsize : 16;
+       } s;
+       struct cvmx_sli_pktx_out_size_s cn61xx;
+       struct cvmx_sli_pktx_out_size_s cn63xx;
+       struct cvmx_sli_pktx_out_size_s cn63xxp1;
+       struct cvmx_sli_pktx_out_size_s cn66xx;
+       struct cvmx_sli_pktx_out_size_s cn68xx;
+       struct cvmx_sli_pktx_out_size_s cn68xxp1;
+       struct cvmx_sli_pktx_out_size_s cn70xx;
+       struct cvmx_sli_pktx_out_size_s cn70xxp1;
+       struct cvmx_sli_pktx_out_size_cn73xx {
+               u64 reserved_22_63 : 42;
+               u64 isize : 6;
+               u64 bsize : 16;
+       } cn73xx;
+       struct cvmx_sli_pktx_out_size_cn73xx cn78xx;
+       struct cvmx_sli_pktx_out_size_s cn78xxp1;
+       struct cvmx_sli_pktx_out_size_s cnf71xx;
+       struct cvmx_sli_pktx_out_size_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_out_size cvmx_sli_pktx_out_size_t;
+
+/**
+ * cvmx_sli_pkt#_output_control
+ *
+ * This register is the control for read operations for gather list and instructions.
+ *
+ */
+union cvmx_sli_pktx_output_control {
+       u64 u64;
+       struct cvmx_sli_pktx_output_control_s {
+               u64 reserved_14_63 : 50;
+               u64 tenb : 1;
+               u64 cenb : 1;
+               u64 iptr : 1;
+               u64 es : 2;
+               u64 nsr : 1;
+               u64 ror : 1;
+               u64 dptr : 1;
+               u64 bmode : 1;
+               u64 es_p : 2;
+               u64 nsr_p : 1;
+               u64 ror_p : 1;
+               u64 enb : 1;
+       } s;
+       struct cvmx_sli_pktx_output_control_s cn73xx;
+       struct cvmx_sli_pktx_output_control_s cn78xx;
+       struct cvmx_sli_pktx_output_control_s cn78xxp1;
+       struct cvmx_sli_pktx_output_control_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_output_control cvmx_sli_pktx_output_control_t;
+
+/**
+ * cvmx_sli_pkt#_pf_vf_mbox_sig#
+ *
+ * These registers are used for communication of data from the PF to the VF and vice versa.
+ *
+ * There are two registers per ring, SIG(0) and SIG(1). The PF and VF, both, have read and
+ * write access to these registers.
+ *
+ * For PF-to-VF ring interrupts, SLI_PKT(0..63)_MBOX_INT[MBOX_EN] must be set.
+ * When [MBOX_EN] is set, writes from the PF to byte 0 of the SIG(0) register will cause
+ * an interrupt by setting [MBOX_INT] in the corresponding ring address of
+ * SLI_PKT()_MBOX_INT[MBOX_INT],
+ * SLI_PKT_IN_DONE()_CNTS[MBOX_INT], and SLI_PKT()_CNTS[MBOX_INT].
+ *
+ * For VF-to-PF ring interrupt, SLI_MAC()_PF()_INT_ENB[VF_MBOX] must be set.
+ * When [VF_MBOX] is set, write from the VF to byte 0 of the SIG(1) register will cause an
+ * interrupt by setting ring address VF_INT field in corresponding SLI_MAC()_PF()_MBOX_INT
+ * register,
+ * which may cause an interrupt to occur through PF.
+ *
+ * Each PF and VF can only access the rings that it owns as programmed by
+ * SLI_PKT_MAC()_PF()_RINFO.
+ * The signaling is ring-based. If a VF owns more than one ring, it can ignore the other
+ * rings' registers if not needed.
+ */
+union cvmx_sli_pktx_pf_vf_mbox_sigx {
+       u64 u64;
+       struct cvmx_sli_pktx_pf_vf_mbox_sigx_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_pktx_pf_vf_mbox_sigx_s cn73xx;
+       struct cvmx_sli_pktx_pf_vf_mbox_sigx_s cn78xx;
+       struct cvmx_sli_pktx_pf_vf_mbox_sigx_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_pf_vf_mbox_sigx cvmx_sli_pktx_pf_vf_mbox_sigx_t;
+
+/**
+ * cvmx_sli_pkt#_slist_baddr
+ *
+ * This register contains the start of scatter list for output-packet pointers. This address must
+ * be 16-byte aligned.
+ */
+union cvmx_sli_pktx_slist_baddr {
+       u64 u64;
+       struct cvmx_sli_pktx_slist_baddr_s {
+               u64 addr : 60;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_sli_pktx_slist_baddr_s cn61xx;
+       struct cvmx_sli_pktx_slist_baddr_s cn63xx;
+       struct cvmx_sli_pktx_slist_baddr_s cn63xxp1;
+       struct cvmx_sli_pktx_slist_baddr_s cn66xx;
+       struct cvmx_sli_pktx_slist_baddr_s cn68xx;
+       struct cvmx_sli_pktx_slist_baddr_s cn68xxp1;
+       struct cvmx_sli_pktx_slist_baddr_s cn70xx;
+       struct cvmx_sli_pktx_slist_baddr_s cn70xxp1;
+       struct cvmx_sli_pktx_slist_baddr_s cn73xx;
+       struct cvmx_sli_pktx_slist_baddr_s cn78xx;
+       struct cvmx_sli_pktx_slist_baddr_s cn78xxp1;
+       struct cvmx_sli_pktx_slist_baddr_s cnf71xx;
+       struct cvmx_sli_pktx_slist_baddr_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_slist_baddr cvmx_sli_pktx_slist_baddr_t;
+
+/**
+ * cvmx_sli_pkt#_slist_baoff_dbell
+ *
+ * This register contains the doorbell and base-address offset for next read operation.
+ *
+ */
+union cvmx_sli_pktx_slist_baoff_dbell {
+       u64 u64;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s {
+               u64 aoff : 32;
+               u64 dbell : 32;
+       } s;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn61xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn63xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn63xxp1;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn66xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn68xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn68xxp1;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn70xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn70xxp1;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn73xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn78xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cn78xxp1;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cnf71xx;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_slist_baoff_dbell cvmx_sli_pktx_slist_baoff_dbell_t;
+
+/**
+ * cvmx_sli_pkt#_slist_fifo_rsize
+ *
+ * This register contains the number of scatter pointer pairs in the scatter list.
+ *
+ */
+union cvmx_sli_pktx_slist_fifo_rsize {
+       u64 u64;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s {
+               u64 reserved_32_63 : 32;
+               u64 rsize : 32;
+       } s;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s cn61xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s cn63xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s cn63xxp1;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s cn66xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s cn68xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s cn68xxp1;
+       struct cvmx_sli_pktx_slist_fifo_rsize_cn70xx {
+               u64 reserved_63_32 : 32;
+               u64 rsize : 32;
+       } cn70xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_cn70xx cn70xxp1;
+       struct cvmx_sli_pktx_slist_fifo_rsize_cn70xx cn73xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_cn70xx cn78xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_cn70xx cn78xxp1;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s cnf71xx;
+       struct cvmx_sli_pktx_slist_fifo_rsize_cn70xx cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_slist_fifo_rsize cvmx_sli_pktx_slist_fifo_rsize_t;
+
+/**
+ * cvmx_sli_pkt#_vf_int_sum
+ *
+ * This register contains summary interrupts bits for a VF. A VF read of this register
+ * for any of its 8 rings will return the same 8-bit summary for packet input, packet
+ * output and mailbox interrupts. If a PF reads this register it will return 0x0.
+ */
+union cvmx_sli_pktx_vf_int_sum {
+       u64 u64;
+       struct cvmx_sli_pktx_vf_int_sum_s {
+               u64 reserved_40_63 : 24;
+               u64 mbox : 8;
+               u64 reserved_24_31 : 8;
+               u64 pkt_out : 8;
+               u64 reserved_8_15 : 8;
+               u64 pkt_in : 8;
+       } s;
+       struct cvmx_sli_pktx_vf_int_sum_s cn73xx;
+       struct cvmx_sli_pktx_vf_int_sum_s cn78xx;
+       struct cvmx_sli_pktx_vf_int_sum_s cnf75xx;
+};
+
+typedef union cvmx_sli_pktx_vf_int_sum cvmx_sli_pktx_vf_int_sum_t;
+
+/**
+ * cvmx_sli_pkt#_vf_sig
+ *
+ * This register is used to signal between PF/VF. These 64 registers are index by VF number.
+ *
+ */
+union cvmx_sli_pktx_vf_sig {
+       u64 u64;
+       struct cvmx_sli_pktx_vf_sig_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_pktx_vf_sig_s cn78xxp1;
+};
+
+typedef union cvmx_sli_pktx_vf_sig cvmx_sli_pktx_vf_sig_t;
+
+/**
+ * cvmx_sli_pkt_bist_status
+ *
+ * This is the built-in self-test (BIST) status register. Each bit is the BIST result of an
+ * individual memory (per bit, 0 = pass and 1 = fail).
+ */
+union cvmx_sli_pkt_bist_status {
+       u64 u64;
+       struct cvmx_sli_pkt_bist_status_s {
+               u64 reserved_22_63 : 42;
+               u64 bist : 22;
+       } s;
+       struct cvmx_sli_pkt_bist_status_s cn73xx;
+       struct cvmx_sli_pkt_bist_status_s cn78xx;
+       struct cvmx_sli_pkt_bist_status_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_bist_status cvmx_sli_pkt_bist_status_t;
+
+/**
+ * cvmx_sli_pkt_cnt_int
+ *
+ * This register specifies which output packet rings are interrupting because of packet counters.
+ * A bit set in this interrupt register will set a corresponding bit in SLI_PKT_INT and can
+ * also cause SLI_MAC()_PF()_INT_SUM[PCNT] to be set if SLI_PKT()_OUTPUT_CONTROL[CENB] is set.
+ * When read by a function, this register informs which rings owned by the function (0 to N,
+ * N as large as 63) have this interrupt pending.
+ */
+union cvmx_sli_pkt_cnt_int {
+       u64 u64;
+       struct cvmx_sli_pkt_cnt_int_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_sli_pkt_cnt_int_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 port : 32;
+       } cn61xx;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cn63xx;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cn63xxp1;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cn66xx;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cn68xx;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cn68xxp1;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cn70xx;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cn70xxp1;
+       struct cvmx_sli_pkt_cnt_int_cn73xx {
+               u64 ring : 64;
+       } cn73xx;
+       struct cvmx_sli_pkt_cnt_int_cn73xx cn78xx;
+       struct cvmx_sli_pkt_cnt_int_cn73xx cn78xxp1;
+       struct cvmx_sli_pkt_cnt_int_cn61xx cnf71xx;
+       struct cvmx_sli_pkt_cnt_int_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_cnt_int cvmx_sli_pkt_cnt_int_t;
+
+/**
+ * cvmx_sli_pkt_cnt_int_enb
+ *
+ * Enable for the packets rings that are interrupting because of Packet Counters.
+ *
+ */
+union cvmx_sli_pkt_cnt_int_enb {
+       u64 u64;
+       struct cvmx_sli_pkt_cnt_int_enb_s {
+               u64 reserved_32_63 : 32;
+               u64 port : 32;
+       } s;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn61xx;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn63xx;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn63xxp1;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn66xx;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn68xx;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn68xxp1;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn70xx;
+       struct cvmx_sli_pkt_cnt_int_enb_s cn70xxp1;
+       struct cvmx_sli_pkt_cnt_int_enb_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_cnt_int_enb cvmx_sli_pkt_cnt_int_enb_t;
+
+/**
+ * cvmx_sli_pkt_ctl
+ *
+ * Control for packets.
+ *
+ */
+union cvmx_sli_pkt_ctl {
+       u64 u64;
+       struct cvmx_sli_pkt_ctl_s {
+               u64 reserved_5_63 : 59;
+               u64 ring_en : 1;
+               u64 pkt_bp : 4;
+       } s;
+       struct cvmx_sli_pkt_ctl_s cn61xx;
+       struct cvmx_sli_pkt_ctl_s cn63xx;
+       struct cvmx_sli_pkt_ctl_s cn63xxp1;
+       struct cvmx_sli_pkt_ctl_s cn66xx;
+       struct cvmx_sli_pkt_ctl_s cn68xx;
+       struct cvmx_sli_pkt_ctl_s cn68xxp1;
+       struct cvmx_sli_pkt_ctl_s cn70xx;
+       struct cvmx_sli_pkt_ctl_s cn70xxp1;
+       struct cvmx_sli_pkt_ctl_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_ctl cvmx_sli_pkt_ctl_t;
+
+/**
+ * cvmx_sli_pkt_data_out_es
+ *
+ * The Endian Swap for writing Data Out.
+ *
+ */
+union cvmx_sli_pkt_data_out_es {
+       u64 u64;
+       struct cvmx_sli_pkt_data_out_es_s {
+               u64 es : 64;
+       } s;
+       struct cvmx_sli_pkt_data_out_es_s cn61xx;
+       struct cvmx_sli_pkt_data_out_es_s cn63xx;
+       struct cvmx_sli_pkt_data_out_es_s cn63xxp1;
+       struct cvmx_sli_pkt_data_out_es_s cn66xx;
+       struct cvmx_sli_pkt_data_out_es_s cn68xx;
+       struct cvmx_sli_pkt_data_out_es_s cn68xxp1;
+       struct cvmx_sli_pkt_data_out_es_s cn70xx;
+       struct cvmx_sli_pkt_data_out_es_s cn70xxp1;
+       struct cvmx_sli_pkt_data_out_es_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_data_out_es cvmx_sli_pkt_data_out_es_t;
+
+/**
+ * cvmx_sli_pkt_data_out_ns
+ *
+ * The NS field for the TLP when writing packet data.
+ *
+ */
+union cvmx_sli_pkt_data_out_ns {
+       u64 u64;
+       struct cvmx_sli_pkt_data_out_ns_s {
+               u64 reserved_32_63 : 32;
+               u64 nsr : 32;
+       } s;
+       struct cvmx_sli_pkt_data_out_ns_s cn61xx;
+       struct cvmx_sli_pkt_data_out_ns_s cn63xx;
+       struct cvmx_sli_pkt_data_out_ns_s cn63xxp1;
+       struct cvmx_sli_pkt_data_out_ns_s cn66xx;
+       struct cvmx_sli_pkt_data_out_ns_s cn68xx;
+       struct cvmx_sli_pkt_data_out_ns_s cn68xxp1;
+       struct cvmx_sli_pkt_data_out_ns_s cn70xx;
+       struct cvmx_sli_pkt_data_out_ns_s cn70xxp1;
+       struct cvmx_sli_pkt_data_out_ns_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_data_out_ns cvmx_sli_pkt_data_out_ns_t;
+
+/**
+ * cvmx_sli_pkt_data_out_ror
+ *
+ * The ROR field for the TLP when writing Packet Data.
+ *
+ */
+union cvmx_sli_pkt_data_out_ror {
+       u64 u64;
+       struct cvmx_sli_pkt_data_out_ror_s {
+               u64 reserved_32_63 : 32;
+               u64 ror : 32;
+       } s;
+       struct cvmx_sli_pkt_data_out_ror_s cn61xx;
+       struct cvmx_sli_pkt_data_out_ror_s cn63xx;
+       struct cvmx_sli_pkt_data_out_ror_s cn63xxp1;
+       struct cvmx_sli_pkt_data_out_ror_s cn66xx;
+       struct cvmx_sli_pkt_data_out_ror_s cn68xx;
+       struct cvmx_sli_pkt_data_out_ror_s cn68xxp1;
+       struct cvmx_sli_pkt_data_out_ror_s cn70xx;
+       struct cvmx_sli_pkt_data_out_ror_s cn70xxp1;
+       struct cvmx_sli_pkt_data_out_ror_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_data_out_ror cvmx_sli_pkt_data_out_ror_t;
+
+/**
+ * cvmx_sli_pkt_dpaddr
+ *
+ * Used to detemine address and attributes for packet data writes.
+ *
+ */
+union cvmx_sli_pkt_dpaddr {
+       u64 u64;
+       struct cvmx_sli_pkt_dpaddr_s {
+               u64 reserved_32_63 : 32;
+               u64 dptr : 32;
+       } s;
+       struct cvmx_sli_pkt_dpaddr_s cn61xx;
+       struct cvmx_sli_pkt_dpaddr_s cn63xx;
+       struct cvmx_sli_pkt_dpaddr_s cn63xxp1;
+       struct cvmx_sli_pkt_dpaddr_s cn66xx;
+       struct cvmx_sli_pkt_dpaddr_s cn68xx;
+       struct cvmx_sli_pkt_dpaddr_s cn68xxp1;
+       struct cvmx_sli_pkt_dpaddr_s cn70xx;
+       struct cvmx_sli_pkt_dpaddr_s cn70xxp1;
+       struct cvmx_sli_pkt_dpaddr_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_dpaddr cvmx_sli_pkt_dpaddr_t;
+
+/**
+ * cvmx_sli_pkt_gbl_control
+ *
+ * This register contains control bits that affect all packet rings.
+ *
+ */
+union cvmx_sli_pkt_gbl_control {
+       u64 u64;
+       struct cvmx_sli_pkt_gbl_control_s {
+               u64 reserved_32_63 : 32;
+               u64 qtime : 16;
+               u64 reserved_14_15 : 2;
+               u64 bpkind : 6;
+               u64 reserved_4_7 : 4;
+               u64 pkpfval : 1;
+               u64 bpflr_d : 1;
+               u64 noptr_d : 1;
+               u64 picnt_d : 1;
+       } s;
+       struct cvmx_sli_pkt_gbl_control_s cn73xx;
+       struct cvmx_sli_pkt_gbl_control_s cn78xx;
+       struct cvmx_sli_pkt_gbl_control_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_gbl_control cvmx_sli_pkt_gbl_control_t;
+
+/**
+ * cvmx_sli_pkt_in_bp
+ *
+ * Which input rings have backpressure applied.
+ *
+ */
+union cvmx_sli_pkt_in_bp {
+       u64 u64;
+       struct cvmx_sli_pkt_in_bp_s {
+               u64 reserved_32_63 : 32;
+               u64 bp : 32;
+       } s;
+       struct cvmx_sli_pkt_in_bp_s cn61xx;
+       struct cvmx_sli_pkt_in_bp_s cn63xx;
+       struct cvmx_sli_pkt_in_bp_s cn63xxp1;
+       struct cvmx_sli_pkt_in_bp_s cn66xx;
+       struct cvmx_sli_pkt_in_bp_s cn70xx;
+       struct cvmx_sli_pkt_in_bp_s cn70xxp1;
+       struct cvmx_sli_pkt_in_bp_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_in_bp cvmx_sli_pkt_in_bp_t;
+
+/**
+ * cvmx_sli_pkt_in_done#_cnts
+ *
+ * This register contains counters for instructions completed on input rings.
+ *
+ */
+union cvmx_sli_pkt_in_donex_cnts {
+       u64 u64;
+       struct cvmx_sli_pkt_in_donex_cnts_s {
+               u64 po_int : 1;
+               u64 pi_int : 1;
+               u64 mbox_int : 1;
+               u64 resend : 1;
+               u64 reserved_49_59 : 11;
+               u64 cint_enb : 1;
+               u64 wmark : 16;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sli_pkt_in_donex_cnts_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } cn61xx;
+       struct cvmx_sli_pkt_in_donex_cnts_cn61xx cn63xx;
+       struct cvmx_sli_pkt_in_donex_cnts_cn61xx cn63xxp1;
+       struct cvmx_sli_pkt_in_donex_cnts_cn61xx cn66xx;
+       struct cvmx_sli_pkt_in_donex_cnts_cn61xx cn68xx;
+       struct cvmx_sli_pkt_in_donex_cnts_cn61xx cn68xxp1;
+       struct cvmx_sli_pkt_in_donex_cnts_cn70xx {
+               u64 reserved_63_32 : 32;
+               u64 cnt : 32;
+       } cn70xx;
+       struct cvmx_sli_pkt_in_donex_cnts_cn70xx cn70xxp1;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn73xx;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn78xx;
+       struct cvmx_sli_pkt_in_donex_cnts_cn78xxp1 {
+               u64 po_int : 1;
+               u64 pi_int : 1;
+               u64 reserved_61_49 : 13;
+               u64 cint_enb : 1;
+               u64 wmark : 16;
+               u64 cnt : 32;
+       } cn78xxp1;
+       struct cvmx_sli_pkt_in_donex_cnts_cn61xx cnf71xx;
+       struct cvmx_sli_pkt_in_donex_cnts_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_in_donex_cnts cvmx_sli_pkt_in_donex_cnts_t;
+
+/**
+ * cvmx_sli_pkt_in_instr_counts
+ *
+ * This register contains keeps track of the number of instructions read into the FIFO and
+ * packets sent to PKI. This register is PF-only.
+ */
+union cvmx_sli_pkt_in_instr_counts {
+       u64 u64;
+       struct cvmx_sli_pkt_in_instr_counts_s {
+               u64 wr_cnt : 32;
+               u64 rd_cnt : 32;
+       } s;
+       struct cvmx_sli_pkt_in_instr_counts_s cn61xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cn63xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cn63xxp1;
+       struct cvmx_sli_pkt_in_instr_counts_s cn66xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cn68xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cn68xxp1;
+       struct cvmx_sli_pkt_in_instr_counts_s cn70xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cn70xxp1;
+       struct cvmx_sli_pkt_in_instr_counts_s cn73xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cn78xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cn78xxp1;
+       struct cvmx_sli_pkt_in_instr_counts_s cnf71xx;
+       struct cvmx_sli_pkt_in_instr_counts_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_in_instr_counts cvmx_sli_pkt_in_instr_counts_t;
+
+/**
+ * cvmx_sli_pkt_in_int
+ *
+ * This register specifies which input packets rings are interrupting because of done counts.
+ * A bit set in this interrupt register will set a corresponding bit in SLI_PKT_INT which
+ * can cause a MSI-X interrupt.  When read by a function, this register informs which rings
+ * owned by the function (0 to N, N as large as 63) have this interrupt pending.
+ * SLI_PKT_IN_INT conditions can cause MSI-X interrupts, but do not cause any
+ * SLI_MAC()_PF()_INT_SUM
+ * bit to set, and cannot cause INTA/B/C/D nor MSI interrupts.
+ */
+union cvmx_sli_pkt_in_int {
+       u64 u64;
+       struct cvmx_sli_pkt_in_int_s {
+               u64 ring : 64;
+       } s;
+       struct cvmx_sli_pkt_in_int_s cn73xx;
+       struct cvmx_sli_pkt_in_int_s cn78xx;
+       struct cvmx_sli_pkt_in_int_s cn78xxp1;
+       struct cvmx_sli_pkt_in_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_in_int cvmx_sli_pkt_in_int_t;
+
+/**
+ * cvmx_sli_pkt_in_jabber
+ *
+ * Register to set limit on SLI packet input packet sizes.
+ *
+ */
+union cvmx_sli_pkt_in_jabber {
+       u64 u64;
+       struct cvmx_sli_pkt_in_jabber_s {
+               u64 reserved_32_63 : 32;
+               u64 size : 32;
+       } s;
+       struct cvmx_sli_pkt_in_jabber_s cn73xx;
+       struct cvmx_sli_pkt_in_jabber_s cn78xx;
+       struct cvmx_sli_pkt_in_jabber_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_in_jabber cvmx_sli_pkt_in_jabber_t;
+
+/**
+ * cvmx_sli_pkt_in_pcie_port
+ *
+ * Assigns Packet Input rings to MAC ports.
+ *
+ */
+union cvmx_sli_pkt_in_pcie_port {
+       u64 u64;
+       struct cvmx_sli_pkt_in_pcie_port_s {
+               u64 pp : 64;
+       } s;
+       struct cvmx_sli_pkt_in_pcie_port_s cn61xx;
+       struct cvmx_sli_pkt_in_pcie_port_s cn63xx;
+       struct cvmx_sli_pkt_in_pcie_port_s cn63xxp1;
+       struct cvmx_sli_pkt_in_pcie_port_s cn66xx;
+       struct cvmx_sli_pkt_in_pcie_port_s cn68xx;
+       struct cvmx_sli_pkt_in_pcie_port_s cn68xxp1;
+       struct cvmx_sli_pkt_in_pcie_port_s cn70xx;
+       struct cvmx_sli_pkt_in_pcie_port_s cn70xxp1;
+       struct cvmx_sli_pkt_in_pcie_port_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_in_pcie_port cvmx_sli_pkt_in_pcie_port_t;
+
+/**
+ * cvmx_sli_pkt_input_control
+ *
+ * Control for reads for gather list and instructions.
+ *
+ */
+union cvmx_sli_pkt_input_control {
+       u64 u64;
+       struct cvmx_sli_pkt_input_control_s {
+               u64 prd_erst : 1;
+               u64 prd_rds : 7;
+               u64 gii_erst : 1;
+               u64 gii_rds : 7;
+               u64 reserved_41_47 : 7;
+               u64 prc_idle : 1;
+               u64 reserved_24_39 : 16;
+               u64 pin_rst : 1;
+               u64 pkt_rr : 1;
+               u64 pbp_dhi : 13;
+               u64 d_nsr : 1;
+               u64 d_esr : 2;
+               u64 d_ror : 1;
+               u64 use_csr : 1;
+               u64 nsr : 1;
+               u64 esr : 2;
+               u64 ror : 1;
+       } s;
+       struct cvmx_sli_pkt_input_control_s cn61xx;
+       struct cvmx_sli_pkt_input_control_cn63xx {
+               u64 reserved_23_63 : 41;
+               u64 pkt_rr : 1;
+               u64 pbp_dhi : 13;
+               u64 d_nsr : 1;
+               u64 d_esr : 2;
+               u64 d_ror : 1;
+               u64 use_csr : 1;
+               u64 nsr : 1;
+               u64 esr : 2;
+               u64 ror : 1;
+       } cn63xx;
+       struct cvmx_sli_pkt_input_control_cn63xx cn63xxp1;
+       struct cvmx_sli_pkt_input_control_s cn66xx;
+       struct cvmx_sli_pkt_input_control_s cn68xx;
+       struct cvmx_sli_pkt_input_control_s cn68xxp1;
+       struct cvmx_sli_pkt_input_control_s cn70xx;
+       struct cvmx_sli_pkt_input_control_s cn70xxp1;
+       struct cvmx_sli_pkt_input_control_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_input_control cvmx_sli_pkt_input_control_t;
+
+/**
+ * cvmx_sli_pkt_instr_enb
+ *
+ * Multi-ring instruction input enable register. This register is PF-only.
+ *
+ */
+union cvmx_sli_pkt_instr_enb {
+       u64 u64;
+       struct cvmx_sli_pkt_instr_enb_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_sli_pkt_instr_enb_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 enb : 32;
+       } cn61xx;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cn63xx;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cn63xxp1;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cn66xx;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cn68xx;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cn68xxp1;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cn70xx;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cn70xxp1;
+       struct cvmx_sli_pkt_instr_enb_s cn78xxp1;
+       struct cvmx_sli_pkt_instr_enb_cn61xx cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_instr_enb cvmx_sli_pkt_instr_enb_t;
+
+/**
+ * cvmx_sli_pkt_instr_rd_size
+ *
+ * The number of instruction allowed to be read at one time.
+ *
+ */
+union cvmx_sli_pkt_instr_rd_size {
+       u64 u64;
+       struct cvmx_sli_pkt_instr_rd_size_s {
+               u64 rdsize : 64;
+       } s;
+       struct cvmx_sli_pkt_instr_rd_size_s cn61xx;
+       struct cvmx_sli_pkt_instr_rd_size_s cn63xx;
+       struct cvmx_sli_pkt_instr_rd_size_s cn63xxp1;
+       struct cvmx_sli_pkt_instr_rd_size_s cn66xx;
+       struct cvmx_sli_pkt_instr_rd_size_s cn68xx;
+       struct cvmx_sli_pkt_instr_rd_size_s cn68xxp1;
+       struct cvmx_sli_pkt_instr_rd_size_s cn70xx;
+       struct cvmx_sli_pkt_instr_rd_size_s cn70xxp1;
+       struct cvmx_sli_pkt_instr_rd_size_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_instr_rd_size cvmx_sli_pkt_instr_rd_size_t;
+
+/**
+ * cvmx_sli_pkt_instr_size
+ *
+ * Determines if instructions are 64 or 32 byte in size for a Packet-ring.
+ *
+ */
+union cvmx_sli_pkt_instr_size {
+       u64 u64;
+       struct cvmx_sli_pkt_instr_size_s {
+               u64 reserved_32_63 : 32;
+               u64 is_64b : 32;
+       } s;
+       struct cvmx_sli_pkt_instr_size_s cn61xx;
+       struct cvmx_sli_pkt_instr_size_s cn63xx;
+       struct cvmx_sli_pkt_instr_size_s cn63xxp1;
+       struct cvmx_sli_pkt_instr_size_s cn66xx;
+       struct cvmx_sli_pkt_instr_size_s cn68xx;
+       struct cvmx_sli_pkt_instr_size_s cn68xxp1;
+       struct cvmx_sli_pkt_instr_size_s cn70xx;
+       struct cvmx_sli_pkt_instr_size_s cn70xxp1;
+       struct cvmx_sli_pkt_instr_size_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_instr_size cvmx_sli_pkt_instr_size_t;
+
+/**
+ * cvmx_sli_pkt_int
+ *
+ * This register combines the SLI_PKT_CNT_INT, SLI_PKT_TIME_INT or SLI_PKT_IN_INT interrupt
+ * registers. When read by a function, this register informs which rings owned by the function
+ * (0 to N, N as large as 63) have an interrupt pending.
+ */
+union cvmx_sli_pkt_int {
+       u64 u64;
+       struct cvmx_sli_pkt_int_s {
+               u64 ring : 64;
+       } s;
+       struct cvmx_sli_pkt_int_s cn73xx;
+       struct cvmx_sli_pkt_int_s cn78xx;
+       struct cvmx_sli_pkt_int_s cn78xxp1;
+       struct cvmx_sli_pkt_int_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_int cvmx_sli_pkt_int_t;
+
+/**
+ * cvmx_sli_pkt_int_levels
+ *
+ * SLI_PKT_INT_LEVELS = SLI's Packet Interrupt Levels
+ * Output packet interrupt levels.
+ */
+union cvmx_sli_pkt_int_levels {
+       u64 u64;
+       struct cvmx_sli_pkt_int_levels_s {
+               u64 reserved_54_63 : 10;
+               u64 time : 22;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sli_pkt_int_levels_s cn61xx;
+       struct cvmx_sli_pkt_int_levels_s cn63xx;
+       struct cvmx_sli_pkt_int_levels_s cn63xxp1;
+       struct cvmx_sli_pkt_int_levels_s cn66xx;
+       struct cvmx_sli_pkt_int_levels_s cn68xx;
+       struct cvmx_sli_pkt_int_levels_s cn68xxp1;
+       struct cvmx_sli_pkt_int_levels_s cn70xx;
+       struct cvmx_sli_pkt_int_levels_s cn70xxp1;
+       struct cvmx_sli_pkt_int_levels_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_int_levels cvmx_sli_pkt_int_levels_t;
+
+/**
+ * cvmx_sli_pkt_iptr
+ *
+ * Controls using the Info-Pointer to store length and data.
+ *
+ */
+union cvmx_sli_pkt_iptr {
+       u64 u64;
+       struct cvmx_sli_pkt_iptr_s {
+               u64 reserved_32_63 : 32;
+               u64 iptr : 32;
+       } s;
+       struct cvmx_sli_pkt_iptr_s cn61xx;
+       struct cvmx_sli_pkt_iptr_s cn63xx;
+       struct cvmx_sli_pkt_iptr_s cn63xxp1;
+       struct cvmx_sli_pkt_iptr_s cn66xx;
+       struct cvmx_sli_pkt_iptr_s cn68xx;
+       struct cvmx_sli_pkt_iptr_s cn68xxp1;
+       struct cvmx_sli_pkt_iptr_s cn70xx;
+       struct cvmx_sli_pkt_iptr_s cn70xxp1;
+       struct cvmx_sli_pkt_iptr_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_iptr cvmx_sli_pkt_iptr_t;
+
+/**
+ * cvmx_sli_pkt_mac#_pf#_rinfo
+ *
+ * This register sets the total number and starting number of rings for a given MAC and PF
+ * combination. Indexed by (MAC index) SLI_PORT_E. In SR-IOV mode, SLI_PKT_MAC()_PF()_RINFO[RPVF]
+ * and SLI_PKT_MAC()_PF()_RINFO[NVFS] must be non zero and determine which rings the PFs and
+ * VFs own.
+ *
+ * An individual VF will own SLI_PKT_MAC()_PF()_RINFO[RPVF] number of rings.
+ *
+ * A PF will own the rings starting from ((SLI_PKT_MAC()_PF()_RINFO[SRN] +
+ * (SLI_PKT_MAC()_PF()_RINFO[RPVF] * SLI_PKT_MAC()_PF()_RINFO[NVFS]))
+ * to (SLI_PKT_MAC()_PF()_RINFO[SRN] + (SLI_PKT_MAC()_PF()_RINFO[TRS] -
+ * 1)). SLI_PKT()_INPUT_CONTROL[PVF_NUM] must be written to values that
+ * correlate with the fields in this register.
+ *
+ * e.g. Given:
+ * _ SLI_PKT_MAC0_PF0_RINFO[SRN] = 32,
+ * _ SLI_PKT_MAC0_PF0_RINFO[TRS] = 32,
+ * _ SLI_PKT_MAC0_PF0_RINFO[RPVF] = 4,
+ * _ SLI_PKT_MAC0_PF0_RINFO[NVFS] = 7:
+ * _ rings owned by VF1: 32,33,34,35
+ * _ rings owned by VF2: 36,37,38,39
+ * _ rings owned by VF3: 40,41,42,43
+ * _ rings owned by VF4: 44,45,46,47
+ * _ rings owned by VF5: 48,49,50,51
+ * _ rings owned by VF6: 52,53,54,55
+ * _ rings owned by VF7: 56,57,58,59
+ * _ rings owned by PF:  60,61,62,63
+ */
+union cvmx_sli_pkt_macx_pfx_rinfo {
+       u64 u64;
+       struct cvmx_sli_pkt_macx_pfx_rinfo_s {
+               u64 reserved_55_63 : 9;
+               u64 nvfs : 7;
+               u64 reserved_40_47 : 8;
+               u64 rpvf : 8;
+               u64 reserved_24_31 : 8;
+               u64 trs : 8;
+               u64 reserved_7_15 : 9;
+               u64 srn : 7;
+       } s;
+       struct cvmx_sli_pkt_macx_pfx_rinfo_s cn73xx;
+       struct cvmx_sli_pkt_macx_pfx_rinfo_s cn78xx;
+       struct cvmx_sli_pkt_macx_pfx_rinfo_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_macx_pfx_rinfo cvmx_sli_pkt_macx_pfx_rinfo_t;
+
+/**
+ * cvmx_sli_pkt_mac#_rinfo
+ *
+ * This register sets the total number and starting number of rings used by the MAC.
+ * This register is PF-only.
+ */
+union cvmx_sli_pkt_macx_rinfo {
+       u64 u64;
+       struct cvmx_sli_pkt_macx_rinfo_s {
+               u64 reserved_40_63 : 24;
+               u64 rpvf : 8;
+               u64 reserved_24_31 : 8;
+               u64 trs : 8;
+               u64 reserved_7_15 : 9;
+               u64 srn : 7;
+       } s;
+       struct cvmx_sli_pkt_macx_rinfo_s cn78xxp1;
+};
+
+typedef union cvmx_sli_pkt_macx_rinfo cvmx_sli_pkt_macx_rinfo_t;
+
+/**
+ * cvmx_sli_pkt_mac0_sig0
+ *
+ * This register is used to signal between PF/VF. This register can be R/W by the PF from MAC0
+ * and any VF.
+ */
+union cvmx_sli_pkt_mac0_sig0 {
+       u64 u64;
+       struct cvmx_sli_pkt_mac0_sig0_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_pkt_mac0_sig0_s cn78xxp1;
+};
+
+typedef union cvmx_sli_pkt_mac0_sig0 cvmx_sli_pkt_mac0_sig0_t;
+
+/**
+ * cvmx_sli_pkt_mac0_sig1
+ *
+ * This register is used to signal between PF/VF. This register can be R/W by the PF from MAC0
+ * and any VF.
+ */
+union cvmx_sli_pkt_mac0_sig1 {
+       u64 u64;
+       struct cvmx_sli_pkt_mac0_sig1_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_pkt_mac0_sig1_s cn78xxp1;
+};
+
+typedef union cvmx_sli_pkt_mac0_sig1 cvmx_sli_pkt_mac0_sig1_t;
+
+/**
+ * cvmx_sli_pkt_mac1_sig0
+ *
+ * This register is used to signal between PF/VF. This register can be R/W by the PF from MAC1
+ * and any VF.
+ */
+union cvmx_sli_pkt_mac1_sig0 {
+       u64 u64;
+       struct cvmx_sli_pkt_mac1_sig0_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_pkt_mac1_sig0_s cn78xxp1;
+};
+
+typedef union cvmx_sli_pkt_mac1_sig0 cvmx_sli_pkt_mac1_sig0_t;
+
+/**
+ * cvmx_sli_pkt_mac1_sig1
+ *
+ * This register is used to signal between PF/VF. This register can be R/W by the PF from MAC1
+ * and any VF.
+ */
+union cvmx_sli_pkt_mac1_sig1 {
+       u64 u64;
+       struct cvmx_sli_pkt_mac1_sig1_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_pkt_mac1_sig1_s cn78xxp1;
+};
+
+typedef union cvmx_sli_pkt_mac1_sig1 cvmx_sli_pkt_mac1_sig1_t;
+
+/**
+ * cvmx_sli_pkt_mem_ctl
+ *
+ * This register controls the ECC of the SLI packet memories.
+ *
+ */
+union cvmx_sli_pkt_mem_ctl {
+       u64 u64;
+       struct cvmx_sli_pkt_mem_ctl_s {
+               u64 reserved_48_63 : 16;
+               u64 msix_mbox_fs : 2;
+               u64 msix_mbox_ecc : 1;
+               u64 reserved_36_44 : 9;
+               u64 pos_fs : 2;
+               u64 pos_ecc : 1;
+               u64 pinm_fs : 2;
+               u64 pinm_ecc : 1;
+               u64 pind_fs : 2;
+               u64 pind_ecc : 1;
+               u64 point_fs : 2;
+               u64 point_ecc : 1;
+               u64 slist_fs : 2;
+               u64 slist_ecc : 1;
+               u64 pop1_fs : 2;
+               u64 pop1_ecc : 1;
+               u64 pop0_fs : 2;
+               u64 pop0_ecc : 1;
+               u64 pfp_fs : 2;
+               u64 pfp_ecc : 1;
+               u64 pbn_fs : 2;
+               u64 pbn_ecc : 1;
+               u64 pdf_fs : 2;
+               u64 pdf_ecc : 1;
+               u64 psf_fs : 2;
+               u64 psf_ecc : 1;
+               u64 poi_fs : 2;
+               u64 poi_ecc : 1;
+       } s;
+       struct cvmx_sli_pkt_mem_ctl_cn73xx {
+               u64 reserved_48_63 : 16;
+               u64 msix_mbox_fs : 2;
+               u64 msix_mbox_ecc : 1;
+               u64 msix_data_fs : 2;
+               u64 msix_data_ecc : 1;
+               u64 msix_addr_fs : 2;
+               u64 msix_addr_ecc : 1;
+               u64 pof_fs : 2;
+               u64 pof_ecc : 1;
+               u64 pos_fs : 2;
+               u64 pos_ecc : 1;
+               u64 pinm_fs : 2;
+               u64 pinm_ecc : 1;
+               u64 pind_fs : 2;
+               u64 pind_ecc : 1;
+               u64 point_fs : 2;
+               u64 point_ecc : 1;
+               u64 slist_fs : 2;
+               u64 slist_ecc : 1;
+               u64 pop1_fs : 2;
+               u64 pop1_ecc : 1;
+               u64 pop0_fs : 2;
+               u64 pop0_ecc : 1;
+               u64 pfp_fs : 2;
+               u64 pfp_ecc : 1;
+               u64 pbn_fs : 2;
+               u64 pbn_ecc : 1;
+               u64 pdf_fs : 2;
+               u64 pdf_ecc : 1;
+               u64 psf_fs : 2;
+               u64 psf_ecc : 1;
+               u64 poi_fs : 2;
+               u64 poi_ecc : 1;
+       } cn73xx;
+       struct cvmx_sli_pkt_mem_ctl_cn73xx cn78xx;
+       struct cvmx_sli_pkt_mem_ctl_cn78xxp1 {
+               u64 reserved_44_63 : 20;
+               u64 msid_fs : 2;
+               u64 msia_fs : 2;
+               u64 msi_ecc : 1;
+               u64 posi_fs : 2;
+               u64 posi_ecc : 1;
+               u64 pos_fs : 2;
+               u64 pos_ecc : 1;
+               u64 pinm_fs : 2;
+               u64 pinm_ecc : 1;
+               u64 pind_fs : 2;
+               u64 pind_ecc : 1;
+               u64 point_fs : 2;
+               u64 point_ecc : 1;
+               u64 slist_fs : 2;
+               u64 slist_ecc : 1;
+               u64 pop1_fs : 2;
+               u64 pop1_ecc : 1;
+               u64 pop0_fs : 2;
+               u64 pop0_ecc : 1;
+               u64 pfp_fs : 2;
+               u64 pfp_ecc : 1;
+               u64 pbn_fs : 2;
+               u64 pbn_ecc : 1;
+               u64 pdf_fs : 2;
+               u64 pdf_ecc : 1;
+               u64 psf_fs : 2;
+               u64 psf_ecc : 1;
+               u64 poi_fs : 2;
+               u64 poi_ecc : 1;
+       } cn78xxp1;
+       struct cvmx_sli_pkt_mem_ctl_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_mem_ctl cvmx_sli_pkt_mem_ctl_t;
+
+/**
+ * cvmx_sli_pkt_out_bmode
+ *
+ * Control the updating of the SLI_PKT#_CNT register.
+ *
+ */
+union cvmx_sli_pkt_out_bmode {
+       u64 u64;
+       struct cvmx_sli_pkt_out_bmode_s {
+               u64 reserved_32_63 : 32;
+               u64 bmode : 32;
+       } s;
+       struct cvmx_sli_pkt_out_bmode_s cn61xx;
+       struct cvmx_sli_pkt_out_bmode_s cn63xx;
+       struct cvmx_sli_pkt_out_bmode_s cn63xxp1;
+       struct cvmx_sli_pkt_out_bmode_s cn66xx;
+       struct cvmx_sli_pkt_out_bmode_s cn68xx;
+       struct cvmx_sli_pkt_out_bmode_s cn68xxp1;
+       struct cvmx_sli_pkt_out_bmode_s cn70xx;
+       struct cvmx_sli_pkt_out_bmode_s cn70xxp1;
+       struct cvmx_sli_pkt_out_bmode_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_out_bmode cvmx_sli_pkt_out_bmode_t;
+
+/**
+ * cvmx_sli_pkt_out_bp_en
+ *
+ * This register enables sending backpressure to PKO.
+ *
+ */
+union cvmx_sli_pkt_out_bp_en {
+       u64 u64;
+       struct cvmx_sli_pkt_out_bp_en_s {
+               u64 bp_en : 64;
+       } s;
+       struct cvmx_sli_pkt_out_bp_en_cn68xx {
+               u64 reserved_32_63 : 32;
+               u64 bp_en : 32;
+       } cn68xx;
+       struct cvmx_sli_pkt_out_bp_en_cn68xx cn68xxp1;
+       struct cvmx_sli_pkt_out_bp_en_s cn78xxp1;
+};
+
+typedef union cvmx_sli_pkt_out_bp_en cvmx_sli_pkt_out_bp_en_t;
+
+/**
+ * cvmx_sli_pkt_out_bp_en2_w1c
+ *
+ * This register disables sending backpressure to PKO.
+ *
+ */
+union cvmx_sli_pkt_out_bp_en2_w1c {
+       u64 u64;
+       struct cvmx_sli_pkt_out_bp_en2_w1c_s {
+               u64 w1c : 64;
+       } s;
+       struct cvmx_sli_pkt_out_bp_en2_w1c_s cn73xx;
+};
+
+typedef union cvmx_sli_pkt_out_bp_en2_w1c cvmx_sli_pkt_out_bp_en2_w1c_t;
+
+/**
+ * cvmx_sli_pkt_out_bp_en2_w1s
+ *
+ * This register enables sending backpressure to PKO.
+ *
+ */
+union cvmx_sli_pkt_out_bp_en2_w1s {
+       u64 u64;
+       struct cvmx_sli_pkt_out_bp_en2_w1s_s {
+               u64 w1s : 64;
+       } s;
+       struct cvmx_sli_pkt_out_bp_en2_w1s_s cn73xx;
+};
+
+typedef union cvmx_sli_pkt_out_bp_en2_w1s cvmx_sli_pkt_out_bp_en2_w1s_t;
+
+/**
+ * cvmx_sli_pkt_out_bp_en_w1c
+ *
+ * This register disables sending backpressure to PKO.
+ *
+ */
+union cvmx_sli_pkt_out_bp_en_w1c {
+       u64 u64;
+       struct cvmx_sli_pkt_out_bp_en_w1c_s {
+               u64 w1c : 64;
+       } s;
+       struct cvmx_sli_pkt_out_bp_en_w1c_s cn73xx;
+       struct cvmx_sli_pkt_out_bp_en_w1c_s cn78xx;
+       struct cvmx_sli_pkt_out_bp_en_w1c_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_out_bp_en_w1c cvmx_sli_pkt_out_bp_en_w1c_t;
+
+/**
+ * cvmx_sli_pkt_out_bp_en_w1s
+ *
+ * This register enables sending backpressure to PKO.
+ *
+ */
+union cvmx_sli_pkt_out_bp_en_w1s {
+       u64 u64;
+       struct cvmx_sli_pkt_out_bp_en_w1s_s {
+               u64 w1s : 64;
+       } s;
+       struct cvmx_sli_pkt_out_bp_en_w1s_s cn73xx;
+       struct cvmx_sli_pkt_out_bp_en_w1s_s cn78xx;
+       struct cvmx_sli_pkt_out_bp_en_w1s_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_out_bp_en_w1s cvmx_sli_pkt_out_bp_en_w1s_t;
+
+/**
+ * cvmx_sli_pkt_out_enb
+ *
+ * Multi-ring packet output enable register. This register is PF-only.
+ *
+ */
+union cvmx_sli_pkt_out_enb {
+       u64 u64;
+       struct cvmx_sli_pkt_out_enb_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_sli_pkt_out_enb_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 enb : 32;
+       } cn61xx;
+       struct cvmx_sli_pkt_out_enb_cn61xx cn63xx;
+       struct cvmx_sli_pkt_out_enb_cn61xx cn63xxp1;
+       struct cvmx_sli_pkt_out_enb_cn61xx cn66xx;
+       struct cvmx_sli_pkt_out_enb_cn61xx cn68xx;
+       struct cvmx_sli_pkt_out_enb_cn61xx cn68xxp1;
+       struct cvmx_sli_pkt_out_enb_cn61xx cn70xx;
+       struct cvmx_sli_pkt_out_enb_cn61xx cn70xxp1;
+       struct cvmx_sli_pkt_out_enb_s cn78xxp1;
+       struct cvmx_sli_pkt_out_enb_cn61xx cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_out_enb cvmx_sli_pkt_out_enb_t;
+
+/**
+ * cvmx_sli_pkt_output_wmark
+ *
+ * This register sets the value that determines when backpressure is applied to the PKO. When
+ * SLI_PKT()_SLIST_BAOFF_DBELL[DBELL] is less than [WMARK], backpressure is sent to PKO for
+ * the associated channel. This register is PF-only.
+ */
+union cvmx_sli_pkt_output_wmark {
+       u64 u64;
+       struct cvmx_sli_pkt_output_wmark_s {
+               u64 reserved_32_63 : 32;
+               u64 wmark : 32;
+       } s;
+       struct cvmx_sli_pkt_output_wmark_s cn61xx;
+       struct cvmx_sli_pkt_output_wmark_s cn63xx;
+       struct cvmx_sli_pkt_output_wmark_s cn63xxp1;
+       struct cvmx_sli_pkt_output_wmark_s cn66xx;
+       struct cvmx_sli_pkt_output_wmark_s cn68xx;
+       struct cvmx_sli_pkt_output_wmark_s cn68xxp1;
+       struct cvmx_sli_pkt_output_wmark_s cn70xx;
+       struct cvmx_sli_pkt_output_wmark_s cn70xxp1;
+       struct cvmx_sli_pkt_output_wmark_s cn73xx;
+       struct cvmx_sli_pkt_output_wmark_s cn78xx;
+       struct cvmx_sli_pkt_output_wmark_s cn78xxp1;
+       struct cvmx_sli_pkt_output_wmark_s cnf71xx;
+       struct cvmx_sli_pkt_output_wmark_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_output_wmark cvmx_sli_pkt_output_wmark_t;
+
+/**
+ * cvmx_sli_pkt_pcie_port
+ *
+ * Assigns Packet Ports to MAC ports.
+ *
+ */
+union cvmx_sli_pkt_pcie_port {
+       u64 u64;
+       struct cvmx_sli_pkt_pcie_port_s {
+               u64 pp : 64;
+       } s;
+       struct cvmx_sli_pkt_pcie_port_s cn61xx;
+       struct cvmx_sli_pkt_pcie_port_s cn63xx;
+       struct cvmx_sli_pkt_pcie_port_s cn63xxp1;
+       struct cvmx_sli_pkt_pcie_port_s cn66xx;
+       struct cvmx_sli_pkt_pcie_port_s cn68xx;
+       struct cvmx_sli_pkt_pcie_port_s cn68xxp1;
+       struct cvmx_sli_pkt_pcie_port_s cn70xx;
+       struct cvmx_sli_pkt_pcie_port_s cn70xxp1;
+       struct cvmx_sli_pkt_pcie_port_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_pcie_port cvmx_sli_pkt_pcie_port_t;
+
+/**
+ * cvmx_sli_pkt_pkind_valid
+ *
+ * Enables bits per PKIND that are allowed to be sent to PKI specified in the
+ * DPI_PKT_INST_HDR_S[PKIND] DPI packet instruction field.
+ */
+union cvmx_sli_pkt_pkind_valid {
+       u64 u64;
+       struct cvmx_sli_pkt_pkind_valid_s {
+               u64 enb : 64;
+       } s;
+       struct cvmx_sli_pkt_pkind_valid_s cn73xx;
+       struct cvmx_sli_pkt_pkind_valid_s cn78xx;
+       struct cvmx_sli_pkt_pkind_valid_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_pkind_valid cvmx_sli_pkt_pkind_valid_t;
+
+/**
+ * cvmx_sli_pkt_port_in_rst
+ *
+ * SLI_PKT_PORT_IN_RST = SLI Packet Port In Reset
+ * Vector bits related to ring-port for ones that are reset.
+ */
+union cvmx_sli_pkt_port_in_rst {
+       u64 u64;
+       struct cvmx_sli_pkt_port_in_rst_s {
+               u64 in_rst : 32;
+               u64 out_rst : 32;
+       } s;
+       struct cvmx_sli_pkt_port_in_rst_s cn61xx;
+       struct cvmx_sli_pkt_port_in_rst_s cn63xx;
+       struct cvmx_sli_pkt_port_in_rst_s cn63xxp1;
+       struct cvmx_sli_pkt_port_in_rst_s cn66xx;
+       struct cvmx_sli_pkt_port_in_rst_s cn68xx;
+       struct cvmx_sli_pkt_port_in_rst_s cn68xxp1;
+       struct cvmx_sli_pkt_port_in_rst_s cn70xx;
+       struct cvmx_sli_pkt_port_in_rst_s cn70xxp1;
+       struct cvmx_sli_pkt_port_in_rst_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_port_in_rst cvmx_sli_pkt_port_in_rst_t;
+
+/**
+ * cvmx_sli_pkt_ring_rst
+ *
+ * When read by a PF, this register informs which rings owned by the function (0 to N, N as large
+ * as 63) are in reset. See also SLI_PKT()_INPUT_CONTROL[RST].
+ */
+union cvmx_sli_pkt_ring_rst {
+       u64 u64;
+       struct cvmx_sli_pkt_ring_rst_s {
+               u64 rst : 64;
+       } s;
+       struct cvmx_sli_pkt_ring_rst_s cn73xx;
+       struct cvmx_sli_pkt_ring_rst_s cn78xx;
+       struct cvmx_sli_pkt_ring_rst_s cn78xxp1;
+       struct cvmx_sli_pkt_ring_rst_s cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_ring_rst cvmx_sli_pkt_ring_rst_t;
+
+/**
+ * cvmx_sli_pkt_slist_es
+ *
+ * The Endian Swap for Scatter List Read.
+ *
+ */
+union cvmx_sli_pkt_slist_es {
+       u64 u64;
+       struct cvmx_sli_pkt_slist_es_s {
+               u64 es : 64;
+       } s;
+       struct cvmx_sli_pkt_slist_es_s cn61xx;
+       struct cvmx_sli_pkt_slist_es_s cn63xx;
+       struct cvmx_sli_pkt_slist_es_s cn63xxp1;
+       struct cvmx_sli_pkt_slist_es_s cn66xx;
+       struct cvmx_sli_pkt_slist_es_s cn68xx;
+       struct cvmx_sli_pkt_slist_es_s cn68xxp1;
+       struct cvmx_sli_pkt_slist_es_s cn70xx;
+       struct cvmx_sli_pkt_slist_es_s cn70xxp1;
+       struct cvmx_sli_pkt_slist_es_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_slist_es cvmx_sli_pkt_slist_es_t;
+
+/**
+ * cvmx_sli_pkt_slist_ns
+ *
+ * The NS field for the TLP when fetching Scatter List.
+ *
+ */
+union cvmx_sli_pkt_slist_ns {
+       u64 u64;
+       struct cvmx_sli_pkt_slist_ns_s {
+               u64 reserved_32_63 : 32;
+               u64 nsr : 32;
+       } s;
+       struct cvmx_sli_pkt_slist_ns_s cn61xx;
+       struct cvmx_sli_pkt_slist_ns_s cn63xx;
+       struct cvmx_sli_pkt_slist_ns_s cn63xxp1;
+       struct cvmx_sli_pkt_slist_ns_s cn66xx;
+       struct cvmx_sli_pkt_slist_ns_s cn68xx;
+       struct cvmx_sli_pkt_slist_ns_s cn68xxp1;
+       struct cvmx_sli_pkt_slist_ns_s cn70xx;
+       struct cvmx_sli_pkt_slist_ns_s cn70xxp1;
+       struct cvmx_sli_pkt_slist_ns_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_slist_ns cvmx_sli_pkt_slist_ns_t;
+
+/**
+ * cvmx_sli_pkt_slist_ror
+ *
+ * The ROR field for the TLP when fetching Scatter List.
+ *
+ */
+union cvmx_sli_pkt_slist_ror {
+       u64 u64;
+       struct cvmx_sli_pkt_slist_ror_s {
+               u64 reserved_32_63 : 32;
+               u64 ror : 32;
+       } s;
+       struct cvmx_sli_pkt_slist_ror_s cn61xx;
+       struct cvmx_sli_pkt_slist_ror_s cn63xx;
+       struct cvmx_sli_pkt_slist_ror_s cn63xxp1;
+       struct cvmx_sli_pkt_slist_ror_s cn66xx;
+       struct cvmx_sli_pkt_slist_ror_s cn68xx;
+       struct cvmx_sli_pkt_slist_ror_s cn68xxp1;
+       struct cvmx_sli_pkt_slist_ror_s cn70xx;
+       struct cvmx_sli_pkt_slist_ror_s cn70xxp1;
+       struct cvmx_sli_pkt_slist_ror_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_slist_ror cvmx_sli_pkt_slist_ror_t;
+
+/**
+ * cvmx_sli_pkt_time_int
+ *
+ * This register specifies which output packets rings are interrupting because of packet timers.
+ * A bit set in this interrupt register will set a corresponding bit in SLI_PKT_INT and can
+ * also cause SLI_MAC()_PF()_INT_SUM[PTIME] to be set if
+ * SLI_PKT()_OUTPUT_CONTROL[TENB]
+ * is set. When read by a function, this register informs which rings owned by the function (0 to
+ * N,
+ * N as large as 63) have this interrupt pending.
+ */
+union cvmx_sli_pkt_time_int {
+       u64 u64;
+       struct cvmx_sli_pkt_time_int_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_sli_pkt_time_int_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 port : 32;
+       } cn61xx;
+       struct cvmx_sli_pkt_time_int_cn61xx cn63xx;
+       struct cvmx_sli_pkt_time_int_cn61xx cn63xxp1;
+       struct cvmx_sli_pkt_time_int_cn61xx cn66xx;
+       struct cvmx_sli_pkt_time_int_cn61xx cn68xx;
+       struct cvmx_sli_pkt_time_int_cn61xx cn68xxp1;
+       struct cvmx_sli_pkt_time_int_cn61xx cn70xx;
+       struct cvmx_sli_pkt_time_int_cn61xx cn70xxp1;
+       struct cvmx_sli_pkt_time_int_cn73xx {
+               u64 ring : 64;
+       } cn73xx;
+       struct cvmx_sli_pkt_time_int_cn73xx cn78xx;
+       struct cvmx_sli_pkt_time_int_cn73xx cn78xxp1;
+       struct cvmx_sli_pkt_time_int_cn61xx cnf71xx;
+       struct cvmx_sli_pkt_time_int_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_pkt_time_int cvmx_sli_pkt_time_int_t;
+
+/**
+ * cvmx_sli_pkt_time_int_enb
+ *
+ * The packets rings that are interrupting because of Packet Timers.
+ *
+ */
+union cvmx_sli_pkt_time_int_enb {
+       u64 u64;
+       struct cvmx_sli_pkt_time_int_enb_s {
+               u64 reserved_32_63 : 32;
+               u64 port : 32;
+       } s;
+       struct cvmx_sli_pkt_time_int_enb_s cn61xx;
+       struct cvmx_sli_pkt_time_int_enb_s cn63xx;
+       struct cvmx_sli_pkt_time_int_enb_s cn63xxp1;
+       struct cvmx_sli_pkt_time_int_enb_s cn66xx;
+       struct cvmx_sli_pkt_time_int_enb_s cn68xx;
+       struct cvmx_sli_pkt_time_int_enb_s cn68xxp1;
+       struct cvmx_sli_pkt_time_int_enb_s cn70xx;
+       struct cvmx_sli_pkt_time_int_enb_s cn70xxp1;
+       struct cvmx_sli_pkt_time_int_enb_s cnf71xx;
+};
+
+typedef union cvmx_sli_pkt_time_int_enb cvmx_sli_pkt_time_int_enb_t;
+
+/**
+ * cvmx_sli_port#_pkind
+ *
+ * SLI_PORT[0..31]_PKIND = SLI Port Pkind
+ *
+ * The SLI/DPI supports 32 input rings for fetching input packets. This register maps the input-rings (0-31) to a PKIND.
+ */
+union cvmx_sli_portx_pkind {
+       u64 u64;
+       struct cvmx_sli_portx_pkind_s {
+               u64 reserved_25_63 : 39;
+               u64 rpk_enb : 1;
+               u64 reserved_22_23 : 2;
+               u64 pkindr : 6;
+               u64 reserved_14_15 : 2;
+               u64 bpkind : 6;
+               u64 reserved_6_7 : 2;
+               u64 pkind : 6;
+       } s;
+       struct cvmx_sli_portx_pkind_s cn68xx;
+       struct cvmx_sli_portx_pkind_cn68xxp1 {
+               u64 reserved_14_63 : 50;
+               u64 bpkind : 6;
+               u64 reserved_6_7 : 2;
+               u64 pkind : 6;
+       } cn68xxp1;
+};
+
+typedef union cvmx_sli_portx_pkind cvmx_sli_portx_pkind_t;
+
+/**
+ * cvmx_sli_pp_pkt_csr_control
+ *
+ * This register provides access to SLI packet register space from the cores.
+ * These SLI packet registers include the following:
+ *  SLI_MSIXX_TABLE_ADDR,
+ *  SLI_MSIXX_TABLE_DATA,
+ *  SLI_MSIX_PBA0,
+ *  SLI_MSIX_PBA1,
+ *  SLI_PKTX_INPUT_CONTROL,
+ *  SLI_PKTX_INSTR_BADDR,
+ *  SLI_PKTX_INSTR_BAOFF_DBELL,
+ *  SLI_PKTX_INSTR_FIFO_RSIZE,
+ *  SLI_PKT_IN_DONEX_CNTS,
+ *  SLI_PKTX_OUTPUT_CONTROL,
+ *  SLI_PKTX_OUT_SIZE,
+ *  SLI_PKTX_SLIST_BADDR,
+ *  SLI_PKTX_SLIST_BAOFF_DBELL,
+ *  SLI_PKTX_SLIST_FIFO_RSIZE,
+ *  SLI_PKTX_INT_LEVELS,
+ *  SLI_PKTX_CNTS,
+ *  SLI_PKTX_ERROR_INFO,
+ *  SLI_PKTX_VF_INT_SUM,
+ *  SLI_PKTX_PF_VF_MBOX_SIG,
+ *  SLI_PKTX_MBOX_INT.
+ */
+union cvmx_sli_pp_pkt_csr_control {
+       u64 u64;
+       struct cvmx_sli_pp_pkt_csr_control_s {
+               u64 reserved_18_63 : 46;
+               u64 mac : 2;
+               u64 pvf : 16;
+       } s;
+       struct cvmx_sli_pp_pkt_csr_control_s cn73xx;
+       struct cvmx_sli_pp_pkt_csr_control_s cn78xx;
+       struct cvmx_sli_pp_pkt_csr_control_s cnf75xx;
+};
+
+typedef union cvmx_sli_pp_pkt_csr_control cvmx_sli_pp_pkt_csr_control_t;
+
+/**
+ * cvmx_sli_s2c_end_merge
+ *
+ * Writing this register will cause a merge to end.
+ *
+ */
+union cvmx_sli_s2c_end_merge {
+       u64 u64;
+       struct cvmx_sli_s2c_end_merge_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_sli_s2c_end_merge_s cn73xx;
+       struct cvmx_sli_s2c_end_merge_s cn78xx;
+       struct cvmx_sli_s2c_end_merge_s cn78xxp1;
+       struct cvmx_sli_s2c_end_merge_s cnf75xx;
+};
+
+typedef union cvmx_sli_s2c_end_merge cvmx_sli_s2c_end_merge_t;
+
+/**
+ * cvmx_sli_s2m_port#_ctl
+ *
+ * These registers contain control for access from SLI to a MAC port. Indexed by SLI_PORT_E.
+ * Write operations to these registers are not ordered with write/read operations to the MAC
+ * memory space. To ensure that a write operation has completed, read the register before
+ * making an access (i.e. MAC memory space) that requires the value of this register to be
+ * updated.
+ */
+union cvmx_sli_s2m_portx_ctl {
+       u64 u64;
+       struct cvmx_sli_s2m_portx_ctl_s {
+               u64 reserved_7_63 : 57;
+               u64 dvferr : 1;
+               u64 lcl_node : 1;
+               u64 wind_d : 1;
+               u64 bar0_d : 1;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx {
+               u64 reserved_5_63 : 59;
+               u64 wind_d : 1;
+               u64 bar0_d : 1;
+               u64 mrrs : 3;
+       } cn61xx;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cn63xx;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cn63xxp1;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cn66xx;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cn68xx;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cn68xxp1;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cn70xx;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cn70xxp1;
+       struct cvmx_sli_s2m_portx_ctl_cn73xx {
+               u64 reserved_7_63 : 57;
+               u64 dvferr : 1;
+               u64 lcl_node : 1;
+               u64 wind_d : 1;
+               u64 bar0_d : 1;
+               u64 ld_cmd : 2;
+               u64 reserved_0_0 : 1;
+       } cn73xx;
+       struct cvmx_sli_s2m_portx_ctl_cn73xx cn78xx;
+       struct cvmx_sli_s2m_portx_ctl_cn78xxp1 {
+               u64 reserved_6_63 : 58;
+               u64 lcl_node : 1;
+               u64 wind_d : 1;
+               u64 bar0_d : 1;
+               u64 ld_cmd : 2;
+               u64 reserved_0_0 : 1;
+       } cn78xxp1;
+       struct cvmx_sli_s2m_portx_ctl_cn61xx cnf71xx;
+       struct cvmx_sli_s2m_portx_ctl_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_s2m_portx_ctl cvmx_sli_s2m_portx_ctl_t;
+
+/**
+ * cvmx_sli_scratch_1
+ *
+ * This registers is a general purpose 64-bit scratch register for software use.
+ *
+ */
+union cvmx_sli_scratch_1 {
+       u64 u64;
+       struct cvmx_sli_scratch_1_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_scratch_1_s cn61xx;
+       struct cvmx_sli_scratch_1_s cn63xx;
+       struct cvmx_sli_scratch_1_s cn63xxp1;
+       struct cvmx_sli_scratch_1_s cn66xx;
+       struct cvmx_sli_scratch_1_s cn68xx;
+       struct cvmx_sli_scratch_1_s cn68xxp1;
+       struct cvmx_sli_scratch_1_s cn70xx;
+       struct cvmx_sli_scratch_1_s cn70xxp1;
+       struct cvmx_sli_scratch_1_s cn73xx;
+       struct cvmx_sli_scratch_1_s cn78xx;
+       struct cvmx_sli_scratch_1_s cn78xxp1;
+       struct cvmx_sli_scratch_1_s cnf71xx;
+       struct cvmx_sli_scratch_1_s cnf75xx;
+};
+
+typedef union cvmx_sli_scratch_1 cvmx_sli_scratch_1_t;
+
+/**
+ * cvmx_sli_scratch_2
+ *
+ * This registers is a general purpose 64-bit scratch register for software use.
+ *
+ */
+union cvmx_sli_scratch_2 {
+       u64 u64;
+       struct cvmx_sli_scratch_2_s {
+               u64 data : 64;
+       } s;
+       struct cvmx_sli_scratch_2_s cn61xx;
+       struct cvmx_sli_scratch_2_s cn63xx;
+       struct cvmx_sli_scratch_2_s cn63xxp1;
+       struct cvmx_sli_scratch_2_s cn66xx;
+       struct cvmx_sli_scratch_2_s cn68xx;
+       struct cvmx_sli_scratch_2_s cn68xxp1;
+       struct cvmx_sli_scratch_2_s cn70xx;
+       struct cvmx_sli_scratch_2_s cn70xxp1;
+       struct cvmx_sli_scratch_2_s cn73xx;
+       struct cvmx_sli_scratch_2_s cn78xx;
+       struct cvmx_sli_scratch_2_s cn78xxp1;
+       struct cvmx_sli_scratch_2_s cnf71xx;
+       struct cvmx_sli_scratch_2_s cnf75xx;
+};
+
+typedef union cvmx_sli_scratch_2 cvmx_sli_scratch_2_t;
+
+/**
+ * cvmx_sli_state1
+ *
+ * This register contains state machines in SLI and is for debug.
+ *
+ */
+union cvmx_sli_state1 {
+       u64 u64;
+       struct cvmx_sli_state1_s {
+               u64 cpl1 : 12;
+               u64 cpl0 : 12;
+               u64 arb : 1;
+               u64 csr : 39;
+       } s;
+       struct cvmx_sli_state1_s cn61xx;
+       struct cvmx_sli_state1_s cn63xx;
+       struct cvmx_sli_state1_s cn63xxp1;
+       struct cvmx_sli_state1_s cn66xx;
+       struct cvmx_sli_state1_s cn68xx;
+       struct cvmx_sli_state1_s cn68xxp1;
+       struct cvmx_sli_state1_s cn70xx;
+       struct cvmx_sli_state1_s cn70xxp1;
+       struct cvmx_sli_state1_s cn73xx;
+       struct cvmx_sli_state1_s cn78xx;
+       struct cvmx_sli_state1_s cn78xxp1;
+       struct cvmx_sli_state1_s cnf71xx;
+       struct cvmx_sli_state1_s cnf75xx;
+};
+
+typedef union cvmx_sli_state1 cvmx_sli_state1_t;
+
+/**
+ * cvmx_sli_state2
+ *
+ * This register contains state machines in SLI and is for debug.
+ *
+ */
+union cvmx_sli_state2 {
+       u64 u64;
+       struct cvmx_sli_state2_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_sli_state2_cn61xx {
+               u64 reserved_56_63 : 8;
+               u64 nnp1 : 8;
+               u64 reserved_47_47 : 1;
+               u64 rac : 1;
+               u64 csm1 : 15;
+               u64 csm0 : 15;
+               u64 nnp0 : 8;
+               u64 nnd : 8;
+       } cn61xx;
+       struct cvmx_sli_state2_cn61xx cn63xx;
+       struct cvmx_sli_state2_cn61xx cn63xxp1;
+       struct cvmx_sli_state2_cn61xx cn66xx;
+       struct cvmx_sli_state2_cn61xx cn68xx;
+       struct cvmx_sli_state2_cn61xx cn68xxp1;
+       struct cvmx_sli_state2_cn61xx cn70xx;
+       struct cvmx_sli_state2_cn61xx cn70xxp1;
+       struct cvmx_sli_state2_cn73xx {
+               u64 reserved_57_63 : 7;
+               u64 nnp1 : 8;
+               u64 reserved_48_48 : 1;
+               u64 rac : 1;
+               u64 csm1 : 15;
+               u64 csm0 : 15;
+               u64 nnp0 : 8;
+               u64 nnd : 9;
+       } cn73xx;
+       struct cvmx_sli_state2_cn73xx cn78xx;
+       struct cvmx_sli_state2_cn73xx cn78xxp1;
+       struct cvmx_sli_state2_cn61xx cnf71xx;
+       struct cvmx_sli_state2_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_state2 cvmx_sli_state2_t;
+
+/**
+ * cvmx_sli_state3
+ *
+ * This register contains state machines in SLI and is for debug.
+ *
+ */
+union cvmx_sli_state3 {
+       u64 u64;
+       struct cvmx_sli_state3_s {
+               u64 reserved_0_63 : 64;
+       } s;
+       struct cvmx_sli_state3_cn61xx {
+               u64 reserved_56_63 : 8;
+               u64 psm1 : 15;
+               u64 psm0 : 15;
+               u64 nsm1 : 13;
+               u64 nsm0 : 13;
+       } cn61xx;
+       struct cvmx_sli_state3_cn61xx cn63xx;
+       struct cvmx_sli_state3_cn61xx cn63xxp1;
+       struct cvmx_sli_state3_cn61xx cn66xx;
+       struct cvmx_sli_state3_cn61xx cn68xx;
+       struct cvmx_sli_state3_cn61xx cn68xxp1;
+       struct cvmx_sli_state3_cn61xx cn70xx;
+       struct cvmx_sli_state3_cn61xx cn70xxp1;
+       struct cvmx_sli_state3_cn73xx {
+               u64 reserved_60_63 : 4;
+               u64 psm1 : 15;
+               u64 psm0 : 15;
+               u64 nsm1 : 15;
+               u64 nsm0 : 15;
+       } cn73xx;
+       struct cvmx_sli_state3_cn73xx cn78xx;
+       struct cvmx_sli_state3_cn73xx cn78xxp1;
+       struct cvmx_sli_state3_cn61xx cnf71xx;
+       struct cvmx_sli_state3_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sli_state3 cvmx_sli_state3_t;
+
+/**
+ * cvmx_sli_tx_pipe
+ *
+ * SLI_TX_PIPE = SLI Packet TX Pipe
+ *
+ * Contains the starting pipe number and number of pipes used by the SLI packet Output.
+ * If a packet is recevied from PKO with an out of range PIPE number, the following occurs:
+ * - SLI_INT_SUM[PIPE_ERR] is set.
+ * - the out of range pipe value is used for returning credits to the PKO.
+ * - the PCIe packet engine will treat the PIPE value to be equal to [BASE].
+ */
+union cvmx_sli_tx_pipe {
+       u64 u64;
+       struct cvmx_sli_tx_pipe_s {
+               u64 reserved_24_63 : 40;
+               u64 nump : 8;
+               u64 reserved_7_15 : 9;
+               u64 base : 7;
+       } s;
+       struct cvmx_sli_tx_pipe_s cn68xx;
+       struct cvmx_sli_tx_pipe_s cn68xxp1;
+};
+
+typedef union cvmx_sli_tx_pipe cvmx_sli_tx_pipe_t;
+
+/**
+ * cvmx_sli_win_rd_addr
+ *
+ * When the LSB of this register is written, the address in this register will be read. The data
+ * returned from this read operation is placed in the WIN_RD_DATA register. This register should
+ * NOT
+ * be used to read SLI_* registers.
+ */
+union cvmx_sli_win_rd_addr {
+       u64 u64;
+       struct cvmx_sli_win_rd_addr_s {
+               u64 reserved_51_63 : 13;
+               u64 ld_cmd : 2;
+               u64 iobit : 1;
+               u64 rd_addr : 48;
+       } s;
+       struct cvmx_sli_win_rd_addr_s cn61xx;
+       struct cvmx_sli_win_rd_addr_s cn63xx;
+       struct cvmx_sli_win_rd_addr_s cn63xxp1;
+       struct cvmx_sli_win_rd_addr_s cn66xx;
+       struct cvmx_sli_win_rd_addr_s cn68xx;
+       struct cvmx_sli_win_rd_addr_s cn68xxp1;
+       struct cvmx_sli_win_rd_addr_s cn70xx;
+       struct cvmx_sli_win_rd_addr_s cn70xxp1;
+       struct cvmx_sli_win_rd_addr_s cn73xx;
+       struct cvmx_sli_win_rd_addr_s cn78xx;
+       struct cvmx_sli_win_rd_addr_s cn78xxp1;
+       struct cvmx_sli_win_rd_addr_s cnf71xx;
+       struct cvmx_sli_win_rd_addr_s cnf75xx;
+};
+
+typedef union cvmx_sli_win_rd_addr cvmx_sli_win_rd_addr_t;
+
+/**
+ * cvmx_sli_win_rd_data
+ *
+ * This register holds the data returned when a read operation is started by the writing of the
+ * SLI_WIN_RD_ADDR register.
+ */
+union cvmx_sli_win_rd_data {
+       u64 u64;
+       struct cvmx_sli_win_rd_data_s {
+               u64 rd_data : 64;
+       } s;
+       struct cvmx_sli_win_rd_data_s cn61xx;
+       struct cvmx_sli_win_rd_data_s cn63xx;
+       struct cvmx_sli_win_rd_data_s cn63xxp1;
+       struct cvmx_sli_win_rd_data_s cn66xx;
+       struct cvmx_sli_win_rd_data_s cn68xx;
+       struct cvmx_sli_win_rd_data_s cn68xxp1;
+       struct cvmx_sli_win_rd_data_s cn70xx;
+       struct cvmx_sli_win_rd_data_s cn70xxp1;
+       struct cvmx_sli_win_rd_data_s cn73xx;
+       struct cvmx_sli_win_rd_data_s cn78xx;
+       struct cvmx_sli_win_rd_data_s cn78xxp1;
+       struct cvmx_sli_win_rd_data_s cnf71xx;
+       struct cvmx_sli_win_rd_data_s cnf75xx;
+};
+
+typedef union cvmx_sli_win_rd_data cvmx_sli_win_rd_data_t;
+
+/**
+ * cvmx_sli_win_wr_addr
+ *
+ * This register contains the address to be written to when a write operation is started by
+ * writing the SLI_WIN_WR_DATA register.
+ *
+ * This register should NOT be used to write SLI_* registers.
+ */
+union cvmx_sli_win_wr_addr {
+       u64 u64;
+       struct cvmx_sli_win_wr_addr_s {
+               u64 reserved_49_63 : 15;
+               u64 iobit : 1;
+               u64 wr_addr : 45;
+               u64 reserved_0_2 : 3;
+       } s;
+       struct cvmx_sli_win_wr_addr_s cn61xx;
+       struct cvmx_sli_win_wr_addr_s cn63xx;
+       struct cvmx_sli_win_wr_addr_s cn63xxp1;
+       struct cvmx_sli_win_wr_addr_s cn66xx;
+       struct cvmx_sli_win_wr_addr_s cn68xx;
+       struct cvmx_sli_win_wr_addr_s cn68xxp1;
+       struct cvmx_sli_win_wr_addr_s cn70xx;
+       struct cvmx_sli_win_wr_addr_s cn70xxp1;
+       struct cvmx_sli_win_wr_addr_s cn73xx;
+       struct cvmx_sli_win_wr_addr_s cn78xx;
+       struct cvmx_sli_win_wr_addr_s cn78xxp1;
+       struct cvmx_sli_win_wr_addr_s cnf71xx;
+       struct cvmx_sli_win_wr_addr_s cnf75xx;
+};
+
+typedef union cvmx_sli_win_wr_addr cvmx_sli_win_wr_addr_t;
+
+/**
+ * cvmx_sli_win_wr_data
+ *
+ * This register contains the data to write to the address located in the SLI_WIN_WR_ADDR
+ * register. Writing the least-significant byte of this register causes a write operation to take
+ * place.
+ */
+union cvmx_sli_win_wr_data {
+       u64 u64;
+       struct cvmx_sli_win_wr_data_s {
+               u64 wr_data : 64;
+       } s;
+       struct cvmx_sli_win_wr_data_s cn61xx;
+       struct cvmx_sli_win_wr_data_s cn63xx;
+       struct cvmx_sli_win_wr_data_s cn63xxp1;
+       struct cvmx_sli_win_wr_data_s cn66xx;
+       struct cvmx_sli_win_wr_data_s cn68xx;
+       struct cvmx_sli_win_wr_data_s cn68xxp1;
+       struct cvmx_sli_win_wr_data_s cn70xx;
+       struct cvmx_sli_win_wr_data_s cn70xxp1;
+       struct cvmx_sli_win_wr_data_s cn73xx;
+       struct cvmx_sli_win_wr_data_s cn78xx;
+       struct cvmx_sli_win_wr_data_s cn78xxp1;
+       struct cvmx_sli_win_wr_data_s cnf71xx;
+       struct cvmx_sli_win_wr_data_s cnf75xx;
+};
+
+typedef union cvmx_sli_win_wr_data cvmx_sli_win_wr_data_t;
+
+/**
+ * cvmx_sli_win_wr_mask
+ *
+ * This register contains the mask for the data in the SLI_WIN_WR_DATA register.
+ *
+ */
+union cvmx_sli_win_wr_mask {
+       u64 u64;
+       struct cvmx_sli_win_wr_mask_s {
+               u64 reserved_8_63 : 56;
+               u64 wr_mask : 8;
+       } s;
+       struct cvmx_sli_win_wr_mask_s cn61xx;
+       struct cvmx_sli_win_wr_mask_s cn63xx;
+       struct cvmx_sli_win_wr_mask_s cn63xxp1;
+       struct cvmx_sli_win_wr_mask_s cn66xx;
+       struct cvmx_sli_win_wr_mask_s cn68xx;
+       struct cvmx_sli_win_wr_mask_s cn68xxp1;
+       struct cvmx_sli_win_wr_mask_s cn70xx;
+       struct cvmx_sli_win_wr_mask_s cn70xxp1;
+       struct cvmx_sli_win_wr_mask_s cn73xx;
+       struct cvmx_sli_win_wr_mask_s cn78xx;
+       struct cvmx_sli_win_wr_mask_s cn78xxp1;
+       struct cvmx_sli_win_wr_mask_s cnf71xx;
+       struct cvmx_sli_win_wr_mask_s cnf75xx;
+};
+
+typedef union cvmx_sli_win_wr_mask cvmx_sli_win_wr_mask_t;
+
+/**
+ * cvmx_sli_window_ctl
+ *
+ * Access to register space on the IOI (caused by window read/write operations) waits for a
+ * period of time specified by this register before timing out.
+ */
+union cvmx_sli_window_ctl {
+       u64 u64;
+       struct cvmx_sli_window_ctl_s {
+               u64 ocx_time : 32;
+               u64 time : 32;
+       } s;
+       struct cvmx_sli_window_ctl_cn61xx {
+               u64 reserved_32_63 : 32;
+               u64 time : 32;
+       } cn61xx;
+       struct cvmx_sli_window_ctl_cn61xx cn63xx;
+       struct cvmx_sli_window_ctl_cn61xx cn63xxp1;
+       struct cvmx_sli_window_ctl_cn61xx cn66xx;
+       struct cvmx_sli_window_ctl_cn61xx cn68xx;
+       struct cvmx_sli_window_ctl_cn61xx cn68xxp1;
+       struct cvmx_sli_window_ctl_cn61xx cn70xx;
+       struct cvmx_sli_window_ctl_cn61xx cn70xxp1;
+       struct cvmx_sli_window_ctl_s cn73xx;
+       struct cvmx_sli_window_ctl_s cn78xx;
+       struct cvmx_sli_window_ctl_s cn78xxp1;
+       struct cvmx_sli_window_ctl_cn61xx cnf71xx;
+       struct cvmx_sli_window_ctl_s cnf75xx;
+};
+
+typedef union cvmx_sli_window_ctl cvmx_sli_window_ctl_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-smix-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-smix-defs.h
new file mode 100644 (file)
index 0000000..c51d71b
--- /dev/null
@@ -0,0 +1,360 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon smix.
+ */
+
+#ifndef __CVMX_SMIX_DEFS_H__
+#define __CVMX_SMIX_DEFS_H__
+
+static inline u64 CVMX_SMIX_CLK(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000001818ull + (offset) * 256;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001180000003818ull + (offset) * 128;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001180000003818ull + (offset) * 128;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003818ull + (offset) * 128;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003818ull + (offset) * 128;
+       }
+       return 0x0001180000003818ull + (offset) * 128;
+}
+
+static inline u64 CVMX_SMIX_CMD(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000001800ull + (offset) * 256;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001180000003800ull + (offset) * 128;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001180000003800ull + (offset) * 128;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003800ull + (offset) * 128;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003800ull + (offset) * 128;
+       }
+       return 0x0001180000003800ull + (offset) * 128;
+}
+
+static inline u64 CVMX_SMIX_EN(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000001820ull + (offset) * 256;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001180000003820ull + (offset) * 128;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001180000003820ull + (offset) * 128;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003820ull + (offset) * 128;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003820ull + (offset) * 128;
+       }
+       return 0x0001180000003820ull + (offset) * 128;
+}
+
+static inline u64 CVMX_SMIX_RD_DAT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000001810ull + (offset) * 256;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001180000003810ull + (offset) * 128;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001180000003810ull + (offset) * 128;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003810ull + (offset) * 128;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003810ull + (offset) * 128;
+       }
+       return 0x0001180000003810ull + (offset) * 128;
+}
+
+static inline u64 CVMX_SMIX_WR_DAT(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000001808ull + (offset) * 256;
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x0001180000003808ull + (offset) * 128;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x0001180000003808ull + (offset) * 128;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003808ull + (offset) * 128;
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x0001180000003808ull + (offset) * 128;
+       }
+       return 0x0001180000003808ull + (offset) * 128;
+}
+
+/**
+ * cvmx_smi#_clk
+ *
+ * This register determines the SMI timing characteristics.
+ * If software wants to change SMI CLK timing parameters ([SAMPLE]/[SAMPLE_HI]), software
+ * must delay the SMI_()_CLK CSR write by at least 512 coprocessor-clock cycles after the
+ * previous SMI operation is finished.
+ */
+union cvmx_smix_clk {
+       u64 u64;
+       struct cvmx_smix_clk_s {
+               u64 reserved_25_63 : 39;
+               u64 mode : 1;
+               u64 reserved_21_23 : 3;
+               u64 sample_hi : 5;
+               u64 sample_mode : 1;
+               u64 reserved_14_14 : 1;
+               u64 clk_idle : 1;
+               u64 preamble : 1;
+               u64 sample : 4;
+               u64 phase : 8;
+       } s;
+       struct cvmx_smix_clk_cn30xx {
+               u64 reserved_21_63 : 43;
+               u64 sample_hi : 5;
+               u64 sample_mode : 1;
+               u64 reserved_14_14 : 1;
+               u64 clk_idle : 1;
+               u64 preamble : 1;
+               u64 sample : 4;
+               u64 phase : 8;
+       } cn30xx;
+       struct cvmx_smix_clk_cn30xx cn31xx;
+       struct cvmx_smix_clk_cn30xx cn38xx;
+       struct cvmx_smix_clk_cn30xx cn38xxp2;
+       struct cvmx_smix_clk_s cn50xx;
+       struct cvmx_smix_clk_s cn52xx;
+       struct cvmx_smix_clk_s cn52xxp1;
+       struct cvmx_smix_clk_s cn56xx;
+       struct cvmx_smix_clk_s cn56xxp1;
+       struct cvmx_smix_clk_cn30xx cn58xx;
+       struct cvmx_smix_clk_cn30xx cn58xxp1;
+       struct cvmx_smix_clk_s cn61xx;
+       struct cvmx_smix_clk_s cn63xx;
+       struct cvmx_smix_clk_s cn63xxp1;
+       struct cvmx_smix_clk_s cn66xx;
+       struct cvmx_smix_clk_s cn68xx;
+       struct cvmx_smix_clk_s cn68xxp1;
+       struct cvmx_smix_clk_s cn70xx;
+       struct cvmx_smix_clk_s cn70xxp1;
+       struct cvmx_smix_clk_s cn73xx;
+       struct cvmx_smix_clk_s cn78xx;
+       struct cvmx_smix_clk_s cn78xxp1;
+       struct cvmx_smix_clk_s cnf71xx;
+       struct cvmx_smix_clk_s cnf75xx;
+};
+
+typedef union cvmx_smix_clk cvmx_smix_clk_t;
+
+/**
+ * cvmx_smi#_cmd
+ *
+ * This register forces a read or write command to the PHY. Write operations to this register
+ * create SMI transactions. Software will poll (depending on the transaction type).
+ */
+union cvmx_smix_cmd {
+       u64 u64;
+       struct cvmx_smix_cmd_s {
+               u64 reserved_18_63 : 46;
+               u64 phy_op : 2;
+               u64 reserved_13_15 : 3;
+               u64 phy_adr : 5;
+               u64 reserved_5_7 : 3;
+               u64 reg_adr : 5;
+       } s;
+       struct cvmx_smix_cmd_cn30xx {
+               u64 reserved_17_63 : 47;
+               u64 phy_op : 1;
+               u64 reserved_13_15 : 3;
+               u64 phy_adr : 5;
+               u64 reserved_5_7 : 3;
+               u64 reg_adr : 5;
+       } cn30xx;
+       struct cvmx_smix_cmd_cn30xx cn31xx;
+       struct cvmx_smix_cmd_cn30xx cn38xx;
+       struct cvmx_smix_cmd_cn30xx cn38xxp2;
+       struct cvmx_smix_cmd_s cn50xx;
+       struct cvmx_smix_cmd_s cn52xx;
+       struct cvmx_smix_cmd_s cn52xxp1;
+       struct cvmx_smix_cmd_s cn56xx;
+       struct cvmx_smix_cmd_s cn56xxp1;
+       struct cvmx_smix_cmd_cn30xx cn58xx;
+       struct cvmx_smix_cmd_cn30xx cn58xxp1;
+       struct cvmx_smix_cmd_s cn61xx;
+       struct cvmx_smix_cmd_s cn63xx;
+       struct cvmx_smix_cmd_s cn63xxp1;
+       struct cvmx_smix_cmd_s cn66xx;
+       struct cvmx_smix_cmd_s cn68xx;
+       struct cvmx_smix_cmd_s cn68xxp1;
+       struct cvmx_smix_cmd_s cn70xx;
+       struct cvmx_smix_cmd_s cn70xxp1;
+       struct cvmx_smix_cmd_s cn73xx;
+       struct cvmx_smix_cmd_s cn78xx;
+       struct cvmx_smix_cmd_s cn78xxp1;
+       struct cvmx_smix_cmd_s cnf71xx;
+       struct cvmx_smix_cmd_s cnf75xx;
+};
+
+typedef union cvmx_smix_cmd cvmx_smix_cmd_t;
+
+/**
+ * cvmx_smi#_en
+ *
+ * Enables the SMI interface.
+ *
+ */
+union cvmx_smix_en {
+       u64 u64;
+       struct cvmx_smix_en_s {
+               u64 reserved_1_63 : 63;
+               u64 en : 1;
+       } s;
+       struct cvmx_smix_en_s cn30xx;
+       struct cvmx_smix_en_s cn31xx;
+       struct cvmx_smix_en_s cn38xx;
+       struct cvmx_smix_en_s cn38xxp2;
+       struct cvmx_smix_en_s cn50xx;
+       struct cvmx_smix_en_s cn52xx;
+       struct cvmx_smix_en_s cn52xxp1;
+       struct cvmx_smix_en_s cn56xx;
+       struct cvmx_smix_en_s cn56xxp1;
+       struct cvmx_smix_en_s cn58xx;
+       struct cvmx_smix_en_s cn58xxp1;
+       struct cvmx_smix_en_s cn61xx;
+       struct cvmx_smix_en_s cn63xx;
+       struct cvmx_smix_en_s cn63xxp1;
+       struct cvmx_smix_en_s cn66xx;
+       struct cvmx_smix_en_s cn68xx;
+       struct cvmx_smix_en_s cn68xxp1;
+       struct cvmx_smix_en_s cn70xx;
+       struct cvmx_smix_en_s cn70xxp1;
+       struct cvmx_smix_en_s cn73xx;
+       struct cvmx_smix_en_s cn78xx;
+       struct cvmx_smix_en_s cn78xxp1;
+       struct cvmx_smix_en_s cnf71xx;
+       struct cvmx_smix_en_s cnf75xx;
+};
+
+typedef union cvmx_smix_en cvmx_smix_en_t;
+
+/**
+ * cvmx_smi#_rd_dat
+ *
+ * This register contains the data in a read operation.
+ *
+ */
+union cvmx_smix_rd_dat {
+       u64 u64;
+       struct cvmx_smix_rd_dat_s {
+               u64 reserved_18_63 : 46;
+               u64 pending : 1;
+               u64 val : 1;
+               u64 dat : 16;
+       } s;
+       struct cvmx_smix_rd_dat_s cn30xx;
+       struct cvmx_smix_rd_dat_s cn31xx;
+       struct cvmx_smix_rd_dat_s cn38xx;
+       struct cvmx_smix_rd_dat_s cn38xxp2;
+       struct cvmx_smix_rd_dat_s cn50xx;
+       struct cvmx_smix_rd_dat_s cn52xx;
+       struct cvmx_smix_rd_dat_s cn52xxp1;
+       struct cvmx_smix_rd_dat_s cn56xx;
+       struct cvmx_smix_rd_dat_s cn56xxp1;
+       struct cvmx_smix_rd_dat_s cn58xx;
+       struct cvmx_smix_rd_dat_s cn58xxp1;
+       struct cvmx_smix_rd_dat_s cn61xx;
+       struct cvmx_smix_rd_dat_s cn63xx;
+       struct cvmx_smix_rd_dat_s cn63xxp1;
+       struct cvmx_smix_rd_dat_s cn66xx;
+       struct cvmx_smix_rd_dat_s cn68xx;
+       struct cvmx_smix_rd_dat_s cn68xxp1;
+       struct cvmx_smix_rd_dat_s cn70xx;
+       struct cvmx_smix_rd_dat_s cn70xxp1;
+       struct cvmx_smix_rd_dat_s cn73xx;
+       struct cvmx_smix_rd_dat_s cn78xx;
+       struct cvmx_smix_rd_dat_s cn78xxp1;
+       struct cvmx_smix_rd_dat_s cnf71xx;
+       struct cvmx_smix_rd_dat_s cnf75xx;
+};
+
+typedef union cvmx_smix_rd_dat cvmx_smix_rd_dat_t;
+
+/**
+ * cvmx_smi#_wr_dat
+ *
+ * This register provides the data for a write operation.
+ *
+ */
+union cvmx_smix_wr_dat {
+       u64 u64;
+       struct cvmx_smix_wr_dat_s {
+               u64 reserved_18_63 : 46;
+               u64 pending : 1;
+               u64 val : 1;
+               u64 dat : 16;
+       } s;
+       struct cvmx_smix_wr_dat_s cn30xx;
+       struct cvmx_smix_wr_dat_s cn31xx;
+       struct cvmx_smix_wr_dat_s cn38xx;
+       struct cvmx_smix_wr_dat_s cn38xxp2;
+       struct cvmx_smix_wr_dat_s cn50xx;
+       struct cvmx_smix_wr_dat_s cn52xx;
+       struct cvmx_smix_wr_dat_s cn52xxp1;
+       struct cvmx_smix_wr_dat_s cn56xx;
+       struct cvmx_smix_wr_dat_s cn56xxp1;
+       struct cvmx_smix_wr_dat_s cn58xx;
+       struct cvmx_smix_wr_dat_s cn58xxp1;
+       struct cvmx_smix_wr_dat_s cn61xx;
+       struct cvmx_smix_wr_dat_s cn63xx;
+       struct cvmx_smix_wr_dat_s cn63xxp1;
+       struct cvmx_smix_wr_dat_s cn66xx;
+       struct cvmx_smix_wr_dat_s cn68xx;
+       struct cvmx_smix_wr_dat_s cn68xxp1;
+       struct cvmx_smix_wr_dat_s cn70xx;
+       struct cvmx_smix_wr_dat_s cn70xxp1;
+       struct cvmx_smix_wr_dat_s cn73xx;
+       struct cvmx_smix_wr_dat_s cn78xx;
+       struct cvmx_smix_wr_dat_s cn78xxp1;
+       struct cvmx_smix_wr_dat_s cnf71xx;
+       struct cvmx_smix_wr_dat_s cnf75xx;
+};
+
+typedef union cvmx_smix_wr_dat cvmx_smix_wr_dat_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-sriomaintx-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-sriomaintx-defs.h
new file mode 100644 (file)
index 0000000..2558e7b
--- /dev/null
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_SRIOMAINTX_DEFS_H__
+#define __CVMX_SRIOMAINTX_DEFS_H__
+
+static inline u64 CVMX_SRIOMAINTX_PORT_0_CTL2(unsigned long offset)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+               return 0x0000010000000154ull + (offset) * 0x100000000ull;
+       case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000154ull;
+       case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
+               return 0x0000000000000154ull + (offset) * 0x100000000ull;
+       }
+       return 0x0000010000000154ull + (offset) * 0x100000000ull;
+}
+
+/**
+ * cvmx_sriomaint#_port_0_ctl2
+ *
+ * These registers are accessed when a local processor or an external
+ * device wishes to examine the port baudrate information.  The automatic
+ * baud rate feature is not available on this device. The SUP_* and ENB_*
+ * fields are set directly by the SRIO()_STATUS_REG[SPD] bits as a
+ * reference but otherwise have no effect.
+ *
+ * WARNING!!  Writes to this register will reinitialize the SRIO link.
+ */
+union cvmx_sriomaintx_port_0_ctl2 {
+       u32 u32;
+       struct cvmx_sriomaintx_port_0_ctl2_s {
+               u32 sel_baud : 4;
+               u32 baud_sup : 1;
+               u32 baud_enb : 1;
+               u32 sup_125g : 1;
+               u32 enb_125g : 1;
+               u32 sup_250g : 1;
+               u32 enb_250g : 1;
+               u32 sup_312g : 1;
+               u32 enb_312g : 1;
+               u32 sub_500g : 1;
+               u32 enb_500g : 1;
+               u32 sup_625g : 1;
+               u32 enb_625g : 1;
+               u32 reserved_2_15 : 14;
+               u32 tx_emph : 1;
+               u32 emph_en : 1;
+       } s;
+       struct cvmx_sriomaintx_port_0_ctl2_s cn63xx;
+       struct cvmx_sriomaintx_port_0_ctl2_s cn63xxp1;
+       struct cvmx_sriomaintx_port_0_ctl2_s cn66xx;
+       struct cvmx_sriomaintx_port_0_ctl2_s cnf75xx;
+};
+
+typedef union cvmx_sriomaintx_port_0_ctl2 cvmx_sriomaintx_port_0_ctl2_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-sriox-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-sriox-defs.h
new file mode 100644 (file)
index 0000000..ac98860
--- /dev/null
@@ -0,0 +1,44 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __CVMX_SRIOX_DEFS_H__
+#define __CVMX_SRIOX_DEFS_H__
+
+#define CVMX_SRIOX_STATUS_REG(offset) (0x00011800C8000100ull + ((offset) & 3) * 0x1000000ull)
+
+/**
+ * cvmx_srio#_status_reg
+ *
+ * The SRIO field displays if the port has been configured for SRIO operation.  This register
+ * can be read regardless of whether the SRIO is selected or being reset.  Although some other
+ * registers can be accessed while the ACCESS bit is zero (see individual registers for details),
+ * the majority of SRIO registers and all the SRIOMAINT registers can be used only when the
+ * ACCESS bit is asserted.
+ *
+ * This register is reset by the coprocessor-clock reset.
+ */
+union cvmx_sriox_status_reg {
+       u64 u64;
+       struct cvmx_sriox_status_reg_s {
+               u64 reserved_9_63 : 55;
+               u64 host : 1;
+               u64 spd : 4;
+               u64 run_type : 2;
+               u64 access : 1;
+               u64 srio : 1;
+       } s;
+       struct cvmx_sriox_status_reg_cn63xx {
+               u64 reserved_2_63 : 62;
+               u64 access : 1;
+               u64 srio : 1;
+       } cn63xx;
+       struct cvmx_sriox_status_reg_cn63xx cn63xxp1;
+       struct cvmx_sriox_status_reg_cn63xx cn66xx;
+       struct cvmx_sriox_status_reg_s cnf75xx;
+};
+
+typedef union cvmx_sriox_status_reg cvmx_sriox_status_reg_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-sso-defs.h b/arch/mips/mach-octeon/include/mach/cvmx-sso-defs.h
new file mode 100644 (file)
index 0000000..4fc6907
--- /dev/null
@@ -0,0 +1,2904 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * Configuration and status register (CSR) type definitions for
+ * Octeon sso.
+ */
+
+#ifndef __CVMX_SSO_DEFS_H__
+#define __CVMX_SSO_DEFS_H__
+
+#define CVMX_SSO_ACTIVE_CYCLES         (0x00016700000010E8ull)
+#define CVMX_SSO_ACTIVE_CYCLESX(offset) (0x0001670000001100ull + ((offset) & 3) * 8)
+#define CVMX_SSO_AW_ADD                        (0x0001670000002080ull)
+#define CVMX_SSO_AW_CFG                        (0x00016700000010F0ull)
+#define CVMX_SSO_AW_ECO                        (0x0001670000001030ull)
+#define CVMX_SSO_AW_READ_ARB           (0x0001670000002090ull)
+#define CVMX_SSO_AW_STATUS             (0x00016700000010E0ull)
+#define CVMX_SSO_AW_TAG_LATENCY_PC     (0x00016700000020A8ull)
+#define CVMX_SSO_AW_TAG_REQ_PC         (0x00016700000020A0ull)
+#define CVMX_SSO_AW_WE                 (0x0001670000001080ull)
+#define CVMX_SSO_BIST_STAT             (0x0001670000001078ull)
+#define CVMX_SSO_BIST_STATUS0          (0x0001670000001200ull)
+#define CVMX_SSO_BIST_STATUS1          (0x0001670000001208ull)
+#define CVMX_SSO_BIST_STATUS2          (0x0001670000001210ull)
+#define CVMX_SSO_CFG                   (0x0001670000001088ull)
+#define CVMX_SSO_DS_PC                 (0x0001670000001070ull)
+#define CVMX_SSO_ECC_CTL0              (0x0001670000001280ull)
+#define CVMX_SSO_ECC_CTL1              (0x0001670000001288ull)
+#define CVMX_SSO_ECC_CTL2              (0x0001670000001290ull)
+#define CVMX_SSO_ERR                   (0x0001670000001038ull)
+#define CVMX_SSO_ERR0                  (0x0001670000001240ull)
+#define CVMX_SSO_ERR1                  (0x0001670000001248ull)
+#define CVMX_SSO_ERR2                  (0x0001670000001250ull)
+#define CVMX_SSO_ERR_ENB               (0x0001670000001030ull)
+#define CVMX_SSO_FIDX_ECC_CTL          (0x00016700000010D0ull)
+#define CVMX_SSO_FIDX_ECC_ST           (0x00016700000010D8ull)
+#define CVMX_SSO_FPAGE_CNT             (0x0001670000001090ull)
+#define CVMX_SSO_GRPX_AQ_CNT(offset)   (0x0001670020000700ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_AQ_THR(offset)   (0x0001670020000800ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_DS_PC(offset)    (0x0001670020001400ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_EXT_PC(offset)   (0x0001670020001100ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_IAQ_THR(offset)  (0x0001670020000000ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_INT(offset)      (0x0001670020000400ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_INT_CNT(offset)  (0x0001670020000600ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_INT_THR(offset)  (0x0001670020000500ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_PRI(offset)      (0x0001670020000200ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_TAQ_THR(offset)  (0x0001670020000100ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_TS_PC(offset)    (0x0001670020001300ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_WA_PC(offset)    (0x0001670020001200ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GRPX_WS_PC(offset)    (0x0001670020001000ull + ((offset) & 255) * 0x10000ull)
+#define CVMX_SSO_GWE_CFG               (0x0001670000001098ull)
+#define CVMX_SSO_GWE_RANDOM            (0x00016700000010B0ull)
+#define CVMX_SSO_GW_ECO                        (0x0001670000001038ull)
+#define CVMX_SSO_IDX_ECC_CTL           (0x00016700000010C0ull)
+#define CVMX_SSO_IDX_ECC_ST            (0x00016700000010C8ull)
+#define CVMX_SSO_IENTX_LINKS(offset)   (0x00016700A0060000ull + ((offset) & 4095) * 8)
+#define CVMX_SSO_IENTX_PENDTAG(offset) (0x00016700A0040000ull + ((offset) & 4095) * 8)
+#define CVMX_SSO_IENTX_QLINKS(offset)  (0x00016700A0080000ull + ((offset) & 4095) * 8)
+#define CVMX_SSO_IENTX_TAG(offset)     (0x00016700A0000000ull + ((offset) & 4095) * 8)
+#define CVMX_SSO_IENTX_WQPGRP(offset)  (0x00016700A0020000ull + ((offset) & 4095) * 8)
+#define CVMX_SSO_IPL_CONFX(offset)     (0x0001670080080000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_IPL_DESCHEDX(offset)  (0x0001670080060000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_IPL_FREEX(offset)     (0x0001670080000000ull + ((offset) & 7) * 8)
+#define CVMX_SSO_IPL_IAQX(offset)      (0x0001670080040000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_IQ_CNTX(offset)       (0x0001670000009000ull + ((offset) & 7) * 8)
+#define CVMX_SSO_IQ_COM_CNT            (0x0001670000001058ull)
+#define CVMX_SSO_IQ_INT                        (0x0001670000001048ull)
+#define CVMX_SSO_IQ_INT_EN             (0x0001670000001050ull)
+#define CVMX_SSO_IQ_THRX(offset)       (0x000167000000A000ull + ((offset) & 7) * 8)
+#define CVMX_SSO_NOS_CNT               (0x0001670000001040ull)
+#define CVMX_SSO_NW_TIM                        (0x0001670000001028ull)
+#define CVMX_SSO_OTH_ECC_CTL           (0x00016700000010B0ull)
+#define CVMX_SSO_OTH_ECC_ST            (0x00016700000010B8ull)
+#define CVMX_SSO_PAGE_CNT              (0x0001670000001090ull)
+#define CVMX_SSO_PND_ECC_CTL           (0x00016700000010A0ull)
+#define CVMX_SSO_PND_ECC_ST            (0x00016700000010A8ull)
+#define CVMX_SSO_PPX_ARB(offset)       (0x0001670040000000ull + ((offset) & 63) * 0x10000ull)
+#define CVMX_SSO_PPX_GRP_MSK(offset)   (0x0001670000006000ull + ((offset) & 31) * 8)
+#define CVMX_SSO_PPX_QOS_PRI(offset)   (0x0001670000003000ull + ((offset) & 31) * 8)
+#define CVMX_SSO_PPX_SX_GRPMSKX(a, b, c)                                                           \
+       (0x0001670040001000ull + ((a) << 16) + ((b) << 5) + ((c) << 3))
+#define CVMX_SSO_PP_STRICT       (0x00016700000010E0ull)
+#define CVMX_SSO_QOSX_RND(offset) (0x0001670000002000ull + ((offset) & 7) * 8)
+#define CVMX_SSO_QOS_THRX(offset) (0x000167000000B000ull + ((offset) & 7) * 8)
+#define CVMX_SSO_QOS_WE                  (0x0001670000001080ull)
+#define CVMX_SSO_RESET           CVMX_SSO_RESET_FUNC()
+static inline u64 CVMX_SSO_RESET_FUNC(void)
+{
+       switch (cvmx_get_octeon_family()) {
+       case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
+       case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+                       return 0x00016700000010F8ull;
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+                       return 0x00016700000010F8ull;
+       case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
+               return 0x00016700000010F8ull;
+       case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+               return 0x00016700000010F0ull;
+       }
+       return 0x00016700000010F8ull;
+}
+
+#define CVMX_SSO_RWQ_HEAD_PTRX(offset) (0x000167000000C000ull + ((offset) & 7) * 8)
+#define CVMX_SSO_RWQ_POP_FPTR          (0x000167000000C408ull)
+#define CVMX_SSO_RWQ_PSH_FPTR          (0x000167000000C400ull)
+#define CVMX_SSO_RWQ_TAIL_PTRX(offset) (0x000167000000C200ull + ((offset) & 7) * 8)
+#define CVMX_SSO_SL_PPX_LINKS(offset)  (0x0001670060000040ull + ((offset) & 63) * 0x10000ull)
+#define CVMX_SSO_SL_PPX_PENDTAG(offset) (0x0001670060000000ull + ((offset) & 63) * 0x10000ull)
+#define CVMX_SSO_SL_PPX_PENDWQP(offset) (0x0001670060000010ull + ((offset) & 63) * 0x10000ull)
+#define CVMX_SSO_SL_PPX_TAG(offset)    (0x0001670060000020ull + ((offset) & 63) * 0x10000ull)
+#define CVMX_SSO_SL_PPX_WQP(offset)    (0x0001670060000030ull + ((offset) & 63) * 0x10000ull)
+#define CVMX_SSO_TAQX_LINK(offset)     (0x00016700C0000000ull + ((offset) & 2047) * 4096)
+#define CVMX_SSO_TAQX_WAEX_TAG(offset, block_id)                                                   \
+       (0x00016700D0000000ull + (((offset) & 15) + ((block_id) & 2047) * 0x100ull) * 16)
+#define CVMX_SSO_TAQX_WAEX_WQP(offset, block_id)                                                   \
+       (0x00016700D0000008ull + (((offset) & 15) + ((block_id) & 2047) * 0x100ull) * 16)
+#define CVMX_SSO_TAQ_ADD               (0x00016700000020E0ull)
+#define CVMX_SSO_TAQ_CNT               (0x00016700000020C0ull)
+#define CVMX_SSO_TIAQX_STATUS(offset)  (0x00016700000C0000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_TOAQX_STATUS(offset)  (0x00016700000D0000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_TS_PC                 (0x0001670000001068ull)
+#define CVMX_SSO_WA_COM_PC             (0x0001670000001060ull)
+#define CVMX_SSO_WA_PCX(offset)                (0x0001670000005000ull + ((offset) & 7) * 8)
+#define CVMX_SSO_WQ_INT                        (0x0001670000001000ull)
+#define CVMX_SSO_WQ_INT_CNTX(offset)   (0x0001670000008000ull + ((offset) & 63) * 8)
+#define CVMX_SSO_WQ_INT_PC             (0x0001670000001020ull)
+#define CVMX_SSO_WQ_INT_THRX(offset)   (0x0001670000007000ull + ((offset) & 63) * 8)
+#define CVMX_SSO_WQ_IQ_DIS             (0x0001670000001010ull)
+#define CVMX_SSO_WS_CFG                        (0x0001670000001088ull)
+#define CVMX_SSO_WS_ECO                        (0x0001670000001048ull)
+#define CVMX_SSO_WS_PCX(offset)                (0x0001670000004000ull + ((offset) & 63) * 8)
+#define CVMX_SSO_XAQX_HEAD_NEXT(offset) (0x00016700000A0000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_XAQX_HEAD_PTR(offset) (0x0001670000080000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_XAQX_TAIL_NEXT(offset) (0x00016700000B0000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_XAQX_TAIL_PTR(offset) (0x0001670000090000ull + ((offset) & 255) * 8)
+#define CVMX_SSO_XAQ_AURA              (0x0001670000002100ull)
+#define CVMX_SSO_XAQ_LATENCY_PC                (0x00016700000020B8ull)
+#define CVMX_SSO_XAQ_REQ_PC            (0x00016700000020B0ull)
+
+/**
+ * cvmx_sso_active_cycles
+ *
+ * SSO_ACTIVE_CYCLES = SSO cycles SSO active
+ *
+ * This register counts every sclk cycle that the SSO clocks are active.
+ * **NOTE: Added in pass 2.0
+ */
+union cvmx_sso_active_cycles {
+       u64 u64;
+       struct cvmx_sso_active_cycles_s {
+               u64 act_cyc : 64;
+       } s;
+       struct cvmx_sso_active_cycles_s cn68xx;
+};
+
+typedef union cvmx_sso_active_cycles cvmx_sso_active_cycles_t;
+
+/**
+ * cvmx_sso_active_cycles#
+ *
+ * This register counts every coprocessor clock (SCLK) cycle that the SSO clocks are active.
+ *
+ */
+union cvmx_sso_active_cyclesx {
+       u64 u64;
+       struct cvmx_sso_active_cyclesx_s {
+               u64 act_cyc : 64;
+       } s;
+       struct cvmx_sso_active_cyclesx_s cn73xx;
+       struct cvmx_sso_active_cyclesx_s cn78xx;
+       struct cvmx_sso_active_cyclesx_s cn78xxp1;
+       struct cvmx_sso_active_cyclesx_s cnf75xx;
+};
+
+typedef union cvmx_sso_active_cyclesx cvmx_sso_active_cyclesx_t;
+
+/**
+ * cvmx_sso_aw_add
+ */
+union cvmx_sso_aw_add {
+       u64 u64;
+       struct cvmx_sso_aw_add_s {
+               u64 reserved_30_63 : 34;
+               u64 rsvd_free : 14;
+               u64 reserved_0_15 : 16;
+       } s;
+       struct cvmx_sso_aw_add_s cn73xx;
+       struct cvmx_sso_aw_add_s cn78xx;
+       struct cvmx_sso_aw_add_s cn78xxp1;
+       struct cvmx_sso_aw_add_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_add cvmx_sso_aw_add_t;
+
+/**
+ * cvmx_sso_aw_cfg
+ *
+ * This register controls the operation of the add-work block (AW).
+ *
+ */
+union cvmx_sso_aw_cfg {
+       u64 u64;
+       struct cvmx_sso_aw_cfg_s {
+               u64 reserved_9_63 : 55;
+               u64 ldt_short : 1;
+               u64 lol : 1;
+               u64 xaq_alloc_dis : 1;
+               u64 ocla_bp : 1;
+               u64 xaq_byp_dis : 1;
+               u64 stt : 1;
+               u64 ldt : 1;
+               u64 ldwb : 1;
+               u64 rwen : 1;
+       } s;
+       struct cvmx_sso_aw_cfg_s cn73xx;
+       struct cvmx_sso_aw_cfg_s cn78xx;
+       struct cvmx_sso_aw_cfg_s cn78xxp1;
+       struct cvmx_sso_aw_cfg_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_cfg cvmx_sso_aw_cfg_t;
+
+/**
+ * cvmx_sso_aw_eco
+ */
+union cvmx_sso_aw_eco {
+       u64 u64;
+       struct cvmx_sso_aw_eco_s {
+               u64 reserved_8_63 : 56;
+               u64 eco_rw : 8;
+       } s;
+       struct cvmx_sso_aw_eco_s cn73xx;
+       struct cvmx_sso_aw_eco_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_eco cvmx_sso_aw_eco_t;
+
+/**
+ * cvmx_sso_aw_read_arb
+ *
+ * This register fine tunes the AW read arbiter and is for diagnostic use.
+ *
+ */
+union cvmx_sso_aw_read_arb {
+       u64 u64;
+       struct cvmx_sso_aw_read_arb_s {
+               u64 reserved_30_63 : 34;
+               u64 xaq_lev : 6;
+               u64 reserved_21_23 : 3;
+               u64 xaq_min : 5;
+               u64 reserved_14_15 : 2;
+               u64 aw_tag_lev : 6;
+               u64 reserved_5_7 : 3;
+               u64 aw_tag_min : 5;
+       } s;
+       struct cvmx_sso_aw_read_arb_s cn73xx;
+       struct cvmx_sso_aw_read_arb_s cn78xx;
+       struct cvmx_sso_aw_read_arb_s cn78xxp1;
+       struct cvmx_sso_aw_read_arb_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_read_arb cvmx_sso_aw_read_arb_t;
+
+/**
+ * cvmx_sso_aw_status
+ *
+ * This register indicates the status of the add-work block (AW).
+ *
+ */
+union cvmx_sso_aw_status {
+       u64 u64;
+       struct cvmx_sso_aw_status_s {
+               u64 reserved_6_63 : 58;
+               u64 xaq_buf_cached : 6;
+       } s;
+       struct cvmx_sso_aw_status_s cn73xx;
+       struct cvmx_sso_aw_status_s cn78xx;
+       struct cvmx_sso_aw_status_s cn78xxp1;
+       struct cvmx_sso_aw_status_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_status cvmx_sso_aw_status_t;
+
+/**
+ * cvmx_sso_aw_tag_latency_pc
+ */
+union cvmx_sso_aw_tag_latency_pc {
+       u64 u64;
+       struct cvmx_sso_aw_tag_latency_pc_s {
+               u64 count : 64;
+       } s;
+       struct cvmx_sso_aw_tag_latency_pc_s cn73xx;
+       struct cvmx_sso_aw_tag_latency_pc_s cn78xx;
+       struct cvmx_sso_aw_tag_latency_pc_s cn78xxp1;
+       struct cvmx_sso_aw_tag_latency_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_tag_latency_pc cvmx_sso_aw_tag_latency_pc_t;
+
+/**
+ * cvmx_sso_aw_tag_req_pc
+ */
+union cvmx_sso_aw_tag_req_pc {
+       u64 u64;
+       struct cvmx_sso_aw_tag_req_pc_s {
+               u64 count : 64;
+       } s;
+       struct cvmx_sso_aw_tag_req_pc_s cn73xx;
+       struct cvmx_sso_aw_tag_req_pc_s cn78xx;
+       struct cvmx_sso_aw_tag_req_pc_s cn78xxp1;
+       struct cvmx_sso_aw_tag_req_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_tag_req_pc cvmx_sso_aw_tag_req_pc_t;
+
+/**
+ * cvmx_sso_aw_we
+ */
+union cvmx_sso_aw_we {
+       u64 u64;
+       struct cvmx_sso_aw_we_s {
+               u64 reserved_29_63 : 35;
+               u64 rsvd_free : 13;
+               u64 reserved_13_15 : 3;
+               u64 free_cnt : 13;
+       } s;
+       struct cvmx_sso_aw_we_s cn73xx;
+       struct cvmx_sso_aw_we_s cn78xx;
+       struct cvmx_sso_aw_we_s cn78xxp1;
+       struct cvmx_sso_aw_we_s cnf75xx;
+};
+
+typedef union cvmx_sso_aw_we cvmx_sso_aw_we_t;
+
+/**
+ * cvmx_sso_bist_stat
+ *
+ * SSO_BIST_STAT = SSO BIST Status Register
+ *
+ * Contains the BIST status for the SSO memories ('0' = pass, '1' = fail).
+ * Note that PP BIST status is not reported here as it was in previous designs.
+ *
+ *   There may be more for DDR interface buffers.
+ *   It's possible that a RAM will be used for SSO_PP_QOS_RND.
+ */
+union cvmx_sso_bist_stat {
+       u64 u64;
+       struct cvmx_sso_bist_stat_s {
+               u64 reserved_62_63 : 2;
+               u64 odu_pref : 2;
+               u64 reserved_54_59 : 6;
+               u64 fptr : 2;
+               u64 reserved_45_51 : 7;
+               u64 rwo_dat : 1;
+               u64 rwo : 2;
+               u64 reserved_35_41 : 7;
+               u64 rwi_dat : 1;
+               u64 reserved_32_33 : 2;
+               u64 soc : 1;
+               u64 reserved_28_30 : 3;
+               u64 ncbo : 4;
+               u64 reserved_21_23 : 3;
+               u64 index : 1;
+               u64 reserved_17_19 : 3;
+               u64 fidx : 1;
+               u64 reserved_10_15 : 6;
+               u64 pend : 2;
+               u64 reserved_2_7 : 6;
+               u64 oth : 2;
+       } s;
+       struct cvmx_sso_bist_stat_s cn68xx;
+       struct cvmx_sso_bist_stat_cn68xxp1 {
+               u64 reserved_54_63 : 10;
+               u64 fptr : 2;
+               u64 reserved_45_51 : 7;
+               u64 rwo_dat : 1;
+               u64 rwo : 2;
+               u64 reserved_35_41 : 7;
+               u64 rwi_dat : 1;
+               u64 reserved_32_33 : 2;
+               u64 soc : 1;
+               u64 reserved_28_30 : 3;
+               u64 ncbo : 4;
+               u64 reserved_21_23 : 3;
+               u64 index : 1;
+               u64 reserved_17_19 : 3;
+               u64 fidx : 1;
+               u64 reserved_10_15 : 6;
+               u64 pend : 2;
+               u64 reserved_2_7 : 6;
+               u64 oth : 2;
+       } cn68xxp1;
+};
+
+typedef union cvmx_sso_bist_stat cvmx_sso_bist_stat_t;
+
+/**
+ * cvmx_sso_bist_status0
+ *
+ * Contains the BIST status for the SSO memories.
+ *
+ */
+union cvmx_sso_bist_status0 {
+       u64 u64;
+       struct cvmx_sso_bist_status0_s {
+               u64 reserved_10_63 : 54;
+               u64 bist : 10;
+       } s;
+       struct cvmx_sso_bist_status0_s cn73xx;
+       struct cvmx_sso_bist_status0_s cn78xx;
+       struct cvmx_sso_bist_status0_s cn78xxp1;
+       struct cvmx_sso_bist_status0_s cnf75xx;
+};
+
+typedef union cvmx_sso_bist_status0 cvmx_sso_bist_status0_t;
+
+/**
+ * cvmx_sso_bist_status1
+ *
+ * Contains the BIST status for the SSO memories.
+ *
+ */
+union cvmx_sso_bist_status1 {
+       u64 u64;
+       struct cvmx_sso_bist_status1_s {
+               u64 reserved_7_63 : 57;
+               u64 bist : 7;
+       } s;
+       struct cvmx_sso_bist_status1_s cn73xx;
+       struct cvmx_sso_bist_status1_s cn78xx;
+       struct cvmx_sso_bist_status1_s cn78xxp1;
+       struct cvmx_sso_bist_status1_s cnf75xx;
+};
+
+typedef union cvmx_sso_bist_status1 cvmx_sso_bist_status1_t;
+
+/**
+ * cvmx_sso_bist_status2
+ *
+ * Contains the BIST status for the SSO memories.
+ *
+ */
+union cvmx_sso_bist_status2 {
+       u64 u64;
+       struct cvmx_sso_bist_status2_s {
+               u64 reserved_9_63 : 55;
+               u64 bist : 9;
+       } s;
+       struct cvmx_sso_bist_status2_s cn73xx;
+       struct cvmx_sso_bist_status2_s cn78xx;
+       struct cvmx_sso_bist_status2_s cn78xxp1;
+       struct cvmx_sso_bist_status2_s cnf75xx;
+};
+
+typedef union cvmx_sso_bist_status2 cvmx_sso_bist_status2_t;
+
+/**
+ * cvmx_sso_cfg
+ *
+ * SSO_CFG = SSO Config
+ *
+ * This register is an assortment of various SSO configuration bits.
+ */
+union cvmx_sso_cfg {
+       u64 u64;
+       struct cvmx_sso_cfg_s {
+               u64 reserved_16_63 : 48;
+               u64 qck_gw_rsp_adj : 3;
+               u64 qck_gw_rsp_dis : 1;
+               u64 qck_sw_dis : 1;
+               u64 rwq_alloc_dis : 1;
+               u64 soc_ccam_dis : 1;
+               u64 sso_cclk_dis : 1;
+               u64 rwo_flush : 1;
+               u64 wfe_thr : 1;
+               u64 rwio_byp_dis : 1;
+               u64 rwq_byp_dis : 1;
+               u64 stt : 1;
+               u64 ldt : 1;
+               u64 dwb : 1;
+               u64 rwen : 1;
+       } s;
+       struct cvmx_sso_cfg_s cn68xx;
+       struct cvmx_sso_cfg_cn68xxp1 {
+               u64 reserved_8_63 : 56;
+               u64 rwo_flush : 1;
+               u64 wfe_thr : 1;
+               u64 rwio_byp_dis : 1;
+               u64 rwq_byp_dis : 1;
+               u64 stt : 1;
+               u64 ldt : 1;
+               u64 dwb : 1;
+               u64 rwen : 1;
+       } cn68xxp1;
+};
+
+typedef union cvmx_sso_cfg cvmx_sso_cfg_t;
+
+/**
+ * cvmx_sso_ds_pc
+ *
+ * SSO_DS_PC = SSO De-Schedule Performance Counter
+ *
+ * Counts the number of de-schedule requests.
+ * Counter rolls over through zero when max value exceeded.
+ */
+union cvmx_sso_ds_pc {
+       u64 u64;
+       struct cvmx_sso_ds_pc_s {
+               u64 ds_pc : 64;
+       } s;
+       struct cvmx_sso_ds_pc_s cn68xx;
+       struct cvmx_sso_ds_pc_s cn68xxp1;
+};
+
+typedef union cvmx_sso_ds_pc cvmx_sso_ds_pc_t;
+
+/**
+ * cvmx_sso_ecc_ctl0
+ */
+union cvmx_sso_ecc_ctl0 {
+       u64 u64;
+       struct cvmx_sso_ecc_ctl0_s {
+               u64 reserved_30_63 : 34;
+               u64 toaqt_flip : 2;
+               u64 toaqt_cdis : 1;
+               u64 toaqh_flip : 2;
+               u64 toaqh_cdis : 1;
+               u64 tiaqt_flip : 2;
+               u64 tiaqt_cdis : 1;
+               u64 tiaqh_flip : 2;
+               u64 tiaqh_cdis : 1;
+               u64 llm_flip : 2;
+               u64 llm_cdis : 1;
+               u64 inp_flip : 2;
+               u64 inp_cdis : 1;
+               u64 qtc_flip : 2;
+               u64 qtc_cdis : 1;
+               u64 xaq_flip : 2;
+               u64 xaq_cdis : 1;
+               u64 fff_flip : 2;
+               u64 fff_cdis : 1;
+               u64 wes_flip : 2;
+               u64 wes_cdis : 1;
+       } s;
+       struct cvmx_sso_ecc_ctl0_s cn73xx;
+       struct cvmx_sso_ecc_ctl0_s cn78xx;
+       struct cvmx_sso_ecc_ctl0_s cn78xxp1;
+       struct cvmx_sso_ecc_ctl0_s cnf75xx;
+};
+
+typedef union cvmx_sso_ecc_ctl0 cvmx_sso_ecc_ctl0_t;
+
+/**
+ * cvmx_sso_ecc_ctl1
+ */
+union cvmx_sso_ecc_ctl1 {
+       u64 u64;
+       struct cvmx_sso_ecc_ctl1_s {
+               u64 reserved_21_63 : 43;
+               u64 thrint_flip : 2;
+               u64 thrint_cdis : 1;
+               u64 mask_flip : 2;
+               u64 mask_cdis : 1;
+               u64 gdw_flip : 2;
+               u64 gdw_cdis : 1;
+               u64 qidx_flip : 2;
+               u64 qidx_cdis : 1;
+               u64 tptr_flip : 2;
+               u64 tptr_cdis : 1;
+               u64 hptr_flip : 2;
+               u64 hptr_cdis : 1;
+               u64 cntr_flip : 2;
+               u64 cntr_cdis : 1;
+       } s;
+       struct cvmx_sso_ecc_ctl1_s cn73xx;
+       struct cvmx_sso_ecc_ctl1_s cn78xx;
+       struct cvmx_sso_ecc_ctl1_s cn78xxp1;
+       struct cvmx_sso_ecc_ctl1_s cnf75xx;
+};
+
+typedef union cvmx_sso_ecc_ctl1 cvmx_sso_ecc_ctl1_t;
+
+/**
+ * cvmx_sso_ecc_ctl2
+ */
+union cvmx_sso_ecc_ctl2 {
+       u64 u64;
+       struct cvmx_sso_ecc_ctl2_s {
+               u64 reserved_15_63 : 49;
+               u64 ncbo_flip : 2;
+               u64 ncbo_cdis : 1;
+               u64 pnd_flip : 2;
+               u64 pnd_cdis : 1;
+               u64 oth_flip : 2;
+               u64 oth_cdis : 1;
+               u64 nidx_flip : 2;
+               u64 nidx_cdis : 1;
+               u64 pidx_flip : 2;
+               u64 pidx_cdis : 1;
+       } s;
+       struct cvmx_sso_ecc_ctl2_s cn73xx;
+       struct cvmx_sso_ecc_ctl2_s cn78xx;
+       struct cvmx_sso_ecc_ctl2_s cn78xxp1;
+       struct cvmx_sso_ecc_ctl2_s cnf75xx;
+};
+
+typedef union cvmx_sso_ecc_ctl2 cvmx_sso_ecc_ctl2_t;
+
+/**
+ * cvmx_sso_err
+ *
+ * SSO_ERR = SSO Error Register
+ *
+ * Contains ECC and other misc error bits.
+ *
+ * <45> The free page error bit will assert when SSO_FPAGE_CNT <= 16 and
+ *      SSO_CFG[RWEN] is 1.  Software will want to disable the interrupt
+ *      associated with this error when recovering SSO pointers from the
+ *      FPA and SSO.
+ *
+ * This register also contains the illegal operation error bits:
+ *
+ * <42> Received ADDWQ with tag specified as EMPTY
+ * <41> Received illegal opcode
+ * <40> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP/GET_WORK/ALLOC_WE
+ *      from WS with CLR_NSCHED pending
+ * <39> Received CLR_NSCHED
+ *      from WS with SWTAG_DESCH/DESCH/CLR_NSCHED pending
+ * <38> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP/GET_WORK/ALLOC_WE
+ *      from WS with ALLOC_WE pending
+ * <37> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP/GET_WORK/ALLOC_WE/CLR_NSCHED
+ *      from WS with GET_WORK pending
+ * <36> Received SWTAG_FULL/SWTAG_DESCH
+ *      with tag specified as UNSCHEDULED
+ * <35> Received SWTAG/SWTAG_FULL/SWTAG_DESCH
+ *      with tag specified as EMPTY
+ * <34> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/GET_WORK
+ *      from WS with pending tag switch to ORDERED or ATOMIC
+ * <33> Received SWTAG/SWTAG_DESCH/DESCH/UPD_WQP
+ *      from WS in UNSCHEDULED state
+ * <32> Received SWTAG/SWTAG_FULL/SWTAG_DESCH/DESCH/UPD_WQP
+ *      from WS in EMPTY state
+ */
+union cvmx_sso_err {
+       u64 u64;
+       struct cvmx_sso_err_s {
+               u64 reserved_48_63 : 16;
+               u64 bfp : 1;
+               u64 awe : 1;
+               u64 fpe : 1;
+               u64 reserved_43_44 : 2;
+               u64 iop : 11;
+               u64 reserved_12_31 : 20;
+               u64 pnd_dbe0 : 1;
+               u64 pnd_sbe0 : 1;
+               u64 pnd_dbe1 : 1;
+               u64 pnd_sbe1 : 1;
+               u64 oth_dbe0 : 1;
+               u64 oth_sbe0 : 1;
+               u64 oth_dbe1 : 1;
+               u64 oth_sbe1 : 1;
+               u64 idx_dbe : 1;
+               u64 idx_sbe : 1;
+               u64 fidx_dbe : 1;
+               u64 fidx_sbe : 1;
+       } s;
+       struct cvmx_sso_err_s cn68xx;
+       struct cvmx_sso_err_s cn68xxp1;
+};
+
+typedef union cvmx_sso_err cvmx_sso_err_t;
+
+/**
+ * cvmx_sso_err0
+ *
+ * This register contains ECC and other miscellaneous error bits.
+ *
+ */
+union cvmx_sso_err0 {
+       u64 u64;
+       struct cvmx_sso_err0_s {
+               u64 reserved_52_63 : 12;
+               u64 toaqt_dbe : 1;
+               u64 toaqt_sbe : 1;
+               u64 toaqh_dbe : 1;
+               u64 toaqh_sbe : 1;
+               u64 tiaqt_dbe : 1;
+               u64 tiaqt_sbe : 1;
+               u64 tiaqh_dbe : 1;
+               u64 tiaqh_sbe : 1;
+               u64 llm_dbe : 1;
+               u64 llm_sbe : 1;
+               u64 inp_dbe : 1;
+               u64 inp_sbe : 1;
+               u64 qtc_dbe : 1;
+               u64 qtc_sbe : 1;
+               u64 xaq_dbe : 1;
+               u64 xaq_sbe : 1;
+               u64 fff_dbe : 1;
+               u64 fff_sbe : 1;
+               u64 wes_dbe : 1;
+               u64 wes_sbe : 1;
+               u64 reserved_6_31 : 26;
+               u64 addwq_dropped : 1;
+               u64 awempty : 1;
+               u64 grpdis : 1;
+               u64 bfp : 1;
+               u64 awe : 1;
+               u64 fpe : 1;
+       } s;
+       struct cvmx_sso_err0_s cn73xx;
+       struct cvmx_sso_err0_s cn78xx;
+       struct cvmx_sso_err0_s cn78xxp1;
+       struct cvmx_sso_err0_s cnf75xx;
+};
+
+typedef union cvmx_sso_err0 cvmx_sso_err0_t;
+
+/**
+ * cvmx_sso_err1
+ *
+ * This register contains ECC and other miscellaneous error bits.
+ *
+ */
+union cvmx_sso_err1 {
+       u64 u64;
+       struct cvmx_sso_err1_s {
+               u64 reserved_14_63 : 50;
+               u64 thrint_dbe : 1;
+               u64 thrint_sbe : 1;
+               u64 mask_dbe : 1;
+               u64 mask_sbe : 1;
+               u64 gdw_dbe : 1;
+               u64 gdw_sbe : 1;
+               u64 qidx_dbe : 1;
+               u64 qidx_sbe : 1;
+               u64 tptr_dbe : 1;
+               u64 tptr_sbe : 1;
+               u64 hptr_dbe : 1;
+               u64 hptr_sbe : 1;
+               u64 cntr_dbe : 1;
+               u64 cntr_sbe : 1;
+       } s;
+       struct cvmx_sso_err1_s cn73xx;
+       struct cvmx_sso_err1_s cn78xx;
+       struct cvmx_sso_err1_s cn78xxp1;
+       struct cvmx_sso_err1_s cnf75xx;
+};
+
+typedef union cvmx_sso_err1 cvmx_sso_err1_t;
+
+/**
+ * cvmx_sso_err2
+ *
+ * This register contains ECC and other miscellaneous error bits.
+ *
+ */
+union cvmx_sso_err2 {
+       u64 u64;
+       struct cvmx_sso_err2_s {
+               u64 reserved_42_63 : 22;
+               u64 ncbo_dbe : 1;
+               u64 ncbo_sbe : 1;
+               u64 pnd_dbe : 1;
+               u64 pnd_sbe : 1;
+               u64 oth_dbe : 1;
+               u64 oth_sbe : 1;
+               u64 nidx_dbe : 1;
+               u64 nidx_sbe : 1;
+               u64 pidx_dbe : 1;
+               u64 pidx_sbe : 1;
+               u64 reserved_13_31 : 19;
+               u64 iop : 13;
+       } s;
+       struct cvmx_sso_err2_s cn73xx;
+       struct cvmx_sso_err2_s cn78xx;
+       struct cvmx_sso_err2_s cn78xxp1;
+       struct cvmx_sso_err2_s cnf75xx;
+};
+
+typedef union cvmx_sso_err2 cvmx_sso_err2_t;
+
+/**
+ * cvmx_sso_err_enb
+ *
+ * SSO_ERR_ENB = SSO Error Enable Register
+ *
+ * Contains the interrupt enables corresponding to SSO_ERR.
+ */
+union cvmx_sso_err_enb {
+       u64 u64;
+       struct cvmx_sso_err_enb_s {
+               u64 reserved_48_63 : 16;
+               u64 bfp_ie : 1;
+               u64 awe_ie : 1;
+               u64 fpe_ie : 1;
+               u64 reserved_43_44 : 2;
+               u64 iop_ie : 11;
+               u64 reserved_12_31 : 20;
+               u64 pnd_dbe0_ie : 1;
+               u64 pnd_sbe0_ie : 1;
+               u64 pnd_dbe1_ie : 1;
+               u64 pnd_sbe1_ie : 1;
+               u64 oth_dbe0_ie : 1;
+               u64 oth_sbe0_ie : 1;
+               u64 oth_dbe1_ie : 1;
+               u64 oth_sbe1_ie : 1;
+               u64 idx_dbe_ie : 1;
+               u64 idx_sbe_ie : 1;
+               u64 fidx_dbe_ie : 1;
+               u64 fidx_sbe_ie : 1;
+       } s;
+       struct cvmx_sso_err_enb_s cn68xx;
+       struct cvmx_sso_err_enb_s cn68xxp1;
+};
+
+typedef union cvmx_sso_err_enb cvmx_sso_err_enb_t;
+
+/**
+ * cvmx_sso_fidx_ecc_ctl
+ *
+ * SSO_FIDX_ECC_CTL = SSO FIDX ECC Control
+ *
+ */
+union cvmx_sso_fidx_ecc_ctl {
+       u64 u64;
+       struct cvmx_sso_fidx_ecc_ctl_s {
+               u64 reserved_3_63 : 61;
+               u64 flip_synd : 2;
+               u64 ecc_ena : 1;
+       } s;
+       struct cvmx_sso_fidx_ecc_ctl_s cn68xx;
+       struct cvmx_sso_fidx_ecc_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_sso_fidx_ecc_ctl cvmx_sso_fidx_ecc_ctl_t;
+
+/**
+ * cvmx_sso_fidx_ecc_st
+ *
+ * SSO_FIDX_ECC_ST = SSO FIDX ECC Status
+ *
+ */
+union cvmx_sso_fidx_ecc_st {
+       u64 u64;
+       struct cvmx_sso_fidx_ecc_st_s {
+               u64 reserved_27_63 : 37;
+               u64 addr : 11;
+               u64 reserved_9_15 : 7;
+               u64 syndrom : 5;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_sso_fidx_ecc_st_s cn68xx;
+       struct cvmx_sso_fidx_ecc_st_s cn68xxp1;
+};
+
+typedef union cvmx_sso_fidx_ecc_st cvmx_sso_fidx_ecc_st_t;
+
+/**
+ * cvmx_sso_fpage_cnt
+ *
+ * SSO_FPAGE_CNT = SSO Free Page Cnt
+ *
+ * This register keeps track of the number of free pages pointers available for use in external memory.
+ */
+union cvmx_sso_fpage_cnt {
+       u64 u64;
+       struct cvmx_sso_fpage_cnt_s {
+               u64 reserved_32_63 : 32;
+               u64 fpage_cnt : 32;
+       } s;
+       struct cvmx_sso_fpage_cnt_s cn68xx;
+       struct cvmx_sso_fpage_cnt_s cn68xxp1;
+};
+
+typedef union cvmx_sso_fpage_cnt cvmx_sso_fpage_cnt_t;
+
+/**
+ * cvmx_sso_grp#_aq_cnt
+ */
+union cvmx_sso_grpx_aq_cnt {
+       u64 u64;
+       struct cvmx_sso_grpx_aq_cnt_s {
+               u64 reserved_33_63 : 31;
+               u64 aq_cnt : 33;
+       } s;
+       struct cvmx_sso_grpx_aq_cnt_s cn73xx;
+       struct cvmx_sso_grpx_aq_cnt_s cn78xx;
+       struct cvmx_sso_grpx_aq_cnt_s cn78xxp1;
+       struct cvmx_sso_grpx_aq_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_aq_cnt cvmx_sso_grpx_aq_cnt_t;
+
+/**
+ * cvmx_sso_grp#_aq_thr
+ */
+union cvmx_sso_grpx_aq_thr {
+       u64 u64;
+       struct cvmx_sso_grpx_aq_thr_s {
+               u64 reserved_33_63 : 31;
+               u64 aq_thr : 33;
+       } s;
+       struct cvmx_sso_grpx_aq_thr_s cn73xx;
+       struct cvmx_sso_grpx_aq_thr_s cn78xx;
+       struct cvmx_sso_grpx_aq_thr_s cn78xxp1;
+       struct cvmx_sso_grpx_aq_thr_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_aq_thr cvmx_sso_grpx_aq_thr_t;
+
+/**
+ * cvmx_sso_grp#_ds_pc
+ *
+ * Counts the number of deschedule requests for each group. Counter rolls over through zero when
+ * max value exceeded.
+ */
+union cvmx_sso_grpx_ds_pc {
+       u64 u64;
+       struct cvmx_sso_grpx_ds_pc_s {
+               u64 cnt : 64;
+       } s;
+       struct cvmx_sso_grpx_ds_pc_s cn73xx;
+       struct cvmx_sso_grpx_ds_pc_s cn78xx;
+       struct cvmx_sso_grpx_ds_pc_s cn78xxp1;
+       struct cvmx_sso_grpx_ds_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_ds_pc cvmx_sso_grpx_ds_pc_t;
+
+/**
+ * cvmx_sso_grp#_ext_pc
+ *
+ * Counts the number of cache lines of WAEs sent to L2/DDR. Counter rolls over through zero when
+ * max value exceeded.
+ */
+union cvmx_sso_grpx_ext_pc {
+       u64 u64;
+       struct cvmx_sso_grpx_ext_pc_s {
+               u64 cnt : 64;
+       } s;
+       struct cvmx_sso_grpx_ext_pc_s cn73xx;
+       struct cvmx_sso_grpx_ext_pc_s cn78xx;
+       struct cvmx_sso_grpx_ext_pc_s cn78xxp1;
+       struct cvmx_sso_grpx_ext_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_ext_pc cvmx_sso_grpx_ext_pc_t;
+
+/**
+ * cvmx_sso_grp#_iaq_thr
+ *
+ * These registers contain the thresholds for allocating SSO in-unit admission queue entries, see
+ * In-Unit Thresholds.
+ */
+union cvmx_sso_grpx_iaq_thr {
+       u64 u64;
+       struct cvmx_sso_grpx_iaq_thr_s {
+               u64 reserved_61_63 : 3;
+               u64 grp_cnt : 13;
+               u64 reserved_45_47 : 3;
+               u64 max_thr : 13;
+               u64 reserved_13_31 : 19;
+               u64 rsvd_thr : 13;
+       } s;
+       struct cvmx_sso_grpx_iaq_thr_s cn73xx;
+       struct cvmx_sso_grpx_iaq_thr_s cn78xx;
+       struct cvmx_sso_grpx_iaq_thr_s cn78xxp1;
+       struct cvmx_sso_grpx_iaq_thr_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_iaq_thr cvmx_sso_grpx_iaq_thr_t;
+
+/**
+ * cvmx_sso_grp#_int
+ *
+ * Contains the per-group interrupts and are used to clear these interrupts. For more information
+ * on this register, refer to Interrupts.
+ */
+union cvmx_sso_grpx_int {
+       u64 u64;
+       struct cvmx_sso_grpx_int_s {
+               u64 exe_dis : 1;
+               u64 reserved_2_62 : 61;
+               u64 exe_int : 1;
+               u64 aq_int : 1;
+       } s;
+       struct cvmx_sso_grpx_int_s cn73xx;
+       struct cvmx_sso_grpx_int_s cn78xx;
+       struct cvmx_sso_grpx_int_s cn78xxp1;
+       struct cvmx_sso_grpx_int_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_int cvmx_sso_grpx_int_t;
+
+/**
+ * cvmx_sso_grp#_int_cnt
+ *
+ * These registers contain a read-only copy of the counts used to trigger work-queue interrupts
+ * (one per group). For more information on this register, refer to Interrupts.
+ */
+union cvmx_sso_grpx_int_cnt {
+       u64 u64;
+       struct cvmx_sso_grpx_int_cnt_s {
+               u64 reserved_61_63 : 3;
+               u64 tc_cnt : 13;
+               u64 reserved_45_47 : 3;
+               u64 cq_cnt : 13;
+               u64 reserved_29_31 : 3;
+               u64 ds_cnt : 13;
+               u64 reserved_13_15 : 3;
+               u64 iaq_cnt : 13;
+       } s;
+       struct cvmx_sso_grpx_int_cnt_s cn73xx;
+       struct cvmx_sso_grpx_int_cnt_s cn78xx;
+       struct cvmx_sso_grpx_int_cnt_s cn78xxp1;
+       struct cvmx_sso_grpx_int_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_int_cnt cvmx_sso_grpx_int_cnt_t;
+
+/**
+ * cvmx_sso_grp#_int_thr
+ *
+ * These registers contain the thresholds for enabling and setting work-queue interrupts (one per
+ * group). For more information on this register, refer to Interrupts.
+ */
+union cvmx_sso_grpx_int_thr {
+       u64 u64;
+       struct cvmx_sso_grpx_int_thr_s {
+               u64 tc_en : 1;
+               u64 reserved_61_62 : 2;
+               u64 tc_thr : 13;
+               u64 reserved_45_47 : 3;
+               u64 cq_thr : 13;
+               u64 reserved_29_31 : 3;
+               u64 ds_thr : 13;
+               u64 reserved_13_15 : 3;
+               u64 iaq_thr : 13;
+       } s;
+       struct cvmx_sso_grpx_int_thr_s cn73xx;
+       struct cvmx_sso_grpx_int_thr_s cn78xx;
+       struct cvmx_sso_grpx_int_thr_s cn78xxp1;
+       struct cvmx_sso_grpx_int_thr_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_int_thr cvmx_sso_grpx_int_thr_t;
+
+/**
+ * cvmx_sso_grp#_pri
+ *
+ * Controls the priority and group affinity arbitration for each group.
+ *
+ */
+union cvmx_sso_grpx_pri {
+       u64 u64;
+       struct cvmx_sso_grpx_pri_s {
+               u64 reserved_30_63 : 34;
+               u64 wgt_left : 6;
+               u64 reserved_22_23 : 2;
+               u64 weight : 6;
+               u64 reserved_12_15 : 4;
+               u64 affinity : 4;
+               u64 reserved_3_7 : 5;
+               u64 pri : 3;
+       } s;
+       struct cvmx_sso_grpx_pri_s cn73xx;
+       struct cvmx_sso_grpx_pri_s cn78xx;
+       struct cvmx_sso_grpx_pri_s cn78xxp1;
+       struct cvmx_sso_grpx_pri_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_pri cvmx_sso_grpx_pri_t;
+
+/**
+ * cvmx_sso_grp#_taq_thr
+ *
+ * These registers contain the thresholds for allocating SSO transitory admission queue storage
+ * buffers, see Transitory-Admission Thresholds.
+ */
+union cvmx_sso_grpx_taq_thr {
+       u64 u64;
+       struct cvmx_sso_grpx_taq_thr_s {
+               u64 reserved_59_63 : 5;
+               u64 grp_cnt : 11;
+               u64 reserved_43_47 : 5;
+               u64 max_thr : 11;
+               u64 reserved_11_31 : 21;
+               u64 rsvd_thr : 11;
+       } s;
+       struct cvmx_sso_grpx_taq_thr_s cn73xx;
+       struct cvmx_sso_grpx_taq_thr_s cn78xx;
+       struct cvmx_sso_grpx_taq_thr_s cn78xxp1;
+       struct cvmx_sso_grpx_taq_thr_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_taq_thr cvmx_sso_grpx_taq_thr_t;
+
+/**
+ * cvmx_sso_grp#_ts_pc
+ *
+ * Counts the number of tag switch requests for each group being switched to. Counter rolls over
+ * through zero when max value exceeded.
+ */
+union cvmx_sso_grpx_ts_pc {
+       u64 u64;
+       struct cvmx_sso_grpx_ts_pc_s {
+               u64 cnt : 64;
+       } s;
+       struct cvmx_sso_grpx_ts_pc_s cn73xx;
+       struct cvmx_sso_grpx_ts_pc_s cn78xx;
+       struct cvmx_sso_grpx_ts_pc_s cn78xxp1;
+       struct cvmx_sso_grpx_ts_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_ts_pc cvmx_sso_grpx_ts_pc_t;
+
+/**
+ * cvmx_sso_grp#_wa_pc
+ *
+ * Counts the number of add new work requests for each group. The counter rolls over through zero
+ * when the max value exceeded.
+ */
+union cvmx_sso_grpx_wa_pc {
+       u64 u64;
+       struct cvmx_sso_grpx_wa_pc_s {
+               u64 cnt : 64;
+       } s;
+       struct cvmx_sso_grpx_wa_pc_s cn73xx;
+       struct cvmx_sso_grpx_wa_pc_s cn78xx;
+       struct cvmx_sso_grpx_wa_pc_s cn78xxp1;
+       struct cvmx_sso_grpx_wa_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_wa_pc cvmx_sso_grpx_wa_pc_t;
+
+/**
+ * cvmx_sso_grp#_ws_pc
+ *
+ * Counts the number of work schedules for each group. The counter rolls over through zero when
+ * the maximum value is exceeded.
+ */
+union cvmx_sso_grpx_ws_pc {
+       u64 u64;
+       struct cvmx_sso_grpx_ws_pc_s {
+               u64 cnt : 64;
+       } s;
+       struct cvmx_sso_grpx_ws_pc_s cn73xx;
+       struct cvmx_sso_grpx_ws_pc_s cn78xx;
+       struct cvmx_sso_grpx_ws_pc_s cn78xxp1;
+       struct cvmx_sso_grpx_ws_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_grpx_ws_pc cvmx_sso_grpx_ws_pc_t;
+
+/**
+ * cvmx_sso_gw_eco
+ */
+union cvmx_sso_gw_eco {
+       u64 u64;
+       struct cvmx_sso_gw_eco_s {
+               u64 reserved_8_63 : 56;
+               u64 eco_rw : 8;
+       } s;
+       struct cvmx_sso_gw_eco_s cn73xx;
+       struct cvmx_sso_gw_eco_s cnf75xx;
+};
+
+typedef union cvmx_sso_gw_eco cvmx_sso_gw_eco_t;
+
+/**
+ * cvmx_sso_gwe_cfg
+ *
+ * This register controls the operation of the get-work examiner (GWE).
+ *
+ */
+union cvmx_sso_gwe_cfg {
+       u64 u64;
+       struct cvmx_sso_gwe_cfg_s {
+               u64 reserved_12_63 : 52;
+               u64 odu_ffpgw_dis : 1;
+               u64 gwe_rfpgw_dis : 1;
+               u64 odu_prf_dis : 1;
+               u64 reserved_0_8 : 9;
+       } s;
+       struct cvmx_sso_gwe_cfg_cn68xx {
+               u64 reserved_12_63 : 52;
+               u64 odu_ffpgw_dis : 1;
+               u64 gwe_rfpgw_dis : 1;
+               u64 odu_prf_dis : 1;
+               u64 odu_bmp_dis : 1;
+               u64 reserved_5_7 : 3;
+               u64 gwe_hvy_dis : 1;
+               u64 gwe_poe : 1;
+               u64 gwe_fpor : 1;
+               u64 gwe_rah : 1;
+               u64 gwe_dis : 1;
+       } cn68xx;
+       struct cvmx_sso_gwe_cfg_cn68xxp1 {
+               u64 reserved_4_63 : 60;
+               u64 gwe_poe : 1;
+               u64 gwe_fpor : 1;
+               u64 gwe_rah : 1;
+               u64 gwe_dis : 1;
+       } cn68xxp1;
+       struct cvmx_sso_gwe_cfg_cn73xx {
+               u64 reserved_9_63 : 55;
+               u64 dis_wgt_credit : 1;
+               u64 ws_retries : 8;
+       } cn73xx;
+       struct cvmx_sso_gwe_cfg_cn73xx cn78xx;
+       struct cvmx_sso_gwe_cfg_cn73xx cn78xxp1;
+       struct cvmx_sso_gwe_cfg_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_gwe_cfg cvmx_sso_gwe_cfg_t;
+
+/**
+ * cvmx_sso_gwe_random
+ *
+ * This register contains the random search start position for the get-work examiner (GWE).
+ *
+ */
+union cvmx_sso_gwe_random {
+       u64 u64;
+       struct cvmx_sso_gwe_random_s {
+               u64 reserved_16_63 : 48;
+               u64 rnd : 16;
+       } s;
+       struct cvmx_sso_gwe_random_s cn73xx;
+       struct cvmx_sso_gwe_random_s cn78xx;
+       struct cvmx_sso_gwe_random_s cn78xxp1;
+       struct cvmx_sso_gwe_random_s cnf75xx;
+};
+
+typedef union cvmx_sso_gwe_random cvmx_sso_gwe_random_t;
+
+/**
+ * cvmx_sso_idx_ecc_ctl
+ *
+ * SSO_IDX_ECC_CTL = SSO IDX ECC Control
+ *
+ */
+union cvmx_sso_idx_ecc_ctl {
+       u64 u64;
+       struct cvmx_sso_idx_ecc_ctl_s {
+               u64 reserved_3_63 : 61;
+               u64 flip_synd : 2;
+               u64 ecc_ena : 1;
+       } s;
+       struct cvmx_sso_idx_ecc_ctl_s cn68xx;
+       struct cvmx_sso_idx_ecc_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_sso_idx_ecc_ctl cvmx_sso_idx_ecc_ctl_t;
+
+/**
+ * cvmx_sso_idx_ecc_st
+ *
+ * SSO_IDX_ECC_ST = SSO IDX ECC Status
+ *
+ */
+union cvmx_sso_idx_ecc_st {
+       u64 u64;
+       struct cvmx_sso_idx_ecc_st_s {
+               u64 reserved_27_63 : 37;
+               u64 addr : 11;
+               u64 reserved_9_15 : 7;
+               u64 syndrom : 5;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_sso_idx_ecc_st_s cn68xx;
+       struct cvmx_sso_idx_ecc_st_s cn68xxp1;
+};
+
+typedef union cvmx_sso_idx_ecc_st cvmx_sso_idx_ecc_st_t;
+
+/**
+ * cvmx_sso_ient#_links
+ *
+ * Returns unit memory status for an index.
+ *
+ */
+union cvmx_sso_ientx_links {
+       u64 u64;
+       struct cvmx_sso_ientx_links_s {
+               u64 reserved_28_63 : 36;
+               u64 prev_index : 12;
+               u64 reserved_0_15 : 16;
+       } s;
+       struct cvmx_sso_ientx_links_cn73xx {
+               u64 reserved_26_63 : 38;
+               u64 prev_index : 10;
+               u64 reserved_11_15 : 5;
+               u64 next_index_vld : 1;
+               u64 next_index : 10;
+       } cn73xx;
+       struct cvmx_sso_ientx_links_cn78xx {
+               u64 reserved_28_63 : 36;
+               u64 prev_index : 12;
+               u64 reserved_13_15 : 3;
+               u64 next_index_vld : 1;
+               u64 next_index : 12;
+       } cn78xx;
+       struct cvmx_sso_ientx_links_cn78xx cn78xxp1;
+       struct cvmx_sso_ientx_links_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_ientx_links cvmx_sso_ientx_links_t;
+
+/**
+ * cvmx_sso_ient#_pendtag
+ *
+ * Returns unit memory status for an index.
+ *
+ */
+union cvmx_sso_ientx_pendtag {
+       u64 u64;
+       struct cvmx_sso_ientx_pendtag_s {
+               u64 reserved_38_63 : 26;
+               u64 pend_switch : 1;
+               u64 reserved_34_36 : 3;
+               u64 pend_tt : 2;
+               u64 pend_tag : 32;
+       } s;
+       struct cvmx_sso_ientx_pendtag_s cn73xx;
+       struct cvmx_sso_ientx_pendtag_s cn78xx;
+       struct cvmx_sso_ientx_pendtag_s cn78xxp1;
+       struct cvmx_sso_ientx_pendtag_s cnf75xx;
+};
+
+typedef union cvmx_sso_ientx_pendtag cvmx_sso_ientx_pendtag_t;
+
+/**
+ * cvmx_sso_ient#_qlinks
+ *
+ * Returns unit memory status for an index.
+ *
+ */
+union cvmx_sso_ientx_qlinks {
+       u64 u64;
+       struct cvmx_sso_ientx_qlinks_s {
+               u64 reserved_12_63 : 52;
+               u64 next_index : 12;
+       } s;
+       struct cvmx_sso_ientx_qlinks_s cn73xx;
+       struct cvmx_sso_ientx_qlinks_s cn78xx;
+       struct cvmx_sso_ientx_qlinks_s cn78xxp1;
+       struct cvmx_sso_ientx_qlinks_s cnf75xx;
+};
+
+typedef union cvmx_sso_ientx_qlinks cvmx_sso_ientx_qlinks_t;
+
+/**
+ * cvmx_sso_ient#_tag
+ *
+ * Returns unit memory status for an index.
+ *
+ */
+union cvmx_sso_ientx_tag {
+       u64 u64;
+       struct cvmx_sso_ientx_tag_s {
+               u64 reserved_39_63 : 25;
+               u64 tailc : 1;
+               u64 tail : 1;
+               u64 reserved_34_36 : 3;
+               u64 tt : 2;
+               u64 tag : 32;
+       } s;
+       struct cvmx_sso_ientx_tag_s cn73xx;
+       struct cvmx_sso_ientx_tag_s cn78xx;
+       struct cvmx_sso_ientx_tag_s cn78xxp1;
+       struct cvmx_sso_ientx_tag_s cnf75xx;
+};
+
+typedef union cvmx_sso_ientx_tag cvmx_sso_ientx_tag_t;
+
+/**
+ * cvmx_sso_ient#_wqpgrp
+ *
+ * Returns unit memory status for an index.
+ *
+ */
+union cvmx_sso_ientx_wqpgrp {
+       u64 u64;
+       struct cvmx_sso_ientx_wqpgrp_s {
+               u64 reserved_62_63 : 2;
+               u64 head : 1;
+               u64 nosched : 1;
+               u64 reserved_58_59 : 2;
+               u64 grp : 10;
+               u64 reserved_42_47 : 6;
+               u64 wqp : 42;
+       } s;
+       struct cvmx_sso_ientx_wqpgrp_cn73xx {
+               u64 reserved_62_63 : 2;
+               u64 head : 1;
+               u64 nosched : 1;
+               u64 reserved_56_59 : 4;
+               u64 grp : 8;
+               u64 reserved_42_47 : 6;
+               u64 wqp : 42;
+       } cn73xx;
+       struct cvmx_sso_ientx_wqpgrp_s cn78xx;
+       struct cvmx_sso_ientx_wqpgrp_s cn78xxp1;
+       struct cvmx_sso_ientx_wqpgrp_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_ientx_wqpgrp cvmx_sso_ientx_wqpgrp_t;
+
+/**
+ * cvmx_sso_ipl_conf#
+ *
+ * Returns list status for the conflicted list indexed by group.  Register
+ * fields are identical to those in SSO_IPL_IAQ() above.
+ */
+union cvmx_sso_ipl_confx {
+       u64 u64;
+       struct cvmx_sso_ipl_confx_s {
+               u64 reserved_28_63 : 36;
+               u64 queue_val : 1;
+               u64 queue_one : 1;
+               u64 reserved_25_25 : 1;
+               u64 queue_head : 12;
+               u64 reserved_12_12 : 1;
+               u64 queue_tail : 12;
+       } s;
+       struct cvmx_sso_ipl_confx_s cn73xx;
+       struct cvmx_sso_ipl_confx_s cn78xx;
+       struct cvmx_sso_ipl_confx_s cn78xxp1;
+       struct cvmx_sso_ipl_confx_s cnf75xx;
+};
+
+typedef union cvmx_sso_ipl_confx cvmx_sso_ipl_confx_t;
+
+/**
+ * cvmx_sso_ipl_desched#
+ *
+ * Returns list status for the deschedule list indexed by group.  Register
+ * fields are identical to those in SSO_IPL_IAQ() above.
+ */
+union cvmx_sso_ipl_deschedx {
+       u64 u64;
+       struct cvmx_sso_ipl_deschedx_s {
+               u64 reserved_28_63 : 36;
+               u64 queue_val : 1;
+               u64 queue_one : 1;
+               u64 reserved_25_25 : 1;
+               u64 queue_head : 12;
+               u64 reserved_12_12 : 1;
+               u64 queue_tail : 12;
+       } s;
+       struct cvmx_sso_ipl_deschedx_s cn73xx;
+       struct cvmx_sso_ipl_deschedx_s cn78xx;
+       struct cvmx_sso_ipl_deschedx_s cn78xxp1;
+       struct cvmx_sso_ipl_deschedx_s cnf75xx;
+};
+
+typedef union cvmx_sso_ipl_deschedx cvmx_sso_ipl_deschedx_t;
+
+/**
+ * cvmx_sso_ipl_free#
+ *
+ * Returns list status.
+ *
+ */
+union cvmx_sso_ipl_freex {
+       u64 u64;
+       struct cvmx_sso_ipl_freex_s {
+               u64 reserved_62_63 : 2;
+               u64 qnum_head : 3;
+               u64 qnum_tail : 3;
+               u64 reserved_28_55 : 28;
+               u64 queue_val : 1;
+               u64 reserved_25_26 : 2;
+               u64 queue_head : 12;
+               u64 reserved_12_12 : 1;
+               u64 queue_tail : 12;
+       } s;
+       struct cvmx_sso_ipl_freex_cn73xx {
+               u64 reserved_62_63 : 2;
+               u64 qnum_head : 3;
+               u64 qnum_tail : 3;
+               u64 reserved_28_55 : 28;
+               u64 queue_val : 1;
+               u64 reserved_23_26 : 4;
+               u64 queue_head : 10;
+               u64 reserved_10_12 : 3;
+               u64 queue_tail : 10;
+       } cn73xx;
+       struct cvmx_sso_ipl_freex_s cn78xx;
+       struct cvmx_sso_ipl_freex_s cn78xxp1;
+       struct cvmx_sso_ipl_freex_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_ipl_freex cvmx_sso_ipl_freex_t;
+
+/**
+ * cvmx_sso_ipl_iaq#
+ *
+ * Returns list status for the internal admission queue indexed by group.
+ *
+ */
+union cvmx_sso_ipl_iaqx {
+       u64 u64;
+       struct cvmx_sso_ipl_iaqx_s {
+               u64 reserved_28_63 : 36;
+               u64 queue_val : 1;
+               u64 queue_one : 1;
+               u64 reserved_25_25 : 1;
+               u64 queue_head : 12;
+               u64 reserved_12_12 : 1;
+               u64 queue_tail : 12;
+       } s;
+       struct cvmx_sso_ipl_iaqx_s cn73xx;
+       struct cvmx_sso_ipl_iaqx_s cn78xx;
+       struct cvmx_sso_ipl_iaqx_s cn78xxp1;
+       struct cvmx_sso_ipl_iaqx_s cnf75xx;
+};
+
+typedef union cvmx_sso_ipl_iaqx cvmx_sso_ipl_iaqx_t;
+
+/**
+ * cvmx_sso_iq_cnt#
+ *
+ * CSR reserved addresses: (64): 0x8200..0x83f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_IQ_CNTX = SSO Input Queue Count Register
+ *               (one per QOS level)
+ *
+ * Contains a read-only count of the number of work queue entries for each QOS
+ * level. Counts both in-unit and in-memory entries.
+ */
+union cvmx_sso_iq_cntx {
+       u64 u64;
+       struct cvmx_sso_iq_cntx_s {
+               u64 reserved_32_63 : 32;
+               u64 iq_cnt : 32;
+       } s;
+       struct cvmx_sso_iq_cntx_s cn68xx;
+       struct cvmx_sso_iq_cntx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_iq_cntx cvmx_sso_iq_cntx_t;
+
+/**
+ * cvmx_sso_iq_com_cnt
+ *
+ * SSO_IQ_COM_CNT = SSO Input Queue Combined Count Register
+ *
+ * Contains a read-only count of the total number of work queue entries in all
+ * QOS levels.  Counts both in-unit and in-memory entries.
+ */
+union cvmx_sso_iq_com_cnt {
+       u64 u64;
+       struct cvmx_sso_iq_com_cnt_s {
+               u64 reserved_32_63 : 32;
+               u64 iq_cnt : 32;
+       } s;
+       struct cvmx_sso_iq_com_cnt_s cn68xx;
+       struct cvmx_sso_iq_com_cnt_s cn68xxp1;
+};
+
+typedef union cvmx_sso_iq_com_cnt cvmx_sso_iq_com_cnt_t;
+
+/**
+ * cvmx_sso_iq_int
+ *
+ * SSO_IQ_INT = SSO Input Queue Interrupt Register
+ *
+ * Contains the bits (one per QOS level) that can trigger the input queue
+ * interrupt.  An IQ_INT bit will be set if SSO_IQ_CNT#QOS# changes and the
+ * resulting value is equal to SSO_IQ_THR#QOS#.
+ */
+union cvmx_sso_iq_int {
+       u64 u64;
+       struct cvmx_sso_iq_int_s {
+               u64 reserved_8_63 : 56;
+               u64 iq_int : 8;
+       } s;
+       struct cvmx_sso_iq_int_s cn68xx;
+       struct cvmx_sso_iq_int_s cn68xxp1;
+};
+
+typedef union cvmx_sso_iq_int cvmx_sso_iq_int_t;
+
+/**
+ * cvmx_sso_iq_int_en
+ *
+ * SSO_IQ_INT_EN = SSO Input Queue Interrupt Enable Register
+ *
+ * Contains the bits (one per QOS level) that enable the input queue interrupt.
+ */
+union cvmx_sso_iq_int_en {
+       u64 u64;
+       struct cvmx_sso_iq_int_en_s {
+               u64 reserved_8_63 : 56;
+               u64 int_en : 8;
+       } s;
+       struct cvmx_sso_iq_int_en_s cn68xx;
+       struct cvmx_sso_iq_int_en_s cn68xxp1;
+};
+
+typedef union cvmx_sso_iq_int_en cvmx_sso_iq_int_en_t;
+
+/**
+ * cvmx_sso_iq_thr#
+ *
+ * CSR reserved addresses: (24): 0x9040..0x90f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_IQ_THRX = SSO Input Queue Threshold Register
+ *               (one per QOS level)
+ *
+ * Threshold value for triggering input queue interrupts.
+ */
+union cvmx_sso_iq_thrx {
+       u64 u64;
+       struct cvmx_sso_iq_thrx_s {
+               u64 reserved_32_63 : 32;
+               u64 iq_thr : 32;
+       } s;
+       struct cvmx_sso_iq_thrx_s cn68xx;
+       struct cvmx_sso_iq_thrx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_iq_thrx cvmx_sso_iq_thrx_t;
+
+/**
+ * cvmx_sso_nos_cnt
+ *
+ * Contains the number of work-queue entries on the no-schedule list.
+ *
+ */
+union cvmx_sso_nos_cnt {
+       u64 u64;
+       struct cvmx_sso_nos_cnt_s {
+               u64 reserved_13_63 : 51;
+               u64 nos_cnt : 13;
+       } s;
+       struct cvmx_sso_nos_cnt_cn68xx {
+               u64 reserved_12_63 : 52;
+               u64 nos_cnt : 12;
+       } cn68xx;
+       struct cvmx_sso_nos_cnt_cn68xx cn68xxp1;
+       struct cvmx_sso_nos_cnt_s cn73xx;
+       struct cvmx_sso_nos_cnt_s cn78xx;
+       struct cvmx_sso_nos_cnt_s cn78xxp1;
+       struct cvmx_sso_nos_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sso_nos_cnt cvmx_sso_nos_cnt_t;
+
+/**
+ * cvmx_sso_nw_tim
+ *
+ * Sets the minimum period for a new-work-request timeout. The period is specified in n-1
+ * notation, with the increment value of 1024 clock cycles. Thus, a value of 0x0 in this register
+ * translates to 1024 cycles, 0x1 translates to 2048 cycles, 0x2 translates to 3072 cycles, etc.
+ */
+union cvmx_sso_nw_tim {
+       u64 u64;
+       struct cvmx_sso_nw_tim_s {
+               u64 reserved_10_63 : 54;
+               u64 nw_tim : 10;
+       } s;
+       struct cvmx_sso_nw_tim_s cn68xx;
+       struct cvmx_sso_nw_tim_s cn68xxp1;
+       struct cvmx_sso_nw_tim_s cn73xx;
+       struct cvmx_sso_nw_tim_s cn78xx;
+       struct cvmx_sso_nw_tim_s cn78xxp1;
+       struct cvmx_sso_nw_tim_s cnf75xx;
+};
+
+typedef union cvmx_sso_nw_tim cvmx_sso_nw_tim_t;
+
+/**
+ * cvmx_sso_oth_ecc_ctl
+ *
+ * SSO_OTH_ECC_CTL = SSO OTH ECC Control
+ *
+ */
+union cvmx_sso_oth_ecc_ctl {
+       u64 u64;
+       struct cvmx_sso_oth_ecc_ctl_s {
+               u64 reserved_6_63 : 58;
+               u64 flip_synd1 : 2;
+               u64 ecc_ena1 : 1;
+               u64 flip_synd0 : 2;
+               u64 ecc_ena0 : 1;
+       } s;
+       struct cvmx_sso_oth_ecc_ctl_s cn68xx;
+       struct cvmx_sso_oth_ecc_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_sso_oth_ecc_ctl cvmx_sso_oth_ecc_ctl_t;
+
+/**
+ * cvmx_sso_oth_ecc_st
+ *
+ * SSO_OTH_ECC_ST = SSO OTH ECC Status
+ *
+ */
+union cvmx_sso_oth_ecc_st {
+       u64 u64;
+       struct cvmx_sso_oth_ecc_st_s {
+               u64 reserved_59_63 : 5;
+               u64 addr1 : 11;
+               u64 reserved_43_47 : 5;
+               u64 syndrom1 : 7;
+               u64 reserved_27_35 : 9;
+               u64 addr0 : 11;
+               u64 reserved_11_15 : 5;
+               u64 syndrom0 : 7;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_sso_oth_ecc_st_s cn68xx;
+       struct cvmx_sso_oth_ecc_st_s cn68xxp1;
+};
+
+typedef union cvmx_sso_oth_ecc_st cvmx_sso_oth_ecc_st_t;
+
+/**
+ * cvmx_sso_page_cnt
+ */
+union cvmx_sso_page_cnt {
+       u64 u64;
+       struct cvmx_sso_page_cnt_s {
+               u64 reserved_32_63 : 32;
+               u64 cnt : 32;
+       } s;
+       struct cvmx_sso_page_cnt_s cn73xx;
+       struct cvmx_sso_page_cnt_s cn78xx;
+       struct cvmx_sso_page_cnt_s cn78xxp1;
+       struct cvmx_sso_page_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sso_page_cnt cvmx_sso_page_cnt_t;
+
+/**
+ * cvmx_sso_pnd_ecc_ctl
+ *
+ * SSO_PND_ECC_CTL = SSO PND ECC Control
+ *
+ */
+union cvmx_sso_pnd_ecc_ctl {
+       u64 u64;
+       struct cvmx_sso_pnd_ecc_ctl_s {
+               u64 reserved_6_63 : 58;
+               u64 flip_synd1 : 2;
+               u64 ecc_ena1 : 1;
+               u64 flip_synd0 : 2;
+               u64 ecc_ena0 : 1;
+       } s;
+       struct cvmx_sso_pnd_ecc_ctl_s cn68xx;
+       struct cvmx_sso_pnd_ecc_ctl_s cn68xxp1;
+};
+
+typedef union cvmx_sso_pnd_ecc_ctl cvmx_sso_pnd_ecc_ctl_t;
+
+/**
+ * cvmx_sso_pnd_ecc_st
+ *
+ * SSO_PND_ECC_ST = SSO PND ECC Status
+ *
+ */
+union cvmx_sso_pnd_ecc_st {
+       u64 u64;
+       struct cvmx_sso_pnd_ecc_st_s {
+               u64 reserved_59_63 : 5;
+               u64 addr1 : 11;
+               u64 reserved_43_47 : 5;
+               u64 syndrom1 : 7;
+               u64 reserved_27_35 : 9;
+               u64 addr0 : 11;
+               u64 reserved_11_15 : 5;
+               u64 syndrom0 : 7;
+               u64 reserved_0_3 : 4;
+       } s;
+       struct cvmx_sso_pnd_ecc_st_s cn68xx;
+       struct cvmx_sso_pnd_ecc_st_s cn68xxp1;
+};
+
+typedef union cvmx_sso_pnd_ecc_st cvmx_sso_pnd_ecc_st_t;
+
+/**
+ * cvmx_sso_pp#_arb
+ *
+ * For diagnostic use, returns the group affinity arbitration state for each core.
+ *
+ */
+union cvmx_sso_ppx_arb {
+       u64 u64;
+       struct cvmx_sso_ppx_arb_s {
+               u64 reserved_20_63 : 44;
+               u64 aff_left : 4;
+               u64 reserved_8_15 : 8;
+               u64 last_grp : 8;
+       } s;
+       struct cvmx_sso_ppx_arb_s cn73xx;
+       struct cvmx_sso_ppx_arb_s cn78xx;
+       struct cvmx_sso_ppx_arb_s cn78xxp1;
+       struct cvmx_sso_ppx_arb_s cnf75xx;
+};
+
+typedef union cvmx_sso_ppx_arb cvmx_sso_ppx_arb_t;
+
+/**
+ * cvmx_sso_pp#_grp_msk
+ *
+ * CSR reserved addresses: (24): 0x5040..0x50f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_PPX_GRP_MSK = SSO PP Group Mask Register
+ *                   (one bit per group per PP)
+ *
+ * Selects which group(s) a PP belongs to.  A '1' in any bit position sets the
+ * PP's membership in the corresponding group.  A value of 0x0 will prevent the
+ * PP from receiving new work.
+ *
+ * Note that these do not contain QOS level priorities for each PP.  This is a
+ * change from previous POW designs.
+ */
+union cvmx_sso_ppx_grp_msk {
+       u64 u64;
+       struct cvmx_sso_ppx_grp_msk_s {
+               u64 grp_msk : 64;
+       } s;
+       struct cvmx_sso_ppx_grp_msk_s cn68xx;
+       struct cvmx_sso_ppx_grp_msk_s cn68xxp1;
+};
+
+typedef union cvmx_sso_ppx_grp_msk cvmx_sso_ppx_grp_msk_t;
+
+/**
+ * cvmx_sso_pp#_qos_pri
+ *
+ * CSR reserved addresses: (56): 0x2040..0x21f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_PP(0..31)_QOS_PRI = SSO PP QOS Priority Register
+ *                                (one field per IQ per PP)
+ *
+ * Contains the QOS level priorities for each PP.
+ *      0x0       is the highest priority
+ *      0x7       is the lowest priority
+ *      0xf       prevents the PP from receiving work from that QOS level
+ *      0x8-0xe   Reserved
+ *
+ * For a given PP, priorities should begin at 0x0, and remain contiguous
+ * throughout the range.  Failure to do so may result in severe
+ * performance degradation.
+ *
+ *
+ * Priorities for IQs 0..7
+ */
+union cvmx_sso_ppx_qos_pri {
+       u64 u64;
+       struct cvmx_sso_ppx_qos_pri_s {
+               u64 reserved_60_63 : 4;
+               u64 qos7_pri : 4;
+               u64 reserved_52_55 : 4;
+               u64 qos6_pri : 4;
+               u64 reserved_44_47 : 4;
+               u64 qos5_pri : 4;
+               u64 reserved_36_39 : 4;
+               u64 qos4_pri : 4;
+               u64 reserved_28_31 : 4;
+               u64 qos3_pri : 4;
+               u64 reserved_20_23 : 4;
+               u64 qos2_pri : 4;
+               u64 reserved_12_15 : 4;
+               u64 qos1_pri : 4;
+               u64 reserved_4_7 : 4;
+               u64 qos0_pri : 4;
+       } s;
+       struct cvmx_sso_ppx_qos_pri_s cn68xx;
+       struct cvmx_sso_ppx_qos_pri_s cn68xxp1;
+};
+
+typedef union cvmx_sso_ppx_qos_pri cvmx_sso_ppx_qos_pri_t;
+
+/**
+ * cvmx_sso_pp#_s#_grpmsk#
+ *
+ * These registers select which group or groups a core belongs to. There are 2 sets of masks per
+ * core, each with 1 register corresponding to 64 groups.
+ */
+union cvmx_sso_ppx_sx_grpmskx {
+       u64 u64;
+       struct cvmx_sso_ppx_sx_grpmskx_s {
+               u64 grp_msk : 64;
+       } s;
+       struct cvmx_sso_ppx_sx_grpmskx_s cn73xx;
+       struct cvmx_sso_ppx_sx_grpmskx_s cn78xx;
+       struct cvmx_sso_ppx_sx_grpmskx_s cn78xxp1;
+       struct cvmx_sso_ppx_sx_grpmskx_s cnf75xx;
+};
+
+typedef union cvmx_sso_ppx_sx_grpmskx cvmx_sso_ppx_sx_grpmskx_t;
+
+/**
+ * cvmx_sso_pp_strict
+ *
+ * SSO_PP_STRICT = SSO Strict Priority
+ *
+ * This register controls getting work from the input queues.  If the bit
+ * corresponding to a PP is set, that PP will not take work off the input
+ * queues until it is known that there is no higher-priority work available.
+ *
+ * Setting SSO_PP_STRICT may incur a performance penalty if highest-priority
+ * work is not found early.
+ *
+ * It is possible to starve a PP of work with SSO_PP_STRICT.  If the
+ * SSO_PPX_GRP_MSK for a PP masks-out much of the work added to the input
+ * queues that are higher-priority for that PP, and if there is a constant
+ * stream of work through one or more of those higher-priority input queues,
+ * then that PP may not accept work from lower-priority input queues.  This can
+ * be alleviated by ensuring that most or all the work added to the
+ * higher-priority input queues for a PP with SSO_PP_STRICT set are in a group
+ * acceptable to that PP.
+ *
+ * It is also possible to neglect work in an input queue if SSO_PP_STRICT is
+ * used.  If an input queue is a lower-priority queue for all PPs, and if all
+ * the PPs have their corresponding bit in SSO_PP_STRICT set, then work may
+ * never be taken (or be seldom taken) from that queue.  This can be alleviated
+ * by ensuring that work in all input queues can be serviced by one or more PPs
+ * that do not have SSO_PP_STRICT set, or that the input queue is the
+ * highest-priority input queue for one or more PPs that do have SSO_PP_STRICT
+ * set.
+ */
+union cvmx_sso_pp_strict {
+       u64 u64;
+       struct cvmx_sso_pp_strict_s {
+               u64 reserved_32_63 : 32;
+               u64 pp_strict : 32;
+       } s;
+       struct cvmx_sso_pp_strict_s cn68xx;
+       struct cvmx_sso_pp_strict_s cn68xxp1;
+};
+
+typedef union cvmx_sso_pp_strict cvmx_sso_pp_strict_t;
+
+/**
+ * cvmx_sso_qos#_rnd
+ *
+ * CSR align addresses: ===========================================================================================================
+ * SSO_QOS(0..7)_RND = SSO QOS Issue Round Register
+ *                (one per IQ)
+ *
+ * The number of arbitration rounds each QOS level participates in.
+ */
+union cvmx_sso_qosx_rnd {
+       u64 u64;
+       struct cvmx_sso_qosx_rnd_s {
+               u64 reserved_8_63 : 56;
+               u64 rnds_qos : 8;
+       } s;
+       struct cvmx_sso_qosx_rnd_s cn68xx;
+       struct cvmx_sso_qosx_rnd_s cn68xxp1;
+};
+
+typedef union cvmx_sso_qosx_rnd cvmx_sso_qosx_rnd_t;
+
+/**
+ * cvmx_sso_qos_thr#
+ *
+ * CSR reserved addresses: (24): 0xa040..0xa0f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_QOS_THRX = SSO QOS Threshold Register
+ *                (one per QOS level)
+ *
+ * Contains the thresholds for allocating SSO internal storage buffers.  If the
+ * number of remaining free buffers drops below the minimum threshold (MIN_THR)
+ * or the number of allocated buffers for this QOS level rises above the
+ * maximum threshold (MAX_THR), future incoming work queue entries will be
+ * buffered externally rather than internally.  This register also contains the
+ * number of internal buffers currently allocated to this QOS level (BUF_CNT).
+ */
+union cvmx_sso_qos_thrx {
+       u64 u64;
+       struct cvmx_sso_qos_thrx_s {
+               u64 reserved_40_63 : 24;
+               u64 buf_cnt : 12;
+               u64 reserved_26_27 : 2;
+               u64 max_thr : 12;
+               u64 reserved_12_13 : 2;
+               u64 min_thr : 12;
+       } s;
+       struct cvmx_sso_qos_thrx_s cn68xx;
+       struct cvmx_sso_qos_thrx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_qos_thrx cvmx_sso_qos_thrx_t;
+
+/**
+ * cvmx_sso_qos_we
+ *
+ * SSO_QOS_WE = SSO WE Buffers
+ *
+ * This register contains a read-only count of the current number of free
+ * buffers (FREE_CNT) and the total number of tag chain heads on the de-schedule list
+ * (DES_CNT) (which is not the same as the total number of entries on all of the descheduled
+ * tag chains.)
+ */
+union cvmx_sso_qos_we {
+       u64 u64;
+       struct cvmx_sso_qos_we_s {
+               u64 reserved_26_63 : 38;
+               u64 des_cnt : 12;
+               u64 reserved_12_13 : 2;
+               u64 free_cnt : 12;
+       } s;
+       struct cvmx_sso_qos_we_s cn68xx;
+       struct cvmx_sso_qos_we_s cn68xxp1;
+};
+
+typedef union cvmx_sso_qos_we cvmx_sso_qos_we_t;
+
+/**
+ * cvmx_sso_reset
+ *
+ * Writing a 1 to SSO_RESET[RESET] resets the SSO. After receiving a store to this CSR, the SSO
+ * must not be sent any other operations for 2500 coprocessor (SCLK) cycles. Note that the
+ * contents of this register are reset along with the rest of the SSO.
+ */
+union cvmx_sso_reset {
+       u64 u64;
+       struct cvmx_sso_reset_s {
+               u64 busy : 1;
+               u64 reserved_1_62 : 62;
+               u64 reset : 1;
+       } s;
+       struct cvmx_sso_reset_cn68xx {
+               u64 reserved_1_63 : 63;
+               u64 reset : 1;
+       } cn68xx;
+       struct cvmx_sso_reset_s cn73xx;
+       struct cvmx_sso_reset_s cn78xx;
+       struct cvmx_sso_reset_s cn78xxp1;
+       struct cvmx_sso_reset_s cnf75xx;
+};
+
+typedef union cvmx_sso_reset cvmx_sso_reset_t;
+
+/**
+ * cvmx_sso_rwq_head_ptr#
+ *
+ * CSR reserved addresses: (24): 0xb040..0xb0f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_RWQ_HEAD_PTRX = SSO Remote Queue Head Register
+ *                (one per QOS level)
+ * Contains the ptr to the first entry of the remote linked list(s) for a particular
+ * QoS level. SW should initialize the remote linked list(s) by programming
+ * SSO_RWQ_HEAD_PTRX and SSO_RWQ_TAIL_PTRX to identical values.
+ */
+union cvmx_sso_rwq_head_ptrx {
+       u64 u64;
+       struct cvmx_sso_rwq_head_ptrx_s {
+               u64 reserved_38_63 : 26;
+               u64 ptr : 31;
+               u64 reserved_5_6 : 2;
+               u64 rctr : 5;
+       } s;
+       struct cvmx_sso_rwq_head_ptrx_s cn68xx;
+       struct cvmx_sso_rwq_head_ptrx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_rwq_head_ptrx cvmx_sso_rwq_head_ptrx_t;
+
+/**
+ * cvmx_sso_rwq_pop_fptr
+ *
+ * SSO_RWQ_POP_FPTR = SSO Pop Free Pointer
+ *
+ * This register is used by SW to remove pointers for buffer-reallocation and diagnostics, and
+ * should only be used when SSO is idle.
+ *
+ * To remove ALL pointers, software must insure that there are modulus 16
+ * pointers in the FPA.  To do this, SSO_CFG.RWQ_BYP_DIS must be set, the FPA
+ * pointer count read, and enough fake buffers pushed via SSO_RWQ_PSH_FPTR to
+ * bring the FPA pointer count up to mod 16.
+ */
+union cvmx_sso_rwq_pop_fptr {
+       u64 u64;
+       struct cvmx_sso_rwq_pop_fptr_s {
+               u64 val : 1;
+               u64 reserved_38_62 : 25;
+               u64 fptr : 31;
+               u64 reserved_0_6 : 7;
+       } s;
+       struct cvmx_sso_rwq_pop_fptr_s cn68xx;
+       struct cvmx_sso_rwq_pop_fptr_s cn68xxp1;
+};
+
+typedef union cvmx_sso_rwq_pop_fptr cvmx_sso_rwq_pop_fptr_t;
+
+/**
+ * cvmx_sso_rwq_psh_fptr
+ *
+ * CSR reserved addresses: (56): 0xc240..0xc3f8
+ * SSO_RWQ_PSH_FPTR = SSO Free Pointer FIFO
+ *
+ * This register is used by SW to initialize the SSO with a pool of free
+ * pointers by writing the FPTR field whenever FULL = 0. Free pointers are
+ * fetched/released from/to the pool when accessing WQE entries stored remotely
+ * (in remote linked lists).  Free pointers should be 128 byte aligned, each of
+ * 256 bytes. This register should only be used when SSO is idle.
+ *
+ * Software needs to set aside buffering for
+ *      8 + 48 + ROUNDUP(N/26)
+ *
+ * where as many as N DRAM work queue entries may be used.  The first 8 buffers
+ * are used to setup the SSO_RWQ_HEAD_PTR and SSO_RWQ_TAIL_PTRs, and the
+ * remainder are pushed via this register.
+ *
+ * IMPLEMENTATION NOTES--NOT FOR SPEC:
+ *      48 avoids false out of buffer error due to (16) FPA and in-sso FPA buffering (32)
+ *      26 is number of WAE's per 256B buffer
+ */
+union cvmx_sso_rwq_psh_fptr {
+       u64 u64;
+       struct cvmx_sso_rwq_psh_fptr_s {
+               u64 full : 1;
+               u64 reserved_38_62 : 25;
+               u64 fptr : 31;
+               u64 reserved_0_6 : 7;
+       } s;
+       struct cvmx_sso_rwq_psh_fptr_s cn68xx;
+       struct cvmx_sso_rwq_psh_fptr_s cn68xxp1;
+};
+
+typedef union cvmx_sso_rwq_psh_fptr cvmx_sso_rwq_psh_fptr_t;
+
+/**
+ * cvmx_sso_rwq_tail_ptr#
+ *
+ * CSR reserved addresses: (56): 0xc040..0xc1f8
+ * SSO_RWQ_TAIL_PTRX = SSO Remote Queue Tail Register
+ *                (one per QOS level)
+ * Contains the ptr to the last entry of the remote linked list(s) for a particular
+ * QoS level. SW must initialize the remote linked list(s) by programming
+ * SSO_RWQ_HEAD_PTRX and SSO_RWQ_TAIL_PTRX to identical values.
+ */
+union cvmx_sso_rwq_tail_ptrx {
+       u64 u64;
+       struct cvmx_sso_rwq_tail_ptrx_s {
+               u64 reserved_38_63 : 26;
+               u64 ptr : 31;
+               u64 reserved_5_6 : 2;
+               u64 rctr : 5;
+       } s;
+       struct cvmx_sso_rwq_tail_ptrx_s cn68xx;
+       struct cvmx_sso_rwq_tail_ptrx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_rwq_tail_ptrx cvmx_sso_rwq_tail_ptrx_t;
+
+/**
+ * cvmx_sso_sl_pp#_links
+ *
+ * Returns status of each core.
+ *
+ */
+union cvmx_sso_sl_ppx_links {
+       u64 u64;
+       struct cvmx_sso_sl_ppx_links_s {
+               u64 tailc : 1;
+               u64 reserved_60_62 : 3;
+               u64 index : 12;
+               u64 reserved_38_47 : 10;
+               u64 grp : 10;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 reserved_0_25 : 26;
+       } s;
+       struct cvmx_sso_sl_ppx_links_cn73xx {
+               u64 tailc : 1;
+               u64 reserved_58_62 : 5;
+               u64 index : 10;
+               u64 reserved_36_47 : 12;
+               u64 grp : 8;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 reserved_21_25 : 5;
+               u64 revlink_index : 10;
+               u64 link_index_vld : 1;
+               u64 link_index : 10;
+       } cn73xx;
+       struct cvmx_sso_sl_ppx_links_cn78xx {
+               u64 tailc : 1;
+               u64 reserved_60_62 : 3;
+               u64 index : 12;
+               u64 reserved_38_47 : 10;
+               u64 grp : 10;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 reserved_25_25 : 1;
+               u64 revlink_index : 12;
+               u64 link_index_vld : 1;
+               u64 link_index : 12;
+       } cn78xx;
+       struct cvmx_sso_sl_ppx_links_cn78xx cn78xxp1;
+       struct cvmx_sso_sl_ppx_links_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_sl_ppx_links cvmx_sso_sl_ppx_links_t;
+
+/**
+ * cvmx_sso_sl_pp#_pendtag
+ *
+ * Returns status of each core.
+ *
+ */
+union cvmx_sso_sl_ppx_pendtag {
+       u64 u64;
+       struct cvmx_sso_sl_ppx_pendtag_s {
+               u64 pend_switch : 1;
+               u64 pend_get_work : 1;
+               u64 pend_get_work_wait : 1;
+               u64 pend_nosched : 1;
+               u64 pend_nosched_clr : 1;
+               u64 pend_desched : 1;
+               u64 pend_alloc_we : 1;
+               u64 pend_gw_insert : 1;
+               u64 reserved_34_55 : 22;
+               u64 pend_tt : 2;
+               u64 pend_tag : 32;
+       } s;
+       struct cvmx_sso_sl_ppx_pendtag_s cn73xx;
+       struct cvmx_sso_sl_ppx_pendtag_s cn78xx;
+       struct cvmx_sso_sl_ppx_pendtag_s cn78xxp1;
+       struct cvmx_sso_sl_ppx_pendtag_s cnf75xx;
+};
+
+typedef union cvmx_sso_sl_ppx_pendtag cvmx_sso_sl_ppx_pendtag_t;
+
+/**
+ * cvmx_sso_sl_pp#_pendwqp
+ *
+ * Returns status of each core.
+ *
+ */
+union cvmx_sso_sl_ppx_pendwqp {
+       u64 u64;
+       struct cvmx_sso_sl_ppx_pendwqp_s {
+               u64 pend_switch : 1;
+               u64 pend_get_work : 1;
+               u64 pend_get_work_wait : 1;
+               u64 pend_nosched : 1;
+               u64 pend_nosched_clr : 1;
+               u64 pend_desched : 1;
+               u64 pend_alloc_we : 1;
+               u64 reserved_56_56 : 1;
+               u64 pend_index : 12;
+               u64 reserved_42_43 : 2;
+               u64 pend_wqp : 42;
+       } s;
+       struct cvmx_sso_sl_ppx_pendwqp_cn73xx {
+               u64 pend_switch : 1;
+               u64 pend_get_work : 1;
+               u64 pend_get_work_wait : 1;
+               u64 pend_nosched : 1;
+               u64 pend_nosched_clr : 1;
+               u64 pend_desched : 1;
+               u64 pend_alloc_we : 1;
+               u64 reserved_54_56 : 3;
+               u64 pend_index : 10;
+               u64 reserved_42_43 : 2;
+               u64 pend_wqp : 42;
+       } cn73xx;
+       struct cvmx_sso_sl_ppx_pendwqp_s cn78xx;
+       struct cvmx_sso_sl_ppx_pendwqp_s cn78xxp1;
+       struct cvmx_sso_sl_ppx_pendwqp_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_sl_ppx_pendwqp cvmx_sso_sl_ppx_pendwqp_t;
+
+/**
+ * cvmx_sso_sl_pp#_tag
+ *
+ * Returns status of each core.
+ *
+ */
+union cvmx_sso_sl_ppx_tag {
+       u64 u64;
+       struct cvmx_sso_sl_ppx_tag_s {
+               u64 tailc : 1;
+               u64 reserved_60_62 : 3;
+               u64 index : 12;
+               u64 reserved_46_47 : 2;
+               u64 grp : 10;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 tt : 2;
+               u64 tag : 32;
+       } s;
+       struct cvmx_sso_sl_ppx_tag_cn73xx {
+               u64 tailc : 1;
+               u64 reserved_58_62 : 5;
+               u64 index : 10;
+               u64 reserved_44_47 : 4;
+               u64 grp : 8;
+               u64 head : 1;
+               u64 tail : 1;
+               u64 tt : 2;
+               u64 tag : 32;
+       } cn73xx;
+       struct cvmx_sso_sl_ppx_tag_s cn78xx;
+       struct cvmx_sso_sl_ppx_tag_s cn78xxp1;
+       struct cvmx_sso_sl_ppx_tag_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_sl_ppx_tag cvmx_sso_sl_ppx_tag_t;
+
+/**
+ * cvmx_sso_sl_pp#_wqp
+ *
+ * Returns status of each core.
+ *
+ */
+union cvmx_sso_sl_ppx_wqp {
+       u64 u64;
+       struct cvmx_sso_sl_ppx_wqp_s {
+               u64 reserved_58_63 : 6;
+               u64 grp : 10;
+               u64 reserved_42_47 : 6;
+               u64 wqp : 42;
+       } s;
+       struct cvmx_sso_sl_ppx_wqp_cn73xx {
+               u64 reserved_56_63 : 8;
+               u64 grp : 8;
+               u64 reserved_42_47 : 6;
+               u64 wqp : 42;
+       } cn73xx;
+       struct cvmx_sso_sl_ppx_wqp_s cn78xx;
+       struct cvmx_sso_sl_ppx_wqp_s cn78xxp1;
+       struct cvmx_sso_sl_ppx_wqp_cn73xx cnf75xx;
+};
+
+typedef union cvmx_sso_sl_ppx_wqp cvmx_sso_sl_ppx_wqp_t;
+
+/**
+ * cvmx_sso_taq#_link
+ *
+ * Returns TAQ status for a given line.
+ *
+ */
+union cvmx_sso_taqx_link {
+       u64 u64;
+       struct cvmx_sso_taqx_link_s {
+               u64 reserved_11_63 : 53;
+               u64 next : 11;
+       } s;
+       struct cvmx_sso_taqx_link_s cn73xx;
+       struct cvmx_sso_taqx_link_s cn78xx;
+       struct cvmx_sso_taqx_link_s cn78xxp1;
+       struct cvmx_sso_taqx_link_s cnf75xx;
+};
+
+typedef union cvmx_sso_taqx_link cvmx_sso_taqx_link_t;
+
+/**
+ * cvmx_sso_taq#_wae#_tag
+ *
+ * Returns TAQ status for a given line and WAE within that line.
+ *
+ */
+union cvmx_sso_taqx_waex_tag {
+       u64 u64;
+       struct cvmx_sso_taqx_waex_tag_s {
+               u64 reserved_34_63 : 30;
+               u64 tt : 2;
+               u64 tag : 32;
+       } s;
+       struct cvmx_sso_taqx_waex_tag_s cn73xx;
+       struct cvmx_sso_taqx_waex_tag_s cn78xx;
+       struct cvmx_sso_taqx_waex_tag_s cn78xxp1;
+       struct cvmx_sso_taqx_waex_tag_s cnf75xx;
+};
+
+typedef union cvmx_sso_taqx_waex_tag cvmx_sso_taqx_waex_tag_t;
+
+/**
+ * cvmx_sso_taq#_wae#_wqp
+ *
+ * Returns TAQ status for a given line and WAE within that line.
+ *
+ */
+union cvmx_sso_taqx_waex_wqp {
+       u64 u64;
+       struct cvmx_sso_taqx_waex_wqp_s {
+               u64 reserved_42_63 : 22;
+               u64 wqp : 42;
+       } s;
+       struct cvmx_sso_taqx_waex_wqp_s cn73xx;
+       struct cvmx_sso_taqx_waex_wqp_s cn78xx;
+       struct cvmx_sso_taqx_waex_wqp_s cn78xxp1;
+       struct cvmx_sso_taqx_waex_wqp_s cnf75xx;
+};
+
+typedef union cvmx_sso_taqx_waex_wqp cvmx_sso_taqx_waex_wqp_t;
+
+/**
+ * cvmx_sso_taq_add
+ */
+union cvmx_sso_taq_add {
+       u64 u64;
+       struct cvmx_sso_taq_add_s {
+               u64 reserved_29_63 : 35;
+               u64 rsvd_free : 13;
+               u64 reserved_0_15 : 16;
+       } s;
+       struct cvmx_sso_taq_add_s cn73xx;
+       struct cvmx_sso_taq_add_s cn78xx;
+       struct cvmx_sso_taq_add_s cn78xxp1;
+       struct cvmx_sso_taq_add_s cnf75xx;
+};
+
+typedef union cvmx_sso_taq_add cvmx_sso_taq_add_t;
+
+/**
+ * cvmx_sso_taq_cnt
+ */
+union cvmx_sso_taq_cnt {
+       u64 u64;
+       struct cvmx_sso_taq_cnt_s {
+               u64 reserved_27_63 : 37;
+               u64 rsvd_free : 11;
+               u64 reserved_11_15 : 5;
+               u64 free_cnt : 11;
+       } s;
+       struct cvmx_sso_taq_cnt_s cn73xx;
+       struct cvmx_sso_taq_cnt_s cn78xx;
+       struct cvmx_sso_taq_cnt_s cn78xxp1;
+       struct cvmx_sso_taq_cnt_s cnf75xx;
+};
+
+typedef union cvmx_sso_taq_cnt cvmx_sso_taq_cnt_t;
+
+/**
+ * cvmx_sso_tiaq#_status
+ *
+ * Returns TAQ inbound status indexed by group.
+ *
+ */
+union cvmx_sso_tiaqx_status {
+       u64 u64;
+       struct cvmx_sso_tiaqx_status_s {
+               u64 wae_head : 4;
+               u64 wae_tail : 4;
+               u64 reserved_47_55 : 9;
+               u64 wae_used : 15;
+               u64 reserved_23_31 : 9;
+               u64 ent_head : 11;
+               u64 reserved_11_11 : 1;
+               u64 ent_tail : 11;
+       } s;
+       struct cvmx_sso_tiaqx_status_s cn73xx;
+       struct cvmx_sso_tiaqx_status_s cn78xx;
+       struct cvmx_sso_tiaqx_status_s cn78xxp1;
+       struct cvmx_sso_tiaqx_status_s cnf75xx;
+};
+
+typedef union cvmx_sso_tiaqx_status cvmx_sso_tiaqx_status_t;
+
+/**
+ * cvmx_sso_toaq#_status
+ *
+ * Returns TAQ outbound status indexed by group.
+ *
+ */
+union cvmx_sso_toaqx_status {
+       u64 u64;
+       struct cvmx_sso_toaqx_status_s {
+               u64 reserved_62_63 : 2;
+               u64 ext_vld : 1;
+               u64 partial : 1;
+               u64 wae_tail : 4;
+               u64 reserved_43_55 : 13;
+               u64 cl_used : 11;
+               u64 reserved_23_31 : 9;
+               u64 ent_head : 11;
+               u64 reserved_11_11 : 1;
+               u64 ent_tail : 11;
+       } s;
+       struct cvmx_sso_toaqx_status_s cn73xx;
+       struct cvmx_sso_toaqx_status_s cn78xx;
+       struct cvmx_sso_toaqx_status_s cn78xxp1;
+       struct cvmx_sso_toaqx_status_s cnf75xx;
+};
+
+typedef union cvmx_sso_toaqx_status cvmx_sso_toaqx_status_t;
+
+/**
+ * cvmx_sso_ts_pc
+ *
+ * SSO_TS_PC = SSO Tag Switch Performance Counter
+ *
+ * Counts the number of tag switch requests.
+ * Counter rolls over through zero when max value exceeded.
+ */
+union cvmx_sso_ts_pc {
+       u64 u64;
+       struct cvmx_sso_ts_pc_s {
+               u64 ts_pc : 64;
+       } s;
+       struct cvmx_sso_ts_pc_s cn68xx;
+       struct cvmx_sso_ts_pc_s cn68xxp1;
+};
+
+typedef union cvmx_sso_ts_pc cvmx_sso_ts_pc_t;
+
+/**
+ * cvmx_sso_wa_com_pc
+ *
+ * SSO_WA_COM_PC = SSO Work Add Combined Performance Counter
+ *
+ * Counts the number of add new work requests for all QOS levels.
+ * Counter rolls over through zero when max value exceeded.
+ */
+union cvmx_sso_wa_com_pc {
+       u64 u64;
+       struct cvmx_sso_wa_com_pc_s {
+               u64 wa_pc : 64;
+       } s;
+       struct cvmx_sso_wa_com_pc_s cn68xx;
+       struct cvmx_sso_wa_com_pc_s cn68xxp1;
+};
+
+typedef union cvmx_sso_wa_com_pc cvmx_sso_wa_com_pc_t;
+
+/**
+ * cvmx_sso_wa_pc#
+ *
+ * CSR reserved addresses: (64): 0x4200..0x43f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_WA_PCX = SSO Work Add Performance Counter
+ *             (one per QOS level)
+ *
+ * Counts the number of add new work requests for each QOS level.
+ * Counter rolls over through zero when max value exceeded.
+ */
+union cvmx_sso_wa_pcx {
+       u64 u64;
+       struct cvmx_sso_wa_pcx_s {
+               u64 wa_pc : 64;
+       } s;
+       struct cvmx_sso_wa_pcx_s cn68xx;
+       struct cvmx_sso_wa_pcx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_wa_pcx cvmx_sso_wa_pcx_t;
+
+/**
+ * cvmx_sso_wq_int
+ *
+ * Note, the old POW offsets ran from 0x0 to 0x3f8, leaving the next available slot at 0x400.
+ * To ensure no overlap, start on 4k boundary: 0x1000.
+ * SSO_WQ_INT = SSO Work Queue Interrupt Register
+ *
+ * Contains the bits (one per group) that set work queue interrupts and are
+ * used to clear these interrupts.  For more information regarding this
+ * register, see the interrupt section of the SSO spec.
+ */
+union cvmx_sso_wq_int {
+       u64 u64;
+       struct cvmx_sso_wq_int_s {
+               u64 wq_int : 64;
+       } s;
+       struct cvmx_sso_wq_int_s cn68xx;
+       struct cvmx_sso_wq_int_s cn68xxp1;
+};
+
+typedef union cvmx_sso_wq_int cvmx_sso_wq_int_t;
+
+/**
+ * cvmx_sso_wq_int_cnt#
+ *
+ * CSR reserved addresses: (64): 0x7200..0x73f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_WQ_INT_CNTX = SSO Work Queue Interrupt Count Register
+ *                   (one per group)
+ *
+ * Contains a read-only copy of the counts used to trigger work queue
+ * interrupts.  For more information regarding this register, see the interrupt
+ * section.
+ */
+union cvmx_sso_wq_int_cntx {
+       u64 u64;
+       struct cvmx_sso_wq_int_cntx_s {
+               u64 reserved_32_63 : 32;
+               u64 tc_cnt : 4;
+               u64 reserved_26_27 : 2;
+               u64 ds_cnt : 12;
+               u64 reserved_12_13 : 2;
+               u64 iq_cnt : 12;
+       } s;
+       struct cvmx_sso_wq_int_cntx_s cn68xx;
+       struct cvmx_sso_wq_int_cntx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_wq_int_cntx cvmx_sso_wq_int_cntx_t;
+
+/**
+ * cvmx_sso_wq_int_pc
+ *
+ * Contains the threshold value for the work-executable interrupt periodic counter and also a
+ * read-only copy of the periodic counter. For more information on this register, refer to
+ * Interrupts.
+ */
+union cvmx_sso_wq_int_pc {
+       u64 u64;
+       struct cvmx_sso_wq_int_pc_s {
+               u64 reserved_60_63 : 4;
+               u64 pc : 28;
+               u64 reserved_28_31 : 4;
+               u64 pc_thr : 20;
+               u64 reserved_0_7 : 8;
+       } s;
+       struct cvmx_sso_wq_int_pc_s cn68xx;
+       struct cvmx_sso_wq_int_pc_s cn68xxp1;
+       struct cvmx_sso_wq_int_pc_s cn73xx;
+       struct cvmx_sso_wq_int_pc_s cn78xx;
+       struct cvmx_sso_wq_int_pc_s cn78xxp1;
+       struct cvmx_sso_wq_int_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_wq_int_pc cvmx_sso_wq_int_pc_t;
+
+/**
+ * cvmx_sso_wq_int_thr#
+ *
+ * CSR reserved addresses: (96): 0x6100..0x63f8
+ * CSR align addresses: ===========================================================================================================
+ * SSO_WQ_INT_THR(0..63) = SSO Work Queue Interrupt Threshold Registers
+ *                         (one per group)
+ *
+ * Contains the thresholds for enabling and setting work queue interrupts.  For
+ * more information, see the interrupt section.
+ *
+ * Note: Up to 16 of the SSO's internal storage buffers can be allocated
+ * for hardware use and are therefore not available for incoming work queue
+ * entries.  Additionally, any WS that is not in the EMPTY state consumes a
+ * buffer.  Thus in a 32 PP system, it is not advisable to set either IQ_THR or
+ * DS_THR to greater than 2048 - 16 - 32*2 = 1968.  Doing so may prevent the
+ * interrupt from ever triggering.
+ *
+ * Priorities for QOS levels 0..7
+ */
+union cvmx_sso_wq_int_thrx {
+       u64 u64;
+       struct cvmx_sso_wq_int_thrx_s {
+               u64 reserved_33_63 : 31;
+               u64 tc_en : 1;
+               u64 tc_thr : 4;
+               u64 reserved_26_27 : 2;
+               u64 ds_thr : 12;
+               u64 reserved_12_13 : 2;
+               u64 iq_thr : 12;
+       } s;
+       struct cvmx_sso_wq_int_thrx_s cn68xx;
+       struct cvmx_sso_wq_int_thrx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_wq_int_thrx cvmx_sso_wq_int_thrx_t;
+
+/**
+ * cvmx_sso_wq_iq_dis
+ *
+ * CSR reserved addresses: (1): 0x1008..0x1008
+ * SSO_WQ_IQ_DIS = SSO Input Queue Interrupt Temporary Disable Mask
+ *
+ * Contains the input queue interrupt temporary disable bits (one per group).
+ * For more information regarding this register, see the interrupt section.
+ */
+union cvmx_sso_wq_iq_dis {
+       u64 u64;
+       struct cvmx_sso_wq_iq_dis_s {
+               u64 iq_dis : 64;
+       } s;
+       struct cvmx_sso_wq_iq_dis_s cn68xx;
+       struct cvmx_sso_wq_iq_dis_s cn68xxp1;
+};
+
+typedef union cvmx_sso_wq_iq_dis cvmx_sso_wq_iq_dis_t;
+
+/**
+ * cvmx_sso_ws_cfg
+ *
+ * This register contains various SSO work-slot configuration bits.
+ *
+ */
+union cvmx_sso_ws_cfg {
+       u64 u64;
+       struct cvmx_sso_ws_cfg_s {
+               u64 reserved_56_63 : 8;
+               u64 ocla_bp : 8;
+               u64 reserved_7_47 : 41;
+               u64 aw_clk_dis : 1;
+               u64 gw_clk_dis : 1;
+               u64 disable_pw : 1;
+               u64 arbc_step_en : 1;
+               u64 ncbo_step_en : 1;
+               u64 soc_ccam_dis : 1;
+               u64 sso_cclk_dis : 1;
+       } s;
+       struct cvmx_sso_ws_cfg_s cn73xx;
+       struct cvmx_sso_ws_cfg_cn78xx {
+               u64 reserved_56_63 : 8;
+               u64 ocla_bp : 8;
+               u64 reserved_5_47 : 43;
+               u64 disable_pw : 1;
+               u64 arbc_step_en : 1;
+               u64 ncbo_step_en : 1;
+               u64 soc_ccam_dis : 1;
+               u64 sso_cclk_dis : 1;
+       } cn78xx;
+       struct cvmx_sso_ws_cfg_cn78xx cn78xxp1;
+       struct cvmx_sso_ws_cfg_s cnf75xx;
+};
+
+typedef union cvmx_sso_ws_cfg cvmx_sso_ws_cfg_t;
+
+/**
+ * cvmx_sso_ws_eco
+ */
+union cvmx_sso_ws_eco {
+       u64 u64;
+       struct cvmx_sso_ws_eco_s {
+               u64 reserved_8_63 : 56;
+               u64 eco_rw : 8;
+       } s;
+       struct cvmx_sso_ws_eco_s cn73xx;
+       struct cvmx_sso_ws_eco_s cnf75xx;
+};
+
+typedef union cvmx_sso_ws_eco cvmx_sso_ws_eco_t;
+
+/**
+ * cvmx_sso_ws_pc#
+ *
+ * CSR reserved addresses: (225): 0x3100..0x3800
+ * CSR align addresses: ===========================================================================================================
+ * SSO_WS_PCX = SSO Work Schedule Performance Counter
+ *              (one per group)
+ *
+ * Counts the number of work schedules for each group.
+ * Counter rolls over through zero when max value exceeded.
+ */
+union cvmx_sso_ws_pcx {
+       u64 u64;
+       struct cvmx_sso_ws_pcx_s {
+               u64 ws_pc : 64;
+       } s;
+       struct cvmx_sso_ws_pcx_s cn68xx;
+       struct cvmx_sso_ws_pcx_s cn68xxp1;
+};
+
+typedef union cvmx_sso_ws_pcx cvmx_sso_ws_pcx_t;
+
+/**
+ * cvmx_sso_xaq#_head_next
+ *
+ * These registers contain the pointer to the next buffer to become the head when the final cache
+ * line in this buffer is read.
+ */
+union cvmx_sso_xaqx_head_next {
+       u64 u64;
+       struct cvmx_sso_xaqx_head_next_s {
+               u64 reserved_42_63 : 22;
+               u64 ptr : 35;
+               u64 reserved_0_6 : 7;
+       } s;
+       struct cvmx_sso_xaqx_head_next_s cn73xx;
+       struct cvmx_sso_xaqx_head_next_s cn78xx;
+       struct cvmx_sso_xaqx_head_next_s cn78xxp1;
+       struct cvmx_sso_xaqx_head_next_s cnf75xx;
+};
+
+typedef union cvmx_sso_xaqx_head_next cvmx_sso_xaqx_head_next_t;
+
+/**
+ * cvmx_sso_xaq#_head_ptr
+ *
+ * These registers contain the pointer to the first entry of the external linked list(s) for a
+ * particular group. Software must initialize the external linked list(s) by programming
+ * SSO_XAQ()_HEAD_PTR, SSO_XAQ()_HEAD_NEXT, SSO_XAQ()_TAIL_PTR and
+ * SSO_XAQ()_TAIL_NEXT to identical values.
+ */
+union cvmx_sso_xaqx_head_ptr {
+       u64 u64;
+       struct cvmx_sso_xaqx_head_ptr_s {
+               u64 reserved_42_63 : 22;
+               u64 ptr : 35;
+               u64 reserved_5_6 : 2;
+               u64 cl : 5;
+       } s;
+       struct cvmx_sso_xaqx_head_ptr_s cn73xx;
+       struct cvmx_sso_xaqx_head_ptr_s cn78xx;
+       struct cvmx_sso_xaqx_head_ptr_s cn78xxp1;
+       struct cvmx_sso_xaqx_head_ptr_s cnf75xx;
+};
+
+typedef union cvmx_sso_xaqx_head_ptr cvmx_sso_xaqx_head_ptr_t;
+
+/**
+ * cvmx_sso_xaq#_tail_next
+ *
+ * These registers contain the pointer to the next buffer to become the tail when the final cache
+ * line in this buffer is written.  Register fields are identical to those in
+ * SSO_XAQ()_HEAD_NEXT above.
+ */
+union cvmx_sso_xaqx_tail_next {
+       u64 u64;
+       struct cvmx_sso_xaqx_tail_next_s {
+               u64 reserved_42_63 : 22;
+               u64 ptr : 35;
+               u64 reserved_0_6 : 7;
+       } s;
+       struct cvmx_sso_xaqx_tail_next_s cn73xx;
+       struct cvmx_sso_xaqx_tail_next_s cn78xx;
+       struct cvmx_sso_xaqx_tail_next_s cn78xxp1;
+       struct cvmx_sso_xaqx_tail_next_s cnf75xx;
+};
+
+typedef union cvmx_sso_xaqx_tail_next cvmx_sso_xaqx_tail_next_t;
+
+/**
+ * cvmx_sso_xaq#_tail_ptr
+ *
+ * These registers contain the pointer to the last entry of the external linked list(s) for a
+ * particular group.  Register fields are identical to those in SSO_XAQ()_HEAD_PTR above.
+ * Software must initialize the external linked list(s) by programming
+ * SSO_XAQ()_HEAD_PTR, SSO_XAQ()_HEAD_NEXT, SSO_XAQ()_TAIL_PTR and
+ * SSO_XAQ()_TAIL_NEXT to identical values.
+ */
+union cvmx_sso_xaqx_tail_ptr {
+       u64 u64;
+       struct cvmx_sso_xaqx_tail_ptr_s {
+               u64 reserved_42_63 : 22;
+               u64 ptr : 35;
+               u64 reserved_5_6 : 2;
+               u64 cl : 5;
+       } s;
+       struct cvmx_sso_xaqx_tail_ptr_s cn73xx;
+       struct cvmx_sso_xaqx_tail_ptr_s cn78xx;
+       struct cvmx_sso_xaqx_tail_ptr_s cn78xxp1;
+       struct cvmx_sso_xaqx_tail_ptr_s cnf75xx;
+};
+
+typedef union cvmx_sso_xaqx_tail_ptr cvmx_sso_xaqx_tail_ptr_t;
+
+/**
+ * cvmx_sso_xaq_aura
+ */
+union cvmx_sso_xaq_aura {
+       u64 u64;
+       struct cvmx_sso_xaq_aura_s {
+               u64 reserved_12_63 : 52;
+               u64 node : 2;
+               u64 laura : 10;
+       } s;
+       struct cvmx_sso_xaq_aura_s cn73xx;
+       struct cvmx_sso_xaq_aura_s cn78xx;
+       struct cvmx_sso_xaq_aura_s cn78xxp1;
+       struct cvmx_sso_xaq_aura_s cnf75xx;
+};
+
+typedef union cvmx_sso_xaq_aura cvmx_sso_xaq_aura_t;
+
+/**
+ * cvmx_sso_xaq_latency_pc
+ */
+union cvmx_sso_xaq_latency_pc {
+       u64 u64;
+       struct cvmx_sso_xaq_latency_pc_s {
+               u64 count : 64;
+       } s;
+       struct cvmx_sso_xaq_latency_pc_s cn73xx;
+       struct cvmx_sso_xaq_latency_pc_s cn78xx;
+       struct cvmx_sso_xaq_latency_pc_s cn78xxp1;
+       struct cvmx_sso_xaq_latency_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_xaq_latency_pc cvmx_sso_xaq_latency_pc_t;
+
+/**
+ * cvmx_sso_xaq_req_pc
+ */
+union cvmx_sso_xaq_req_pc {
+       u64 u64;
+       struct cvmx_sso_xaq_req_pc_s {
+               u64 count : 64;
+       } s;
+       struct cvmx_sso_xaq_req_pc_s cn73xx;
+       struct cvmx_sso_xaq_req_pc_s cn78xx;
+       struct cvmx_sso_xaq_req_pc_s cn78xxp1;
+       struct cvmx_sso_xaq_req_pc_s cnf75xx;
+};
+
+typedef union cvmx_sso_xaq_req_pc cvmx_sso_xaq_req_pc_t;
+
+#endif
diff --git a/arch/mips/mach-octeon/include/mach/cvmx-wqe.h b/arch/mips/mach-octeon/include/mach/cvmx-wqe.h
new file mode 100644 (file)
index 0000000..c9e3c83
--- /dev/null
@@ -0,0 +1,1462 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * This header file defines the work queue entry (wqe) data structure.
+ * Since this is a commonly used structure that depends on structures
+ * from several hardware blocks, those definitions have been placed
+ * in this file to create a single point of definition of the wqe
+ * format.
+ * Data structures are still named according to the block that they
+ * relate to.
+ */
+
+#ifndef __CVMX_WQE_H__
+#define __CVMX_WQE_H__
+
+#include "cvmx-packet.h"
+#include "cvmx-csr-enums.h"
+#include "cvmx-pki-defs.h"
+#include "cvmx-pip-defs.h"
+#include "octeon-feature.h"
+
+#define OCT_TAG_TYPE_STRING(x)                                         \
+       (((x) == CVMX_POW_TAG_TYPE_ORDERED) ?                           \
+        "ORDERED" :                                                    \
+        (((x) == CVMX_POW_TAG_TYPE_ATOMIC) ?                           \
+         "ATOMIC" :                                                    \
+         (((x) == CVMX_POW_TAG_TYPE_NULL) ? "NULL" : "NULL_NULL")))
+
+/* Error levels in WQE WORD2 (ERRLEV).*/
+#define PKI_ERRLEV_E__RE_M 0x0
+#define PKI_ERRLEV_E__LA_M 0x1
+#define PKI_ERRLEV_E__LB_M 0x2
+#define PKI_ERRLEV_E__LC_M 0x3
+#define PKI_ERRLEV_E__LD_M 0x4
+#define PKI_ERRLEV_E__LE_M 0x5
+#define PKI_ERRLEV_E__LF_M 0x6
+#define PKI_ERRLEV_E__LG_M 0x7
+
+enum cvmx_pki_errlevel {
+       CVMX_PKI_ERRLEV_E_RE = PKI_ERRLEV_E__RE_M,
+       CVMX_PKI_ERRLEV_E_LA = PKI_ERRLEV_E__LA_M,
+       CVMX_PKI_ERRLEV_E_LB = PKI_ERRLEV_E__LB_M,
+       CVMX_PKI_ERRLEV_E_LC = PKI_ERRLEV_E__LC_M,
+       CVMX_PKI_ERRLEV_E_LD = PKI_ERRLEV_E__LD_M,
+       CVMX_PKI_ERRLEV_E_LE = PKI_ERRLEV_E__LE_M,
+       CVMX_PKI_ERRLEV_E_LF = PKI_ERRLEV_E__LF_M,
+       CVMX_PKI_ERRLEV_E_LG = PKI_ERRLEV_E__LG_M
+};
+
+#define CVMX_PKI_ERRLEV_MAX BIT(3) /* The size of WORD2:ERRLEV field.*/
+
+/* Error code in WQE WORD2 (OPCODE).*/
+#define CVMX_PKI_OPCODE_RE_NONE              0x0
+#define CVMX_PKI_OPCODE_RE_PARTIAL    0x1
+#define CVMX_PKI_OPCODE_RE_JABBER     0x2
+#define CVMX_PKI_OPCODE_RE_FCS       0x7
+#define CVMX_PKI_OPCODE_RE_FCS_RCV    0x8
+#define CVMX_PKI_OPCODE_RE_TERMINATE  0x9
+#define CVMX_PKI_OPCODE_RE_RX_CTL     0xb
+#define CVMX_PKI_OPCODE_RE_SKIP              0xc
+#define CVMX_PKI_OPCODE_RE_DMAPKT     0xf
+#define CVMX_PKI_OPCODE_RE_PKIPAR     0x13
+#define CVMX_PKI_OPCODE_RE_PKIPCAM    0x14
+#define CVMX_PKI_OPCODE_RE_MEMOUT     0x15
+#define CVMX_PKI_OPCODE_RE_BUFS_OFLOW 0x16
+#define CVMX_PKI_OPCODE_L2_FRAGMENT   0x20
+#define CVMX_PKI_OPCODE_L2_OVERRUN    0x21
+#define CVMX_PKI_OPCODE_L2_PFCS              0x22
+#define CVMX_PKI_OPCODE_L2_PUNY              0x23
+#define CVMX_PKI_OPCODE_L2_MAL       0x24
+#define CVMX_PKI_OPCODE_L2_OVERSIZE   0x25
+#define CVMX_PKI_OPCODE_L2_UNDERSIZE  0x26
+#define CVMX_PKI_OPCODE_L2_LENMISM    0x27
+#define CVMX_PKI_OPCODE_IP_NOT       0x41
+#define CVMX_PKI_OPCODE_IP_CHK       0x42
+#define CVMX_PKI_OPCODE_IP_MAL       0x43
+#define CVMX_PKI_OPCODE_IP_MALD              0x44
+#define CVMX_PKI_OPCODE_IP_HOP       0x45
+#define CVMX_PKI_OPCODE_L4_MAL       0x61
+#define CVMX_PKI_OPCODE_L4_CHK       0x62
+#define CVMX_PKI_OPCODE_L4_LEN       0x63
+#define CVMX_PKI_OPCODE_L4_PORT              0x64
+#define CVMX_PKI_OPCODE_TCP_FLAG      0x65
+
+#define CVMX_PKI_OPCODE_MAX BIT(8) /* The size of WORD2:OPCODE field.*/
+
+/* Layer types in pki */
+#define CVMX_PKI_LTYPE_E_NONE_M              0x0
+#define CVMX_PKI_LTYPE_E_ENET_M              0x1
+#define CVMX_PKI_LTYPE_E_VLAN_M              0x2
+#define CVMX_PKI_LTYPE_E_SNAP_PAYLD_M 0x5
+#define CVMX_PKI_LTYPE_E_ARP_M       0x6
+#define CVMX_PKI_LTYPE_E_RARP_M              0x7
+#define CVMX_PKI_LTYPE_E_IP4_M       0x8
+#define CVMX_PKI_LTYPE_E_IP4_OPT_M    0x9
+#define CVMX_PKI_LTYPE_E_IP6_M       0xA
+#define CVMX_PKI_LTYPE_E_IP6_OPT_M    0xB
+#define CVMX_PKI_LTYPE_E_IPSEC_ESP_M  0xC
+#define CVMX_PKI_LTYPE_E_IPFRAG_M     0xD
+#define CVMX_PKI_LTYPE_E_IPCOMP_M     0xE
+#define CVMX_PKI_LTYPE_E_TCP_M       0x10
+#define CVMX_PKI_LTYPE_E_UDP_M       0x11
+#define CVMX_PKI_LTYPE_E_SCTP_M              0x12
+#define CVMX_PKI_LTYPE_E_UDP_VXLAN_M  0x13
+#define CVMX_PKI_LTYPE_E_GRE_M       0x14
+#define CVMX_PKI_LTYPE_E_NVGRE_M      0x15
+#define CVMX_PKI_LTYPE_E_GTP_M       0x16
+#define CVMX_PKI_LTYPE_E_SW28_M              0x1C
+#define CVMX_PKI_LTYPE_E_SW29_M              0x1D
+#define CVMX_PKI_LTYPE_E_SW30_M              0x1E
+#define CVMX_PKI_LTYPE_E_SW31_M              0x1F
+
+enum cvmx_pki_layer_type {
+       CVMX_PKI_LTYPE_E_NONE = CVMX_PKI_LTYPE_E_NONE_M,
+       CVMX_PKI_LTYPE_E_ENET = CVMX_PKI_LTYPE_E_ENET_M,
+       CVMX_PKI_LTYPE_E_VLAN = CVMX_PKI_LTYPE_E_VLAN_M,
+       CVMX_PKI_LTYPE_E_SNAP_PAYLD = CVMX_PKI_LTYPE_E_SNAP_PAYLD_M,
+       CVMX_PKI_LTYPE_E_ARP = CVMX_PKI_LTYPE_E_ARP_M,
+       CVMX_PKI_LTYPE_E_RARP = CVMX_PKI_LTYPE_E_RARP_M,
+       CVMX_PKI_LTYPE_E_IP4 = CVMX_PKI_LTYPE_E_IP4_M,
+       CVMX_PKI_LTYPE_E_IP4_OPT = CVMX_PKI_LTYPE_E_IP4_OPT_M,
+       CVMX_PKI_LTYPE_E_IP6 = CVMX_PKI_LTYPE_E_IP6_M,
+       CVMX_PKI_LTYPE_E_IP6_OPT = CVMX_PKI_LTYPE_E_IP6_OPT_M,
+       CVMX_PKI_LTYPE_E_IPSEC_ESP = CVMX_PKI_LTYPE_E_IPSEC_ESP_M,
+       CVMX_PKI_LTYPE_E_IPFRAG = CVMX_PKI_LTYPE_E_IPFRAG_M,
+       CVMX_PKI_LTYPE_E_IPCOMP = CVMX_PKI_LTYPE_E_IPCOMP_M,
+       CVMX_PKI_LTYPE_E_TCP = CVMX_PKI_LTYPE_E_TCP_M,
+       CVMX_PKI_LTYPE_E_UDP = CVMX_PKI_LTYPE_E_UDP_M,
+       CVMX_PKI_LTYPE_E_SCTP = CVMX_PKI_LTYPE_E_SCTP_M,
+       CVMX_PKI_LTYPE_E_UDP_VXLAN = CVMX_PKI_LTYPE_E_UDP_VXLAN_M,
+       CVMX_PKI_LTYPE_E_GRE = CVMX_PKI_LTYPE_E_GRE_M,
+       CVMX_PKI_LTYPE_E_NVGRE = CVMX_PKI_LTYPE_E_NVGRE_M,
+       CVMX_PKI_LTYPE_E_GTP = CVMX_PKI_LTYPE_E_GTP_M,
+       CVMX_PKI_LTYPE_E_SW28 = CVMX_PKI_LTYPE_E_SW28_M,
+       CVMX_PKI_LTYPE_E_SW29 = CVMX_PKI_LTYPE_E_SW29_M,
+       CVMX_PKI_LTYPE_E_SW30 = CVMX_PKI_LTYPE_E_SW30_M,
+       CVMX_PKI_LTYPE_E_SW31 = CVMX_PKI_LTYPE_E_SW31_M,
+       CVMX_PKI_LTYPE_E_MAX = CVMX_PKI_LTYPE_E_SW31
+};
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 ptr_vlan : 8;
+               u64 ptr_layer_g : 8;
+               u64 ptr_layer_f : 8;
+               u64 ptr_layer_e : 8;
+               u64 ptr_layer_d : 8;
+               u64 ptr_layer_c : 8;
+               u64 ptr_layer_b : 8;
+               u64 ptr_layer_a : 8;
+       };
+} cvmx_pki_wqe_word4_t;
+
+/**
+ * HW decode / err_code in work queue entry
+ */
+typedef union {
+       u64 u64;
+       struct {
+               u64 bufs : 8;
+               u64 ip_offset : 8;
+               u64 vlan_valid : 1;
+               u64 vlan_stacked : 1;
+               u64 unassigned : 1;
+               u64 vlan_cfi : 1;
+               u64 vlan_id : 12;
+               u64 varies : 12;
+               u64 dec_ipcomp : 1;
+               u64 tcp_or_udp : 1;
+               u64 dec_ipsec : 1;
+               u64 is_v6 : 1;
+               u64 software : 1;
+               u64 L4_error : 1;
+               u64 is_frag : 1;
+               u64 IP_exc : 1;
+               u64 is_bcast : 1;
+               u64 is_mcast : 1;
+               u64 not_IP : 1;
+               u64 rcv_error : 1;
+               u64 err_code : 8;
+       } s;
+       struct {
+               u64 bufs : 8;
+               u64 ip_offset : 8;
+               u64 vlan_valid : 1;
+               u64 vlan_stacked : 1;
+               u64 unassigned : 1;
+               u64 vlan_cfi : 1;
+               u64 vlan_id : 12;
+               u64 port : 12;
+               u64 dec_ipcomp : 1;
+               u64 tcp_or_udp : 1;
+               u64 dec_ipsec : 1;
+               u64 is_v6 : 1;
+               u64 software : 1;
+               u64 L4_error : 1;
+               u64 is_frag : 1;
+               u64 IP_exc : 1;
+               u64 is_bcast : 1;
+               u64 is_mcast : 1;
+               u64 not_IP : 1;
+               u64 rcv_error : 1;
+               u64 err_code : 8;
+       } s_cn68xx;
+       struct {
+               u64 bufs : 8;
+               u64 ip_offset : 8;
+               u64 vlan_valid : 1;
+               u64 vlan_stacked : 1;
+               u64 unassigned : 1;
+               u64 vlan_cfi : 1;
+               u64 vlan_id : 12;
+               u64 pr : 4;
+               u64 unassigned2a : 4;
+               u64 unassigned2 : 4;
+               u64 dec_ipcomp : 1;
+               u64 tcp_or_udp : 1;
+               u64 dec_ipsec : 1;
+               u64 is_v6 : 1;
+               u64 software : 1;
+               u64 L4_error : 1;
+               u64 is_frag : 1;
+               u64 IP_exc : 1;
+               u64 is_bcast : 1;
+               u64 is_mcast : 1;
+               u64 not_IP : 1;
+               u64 rcv_error : 1;
+               u64 err_code : 8;
+       } s_cn38xx;
+       struct {
+               u64 unused1 : 16;
+               u64 vlan : 16;
+               u64 unused2 : 32;
+       } svlan;
+       struct {
+               u64 bufs : 8;
+               u64 unused : 8;
+               u64 vlan_valid : 1;
+               u64 vlan_stacked : 1;
+               u64 unassigned : 1;
+               u64 vlan_cfi : 1;
+               u64 vlan_id : 12;
+               u64 varies : 12;
+               u64 unassigned2 : 4;
+               u64 software : 1;
+               u64 unassigned3 : 1;
+               u64 is_rarp : 1;
+               u64 is_arp : 1;
+               u64 is_bcast : 1;
+               u64 is_mcast : 1;
+               u64 not_IP : 1;
+               u64 rcv_error : 1;
+               u64 err_code : 8;
+       } snoip;
+       struct {
+               u64 bufs : 8;
+               u64 unused : 8;
+               u64 vlan_valid : 1;
+               u64 vlan_stacked : 1;
+               u64 unassigned : 1;
+               u64 vlan_cfi : 1;
+               u64 vlan_id : 12;
+               u64 port : 12;
+               u64 unassigned2 : 4;
+               u64 software : 1;
+               u64 unassigned3 : 1;
+               u64 is_rarp : 1;
+               u64 is_arp : 1;
+               u64 is_bcast : 1;
+               u64 is_mcast : 1;
+               u64 not_IP : 1;
+               u64 rcv_error : 1;
+               u64 err_code : 8;
+       } snoip_cn68xx;
+       struct {
+               u64 bufs : 8;
+               u64 unused : 8;
+               u64 vlan_valid : 1;
+               u64 vlan_stacked : 1;
+               u64 unassigned : 1;
+               u64 vlan_cfi : 1;
+               u64 vlan_id : 12;
+               u64 pr : 4;
+               u64 unassigned2a : 8;
+               u64 unassigned2 : 4;
+               u64 software : 1;
+               u64 unassigned3 : 1;
+               u64 is_rarp : 1;
+               u64 is_arp : 1;
+               u64 is_bcast : 1;
+               u64 is_mcast : 1;
+               u64 not_IP : 1;
+               u64 rcv_error : 1;
+               u64 err_code : 8;
+       } snoip_cn38xx;
+} cvmx_pip_wqe_word2_t;
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 software : 1;
+               u64 lg_hdr_type : 5;
+               u64 lf_hdr_type : 5;
+               u64 le_hdr_type : 5;
+               u64 ld_hdr_type : 5;
+               u64 lc_hdr_type : 5;
+               u64 lb_hdr_type : 5;
+               u64 is_la_ether : 1;
+               u64 rsvd_0 : 8;
+               u64 vlan_valid : 1;
+               u64 vlan_stacked : 1;
+               u64 stat_inc : 1;
+               u64 pcam_flag4 : 1;
+               u64 pcam_flag3 : 1;
+               u64 pcam_flag2 : 1;
+               u64 pcam_flag1 : 1;
+               u64 is_frag : 1;
+               u64 is_l3_bcast : 1;
+               u64 is_l3_mcast : 1;
+               u64 is_l2_bcast : 1;
+               u64 is_l2_mcast : 1;
+               u64 is_raw : 1;
+               u64 err_level : 3;
+               u64 err_code : 8;
+       };
+} cvmx_pki_wqe_word2_t;
+
+typedef union {
+       u64 u64;
+       cvmx_pki_wqe_word2_t pki;
+       cvmx_pip_wqe_word2_t pip;
+} cvmx_wqe_word2_t;
+
+typedef union {
+       u64 u64;
+       struct {
+               u16 hw_chksum;
+               u8 unused;
+               u64 next_ptr : 40;
+       } cn38xx;
+       struct {
+               u64 l4ptr : 8;    /* 56..63 */
+               u64 unused0 : 8;  /* 48..55 */
+               u64 l3ptr : 8;    /* 40..47 */
+               u64 l2ptr : 8;    /* 32..39 */
+               u64 unused1 : 18; /* 14..31 */
+               u64 bpid : 6;     /* 8..13 */
+               u64 unused2 : 2;  /* 6..7 */
+               u64 pknd : 6;     /* 0..5 */
+       } cn68xx;
+} cvmx_pip_wqe_word0_t;
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 rsvd_0 : 4;
+               u64 aura : 12;
+               u64 rsvd_1 : 1;
+               u64 apad : 3;
+               u64 channel : 12;
+               u64 bufs : 8;
+               u64 style : 8;
+               u64 rsvd_2 : 10;
+               u64 pknd : 6;
+       };
+} cvmx_pki_wqe_word0_t;
+
+/* Use reserved bit, set by HW to 0, to indicate buf_ptr legacy translation*/
+#define pki_wqe_translated word0.rsvd_1
+
+typedef union {
+       u64 u64;
+       cvmx_pip_wqe_word0_t pip;
+       cvmx_pki_wqe_word0_t pki;
+       struct {
+               u64 unused : 24;
+               u64 next_ptr : 40; /* On cn68xx this is unused as well */
+       } raw;
+} cvmx_wqe_word0_t;
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 len : 16;
+               u64 rsvd_0 : 2;
+               u64 rsvd_1 : 2;
+               u64 grp : 10;
+               cvmx_pow_tag_type_t tag_type : 2;
+               u64 tag : 32;
+       };
+} cvmx_pki_wqe_word1_t;
+
+#define pki_errata20776 word1.rsvd_0
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 len : 16;
+               u64 varies : 14;
+               cvmx_pow_tag_type_t tag_type : 2;
+               u64 tag : 32;
+       };
+       cvmx_pki_wqe_word1_t cn78xx;
+       struct {
+               u64 len : 16;
+               u64 zero_0 : 1;
+               u64 qos : 3;
+               u64 zero_1 : 1;
+               u64 grp : 6;
+               u64 zero_2 : 3;
+               cvmx_pow_tag_type_t tag_type : 2;
+               u64 tag : 32;
+       } cn68xx;
+       struct {
+               u64 len : 16;
+               u64 ipprt : 6;
+               u64 qos : 3;
+               u64 grp : 4;
+               u64 zero_2 : 1;
+               cvmx_pow_tag_type_t tag_type : 2;
+               u64 tag : 32;
+       } cn38xx;
+} cvmx_wqe_word1_t;
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 rsvd_0 : 8;
+               u64 hwerr : 8;
+               u64 rsvd_1 : 24;
+               u64 sqid : 8;
+               u64 rsvd_2 : 4;
+               u64 vfnum : 12;
+       };
+} cvmx_wqe_word3_t;
+
+typedef union {
+       u64 u64;
+       struct {
+               u64 rsvd_0 : 21;
+               u64 sqfc : 11;
+               u64 rsvd_1 : 5;
+               u64 sqtail : 11;
+               u64 rsvd_2 : 3;
+               u64 sqhead : 13;
+       };
+} cvmx_wqe_word4_t;
+
+/**
+ * Work queue entry format.
+ * Must be 8-byte aligned.
+ */
+typedef struct cvmx_wqe_s {
+       /*-------------------------------------------------------------------*/
+       /* WORD 0                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64 bits are filled by HW when a packet
+        * arrives.
+        */
+       cvmx_wqe_word0_t word0;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 1                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64 bits are filled by HW when a packet
+        * arrives.
+        */
+       cvmx_wqe_word1_t word1;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 2                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64-bits are filled in by hardware when a
+        * packet arrives. This indicates a variety of status and error
+        *conditions.
+        */
+       cvmx_pip_wqe_word2_t word2;
+
+       /* Pointer to the first segment of the packet. */
+       cvmx_buf_ptr_t packet_ptr;
+
+       /* HW WRITE: OCTEON will fill in a programmable amount from the packet,
+        * up to (at most, but perhaps less) the amount needed to fill the work
+        * queue entry to 128 bytes. If the packet is recognized to be IP, the
+        * hardware starts (except that the IPv4 header is padded for
+        * appropriate alignment) writing here where the IP header starts.
+        * If the packet is not recognized to be IP, the hardware starts
+        * writing the beginning of the packet here.
+        */
+       u8 packet_data[96];
+
+       /* If desired, SW can make the work Q entry any length. For the purposes
+        * of discussion here, Assume 128B always, as this is all that the hardware
+        * deals with.
+        */
+} CVMX_CACHE_LINE_ALIGNED cvmx_wqe_t;
+
+/**
+ * Work queue entry format for NQM
+ * Must be 8-byte aligned
+ */
+typedef struct cvmx_wqe_nqm_s {
+       /*-------------------------------------------------------------------*/
+       /* WORD 0                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64 bits are filled by HW when a packet
+        * arrives.
+        */
+       cvmx_wqe_word0_t word0;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 1                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64 bits are filled by HW when a packet
+        * arrives.
+        */
+       cvmx_wqe_word1_t word1;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 2                                                            */
+       /*-------------------------------------------------------------------*/
+       /* Reserved */
+       u64 word2;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 3                                                            */
+       /*-------------------------------------------------------------------*/
+       /* NVMe specific information.*/
+       cvmx_wqe_word3_t word3;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 4                                                            */
+       /*-------------------------------------------------------------------*/
+       /* NVMe specific information.*/
+       cvmx_wqe_word4_t word4;
+
+       /* HW WRITE: OCTEON will fill in a programmable amount from the packet,
+        * up to (at most, but perhaps less) the amount needed to fill the work
+        * queue entry to 128 bytes. If the packet is recognized to be IP, the
+        * hardware starts (except that the IPv4 header is padded for
+        * appropriate alignment) writing here where the IP header starts.
+        * If the packet is not recognized to be IP, the hardware starts
+        * writing the beginning of the packet here.
+        */
+       u8 packet_data[88];
+
+       /* If desired, SW can make the work Q entry any length.
+        * For the purposes of discussion here, assume 128B always, as this is
+        * all that the hardware deals with.
+        */
+} CVMX_CACHE_LINE_ALIGNED cvmx_wqe_nqm_t;
+
+/**
+ * Work queue entry format for 78XX.
+ * In 78XX packet data always resides in WQE buffer unless option
+ * DIS_WQ_DAT=1 in PKI_STYLE_BUF, which causes packet data to use separate buffer.
+ *
+ * Must be 8-byte aligned.
+ */
+typedef struct {
+       /*-------------------------------------------------------------------*/
+       /* WORD 0                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64 bits are filled by HW when a packet
+        * arrives.
+        */
+       cvmx_pki_wqe_word0_t word0;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 1                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64 bits are filled by HW when a packet
+        * arrives.
+        */
+       cvmx_pki_wqe_word1_t word1;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 2                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64-bits are filled in by hardware when a
+        * packet arrives. This indicates a variety of status and error
+        * conditions.
+        */
+       cvmx_pki_wqe_word2_t word2;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 3                                                            */
+       /*-------------------------------------------------------------------*/
+       /* Pointer to the first segment of the packet.*/
+       cvmx_buf_ptr_pki_t packet_ptr;
+
+       /*-------------------------------------------------------------------*/
+       /* WORD 4                                                            */
+       /*-------------------------------------------------------------------*/
+       /* HW WRITE: the following 64-bits are filled in by hardware when a
+        * packet arrives contains a byte pointer to the start of Layer
+        * A/B/C/D/E/F/G relative of start of packet.
+        */
+       cvmx_pki_wqe_word4_t word4;
+
+       /*-------------------------------------------------------------------*/
+       /* WORDs 5/6/7 may be extended there, if WQE_HSZ is set.             */
+       /*-------------------------------------------------------------------*/
+       u64 wqe_data[11];
+
+} CVMX_CACHE_LINE_ALIGNED cvmx_wqe_78xx_t;
+
+/* Node LS-bit position in the WQE[grp] or PKI_QPG_TBL[grp_ok].*/
+#define CVMX_WQE_GRP_NODE_SHIFT 8
+
+/*
+ * This is an accessor function into the WQE that retreives the
+ * ingress port number, which can also be used as a destination
+ * port number for the same port.
+ *
+ * @param work - Work Queue Entrey pointer
+ * @returns returns the normalized port number, also known as "ipd" port
+ */
+static inline int cvmx_wqe_get_port(cvmx_wqe_t *work)
+{
+       int port;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               /* In 78xx wqe entry has channel number not port*/
+               port = work->word0.pki.channel;
+               /* For BGX interfaces (0x800 - 0xdff) the 4 LSBs indicate
+                * the PFC channel, must be cleared to normalize to "ipd"
+                */
+               if (port & 0x800)
+                       port &= 0xff0;
+               /* Node number is in AURA field, make it part of port # */
+               port |= (work->word0.pki.aura >> 10) << 12;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               port = work->word2.s_cn68xx.port;
+       } else {
+               port = work->word1.cn38xx.ipprt;
+       }
+
+       return port;
+}
+
+static inline void cvmx_wqe_set_port(cvmx_wqe_t *work, int port)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               work->word0.pki.channel = port;
+       else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               work->word2.s_cn68xx.port = port;
+       else
+               work->word1.cn38xx.ipprt = port;
+}
+
+static inline int cvmx_wqe_get_grp(cvmx_wqe_t *work)
+{
+       int grp;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               /* legacy: GRP[0..2] :=QOS */
+               grp = (0xff & work->word1.cn78xx.grp) >> 3;
+       else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               grp = work->word1.cn68xx.grp;
+       else
+               grp = work->word1.cn38xx.grp;
+
+       return grp;
+}
+
+static inline void cvmx_wqe_set_xgrp(cvmx_wqe_t *work, int grp)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               work->word1.cn78xx.grp = grp;
+       else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               work->word1.cn68xx.grp = grp;
+       else
+               work->word1.cn38xx.grp = grp;
+}
+
+static inline int cvmx_wqe_get_xgrp(cvmx_wqe_t *work)
+{
+       int grp;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               grp = work->word1.cn78xx.grp;
+       else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               grp = work->word1.cn68xx.grp;
+       else
+               grp = work->word1.cn38xx.grp;
+
+       return grp;
+}
+
+static inline void cvmx_wqe_set_grp(cvmx_wqe_t *work, int grp)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               unsigned int node = cvmx_get_node_num();
+               /* Legacy: GRP[0..2] :=QOS */
+               work->word1.cn78xx.grp &= 0x7;
+               work->word1.cn78xx.grp |= 0xff & (grp << 3);
+               work->word1.cn78xx.grp |= (node << 8);
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               work->word1.cn68xx.grp = grp;
+       } else {
+               work->word1.cn38xx.grp = grp;
+       }
+}
+
+static inline int cvmx_wqe_get_qos(cvmx_wqe_t *work)
+{
+       int qos;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               /* Legacy: GRP[0..2] :=QOS */
+               qos = work->word1.cn78xx.grp & 0x7;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               qos = work->word1.cn68xx.qos;
+       } else {
+               qos = work->word1.cn38xx.qos;
+       }
+
+       return qos;
+}
+
+static inline void cvmx_wqe_set_qos(cvmx_wqe_t *work, int qos)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               /* legacy: GRP[0..2] :=QOS */
+               work->word1.cn78xx.grp &= ~0x7;
+               work->word1.cn78xx.grp |= qos & 0x7;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               work->word1.cn68xx.qos = qos;
+       } else {
+               work->word1.cn38xx.qos = qos;
+       }
+}
+
+static inline int cvmx_wqe_get_len(cvmx_wqe_t *work)
+{
+       int len;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               len = work->word1.cn78xx.len;
+       else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               len = work->word1.cn68xx.len;
+       else
+               len = work->word1.cn38xx.len;
+
+       return len;
+}
+
+static inline void cvmx_wqe_set_len(cvmx_wqe_t *work, int len)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               work->word1.cn78xx.len = len;
+       else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               work->word1.cn68xx.len = len;
+       else
+               work->word1.cn38xx.len = len;
+}
+
+/**
+ * This function returns, if there was L2/L1 errors detected in packet.
+ *
+ * @param work pointer to work queue entry
+ *
+ * @return     0 if packet had no error, non-zero to indicate error code.
+ *
+ * Please refer to HRM for the specific model for full enumaration of error codes.
+ * With Octeon1/Octeon2 models, the returned code indicates L1/L2 errors.
+ * On CN73XX/CN78XX, the return code is the value of PKI_OPCODE_E,
+ * if it is non-zero, otherwise the returned code will be derived from
+ * PKI_ERRLEV_E such that an error indicated in LayerA will return 0x20,
+ * LayerB - 0x30, LayerC - 0x40 and so forth.
+ */
+static inline int cvmx_wqe_get_rcv_err(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (wqe->word2.err_level == CVMX_PKI_ERRLEV_E_RE || wqe->word2.err_code != 0)
+                       return wqe->word2.err_code;
+               else
+                       return (wqe->word2.err_level << 4) + 0x10;
+       } else if (work->word2.snoip.rcv_error) {
+               return work->word2.snoip.err_code;
+       }
+
+       return 0;
+}
+
+static inline u32 cvmx_wqe_get_tag(cvmx_wqe_t *work)
+{
+       return work->word1.tag;
+}
+
+static inline void cvmx_wqe_set_tag(cvmx_wqe_t *work, u32 tag)
+{
+       work->word1.tag = tag;
+}
+
+static inline int cvmx_wqe_get_tt(cvmx_wqe_t *work)
+{
+       return work->word1.tag_type;
+}
+
+static inline void cvmx_wqe_set_tt(cvmx_wqe_t *work, int tt)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               work->word1.cn78xx.tag_type = (cvmx_pow_tag_type_t)tt;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               work->word1.cn68xx.tag_type = (cvmx_pow_tag_type_t)tt;
+               work->word1.cn68xx.zero_2 = 0;
+       } else {
+               work->word1.cn38xx.tag_type = (cvmx_pow_tag_type_t)tt;
+               work->word1.cn38xx.zero_2 = 0;
+       }
+}
+
+static inline u8 cvmx_wqe_get_unused8(cvmx_wqe_t *work)
+{
+       u8 bits;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               bits = wqe->word2.rsvd_0;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               bits = work->word0.pip.cn68xx.unused1;
+       } else {
+               bits = work->word0.pip.cn38xx.unused;
+       }
+
+       return bits;
+}
+
+static inline void cvmx_wqe_set_unused8(cvmx_wqe_t *work, u8 v)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               wqe->word2.rsvd_0 = v;
+       } else if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE)) {
+               work->word0.pip.cn68xx.unused1 = v;
+       } else {
+               work->word0.pip.cn38xx.unused = v;
+       }
+}
+
+static inline u8 cvmx_wqe_get_user_flags(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               return work->word0.pki.rsvd_2;
+       else
+               return 0;
+}
+
+static inline void cvmx_wqe_set_user_flags(cvmx_wqe_t *work, u8 v)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               work->word0.pki.rsvd_2 = v;
+}
+
+static inline int cvmx_wqe_get_channel(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               return (work->word0.pki.channel);
+       else
+               return cvmx_wqe_get_port(work);
+}
+
+static inline void cvmx_wqe_set_channel(cvmx_wqe_t *work, int channel)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               work->word0.pki.channel = channel;
+       else
+               debug("%s: ERROR: not supported for model\n", __func__);
+}
+
+static inline int cvmx_wqe_get_aura(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               return (work->word0.pki.aura);
+       else
+               return (work->packet_ptr.s.pool);
+}
+
+static inline void cvmx_wqe_set_aura(cvmx_wqe_t *work, int aura)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               work->word0.pki.aura = aura;
+       else
+               work->packet_ptr.s.pool = aura;
+}
+
+static inline int cvmx_wqe_get_style(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               return (work->word0.pki.style);
+       return 0;
+}
+
+static inline void cvmx_wqe_set_style(cvmx_wqe_t *work, int style)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE))
+               work->word0.pki.style = style;
+}
+
+static inline int cvmx_wqe_is_l3_ip(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+               /* Match all 4 values for v4/v6 with.without options */
+               if ((wqe->word2.lc_hdr_type & 0x1c) == CVMX_PKI_LTYPE_E_IP4)
+                       return 1;
+               if ((wqe->word2.le_hdr_type & 0x1c) == CVMX_PKI_LTYPE_E_IP4)
+                       return 1;
+               return 0;
+       } else {
+               return !work->word2.s_cn38xx.not_IP;
+       }
+}
+
+static inline int cvmx_wqe_is_l3_ipv4(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+               /* Match 2 values - with/wotuout options */
+               if ((wqe->word2.lc_hdr_type & 0x1e) == CVMX_PKI_LTYPE_E_IP4)
+                       return 1;
+               if ((wqe->word2.le_hdr_type & 0x1e) == CVMX_PKI_LTYPE_E_IP4)
+                       return 1;
+               return 0;
+       } else {
+               return (!work->word2.s_cn38xx.not_IP &&
+                       !work->word2.s_cn38xx.is_v6);
+       }
+}
+
+static inline int cvmx_wqe_is_l3_ipv6(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+               /* Match 2 values - with/wotuout options */
+               if ((wqe->word2.lc_hdr_type & 0x1e) == CVMX_PKI_LTYPE_E_IP6)
+                       return 1;
+               if ((wqe->word2.le_hdr_type & 0x1e) == CVMX_PKI_LTYPE_E_IP6)
+                       return 1;
+               return 0;
+       } else {
+               return (!work->word2.s_cn38xx.not_IP &&
+                       work->word2.s_cn38xx.is_v6);
+       }
+}
+
+static inline bool cvmx_wqe_is_l4_udp_or_tcp(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (wqe->word2.lf_hdr_type == CVMX_PKI_LTYPE_E_TCP)
+                       return true;
+               if (wqe->word2.lf_hdr_type == CVMX_PKI_LTYPE_E_UDP)
+                       return true;
+               return false;
+       }
+
+       if (work->word2.s_cn38xx.not_IP)
+               return false;
+
+       return (work->word2.s_cn38xx.tcp_or_udp != 0);
+}
+
+static inline int cvmx_wqe_is_l2_bcast(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return wqe->word2.is_l2_bcast;
+       } else {
+               return work->word2.s_cn38xx.is_bcast;
+       }
+}
+
+static inline int cvmx_wqe_is_l2_mcast(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return wqe->word2.is_l2_mcast;
+       } else {
+               return work->word2.s_cn38xx.is_mcast;
+       }
+}
+
+static inline void cvmx_wqe_set_l2_bcast(cvmx_wqe_t *work, bool bcast)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               wqe->word2.is_l2_bcast = bcast;
+       } else {
+               work->word2.s_cn38xx.is_bcast = bcast;
+       }
+}
+
+static inline void cvmx_wqe_set_l2_mcast(cvmx_wqe_t *work, bool mcast)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               wqe->word2.is_l2_mcast = mcast;
+       } else {
+               work->word2.s_cn38xx.is_mcast = mcast;
+       }
+}
+
+static inline int cvmx_wqe_is_l3_bcast(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return wqe->word2.is_l3_bcast;
+       }
+       debug("%s: ERROR: not supported for model\n", __func__);
+       return 0;
+}
+
+static inline int cvmx_wqe_is_l3_mcast(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return wqe->word2.is_l3_mcast;
+       }
+       debug("%s: ERROR: not supported for model\n", __func__);
+       return 0;
+}
+
+/**
+ * This function returns is there was IP error detected in packet.
+ * For 78XX it does not flag ipv4 options and ipv6 extensions.
+ * For older chips if PIP_GBL_CTL was proviosned to flag ip4_otions and
+ * ipv6 extension, it will be flag them.
+ * @param work pointer to work queue entry
+ * @return     1 -- If IP error was found in packet
+ *          0 -- If no IP error was found in packet.
+ */
+static inline int cvmx_wqe_is_ip_exception(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (wqe->word2.err_level == CVMX_PKI_ERRLEV_E_LC)
+                       return 1;
+               else
+                       return 0;
+       }
+
+       return work->word2.s.IP_exc;
+}
+
+static inline int cvmx_wqe_is_l4_error(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (wqe->word2.err_level == CVMX_PKI_ERRLEV_E_LF)
+                       return 1;
+               else
+                       return 0;
+       } else {
+               return work->word2.s.L4_error;
+       }
+}
+
+static inline void cvmx_wqe_set_vlan(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               wqe->word2.vlan_valid = set;
+       } else {
+               work->word2.s.vlan_valid = set;
+       }
+}
+
+static inline int cvmx_wqe_is_vlan(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return wqe->word2.vlan_valid;
+       } else {
+               return work->word2.s.vlan_valid;
+       }
+}
+
+static inline int cvmx_wqe_is_vlan_stacked(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return wqe->word2.vlan_stacked;
+       } else {
+               return work->word2.s.vlan_stacked;
+       }
+}
+
+/**
+ * Extract packet data buffer pointer from work queue entry.
+ *
+ * Returns the legacy (Octeon1/Octeon2) buffer pointer structure
+ * for the linked buffer list.
+ * On CN78XX, the native buffer pointer structure is converted into
+ * the legacy format.
+ * The legacy buf_ptr is then stored in the WQE, and word0 reserved
+ * field is set to indicate that the buffer pointers were translated.
+ * If the packet data is only found inside the work queue entry,
+ * a standard buffer pointer structure is created for it.
+ */
+cvmx_buf_ptr_t cvmx_wqe_get_packet_ptr(cvmx_wqe_t *work);
+
+static inline int cvmx_wqe_get_bufs(cvmx_wqe_t *work)
+{
+       int bufs;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               bufs = work->word0.pki.bufs;
+       } else {
+               /* Adjust for packet-in-WQE cases */
+               if (cvmx_unlikely(work->word2.s_cn38xx.bufs == 0 && !work->word2.s.software))
+                       (void)cvmx_wqe_get_packet_ptr(work);
+               bufs = work->word2.s_cn38xx.bufs;
+       }
+       return bufs;
+}
+
+/**
+ * Free Work Queue Entry memory
+ *
+ * Will return the WQE buffer to its pool, unless the WQE contains
+ * non-redundant packet data.
+ * This function is intended to be called AFTER the packet data
+ * has been passed along to PKO for transmission and release.
+ * It can also follow a call to cvmx_helper_free_packet_data()
+ * to release the WQE after associated data was released.
+ */
+void cvmx_wqe_free(cvmx_wqe_t *work);
+
+/**
+ * Check if a work entry has been intiated by software
+ *
+ */
+static inline bool cvmx_wqe_is_soft(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return wqe->word2.software;
+       } else {
+               return work->word2.s.software;
+       }
+}
+
+/**
+ * Allocate a work-queue entry for delivering software-initiated
+ * event notifications.
+ * The application data is copied into the work-queue entry,
+ * if the space is sufficient.
+ */
+cvmx_wqe_t *cvmx_wqe_soft_create(void *data_p, unsigned int data_sz);
+
+/* Errata (PKI-20776) PKI_BUFLINK_S's are endian-swapped
+ * CN78XX pass 1.x has a bug where the packet pointer in each segment is
+ * written in the opposite endianness of the configured mode. Fix these here.
+ */
+static inline void cvmx_wqe_pki_errata_20776(cvmx_wqe_t *work)
+{
+       cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) && !wqe->pki_errata20776) {
+               u64 bufs;
+               cvmx_buf_ptr_pki_t buffer_next;
+
+               bufs = wqe->word0.bufs;
+               buffer_next = wqe->packet_ptr;
+               while (bufs > 1) {
+                       cvmx_buf_ptr_pki_t next;
+                       void *nextaddr = cvmx_phys_to_ptr(buffer_next.addr - 8);
+
+                       memcpy(&next, nextaddr, sizeof(next));
+                       next.u64 = __builtin_bswap64(next.u64);
+                       memcpy(nextaddr, &next, sizeof(next));
+                       buffer_next = next;
+                       bufs--;
+               }
+               wqe->pki_errata20776 = 1;
+       }
+}
+
+/**
+ * @INTERNAL
+ *
+ * Extract the native PKI-specific buffer pointer from WQE.
+ *
+ * NOTE: Provisional, may be superceded.
+ */
+static inline cvmx_buf_ptr_pki_t cvmx_wqe_get_pki_pkt_ptr(cvmx_wqe_t *work)
+{
+       cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_buf_ptr_pki_t x = { 0 };
+               return x;
+       }
+
+       cvmx_wqe_pki_errata_20776(work);
+       return wqe->packet_ptr;
+}
+
+/**
+ * Set the buffer segment count for a packet.
+ *
+ * @return Returns the actual resulting value in the WQE fielda
+ *
+ */
+static inline unsigned int cvmx_wqe_set_bufs(cvmx_wqe_t *work, unsigned int bufs)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               work->word0.pki.bufs = bufs;
+               return work->word0.pki.bufs;
+       }
+
+       work->word2.s.bufs = bufs;
+       return work->word2.s.bufs;
+}
+
+/**
+ * Get the offset of Layer-3 header,
+ * only supported when Layer-3 protocol is IPv4 or IPv6.
+ *
+ * @return Returns the offset, or 0 if the offset is not known or unsupported.
+ *
+ * FIXME: Assuming word4 is present.
+ */
+static inline unsigned int cvmx_wqe_get_l3_offset(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+               /* Match 4 values: IPv4/v6 w/wo options */
+               if ((wqe->word2.lc_hdr_type & 0x1c) == CVMX_PKI_LTYPE_E_IP4)
+                       return wqe->word4.ptr_layer_c;
+       } else {
+               return work->word2.s.ip_offset;
+       }
+
+       return 0;
+}
+
+/**
+ * Set the offset of Layer-3 header in a packet.
+ * Typically used when an IP packet is generated by software
+ * or when the Layer-2 header length is modified, and
+ * a subsequent recalculation of checksums is anticipated.
+ *
+ * @return Returns the actual value of the work entry offset field.
+ *
+ * FIXME: Assuming word4 is present.
+ */
+static inline unsigned int cvmx_wqe_set_l3_offset(cvmx_wqe_t *work, unsigned int ip_off)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+               /* Match 4 values: IPv4/v6 w/wo options */
+               if ((wqe->word2.lc_hdr_type & 0x1c) == CVMX_PKI_LTYPE_E_IP4)
+                       wqe->word4.ptr_layer_c = ip_off;
+       } else {
+               work->word2.s.ip_offset = ip_off;
+       }
+
+       return cvmx_wqe_get_l3_offset(work);
+}
+
+/**
+ * Set the indication that the packet contains a IPv4 Layer-3 * header.
+ * Use 'cvmx_wqe_set_l3_ipv6()' if the protocol is IPv6.
+ * When 'set' is false, the call will result in an indication
+ * that the Layer-3 protocol is neither IPv4 nor IPv6.
+ *
+ * FIXME: Add IPV4_OPT handling based on L3 header length.
+ */
+static inline void cvmx_wqe_set_l3_ipv4(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (set)
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_IP4;
+               else
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_NONE;
+       } else {
+               work->word2.s.not_IP = !set;
+               if (set)
+                       work->word2.s_cn38xx.is_v6 = 0;
+       }
+}
+
+/**
+ * Set packet Layer-3 protocol to IPv6.
+ *
+ * FIXME: Add IPV6_OPT handling based on presence of extended headers.
+ */
+static inline void cvmx_wqe_set_l3_ipv6(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (set)
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_IP6;
+               else
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_NONE;
+       } else {
+               work->word2.s_cn38xx.not_IP = !set;
+               if (set)
+                       work->word2.s_cn38xx.is_v6 = 1;
+       }
+}
+
+/**
+ * Set a packet Layer-4 protocol type to UDP.
+ */
+static inline void cvmx_wqe_set_l4_udp(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (set)
+                       wqe->word2.lf_hdr_type = CVMX_PKI_LTYPE_E_UDP;
+               else
+                       wqe->word2.lf_hdr_type = CVMX_PKI_LTYPE_E_NONE;
+       } else {
+               if (!work->word2.s_cn38xx.not_IP)
+                       work->word2.s_cn38xx.tcp_or_udp = set;
+       }
+}
+
+/**
+ * Set a packet Layer-4 protocol type to TCP.
+ */
+static inline void cvmx_wqe_set_l4_tcp(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (set)
+                       wqe->word2.lf_hdr_type = CVMX_PKI_LTYPE_E_TCP;
+               else
+                       wqe->word2.lf_hdr_type = CVMX_PKI_LTYPE_E_NONE;
+       } else {
+               if (!work->word2.s_cn38xx.not_IP)
+                       work->word2.s_cn38xx.tcp_or_udp = set;
+       }
+}
+
+/**
+ * Set the "software" flag in a work entry.
+ */
+static inline void cvmx_wqe_set_soft(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               wqe->word2.software = set;
+       } else {
+               work->word2.s.software = set;
+       }
+}
+
+/**
+ * Return true if the packet is an IP fragment.
+ */
+static inline bool cvmx_wqe_is_l3_frag(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return (wqe->word2.is_frag != 0);
+       }
+
+       if (!work->word2.s_cn38xx.not_IP)
+               return (work->word2.s.is_frag != 0);
+
+       return false;
+}
+
+/**
+ * Set the indicator that the packet is an fragmented IP packet.
+ */
+static inline void cvmx_wqe_set_l3_frag(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               wqe->word2.is_frag = set;
+       } else {
+               if (!work->word2.s_cn38xx.not_IP)
+                       work->word2.s.is_frag = set;
+       }
+}
+
+/**
+ * Set the packet Layer-3 protocol to RARP.
+ */
+static inline void cvmx_wqe_set_l3_rarp(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (set)
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_RARP;
+               else
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_NONE;
+       } else {
+               work->word2.snoip.is_rarp = set;
+       }
+}
+
+/**
+ * Set the packet Layer-3 protocol to ARP.
+ */
+static inline void cvmx_wqe_set_l3_arp(cvmx_wqe_t *work, bool set)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               if (set)
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_ARP;
+               else
+                       wqe->word2.lc_hdr_type = CVMX_PKI_LTYPE_E_NONE;
+       } else {
+               work->word2.snoip.is_arp = set;
+       }
+}
+
+/**
+ * Return true if the packet Layer-3 protocol is ARP.
+ */
+static inline bool cvmx_wqe_is_l3_arp(cvmx_wqe_t *work)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN78XX_WQE)) {
+               cvmx_wqe_78xx_t *wqe = (cvmx_wqe_78xx_t *)work;
+
+               return (wqe->word2.lc_hdr_type == CVMX_PKI_LTYPE_E_ARP);
+       }
+
+       if (work->word2.s_cn38xx.not_IP)
+               return (work->word2.snoip.is_arp != 0);
+
+       return false;
+}
+
+#endif /* __CVMX_WQE_H__ */
index 1202716..2eb1714 100644 (file)
@@ -6,6 +6,8 @@
 #ifndef __OCTEON_FEATURE_H__
 #define __OCTEON_FEATURE_H__
 
+#include "cvmx-fuse.h"
+
 /*
  * Octeon models are declared after the macros in octeon-model.h with the
  * suffix _FEATURE. The individual features are declared with the
index 22d6df6..9164a4c 100644 (file)
@@ -28,6 +28,8 @@
  * use only, and may change without notice.
  */
 
+#include <asm/mipsregs.h>
+
 #define OCTEON_FAMILY_MASK      0x00ffff00
 #define OCTEON_PRID_MASK       0x00ffffff
 
index 4473be4..0b5be06 100644 (file)
 #include <linux/delay.h>
 #include <linux/io.h>
 #include <mach/octeon-model.h>
-#include <mach/cvmx/cvmx-lmcx-defs.h>
-
-/* Mapping is done starting from 0x11800.80000000 */
-#define CVMX_L2C_CTL           0x00800000
-#define CVMX_L2C_BIG_CTL       0x00800030
-#define CVMX_L2C_TADX_INT(i)   (0x00a00028 + (((i) & 7) * 0x40000))
-#define CVMX_L2C_MCIX_INT(i)   (0x00c00028 + (((i) & 3) * 0x40000))
+#include <mach/cvmx-lmcx-defs.h>
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-l2c-defs.h>
 
 /* Some "external" (non-LMC) registers */
 #define CVMX_IPD_CLK_COUNT             0x00014F0000000338
@@ -68,34 +64,6 @@ static inline void l2c_wr(struct ddr_priv *priv, u64 addr, u64 val)
        iowrite64(val, priv->l2c_base + addr);
 }
 
-/* Access other CSR registers not located inside the LMC address space */
-static inline u64 csr_rd(u64 addr)
-{
-       void __iomem *base;
-
-       base = ioremap_nocache(addr, 0x100);
-       return ioread64(base);
-}
-
-static inline void csr_wr(u64 addr, u64 val)
-{
-       void __iomem *base;
-
-       base = ioremap_nocache(addr, 0x100);
-       return iowrite64(val, base);
-}
-
-/* "Normal" access, without any offsets and/or mapping */
-static inline u64 cvmx_read64_uint64(u64 addr)
-{
-       return readq((void *)addr);
-}
-
-static inline void cvmx_write64_uint64(u64 addr, u64 val)
-{
-       writeq(val, (void *)addr);
-}
-
 /* Failsafe mode */
 #define FLAG_FAILSAFE_MODE             0x01000
 /* Note that the DDR clock initialized flags must be contiguous */
@@ -152,8 +120,6 @@ static inline int ddr_verbose(void)
 #define CVMX_TMP_STR(x) CVMX_TMP_STR2(x)
 #define CVMX_TMP_STR2(x) #x
 
-#define CVMX_SYNC asm volatile ("sync" : : : "memory")
-
 #define CVMX_CACHE(op, address, offset)                                        \
        asm volatile ("cache " CVMX_TMP_STR(op) ", "                    \
                      CVMX_TMP_STR(offset) "(%[rbase])"                 \
@@ -167,157 +133,6 @@ static inline int ddr_verbose(void)
 #define CVMX_DCACHE_INVALIDATE                                 \
        { CVMX_SYNC; asm volatile ("cache 9, 0($0)" : : ); }
 
-/**
- * cvmx_l2c_cfg
- *
- * Specify the RSL base addresses for the block
- *
- *                  L2C_CFG = L2C Configuration
- *
- * Description:
- */
-union cvmx_l2c_cfg {
-       u64 u64;
-       struct cvmx_l2c_cfg_s {
-               uint64_t reserved_20_63:44;
-               uint64_t bstrun:1;
-               uint64_t lbist:1;
-               uint64_t xor_bank:1;
-               uint64_t dpres1:1;
-               uint64_t dpres0:1;
-               uint64_t dfill_dis:1;
-               uint64_t fpexp:4;
-               uint64_t fpempty:1;
-               uint64_t fpen:1;
-               uint64_t idxalias:1;
-               uint64_t mwf_crd:4;
-               uint64_t rsp_arb_mode:1;
-               uint64_t rfb_arb_mode:1;
-               uint64_t lrf_arb_mode:1;
-       } s;
-};
-
-/**
- * cvmx_l2c_ctl
- *
- * L2C_CTL = L2C Control
- *
- *
- * Notes:
- * (1) If MAXVAB is != 0, VAB_THRESH should be less than MAXVAB.
- *
- * (2) L2DFDBE and L2DFSBE allows software to generate L2DSBE, L2DDBE, VBFSBE,
- * and VBFDBE errors for the purposes of testing error handling code.  When
- * one (or both) of these bits are set a PL2 which misses in the L2 will fill
- * with the appropriate error in the first 2 OWs of the fill. Software can
- * determine which OW pair gets the error by choosing the desired fill order
- * (address<6:5>).  A PL2 which hits in the L2 will not inject any errors.
- * Therefore sending a WBIL2 prior to the PL2 is recommended to make a miss
- * likely (if multiple processors are involved software must be careful to be
- * sure no other processor or IO device can bring the block into the L2).
- *
- * To generate a VBFSBE or VBFDBE, software must first get the cache block
- * into the cache with an error using a PL2 which misses the L2.  Then a
- * store partial to a portion of the cache block without the error must
- * change the block to dirty.  Then, a subsequent WBL2/WBIL2/victim will
- * trigger the VBFSBE/VBFDBE error.
- */
-union cvmx_l2c_ctl {
-       u64 u64;
-       struct cvmx_l2c_ctl_s {
-               uint64_t reserved_29_63:35;
-               uint64_t rdf_fast:1;
-               uint64_t disstgl2i:1;
-               uint64_t l2dfsbe:1;
-               uint64_t l2dfdbe:1;
-               uint64_t discclk:1;
-               uint64_t maxvab:4;
-               uint64_t maxlfb:4;
-               uint64_t rsp_arb_mode:1;
-               uint64_t xmc_arb_mode:1;
-               uint64_t reserved_2_13:12;
-               uint64_t disecc:1;
-               uint64_t disidxalias:1;
-       } s;
-
-       struct cvmx_l2c_ctl_cn73xx {
-               uint64_t reserved_32_63:32;
-               uint64_t ocla_qos:3;
-               uint64_t reserved_28_28:1;
-               uint64_t disstgl2i:1;
-               uint64_t reserved_25_26:2;
-               uint64_t discclk:1;
-               uint64_t reserved_16_23:8;
-               uint64_t rsp_arb_mode:1;
-               uint64_t xmc_arb_mode:1;
-               uint64_t rdf_cnt:8;
-               uint64_t reserved_4_5:2;
-               uint64_t disldwb:1;
-               uint64_t dissblkdty:1;
-               uint64_t disecc:1;
-               uint64_t disidxalias:1;
-       } cn73xx;
-
-       struct cvmx_l2c_ctl_cn73xx cn78xx;
-};
-
-/**
- * cvmx_l2c_big_ctl
- *
- * L2C_BIG_CTL = L2C Big memory control register
- *
- *
- * Notes:
- * (1) BIGRD interrupts can occur during normal operation as the PP's are
- * allowed to prefetch to non-existent memory locations.  Therefore,
- * BIGRD is for informational purposes only.
- *
- * (2) When HOLEWR/BIGWR blocks a store L2C_VER_ID, L2C_VER_PP, L2C_VER_IOB,
- * and L2C_VER_MSC will be loaded just like a store which is blocked by VRTWR.
- * Additionally, L2C_ERR_XMC will be loaded.
- */
-union cvmx_l2c_big_ctl {
-       u64 u64;
-       struct cvmx_l2c_big_ctl_s {
-               uint64_t reserved_8_63:56;
-               uint64_t maxdram:4;
-               uint64_t reserved_0_3:4;
-       } s;
-       struct cvmx_l2c_big_ctl_cn61xx {
-               uint64_t reserved_8_63:56;
-               uint64_t maxdram:4;
-               uint64_t reserved_1_3:3;
-               uint64_t disable:1;
-       } cn61xx;
-       struct cvmx_l2c_big_ctl_cn61xx cn63xx;
-       struct cvmx_l2c_big_ctl_cn61xx cn66xx;
-       struct cvmx_l2c_big_ctl_cn61xx cn68xx;
-       struct cvmx_l2c_big_ctl_cn61xx cn68xxp1;
-       struct cvmx_l2c_big_ctl_cn70xx {
-               uint64_t reserved_8_63:56;
-               uint64_t maxdram:4;
-               uint64_t reserved_1_3:3;
-               uint64_t disbig:1;
-       } cn70xx;
-       struct cvmx_l2c_big_ctl_cn70xx cn70xxp1;
-       struct cvmx_l2c_big_ctl_cn70xx cn73xx;
-       struct cvmx_l2c_big_ctl_cn70xx cn78xx;
-       struct cvmx_l2c_big_ctl_cn70xx cn78xxp1;
-       struct cvmx_l2c_big_ctl_cn61xx cnf71xx;
-       struct cvmx_l2c_big_ctl_cn70xx cnf75xx;
-};
-
-struct rlevel_byte_data {
-       int delay;
-       int loop_total;
-       int loop_count;
-       int best;
-       u64 bm;
-       int bmerrs;
-       int sqerrs;
-       int bestsq;
-};
-
 #define DEBUG_VALIDATE_BITMASK 0
 #if DEBUG_VALIDATE_BITMASK
 #define debug_bitmask_print printf
diff --git a/arch/mips/mach-octeon/include/mach/octeon_eth.h b/arch/mips/mach-octeon/include/mach/octeon_eth.h
new file mode 100644 (file)
index 0000000..bfef0a6
--- /dev/null
@@ -0,0 +1,141 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __OCTEON_ETH_H__
+#define __OCTEON_ETH_H__
+
+#include <phy.h>
+#include <miiphy.h>
+
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-board.h>
+#include <mach/octeon_fdt.h>
+
+struct eth_device;
+
+/** Ethernet device private data structure for octeon ethernet */
+struct octeon_eth_info {
+       u64 link_state;
+       u32 port;                  /** ipd port */
+       u32 interface;             /** Port interface */
+       u32 index;                 /** port index on interface */
+       int node;                  /** OCX node number */
+       u32 initted_flag;          /** 0 if port not initialized */
+       struct mii_dev *mii_bus;   /** MII bus for PHY */
+       struct phy_device *phydev; /** PHY device */
+       struct eth_device *ethdev; /** Eth device this priv is part of */
+       int mii_addr;
+       int phy_fdt_offset;                 /** Offset of PHY info in device tree */
+       int fdt_offset;                     /** Offset of Eth interface in DT */
+       int phy_offset;                     /** Offset of PHY dev in device tree */
+       enum cvmx_phy_type phy_device_type; /** Type of PHY */
+       /* current link status, use to reconfigure on status changes */
+       u64 packets_sent;
+       u64 packets_received;
+       u32 link_speed : 2;
+       u32 link_duplex : 1;
+       u32 link_status : 1;
+       u32 loopback : 1;
+       u32 enabled : 1;
+       u32 is_c45 : 1;             /** Set if we need to use clause 45 */
+       u32 vitesse_sfp_config : 1; /** Need Vitesse SFP config */
+       u32 ti_gpio_config : 1;     /** Need TI GPIO config */
+       u32 bgx_mac_set : 1;        /** Has the BGX MAC been set already */
+       u64 last_bgx_mac;           /** Last BGX MAC address set */
+       u64 gmx_base;               /** Base address to access GMX CSRs */
+       bool mod_abs;               /** True if module is absent */
+
+       /**
+        * User defined function to check if a SFP+ module is absent or not.
+        *
+        * @param       dev     Ethernet device
+        * @param       data    User supplied data
+        */
+       int (*check_mod_abs)(struct eth_device *dev, void *data);
+
+       /** User supplied data for check_mod_abs */
+       void *mod_abs_data;
+       /**
+        * Called to check the status of a port.  This is used for some
+        * Vitesse and Inphi phys to probe the sFP adapter.
+        */
+       int (*phy_port_check)(struct phy_device *dev);
+       /**
+        * Called whenever mod_abs changes state
+        *
+        * @param       dev     Ethernet device
+        * @param       mod_abs True if module is absent
+        *
+        * @return      0 for success, otherwise error
+        */
+       int (*mod_abs_changed)(struct eth_device *dev, bool mod_abs);
+       /** SDK phy information data structure */
+       cvmx_phy_info_t phy_info;
+#ifdef CONFIG_OCTEON_SFP
+       /** Information about connected SFP/SFP+/SFP28/QSFP+/QSFP28 module */
+       struct octeon_sfp_info sfp;
+#endif
+};
+
+/**
+ * Searches for an ethernet device based on interface and index.
+ *
+ * @param interface - interface number to search for
+ * @param index - index to search for
+ *
+ * @returns pointer to ethernet device or NULL if not found.
+ */
+struct eth_device *octeon_find_eth_by_interface_index(int interface, int index);
+
+/**
+ * User-defined function called when the link state changes
+ *
+ * @param[in]  dev             Ethernet device
+ * @param      link_state      new link state
+ *
+ * NOTE: This is defined as a weak function.
+ */
+void board_net_set_link(struct eth_device *dev, cvmx_helper_link_info_t link_state);
+
+/**
+ * Registers a function to be called when the link goes down.  The function is
+ * often used for things like reading the SFP+ EEPROM.
+ *
+ * @param      dev             Ethernet device
+ * @param      phy_port_check  Function to call
+ */
+void octeon_eth_register_phy_port_check(struct eth_device *dev,
+                                       int (*phy_port_check)(struct phy_device *dev));
+
+/**
+ * This weak function is called after the phy driver is connected but before
+ * it is initialized.
+ *
+ * @param      dev     Ethernet device for phy
+ *
+ * @return     0 to continue, or -1 for error to stop setting up the phy
+ */
+int octeon_eth_board_post_setup_phy(struct eth_device *dev);
+
+/**
+ * Registers a function to be called whenever a mod_abs change is detected.
+ *
+ * @param      dev             Ethernet device
+ * @param      mod_abs_changed Function to be called
+ */
+void octeon_eth_register_mod_abs_changed(struct eth_device *dev,
+                                        int (*mod_abs_changed)(struct eth_device *dev,
+                                                               bool mod_abs));
+
+/**
+ * Checks for state changes with the link state or module state
+ *
+ * @param      dev     Ethernet device to check
+ *
+ * NOTE: If the module state is changed then the module callback is called.
+ */
+void octeon_phy_port_check(struct eth_device *dev);
+
+#endif /* __OCTEON_ETH_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/octeon_fdt.h b/arch/mips/mach-octeon/include/mach/octeon_fdt.h
new file mode 100644 (file)
index 0000000..31878cb
--- /dev/null
@@ -0,0 +1,268 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __OCTEON_FDT_H__
+#define __OCTEON_FDT_H__
+
+struct phy_device;
+
+/** Type of GPIO pin */
+enum octeon_gpio_type {
+       GPIO_TYPE_OCTEON,  /** Native Octeon */
+       GPIO_TYPE_PCA953X, /** PCA953X i2c GPIO expander */
+       GPIO_TYPE_PCA9554, /** PCA9554 i2c GPIO expander */
+       GPIO_TYPE_PCA9555, /** PCA9555 i2c GPIO expander */
+       GPIO_TYPE_PCA9698, /** PCA9698 i2c GPIO expander */
+#ifdef CONFIG_PHY_VITESSE
+       GPIO_TYPE_VSC8488, /** Vitesse VSC8488 or related PHY GPIO */
+#endif
+       GPIO_TYPE_UNKNOWN /** Unknown GPIO type */
+};
+
+/**
+ * Trims nodes from the flat device tree.
+ *
+ * @param fdt - pointer to working FDT, usually in gd->fdt_blob
+ * @param fdt_key - key to preserve.  All non-matching keys are removed
+ * @param trim_name - name of property to look for.  If NULL use
+ *                   'cavium,qlm-trim'
+ * @param rename - set to TRUE to rename interfaces.
+ * @param callback - function to call on matched nodes.
+ * @param cbarg - passed to callback.
+ *
+ * The key should look something like device #, type where device # is a
+ * number from 0-9 and type is a string describing the type.  For QLM
+ * operations this would typically contain the QLM number followed by
+ * the type in the device tree, like "0,xaui", "0,sgmii", etc.  This function
+ * will trim all items in the device tree which match the device number but
+ * have a type which does not match.  For example, if a QLM has a xaui module
+ * installed on QLM 0 and "0,xaui" is passed as a key, then all FDT nodes that
+ * have "0,xaui" will be preserved but all others, i.e. "0,sgmii" will be
+ * removed.
+ *
+ * Note that the trim_name must also match.  If trim_name is NULL then it
+ * looks for the property "cavium,qlm-trim".
+ *
+ * Also, when the trim_name is "cavium,qlm-trim" or NULL that the interfaces
+ * will also be renamed based on their register values.
+ *
+ * For example, if a PIP interface is named "interface@W" and has the property
+ * reg = <0> then the interface will be renamed after this function to
+ * interface@0.
+ *
+ * @return 0 for success.
+ */
+int octeon_fdt_patch_rename(void *fdt, const char *fdt_key, const char *trim_name, bool rename,
+                           void (*callback)(void *fdt, int offset, void *arg), void *cbarg);
+
+/**
+ * Trims nodes from the flat device tree.
+ *
+ * @param fdt - pointer to working FDT, usually in gd->fdt_blob
+ * @param fdt_key - key to preserve.  All non-matching keys are removed
+ * @param trim_name - name of property to look for.  If NULL use
+ *                   'cavium,qlm-trim'
+ *
+ * The key should look something like device #, type where device # is a
+ * number from 0-9 and type is a string describing the type.  For QLM
+ * operations this would typically contain the QLM number followed by
+ * the type in the device tree, like "0,xaui", "0,sgmii", etc.  This function
+ * will trim all items in the device tree which match the device number but
+ * have a type which does not match.  For example, if a QLM has a xaui module
+ * installed on QLM 0 and "0,xaui" is passed as a key, then all FDT nodes that
+ * have "0,xaui" will be preserved but all others, i.e. "0,sgmii" will be
+ * removed.
+ *
+ * Note that the trim_name must also match.  If trim_name is NULL then it
+ * looks for the property "cavium,qlm-trim".
+ *
+ * Also, when the trim_name is "cavium,qlm-trim" or NULL that the interfaces
+ * will also be renamed based on their register values.
+ *
+ * For example, if a PIP interface is named "interface@W" and has the property
+ * reg = <0> then the interface will be renamed after this function to
+ * interface@0.
+ *
+ * @return 0 for success.
+ */
+int octeon_fdt_patch(void *fdt, const char *fdt_key, const char *trim_name);
+
+/**
+ * Fix up the MAC address in the flat device tree based on the MAC address
+ * stored in ethaddr or in the board descriptor.
+ *
+ * NOTE: This function is weak and an alias for __octeon_fixup_fdt_mac_addr.
+ */
+void octeon_fixup_fdt_mac_addr(void);
+
+/**
+ * This function fixes the clock-frequency in the flat device tree for the UART.
+ *
+ * NOTE: This function is weak and an alias for __octeon_fixup_fdt_uart.
+ */
+void octeon_fixup_fdt_uart(void);
+
+/**
+ * This function fills in the /memory portion of the flat device tree.
+ *
+ * NOTE: This function is weak and aliased to __octeon_fixup_fdt_memory.
+ */
+void octeon_fixup_fdt_memory(void);
+
+int board_fixup_fdt(void);
+
+void octeon_fixup_fdt(void);
+
+/**
+ * This is a helper function to find the offset of a PHY device given
+ * an Ethernet device.
+ *
+ * @param[in] eth - Ethernet device to search for PHY offset
+ *
+ * @returns offset of phy info in device tree or -1 if not found
+ */
+int octeon_fdt_find_phy(const struct udevice *eth);
+
+/**
+ * This helper function returns if a node contains the specified vendor name.
+ *
+ * @param[in]  fdt             pointer to device tree blob
+ * @param      nodeoffset      offset of the tree node
+ * @param[in]  vendor          name of vendor to check
+ *
+ * returns:
+ *     0, if the node has a compatible vendor string property
+ *     1, if the node does not contain the vendor string property
+ *     -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
+ *     -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_BADSTATE,
+ *     -FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int octeon_fdt_compat_vendor(const void *fdt, int nodeoffset, const char *vendor);
+
+/**
+ * Given a node in the device tree get the OCTEON OCX node number
+ *
+ * @param fdt          pointer to flat device tree
+ * @param nodeoffset   node offset to get OCX node for
+ *
+ * @return the Octeon OCX node number
+ */
+int octeon_fdt_get_soc_node(const void *fdt, int nodeoffset);
+
+/**
+ * Given a FDT node, check if it is compatible with a list of devices
+ *
+ * @param[in]  fdt             Flat device tree pointer
+ * @param      node_offset     Node offset in device tree
+ * @param[in]  strlist         Array of FDT devices to check, end must be NULL
+ *
+ * @return     0 if at least one device is compatible, 1 if not compatible.
+ */
+int octeon_fdt_node_check_compatible(const void *fdt, int node_offset, const char *const *strlist);
+/**
+ * Given a node offset, find the i2c bus number for that node
+ *
+ * @param[in]  fdt     Pointer to flat device tree
+ * @param      node_offset     Node offset in device tree
+ *
+ * @return     i2c bus number or -1 if error
+ */
+int octeon_fdt_i2c_get_bus(const void *fdt, int node_offset);
+
+/**
+ * Given an offset into the fdt, output the i2c bus and address of the device
+ *
+ * @param[in]  fdt     fdt blob pointer
+ * @param      node    offset in FDT of device
+ * @param[out] bus     i2c bus number of device
+ * @param[out] addr    address of device on i2c bus
+ *
+ * @return     0 for success, -1 on error
+ */
+int octeon_fdt_get_i2c_bus_addr(const void *fdt, int node, int *bus, int *addr);
+
+/**
+ * Reads a GPIO pin given the node of the GPIO device in the device tree and
+ * the pin number.
+ *
+ * @param[in]  fdt     fdt blob pointer
+ * @param      phandle phandle of GPIO node
+ * @param      pin     pin number to read
+ *
+ * @return     0 = pin is low, 1 = pin is high, -1 = error
+ */
+int octeon_fdt_read_gpio(const void *fdt, int phandle, int pin);
+
+/**
+ * Reads a GPIO pin given the node of the GPIO device in the device tree and
+ * the pin number.
+ *
+ * @param[in]  fdt     fdt blob pointer
+ * @param      phandle phandle of GPIO node
+ * @param      pin     pin number to read
+ * @param      val     value to write (1 = high, 0 = low)
+ *
+ * @return     0 = success, -1 = error
+ */
+int octeon_fdt_set_gpio(const void *fdt, int phandle, int pin, int val);
+
+/**
+ * Given the node to a MAC entry in the device tree, output the i2c bus, address
+ * and if the module is absent.
+ *
+ * @param[in]  fdt             flat device tree pointer
+ * @param      mac_node        node of Ethernet port in the FDT
+ * @param[out] bus             i2c bus address of SFP EEPROM
+ * @param[out] addr            i2c address of SFP EEPROM
+ * @param[out] mod_abs         Set true if module is absent, false if present
+ *
+ * @return     0 for success, -1 if there are problems with the device tree
+ */
+int octeon_fdt_get_sfp_eeprom(const void *fdt, int mac_node, int *bus, int *addr, bool *mod_abs);
+
+/**
+ * Given a node to a MAC entry in the device tree, output the i2c bus, address
+ * and if the module is absent
+ *
+ * @param[in]  fdt             flat device tree pointer
+ * @param      mac_node        node of QSFP Ethernet port in FDT
+ * @param[out] bus             i2c bus address of SFP EEPROM
+ * @param[out] addr            i2c address of SFP eeprom
+ * @param[out] mod_abs         Set true if module is absent, false if present
+ *
+ * @return     0 for success, -1 if there are problems with the device tree
+ */
+int octeon_fdt_get_qsfp_eeprom(const void *fdt, int mac_node, int *bus, int *addr, bool *mod_abs);
+
+/**
+ * Given the node of a GPIO entry output the GPIO type, i2c bus and i2c
+ * address.
+ *
+ * @param      fdt_node        node of GPIO in device tree, generally
+ *                             derived from a phandle.
+ * @param[out] type            Type of GPIO detected
+ * @param[out] i2c_bus         For i2c GPIO expanders, the i2c bus number
+ * @param[out] i2c_addr        For i2c GPIO expanders, the i2c address
+ *
+ * @return     0 for success, -1 for errors
+ *
+ * NOTE: It is up to the caller to determine the pin number.
+ */
+int octeon_fdt_get_gpio_info(int fdt_node, enum octeon_gpio_type *type, int *i2c_bus,
+                            int *i2c_addr);
+
+/**
+ * Get the PHY data structure for the specified FDT node and output the type
+ *
+ * @param      fdt_node        FDT node of phy
+ * @param[out] type            Type of GPIO
+ *
+ * @return     pointer to phy device or NULL if no match found.
+ */
+struct phy_device *octeon_fdt_get_phy_gpio_info(int fdt_node, enum octeon_gpio_type *type);
+#endif /* __OCTEON_FDT_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/octeon_pci.h b/arch/mips/mach-octeon/include/mach/octeon_pci.h
new file mode 100644 (file)
index 0000000..3034f23
--- /dev/null
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __OCTEON_PCI_H__
+#define __OCTEON_PCI_H__
+
+/**
+ * EEPROM entry struct
+ */
+union octeon_pcie_eeprom {
+       u64 u64;
+       struct octeon_data_s {
+               /**
+                * 0x9DA1 valid entry, 0x6A5D end of table, 0xffff invalid
+                * access
+                */
+               u64 preamble : 16;
+u64: 1; /** Reserved */
+               /** Physical function number accessed by the write operation. */
+               u64 pf : 2;
+               /**
+                * Specifies bit<31> of the address written by hardware.
+                * 1 = configuration mask register, 0 = configuration register
+                */
+               u64 cs2 : 1;
+               /**
+                * Specifies bits<11:0> of the address written by hardware.
+                * Bits<30:12> of this address are all 0s.
+                */
+               u64 address : 12;
+               u64 data : 32;
+       } s;
+};
+
+void pci_dev_post_init(void);
+
+int octeon_pci_io_readb(unsigned int reg);
+void octeon_pci_io_writeb(int value, unsigned int reg);
+int octeon_pci_io_readw(unsigned int reg);
+void octeon_pci_io_writew(int value, unsigned int reg);
+int octeon_pci_io_readl(unsigned int reg);
+void octeon_pci_io_writel(int value, unsigned int reg);
+int octeon_pci_mem1_readb(unsigned int reg);
+void octeon_pci_mem1_writeb(int value, unsigned int reg);
+int octeon_pci_mem1_readw(unsigned int reg);
+void octeon_pci_mem1_writew(int value, unsigned int reg);
+int octeon_pci_mem1_readl(unsigned int reg);
+void octeon_pci_mem1_writel(int value, unsigned int reg);
+
+/* In the TLB mapped case, these also work with virtual addresses,
+** and do the required virt<->phys translations as well. */
+u32 octeon_pci_phys_to_bus(u32 phys);
+u32 octeon_pci_bus_to_phys(u32 bus);
+
+/**
+ * Searches PCIe EEPROM for override data specified by address and pf.
+ *
+ * @param      address - PCIe config space address
+ * @param      pf      - PCIe config space pf num
+ * @param[out] id      - override device and vendor ID
+ *
+ * @return     0 if override found, 1 if not found.
+ */
+int octeon_find_pcie_id_override(unsigned int address, unsigned int pf, u32 *id);
+
+#endif /* __OCTEON_PCI_H__ */
diff --git a/arch/mips/mach-octeon/include/mach/octeon_qlm.h b/arch/mips/mach-octeon/include/mach/octeon_qlm.h
new file mode 100644 (file)
index 0000000..219625b
--- /dev/null
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#ifndef __OCTEON_QLM_H__
+#define __OCTEON_QLM_H__
+
+/* Reference clock selector values for ref_clk_sel */
+#define OCTEON_QLM_REF_CLK_100MHZ 0 /** 100 MHz */
+#define OCTEON_QLM_REF_CLK_125MHZ 1 /** 125 MHz */
+#define OCTEON_QLM_REF_CLK_156MHZ 2 /** 156.25 MHz */
+#define OCTEON_QLM_REF_CLK_161MHZ 3 /** 161.1328125 MHz */
+
+/**
+ * Configure qlm/dlm speed and mode.
+ * @param qlm     The QLM or DLM to configure
+ * @param speed   The speed the QLM needs to be configured in Mhz.
+ * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
+ * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP
+ *               mode.
+ * @param pcie_mode Only used when qlm/dlm are in pcie mode.
+ * @param ref_clk_sel Reference clock to use for 70XX where:
+ *                     0: 100MHz
+ *                     1: 125MHz
+ *                     2: 156.25MHz
+ *                     3: 161.1328125MHz (CN73XX and CN78XX only)
+ * @param ref_clk_input        This selects which reference clock input to use.  For
+ *                     cn70xx:
+ *                             0: DLMC_REF_CLK0
+ *                             1: DLMC_REF_CLK1
+ *                             2: DLM0_REF_CLK
+ *                     cn61xx: (not used)
+ *                     cn78xx/cn76xx/cn73xx:
+ *                             0: Internal clock (QLM[0-7]_REF_CLK)
+ *                             1: QLMC_REF_CLK0
+ *                             2: QLMC_REF_CLK1
+ *
+ * @return     Return 0 on success or -1.
+ *
+ * @note       When the 161MHz clock is used it can only be used for
+ *             XLAUI mode with a 6316 speed or XFI mode with a 103125 speed.
+ *             This rate is also only supported for CN73XX and CN78XX.
+ */
+int octeon_configure_qlm(int qlm, int speed, int mode, int rc, int pcie_mode, int ref_clk_sel,
+                        int ref_clk_input);
+
+int octeon_configure_qlm_cn78xx(int node, int qlm, int speed, int mode, int rc, int pcie_mode,
+                               int ref_clk_sel, int ref_clk_input);
+
+/**
+ * Some QLM speeds need to override the default tuning parameters
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param baud_mhz Desired speed in MHz
+ * @param lane     Lane the apply the tuning parameters
+ * @param tx_swing Voltage swing.  The higher the value the lower the voltage,
+ *                the default value is 7.
+ * @param tx_pre   pre-cursor pre-emphasis
+ * @param tx_post  post-cursor pre-emphasis.
+ * @param tx_gain   Transmit gain. Range 0-7
+ * @param tx_vboost Transmit voltage boost. Range 0-1
+ */
+void octeon_qlm_tune_per_lane_v3(int node, int qlm, int baud_mhz, int lane, int tx_swing,
+                                int tx_pre, int tx_post, int tx_gain, int tx_vboost);
+
+/**
+ * Some QLM speeds need to override the default tuning parameters
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param baud_mhz Desired speed in MHz
+ * @param tx_swing Voltage swing.  The higher the value the lower the voltage,
+ *                the default value is 7.
+ * @param tx_premptap bits [0:3] pre-cursor pre-emphasis, bits[4:8] post-cursor
+ *                   pre-emphasis.
+ * @param tx_gain   Transmit gain. Range 0-7
+ * @param tx_vboost Transmit voltage boost. Range 0-1
+ */
+void octeon_qlm_tune_v3(int node, int qlm, int baud_mhz, int tx_swing, int tx_premptap, int tx_gain,
+                       int tx_vboost);
+
+/**
+ * Disables DFE for the specified QLM lane(s).
+ * This function should only be called for low-loss channels.
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param lane     Lane to configure, or -1 all lanes
+ * @param baud_mhz The speed the QLM needs to be configured in Mhz.
+ * @param mode     The QLM to be configured as SGMII/XAUI/PCIe.
+ */
+void octeon_qlm_dfe_disable(int node, int qlm, int lane, int baud_mhz, int mode);
+
+/**
+ * Some QLMs need to override the default pre-ctle for low loss channels.
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param pre_ctle pre-ctle settings for low loss channels
+ */
+void octeon_qlm_set_channel_v3(int node, int qlm, int pre_ctle);
+
+void octeon_init_qlm(int node);
+
+int octeon_mcu_probe(int node);
+
+#endif /* __OCTEON_QLM_H__ */
diff --git a/arch/mips/mach-octeon/octeon_fdt.c b/arch/mips/mach-octeon/octeon_fdt.c
new file mode 100644 (file)
index 0000000..199f692
--- /dev/null
@@ -0,0 +1,1040 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#include <env.h>
+#include <log.h>
+#include <i2c.h>
+#include <net.h>
+#include <dm/device.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-csr.h>
+#include <mach/cvmx-bootmem.h>
+#include <mach/octeon-model.h>
+#include <mach/octeon_eth.h>
+#include <mach/octeon_fdt.h>
+#include <mach/cvmx-helper-fdt.h>
+#include <mach/cvmx-helper-gpio.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/octeon-feature.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <asm/gpio.h>
+
+#ifdef CONFIG_PCA953X
+#include <pca953x.h>
+#endif
+#ifdef CONFIG_PCF857X
+#include <pcf857x.h>
+#endif
+#ifdef CONFIG_PCA9698
+#include <pca9698.h>
+#endif
+#ifdef CONFIG_PCA9554
+#include <pca9554.h>
+#endif
+#ifdef CONFIG_PCA9555
+#include <pca9555.h>
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_PCA9554
+static const char * const pca9554_gpio_list[] = {
+       "pca9554",
+       "nxp,pca9554",
+       "ti,pca9554",
+       NULL,
+};
+#endif
+
+#ifdef CONFIG_PCA9555
+static const char * const pca9555_gpio_list[] = {
+       "pca9535",    "nxp,pca9535", "pca9539", "nxp,pca9539", "pca9555",
+       "nxp,pca9555", "ti,pca9555", "max7312", "maxim,max7312", "max7313",
+       "maxim,max7313", "tca6416", "tca9539",    NULL,
+};
+#endif
+
+#ifdef CONFIG_PCA9698
+/** List of compatible strings supported by pca9698 driver */
+static const char * const pca9698_gpio_list[] = {
+       "nxp,pca9505", "pca9505", "nxp,pca9698", "pca9698", NULL,
+};
+#endif
+
+#ifdef CONFIG_PCA953X
+/** List of compatible strings supported by pca953x driver */
+static const char * const pca953x_gpio_list[] = {
+       "nxp,pca9534", "nxp,pca9535", "nxp,pca9536", "nxp,pca9537", "nxp,pca9538", "nxp,pca9539",
+       "nxp,pca953x", "nxp,pca9554", "nxp,pca9555", "nxp,pca9556", "nxp,pca9557", "nxp,pca6107",
+       "pca9534",     "pca9535",     "pca9536",     "pca9537",     "pca9538",     "pca9539",
+       "pca953x",     "pca9554",     "pca9555",     "pca9556",     "pca9557",     "max7310",
+       "max7312",     "max7313",     "max7315",     "pca6107",     "tca6408",     "tca6416",
+       "tca9555",     NULL
+};
+#endif
+
+#ifdef CONFIG_PHY_VITESSE
+static const char * const vitesse_vsc8488_gpio_list[] = {
+       "vitesse,vsc8486",   "microsemi,vsc8486", "vitesse,vsc8488",
+       "microsemi,vsc8488", "vitesse,vsc8489",   "microsemi,vsc8489",
+       "vitesse,vsc8490",   "microsemi,vsc8490", NULL
+};
+#endif
+
+/** List of compatible strings supported by Octeon driver */
+static const char * const octeon_gpio_list[] = {
+       "cavium,octeon-7890-gpio",
+       "cavium,octeon-3860-gpio",
+       NULL
+};
+
+/**
+ * Trims nodes from the flat device tree.
+ *
+ * @param fdt - pointer to working FDT, usually in gd->fdt_blob
+ * @param fdt_key - key to preserve.  All non-matching keys are removed
+ * @param trim_name - name of property to look for.  If NULL use
+ *                   'cavium,qlm-trim'
+ *
+ * The key should look something like device #, type where device # is a
+ * number from 0-9 and type is a string describing the type.  For QLM
+ * operations this would typically contain the QLM number followed by
+ * the type in the device tree, like "0,xaui", "0,sgmii", etc.  This function
+ * will trim all items in the device tree which match the device number but
+ * have a type which does not match.  For example, if a QLM has a xaui module
+ * installed on QLM 0 and "0,xaui" is passed as a key, then all FDT nodes that
+ * have "0,xaui" will be preserved but all others, i.e. "0,sgmii" will be
+ * removed.
+ *
+ * Note that the trim_name must also match.  If trim_name is NULL then it
+ * looks for the property "cavium,qlm-trim".
+ *
+ * Also, when the trim_name is "cavium,qlm-trim" or NULL that the interfaces
+ * will also be renamed based on their register values.
+ *
+ * For example, if a PIP interface is named "interface@W" and has the property
+ * reg = <0> then the interface will be renamed after this function to
+ * interface@0.
+ *
+ * @return 0 for success.
+ */
+int __octeon_fdt_patch(void *fdt, const char *fdt_key, const char *trim_name)
+{
+       bool rename = !trim_name || !strcmp(trim_name, "cavium,qlm-trim");
+
+       return octeon_fdt_patch_rename(fdt, fdt_key, trim_name, rename, NULL, NULL);
+}
+
+int octeon_fdt_patch(void *fdt, const char *fdt_key, const char *trim_name)
+       __attribute__((weak, alias("__octeon_fdt_patch")));
+
+/**
+ * Trims nodes from the flat device tree.
+ *
+ * @param fdt - pointer to working FDT, usually in gd->fdt_blob
+ * @param fdt_key - key to preserve.  All non-matching keys are removed
+ * @param trim_name - name of property to look for.  If NULL use
+ *                   'cavium,qlm-trim'
+ * @param rename - set to TRUE to rename interfaces.
+ * @param callback - function to call on matched nodes.
+ * @param cbarg - passed to callback.
+ *
+ * The key should look something like device #, type where device # is a
+ * number from 0-9 and type is a string describing the type.  For QLM
+ * operations this would typically contain the QLM number followed by
+ * the type in the device tree, like "0,xaui", "0,sgmii", etc.  This function
+ * will trim all items in the device tree which match the device number but
+ * have a type which does not match.  For example, if a QLM has a xaui module
+ * installed on QLM 0 and "0,xaui" is passed as a key, then all FDT nodes that
+ * have "0,xaui" will be preserved but all others, i.e. "0,sgmii" will be
+ * removed.
+ *
+ * Note that the trim_name must also match.  If trim_name is NULL then it
+ * looks for the property "cavium,qlm-trim".
+ *
+ * Also, when the trim_name is "cavium,qlm-trim" or NULL that the interfaces
+ * will also be renamed based on their register values.
+ *
+ * For example, if a PIP interface is named "interface@W" and has the property
+ * reg = <0> then the interface will be renamed after this function to
+ * interface@0.
+ *
+ * @return 0 for success.
+ */
+int octeon_fdt_patch_rename(void *fdt, const char *fdt_key,
+                           const char *trim_name, bool rename,
+                           void (*callback)(void *fdt, int offset, void *arg),
+                           void *cbarg)
+       __attribute__((weak, alias("__octeon_fdt_patch_rename")));
+
+int __octeon_fdt_patch_rename(void *fdt, const char *fdt_key,
+                             const char *trim_name, bool rename,
+                             void (*callback)(void *fdt, int offset, void *arg),
+                             void *cbarg)
+{
+       int fdt_key_len;
+       int offset, next_offset;
+       int aliases;
+       const void *aprop;
+       char qlm[32];
+       char *mode;
+       int qlm_key_len;
+       int rc;
+       int cpu_node;
+
+       if (!trim_name)
+               trim_name = "cavium,qlm-trim";
+
+       strncpy(qlm, fdt_key, sizeof(qlm));
+       mode = qlm;
+       strsep(&mode, ",");
+       qlm_key_len = strlen(qlm);
+
+       debug("In %s: Patching FDT header at 0x%p with key \"%s\"\n", __func__, fdt, fdt_key);
+       if (!fdt || fdt_check_header(fdt) != 0) {
+               printf("%s: Invalid device tree\n", __func__);
+               return -1;
+       }
+
+       fdt_key_len = strlen(fdt_key) + 1;
+
+       /* Prune out the unwanted parts based on the QLM mode.  */
+       offset = 0;
+       for (offset = fdt_next_node(fdt, offset, NULL); offset >= 0; offset = next_offset) {
+               int len;
+               const char *val;
+               const char *val_comma;
+
+               next_offset = fdt_next_node(fdt, offset, NULL);
+
+               val = fdt_getprop(fdt, offset, trim_name, &len);
+               if (!val)
+                       continue;
+
+               debug("fdt found trim name %s, comparing key \"%s\"(%d) with \"%s\"(%d)\n",
+                     trim_name, fdt_key, fdt_key_len, val, len);
+               val_comma = strchr(val, ',');
+               if (!val_comma || (val_comma - val) != qlm_key_len)
+                       continue;
+               if (strncmp(val, qlm, qlm_key_len) != 0)
+                       continue; /* Not this QLM. */
+
+               debug("fdt key number \"%s\" matches\n", val);
+               if (!fdt_stringlist_contains(val, len, fdt_key)) {
+                       debug("Key \"%s\" does not match \"%s\"\n", val, fdt_key);
+                       /* This QLM, but wrong mode.  Delete it. */
+                       /* See if there's an alias that needs deleting */
+                       val = fdt_getprop(fdt, offset, "cavium,qlm-trim-alias", NULL);
+                       if (val) {
+                               debug("Trimming alias \"%s\"\n", val);
+                               aliases = fdt_path_offset(fdt, "/aliases");
+                               if (aliases) {
+                                       aprop = fdt_getprop(fdt, aliases, val, NULL);
+                                       if (aprop) {
+                                               rc = fdt_nop_property(fdt, aliases, val);
+                                               if (rc) {
+                                                       printf("Error: Could not NOP alias %s in fdt\n",
+                                                              val);
+                                               }
+                                       } else {
+                                               printf("Error: could not find /aliases/%s in device tree\n",
+                                                      val);
+                                       }
+                               } else {
+                                       puts("Error: could not find /aliases in device tree\n");
+                               }
+                       }
+                       debug("fdt trimming matching key %s\n", fdt_key);
+                       next_offset = fdt_parent_offset(fdt, offset);
+                       rc = fdt_nop_node(fdt, offset);
+                       if (rc)
+                               printf("Error %d noping node in device tree\n", rc);
+               }
+       }
+
+       debug("%s: Starting pass 2 for key %s\n", __func__, fdt_key);
+       /* Second pass: Rewrite names and remove key properties.  */
+       offset = -1;
+       for (offset = fdt_next_node(fdt, offset, NULL); offset >= 0; offset = next_offset) {
+               int len;
+               const char *val = fdt_getprop(fdt, offset, trim_name, &len);
+
+               next_offset = fdt_next_node(fdt, offset, NULL);
+
+               if (!val)
+                       continue;
+               debug("Searching stringlist %s for %s\n", val, fdt_key);
+               if (fdt_stringlist_contains(val, len, fdt_key)) {
+                       char new_name[64];
+                       const char *name;
+                       const char *at;
+                       int reg;
+
+                       debug("Found key %s at offset 0x%x\n", fdt_key, offset);
+                       fdt_nop_property(fdt, offset, trim_name);
+
+                       if (rename) {
+                               name = fdt_get_name(fdt, offset, NULL);
+                               debug("  name: %s\n", name);
+                               if (!name)
+                                       continue;
+                               at = strchr(name, '@');
+                               if (!at)
+                                       continue;
+
+                               reg = fdtdec_get_int(fdt, offset, "reg", -1);
+                               if (reg == -1)
+                                       continue;
+
+                               debug("  reg: %d\n", reg);
+                               len = at - name + 1;
+                               debug("  len: %d\n", len);
+                               if (len + 9 >= sizeof(new_name))
+                                       continue;
+
+                               memcpy(new_name, name, len);
+                               cpu_node = cvmx_fdt_get_cpu_node(fdt, offset);
+                               if (cpu_node > 0)
+                                       snprintf(new_name + len, sizeof(new_name) - len, "%x_%x",
+                                                cpu_node, reg);
+                               else
+                                       sprintf(new_name + len, "%x", reg);
+                               debug("Renaming cpu node %d %s to %s\n", cpu_node, name, new_name);
+                               fdt_set_name(fdt, offset, new_name);
+                       }
+                       if (callback)
+                               callback(fdt, offset, cbarg);
+
+                       /* Structure may have changed, start at the beginning. */
+                       next_offset = 0;
+               }
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_CMD_NET
+static void octeon_set_one_fdt_mac(int node, uint64_t *mac)
+{
+       u8 mac_addr[6];
+       int r;
+
+       mac_addr[5] = *mac & 0xff;
+       mac_addr[4] = (*mac >> 8) & 0xff;
+       mac_addr[3] = (*mac >> 16) & 0xff;
+       mac_addr[2] = (*mac >> 24) & 0xff;
+       mac_addr[1] = (*mac >> 32) & 0xff;
+       mac_addr[0] = (*mac >> 40) & 0xff;
+
+       r = fdt_setprop_inplace(working_fdt, node, "local-mac-address", mac_addr, 6);
+       if (r == 0)
+               *mac = *mac + 1;
+}
+
+static uint64_t convert_mac(const u8 mac_addr[6])
+{
+       int i;
+       u64 mac = 0;
+
+       for (i = 0; i < 6; i++)
+               mac = (mac << 8) | mac_addr[i];
+       return mac;
+}
+
+/**
+ * Fix up the MAC address in the flat device tree based on the MAC address
+ * stored in ethaddr or in the board descriptor.
+ *
+ * NOTE: This function is weak and an alias for __octeon_fixup_fdt_mac_addr.
+ */
+void octeon_fixup_fdt_mac_addr(void) __attribute__((weak, alias("__octeon_fixup_fdt_mac_addr")));
+
+void __octeon_fixup_fdt_mac_addr(void)
+{
+       int node, pip, interface, ethernet;
+       int i, e;
+       u64 mac = 0;
+       uchar mac_addr[6];
+       char name[20];
+       bool env_mac_addr_valid;
+       const char *p;
+
+       debug("%s: env ethaddr: %s\n", __func__, (p = env_get("ethaddr")) ? p : "not set");
+       if (eth_env_get_enetaddr("ethaddr", mac_addr)) {
+               mac = convert_mac(mac_addr);
+               env_mac_addr_valid = true;
+       } else {
+               mac = convert_mac((uint8_t *)gd->arch.mac_desc.mac_addr_base);
+               env_mac_addr_valid = false;
+       }
+
+       debug("%s: mac_addr: %pM, board mac: %pM, env valid: %s\n", __func__, mac_addr,
+             gd->arch.mac_desc.mac_addr_base, env_mac_addr_valid ? "true" : "false");
+
+       if (env_mac_addr_valid && memcmp(mac_addr, (void *)gd->arch.mac_desc.mac_addr_base, 6))
+               printf("Warning: the environment variable ethaddr is set to %pM\n"
+                      "which does not match the board descriptor MAC address %pM.\n"
+                      "Please clear the ethaddr environment variable with the command\n"
+                      "\"setenv -f ethaddr; saveenv\" or change the board MAC address with the command\n"
+                      "\"tlv_eeprom set mac %pM\" to change the board MAC address so that it matches\n"
+                      "the environment address.\n"
+                      "Note: the correct MAC address is usually the one stored in the tlv EEPROM.\n",
+                      mac_addr, gd->arch.mac_desc.mac_addr_base, mac_addr);
+
+       for (i = 0; i < 2; i++) {
+               sprintf(name, "mix%x", i);
+               p = fdt_get_alias(working_fdt, name);
+               if (p) {
+                       node = fdt_path_offset(working_fdt, p);
+                       if (node > 0)
+                               octeon_set_one_fdt_mac(node, &mac);
+               }
+       }
+
+       for (i = 0; i < 2; i++) {
+               sprintf(name, "rgmii%x", i);
+               p = fdt_get_alias(working_fdt, name);
+               if (p) {
+                       node = fdt_path_offset(working_fdt, p);
+                       if (node > 0)
+                               octeon_set_one_fdt_mac(node, &mac);
+               }
+       }
+
+       pip = fdt_node_offset_by_compatible(working_fdt, -1, "cavium,octeon-3860-pip");
+
+       if (pip > 0)
+               for (i = 0; i < 8; i++) {
+                       sprintf(name, "interface@%d", i);
+                       interface = fdt_subnode_offset(working_fdt, pip, name);
+                       if (interface <= 0)
+                               continue;
+                       for (e = 0; e < 16; e++) {
+                               sprintf(name, "ethernet@%d", e);
+                               ethernet = fdt_subnode_offset(working_fdt, interface, name);
+                               if (ethernet <= 0)
+                                       continue;
+                               octeon_set_one_fdt_mac(ethernet, &mac);
+                       }
+               }
+
+       /* Assign 78XX addresses in the order they appear in the device tree. */
+       node = fdt_node_offset_by_compatible(working_fdt, -1, "cavium,octeon-7890-bgx-port");
+       while (node != -FDT_ERR_NOTFOUND) {
+               octeon_set_one_fdt_mac(node, &mac);
+               node = fdt_node_offset_by_compatible(working_fdt, node,
+                                                    "cavium,octeon-7890-bgx-port");
+       }
+}
+#endif
+
+/**
+ * This function fixes the clock-frequency in the flat device tree for the UART.
+ *
+ * NOTE: This function is weak and an alias for __octeon_fixup_fdt_uart.
+ */
+void octeon_fixup_fdt_uart(void) __attribute__((weak, alias("__octeon_fixup_fdt_uart")));
+
+void __octeon_fixup_fdt_uart(void)
+{
+       u32 clk;
+       int node;
+
+       clk = gd->bus_clk;
+
+       /* Device trees already have good values for fast simulator
+        * output, real boards need the correct value.
+        */
+       node = fdt_node_offset_by_compatible(working_fdt, -1, "cavium,octeon-3860-uart");
+       while (node != -FDT_ERR_NOTFOUND) {
+               fdt_setprop_inplace_cell(working_fdt, node, "clock-frequency", clk);
+               node = fdt_node_offset_by_compatible(working_fdt, node, "cavium,octeon-3860-uart");
+       }
+}
+
+/**
+ * This function fills in the /memory portion of the flat device tree.
+ *
+ * NOTE: This function is weak and aliased to __octeon_fixup_fdt_memory.
+ */
+void octeon_fixup_fdt_memory(void) __attribute__((weak, alias("__octeon_fixup_fdt_memory")));
+
+void __octeon_fixup_fdt_memory(void)
+{
+       u64 sizes[3], addresses[3];
+       u64 size_left = gd->ram_size;
+       int num_addresses = 0;
+       int rc;
+       int node;
+
+       size_left = gd->ram_size;
+       sizes[num_addresses] = min_t(u64, size_left, 256 * 1024 * 1024);
+       size_left -= sizes[num_addresses];
+       addresses[num_addresses] = 0;
+       num_addresses++;
+
+       if (size_left > 0) {
+               sizes[num_addresses] = size_left;
+               addresses[num_addresses] = 0x20000000ULL;
+               num_addresses++;
+       }
+
+       node = fdt_path_offset(working_fdt, "/memory");
+       if (node < 0)
+               node = fdt_add_subnode(working_fdt, fdt_path_offset(working_fdt, "/"), "memory");
+       if (node < 0) {
+               printf("Could not add memory section to fdt: %s\n", fdt_strerror(node));
+               return;
+       }
+       rc = fdt_fixup_memory_banks(working_fdt, addresses, sizes, num_addresses);
+       if (rc != 0)
+               printf("%s: fdt_fixup_memory_banks returned %d when adding %d addresses\n",
+                      __func__, rc, num_addresses);
+}
+
+void octeon_fixup_fdt(void) __attribute__((weak, alias("__octeon_fixup_fdt")));
+
+void __octeon_fixup_fdt(void)
+{
+       if (!working_fdt)
+               return;
+
+#ifdef CONFIG_CMD_NET
+       octeon_fixup_fdt_mac_addr();
+#endif /* CONFIG_CMD_NET */
+
+#if !CONFIG_OCTEON_SIM_SPEED
+       octeon_fixup_fdt_uart();
+#endif
+
+       octeon_fixup_fdt_memory();
+}
+
+int __board_fixup_fdt(void)
+{
+       /*
+        * Nothing to do in this dummy implementation
+        */
+       return 0;
+}
+
+int board_fixup_fdt(void) __attribute__((weak, alias("__board_fixup_fdt")));
+
+/**
+ * This is a helper function to find the offset of a PHY device given
+ * an Ethernet device.
+ *
+ * @param[in] eth - Ethernet device to search for PHY offset
+ *
+ * @returns offset of phy info in device tree or -1 if not found
+ */
+//int octeon_fdt_find_phy(const struct eth_device *eth)
+int octeon_fdt_find_phy(const struct udevice *eth)
+{
+       int aliases;
+       const void *fdt = gd->fdt_blob;
+       const char *pip_path;
+       int pip;
+       char buffer[64];
+#if 0
+       struct octeon_eth_info *oct_eth_info =
+                                (struct octeon_eth_info *)eth->priv;
+#else
+       struct octeon_eth_info *oct_eth_info = dev_get_priv(eth);
+#endif
+       int interface, index;
+       int phandle;
+       int phy;
+       u32 *phy_handle;
+
+       aliases = fdt_path_offset(fdt, "/aliases");
+       if (aliases < 0) {
+               puts("/aliases not found in device tree!\n");
+               return -1;
+       }
+       pip_path = fdt_getprop(fdt, aliases, "pip", NULL);
+       if (!pip_path) {
+               puts("pip not found in aliases in device tree\n");
+               return -1;
+       }
+       pip = fdt_path_offset(fdt, pip_path);
+       if (pip < 0) {
+               puts("pip not found in device tree\n");
+               return -1;
+       }
+       snprintf(buffer, sizeof(buffer), "interface@%d", oct_eth_info->interface);
+       interface = fdt_subnode_offset(fdt, pip, buffer);
+       if (interface < 0) {
+               printf("%s: interface@%d not found in device tree for %s\n", __func__,
+                      oct_eth_info->interface, eth->name);
+               return -1;
+       }
+       snprintf(buffer, sizeof(buffer), "ethernet@%x", oct_eth_info->index);
+       index = fdt_subnode_offset(fdt, interface, buffer);
+       if (index < 0) {
+               printf("%s: ethernet@%x not found in device tree for %s\n", __func__,
+                      oct_eth_info->index, eth->name);
+               return -1;
+       }
+       phy_handle = (uint32_t *)fdt_getprop(fdt, index, "phy-handle", NULL);
+       if (phy_handle < 0) {
+               printf("%s: phy-handle not found for %s\n", __func__, eth->name);
+               return -1;
+       }
+       phandle = fdt32_to_cpu(*phy_handle);
+       phy = fdt_node_offset_by_phandle(fdt, phandle);
+       if (phy < 0) {
+               printf("%s: phy not found for %s\n", __func__, eth->name);
+               return -1;
+       }
+
+       return phy;
+}
+
+/**
+ * This helper function returns if a node contains the specified vendor name.
+ *
+ * @param[in]  fdt             pointer to device tree blob
+ * @param      nodeoffset      offset of the tree node
+ * @param[in]  vendor          name of vendor to check
+ *
+ * returns:
+ *     0, if the node has a compatible vendor string property
+ *     1, if the node does not contain the vendor string property
+ *     -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
+ *     -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_BADSTATE,
+ *     -FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int octeon_fdt_compat_vendor(const void *fdt, int nodeoffset, const char *vendor)
+{
+       const char *strlist;
+       const char *p;
+       int len;
+       int listlen;
+
+       strlist = fdt_getprop(fdt, nodeoffset, "compatible", &listlen);
+       if (!strlist)
+               return listlen;
+
+       len = strlen(vendor);
+
+       debug("%s(%p, %d, %s (%p)) strlist: %s (%p), len: %d\n", __func__, fdt, nodeoffset, vendor,
+             vendor, strlist, strlist, len);
+       while (listlen >= len) {
+               debug("  Comparing %d bytes of %s and %s\n", len, vendor, strlist);
+               if ((memcmp(vendor, strlist, len) == 0) &&
+                   ((strlist[len] == ',') || (strlist[len] == '\0')))
+                       return 0;
+               p = memchr(strlist, '\0', listlen);
+               if (!p)
+                       return 1; /* malformed strlist.. */
+               listlen -= (p - strlist) + 1;
+               strlist = p + 1;
+       }
+       return 1;
+}
+
+/**
+ * Given a node in the device tree get the OCTEON OCX node number
+ *
+ * @param fdt          pointer to flat device tree
+ * @param nodeoffset   node offset to get OCX node for
+ *
+ * @return the Octeon OCX node number
+ */
+int octeon_fdt_get_soc_node(const void *fdt, int nodeoffset)
+{
+       return 0;
+}
+
+/**
+ * Given a FDT node, check if it is compatible with a list of devices
+ *
+ * @param[in]  fdt             Flat device tree pointer
+ * @param      node_offset     Node offset in device tree
+ * @param[in]  strlist         Array of FDT devices to check, end must be NULL
+ *
+ * @return     0 if at least one device is compatible, 1 if not compatible.
+ */
+int octeon_fdt_node_check_compatible(const void *fdt, int node_offset,
+                                    const char *const *strlist)
+{
+       while (*strlist && **strlist) {
+               debug("%s: Checking %s\n", __func__, *strlist);
+               if (!fdt_node_check_compatible(fdt, node_offset, *strlist)) {
+                       debug("%s: match found\n", __func__);
+                       return 0;
+               }
+               strlist++;
+       }
+       debug("%s: No match found\n", __func__);
+       return 1;
+}
+
+/**
+ * Given a node offset, find the i2c bus number for that node
+ *
+ * @param[in]  fdt     Pointer to flat device tree
+ * @param      node_offset     Node offset in device tree
+ *
+ * @return     i2c bus number or -1 if error
+ */
+int octeon_fdt_i2c_get_bus(const void *fdt, int node_offset)
+{
+       const char *compat;
+       const u64 addresses[] = { 0x1180000001000, 0x1180000001200 };
+       u64 reg;
+       int i;
+       int bus = -1;
+       bool found = false;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CIU3))
+               compat = "cavium,octeon-7890-twsi";
+       else
+               compat = "cavium,octeon-3860-twsi";
+
+       while (node_offset > 0 &&
+              !(found = !fdt_node_check_compatible(fdt, node_offset, compat))) {
+               node_offset = fdt_parent_offset(fdt, node_offset);
+#ifdef CONFIG_OCTEON_I2C_FDT
+               bus = i2c_get_bus_num_fdt(node_offset);
+               if (bus >= 0) {
+                       debug("%s: Found bus 0x%x\n", __func__, bus);
+                       return bus;
+               }
+#endif
+       }
+       if (!found) {
+               printf("Error: node %d in device tree is not a child of the I2C bus\n",
+                      node_offset);
+               return -1;
+       }
+
+       reg = fdtdec_get_addr(fdt, node_offset, "reg");
+       if (reg == FDT_ADDR_T_NONE) {
+               printf("%s: Error: invalid reg address for TWSI bus\n", __func__);
+               return -1;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(addresses); i++)
+               if (reg == addresses[i]) {
+                       bus = i;
+                       break;
+               }
+
+       debug("%s: bus 0x%x\n", __func__, bus);
+       return bus;
+}
+
+/**
+ * Given an offset into the fdt, output the i2c bus and address of the device
+ *
+ * @param[in]  fdt     fdt blob pointer
+ * @param      node    offset in FDT of device
+ * @param[out] bus     i2c bus number of device
+ * @param[out] addr    address of device on i2c bus
+ *
+ * @return     0 for success, -1 on error
+ */
+int octeon_fdt_get_i2c_bus_addr(const void *fdt, int node, int *bus, int *addr)
+{
+       *bus = octeon_fdt_i2c_get_bus(fdt, fdt_parent_offset(fdt, node));
+       if (*bus < 0) {
+               printf("%s: Could not get parent i2c bus\n", __func__);
+               return -1;
+       }
+       *addr = fdtdec_get_int(fdt, node, "reg", -1);
+       if (*addr < 0)
+               return -1;
+       return 0;
+}
+
+/**
+ * Reads a GPIO pin given the node of the GPIO device in the device tree and
+ * the pin number.
+ *
+ * @param[in]  fdt     fdt blob pointer
+ * @param      phandle phandle of GPIO node
+ * @param      pin     pin number to read
+ *
+ * @return     0 = pin is low, 1 = pin is high, -1 = error
+ */
+int octeon_fdt_read_gpio(const void *fdt, int phandle, int pin)
+{
+       enum cvmx_gpio_type type;
+       __maybe_unused int node;
+       __maybe_unused int addr;
+       __maybe_unused int bus;
+       __maybe_unused int old_bus;
+       int num_pins;
+       int value;
+
+       type = cvmx_fdt_get_gpio_type(fdt, phandle, &num_pins);
+       if ((pin & 0xff) >= num_pins) {
+               debug("%s: pin number %d out of range\n", __func__, pin);
+               return -1;
+       }
+       switch (type) {
+#ifdef CONFIG_PCA953X
+       case CVMX_GPIO_PIN_PCA953X:
+               node = fdt_node_offset_by_phandle(fdt, phandle);
+               if (octeon_fdt_get_i2c_bus_addr(fdt, node, &bus, &addr)) {
+                       printf("%s: Could not get gpio bus and/or address\n", __func__);
+                       return -1;
+               }
+               value = pca953x_get_val(bus, addr);
+               if (value < 0) {
+                       printf("%s: Error reading PCA953X GPIO at 0x%x:0x%x\n", __func__, bus,
+                              addr);
+                       return -1;
+               }
+               value = (value >> pin) & 1;
+               break;
+#endif
+#ifdef CONFIG_PCF857X
+       case CVMX_GPIO_PIN_PCF857X:
+               node = fdt_node_offset_by_phandle(fdt, phandle);
+               if (octeon_fdt_get_i2c_bus_addr(fdt, node, &bus, &addr)) {
+                       printf("%s: Could not get gpio bus and/or address\n", __func__);
+                       return -1;
+               }
+               value = pcf857x_get_val(bus, addr);
+               if (value < 0) {
+                       printf("%s: Error reading PCF857X GPIO at 0x%x:0x%x\n", __func__, bus,
+                              addr);
+                       return -1;
+               }
+               value = (value >> pin) & 1;
+               break;
+#endif
+#ifdef CONFIG_PCA9698
+       case CVMX_GPIO_PIN_PCA9698:
+               node = fdt_node_offset_by_phandle(fdt, phandle);
+               if (octeon_fdt_get_i2c_bus_addr(fdt, node, &bus, &addr)) {
+                       printf("%s: Could not get gpio bus and/or address\n", __func__);
+                       return -1;
+               }
+               old_bus = i2c_get_bus_num();
+               i2c_set_bus_num(bus);
+               value = pca9698_get_value(addr, pin);
+               i2c_set_bus_num(old_bus);
+               break;
+#endif
+       case CVMX_GPIO_PIN_OCTEON:
+               value = gpio_get_value(pin);
+               break;
+       default:
+               printf("%s: Unknown GPIO type %d\n", __func__, type);
+               return -1;
+       }
+       return value;
+}
+
+/**
+ * Reads a GPIO pin given the node of the GPIO device in the device tree and
+ * the pin number.
+ *
+ * @param[in]  fdt     fdt blob pointer
+ * @param      phandle phandle of GPIO node
+ * @param      pin     pin number to read
+ * @param      val     value to write (1 = high, 0 = low)
+ *
+ * @return     0 = success, -1 = error
+ */
+int octeon_fdt_set_gpio(const void *fdt, int phandle, int pin, int val)
+{
+       enum cvmx_gpio_type type;
+       int node;
+       int num_pins;
+       __maybe_unused int addr;
+       __maybe_unused int bus;
+       __maybe_unused int old_bus;
+       __maybe_unused int rc;
+
+       node = fdt_node_offset_by_phandle(fdt, phandle);
+       if (node < 0) {
+               printf("%s: Invalid phandle\n", __func__);
+               return -1;
+       }
+
+       type = cvmx_fdt_get_gpio_type(fdt, phandle, &num_pins);
+       if ((pin & 0xff) >= num_pins) {
+               debug("%s: pin number %d out of range\n", __func__, pin);
+               return -1;
+       }
+       switch (type) {
+#ifdef CONFIG_PCA953X
+       case CVMX_GPIO_PIN_PCA953X:
+               if (octeon_fdt_get_i2c_bus_addr(fdt, node, &bus, &addr)) {
+                       printf("%s: Could not get gpio bus and/or address\n", __func__);
+                       return -1;
+               }
+
+               return pca953x_set_val(bus, addr, 1 << pin, val << pin);
+#endif
+#ifdef CONFIG_PCF857X
+       case CVMX_GPIO_PIN_PCF857X:
+               if (octeon_fdt_get_i2c_bus_addr(fdt, node, &bus, &addr)) {
+                       printf("%s: Could not get gpio bus and/or address\n", __func__);
+                       return -1;
+               }
+               return pcf957x_set_val(bus, addr, 1 << pin, val << pin);
+#endif
+#ifdef CONFIG_PCA9698
+       case CVMX_GPIO_PIN_PCA9698:
+               if (octeon_fdt_get_i2c_bus_addr(fdt, node, &bus, &addr)) {
+                       printf("%s: Could not get gpio bus and/or address\n", __func__);
+                       return -1;
+               }
+               old_bus = i2c_get_bus_num();
+               i2c_set_bus_num(bus);
+               rc = pca9698_set_value(addr, pin, val);
+               i2c_set_bus_num(old_bus);
+               return rc;
+#endif
+       case CVMX_GPIO_PIN_OCTEON:
+               return gpio_set_value(pin, val);
+       default:
+               printf("%s: Unknown GPIO type %d\n", __func__, type);
+               return -1;
+       }
+}
+
+/**
+ * Given the node of a GPIO entry output the GPIO type, i2c bus and i2c
+ * address.
+ *
+ * @param      fdt_node        node of GPIO in device tree, generally
+ *                             derived from a phandle.
+ * @param[out] type            Type of GPIO detected
+ * @param[out] i2c_bus         For i2c GPIO expanders, the i2c bus number
+ * @param[out] i2c_addr        For i2c GPIO expanders, the i2c address
+ *
+ * @return     0 for success, -1 for errors
+ *
+ * NOTE: It is up to the caller to determine the pin number.
+ */
+int octeon_fdt_get_gpio_info(int fdt_node, enum octeon_gpio_type *type,
+                            int *i2c_bus, int *i2c_addr)
+{
+       const void *fdt = gd->fdt_blob;
+
+       int i2c_bus_node __attribute__((unused));
+
+       *type = GPIO_TYPE_UNKNOWN;
+
+       if (!octeon_fdt_node_check_compatible(fdt, fdt_node, octeon_gpio_list)) {
+               debug("%s: Found Octeon compatible GPIO\n", __func__);
+               *type = GPIO_TYPE_OCTEON;
+               if (i2c_bus)
+                       *i2c_bus = -1;
+               if (i2c_addr)
+                       *i2c_addr = -1;
+               return 0;
+       }
+#ifdef CONFIG_PCA9555
+       if (!octeon_fdt_node_check_compatible(fdt, fdt_node, pca9555_gpio_list)) {
+               debug("%s: Found PCA9555 type compatible GPIO\n", __func__);
+               *type = GPIO_TYPE_PCA9555;
+       }
+#endif
+#ifdef CONFIG_PCA9554
+       if (!octeon_fdt_node_check_compatible(fdt, fdt_node, pca9554_gpio_list)) {
+               debug("%s: Found PCA9555 type compatible GPIO\n", __func__);
+               *type = GPIO_TYPE_PCA9554;
+       }
+#endif
+#ifdef CONFIG_PCA953X
+       if (!octeon_fdt_node_check_compatible(fdt, fdt_node, pca953x_gpio_list)) {
+               debug("%s: Found PCA953x compatible GPIO", __func__);
+               *type = GPIO_TYPE_PCA953X;
+       }
+#endif
+#ifdef CONFIG_PCA9698
+       if (!octeon_fdt_node_check_compatible(fdt, fdt_node, pca9698_gpio_list)) {
+               debug("%s: Found PCA9698 compatible GPIO", __func__);
+               *type = GPIO_TYPE_PCA9698;
+       }
+#endif
+#if defined(CONFIG_PCA953X) || defined(CONFIG_PCA9698) || \
+       defined(CONFIG_PCA9555) || defined(CONFIG_PCA9554)
+       if (!i2c_addr || !i2c_bus) {
+               printf("%s: Error: i2c_addr or i2c_bus is NULL\n", __func__);
+               return -1;
+       }
+
+       *i2c_addr = fdtdec_get_int(fdt, fdt_node, "reg", -1);
+       i2c_bus_node = fdt_parent_offset(fdt, fdt_node);
+       if (i2c_bus_node < 0) {
+               printf("%s: Invalid parent\n", __func__);
+               return -1;
+       }
+       *i2c_bus = i2c_get_bus_num_fdt(i2c_bus_node);
+#endif
+       return (*type != GPIO_TYPE_UNKNOWN) ? 0 : -1;
+}
+
+#ifdef CONFIG_PHY_VITESSE
+/**
+ * Given a node in the flat device tree, return the matching PHY device
+ *
+ * @param      fdt_node        FDT node in device tree
+ *
+ * @return     pointer to PHY device or NULL if none found.
+ */
+static struct phy_device *octeon_fdt_get_phy_device_from_node(int fdt_node)
+{
+       struct eth_device *dev;
+       int i = 0;
+       struct octeon_eth_info *ethinfo = NULL;
+
+       do {
+               dev = eth_get_dev_by_index(i++);
+               if (!dev)
+                       return NULL;
+               ethinfo = dev->priv;
+               if (ethinfo->phy_offset == fdt_node)
+                       return ethinfo->phydev;
+       } while (dev);
+       return NULL;
+}
+#endif
+
+/**
+ * Get the PHY data structure for the specified FDT node and output the type
+ *
+ * @param      fdt_node        FDT node of phy
+ * @param[out] type            Type of GPIO
+ *
+ * @return     pointer to phy device or NULL if no match found.
+ */
+struct phy_device *octeon_fdt_get_phy_gpio_info(int fdt_node, enum octeon_gpio_type *type)
+{
+#ifdef CONFIG_PHY_VITESSE
+       struct phy_device *phydev;
+
+       if (!octeon_fdt_node_check_compatible(gd->fdt_blob, fdt_node,
+                                             vitesse_vsc8488_gpio_list)) {
+               phydev = octeon_fdt_get_phy_device_from_node(fdt_node);
+               if (phydev) {
+                       debug("%s: Found Vitesse VSC848X compatible GPIO\n", __func__);
+                       *type = GPIO_TYPE_VSC8488;
+                       return phydev;
+               }
+
+               debug("%s: Error: phy device not found!\n", __func__);
+               return NULL;
+       }
+
+       debug("%s: No compatible Vitesse PHY type found\n", __func__);
+#endif
+       return NULL;
+}
diff --git a/arch/mips/mach-octeon/octeon_qlm.c b/arch/mips/mach-octeon/octeon_qlm.c
new file mode 100644 (file)
index 0000000..7636927
--- /dev/null
@@ -0,0 +1,5853 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#include <dm.h>
+#include <time.h>
+#include <linux/delay.h>
+
+#include <mach/cvmx-regs.h>
+#include <mach/octeon-model.h>
+#include <mach/cvmx-fuse.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/cvmx-pcie.h>
+
+#include <mach/cvmx-bgxx-defs.h>
+#include <mach/cvmx-ciu-defs.h>
+#include <mach/cvmx-gmxx-defs.h>
+#include <mach/cvmx-gserx-defs.h>
+#include <mach/cvmx-mio-defs.h>
+#include <mach/cvmx-pciercx-defs.h>
+#include <mach/cvmx-pemx-defs.h>
+#include <mach/cvmx-pexp-defs.h>
+#include <mach/cvmx-rst-defs.h>
+#include <mach/cvmx-sata-defs.h>
+#include <mach/cvmx-sli-defs.h>
+#include <mach/cvmx-sriomaintx-defs.h>
+#include <mach/cvmx-sriox-defs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/** 2.5GHz with 100MHz reference clock */
+#define R_2_5G_REFCLK100 0x0
+/** 5.0GHz with 100MHz reference clock */
+#define R_5G_REFCLK100 0x1
+/** 8.0GHz with 100MHz reference clock */
+#define R_8G_REFCLK100 0x2
+/** 1.25GHz with 156.25MHz reference clock */
+#define R_125G_REFCLK15625_KX 0x3
+/** 3.125Ghz with 156.25MHz reference clock (XAUI) */
+#define R_3125G_REFCLK15625_XAUI 0x4
+/** 10.3125GHz with 156.25MHz reference clock (XFI/XLAUI) */
+#define R_103125G_REFCLK15625_KR 0x5
+/** 1.25GHz with 156.25MHz reference clock (SGMII) */
+#define R_125G_REFCLK15625_SGMII 0x6
+/** 5GHz with 156.25MHz reference clock (QSGMII) */
+#define R_5G_REFCLK15625_QSGMII 0x7
+/** 6.25GHz with 156.25MHz reference clock (RXAUI/25G) */
+#define R_625G_REFCLK15625_RXAUI 0x8
+/** 2.5GHz with 125MHz reference clock */
+#define R_2_5G_REFCLK125 0x9
+/** 5GHz with 125MHz reference clock */
+#define R_5G_REFCLK125 0xa
+/** 8GHz with 125MHz reference clock */
+#define R_8G_REFCLK125 0xb
+/** Must be last, number of modes */
+#define R_NUM_LANE_MODES 0xc
+
+int cvmx_qlm_is_ref_clock(int qlm, int reference_mhz)
+{
+       int ref_clock = cvmx_qlm_measure_clock(qlm);
+       int mhz = ref_clock / 1000000;
+       int range = reference_mhz / 10;
+
+       return ((mhz >= reference_mhz - range) && (mhz <= reference_mhz + range));
+}
+
+static int __get_qlm_spd(int qlm, int speed)
+{
+       int qlm_spd = 0xf;
+
+       if (cvmx_qlm_is_ref_clock(qlm, 100)) {
+               if (speed == 1250)
+                       qlm_spd = 0x3;
+               else if (speed == 2500)
+                       qlm_spd = 0x2;
+               else if (speed == 5000)
+                       qlm_spd = 0x0;
+               else
+                       qlm_spd = 0xf;
+       } else if (cvmx_qlm_is_ref_clock(qlm, 125)) {
+               if (speed == 1250)
+                       qlm_spd = 0xa;
+               else if (speed == 2500)
+                       qlm_spd = 0x9;
+               else if (speed == 3125)
+                       qlm_spd = 0x8;
+               else if (speed == 5000)
+                       qlm_spd = 0x6;
+               else if (speed == 6250)
+                       qlm_spd = 0x5;
+               else
+                       qlm_spd = 0xf;
+       } else if (cvmx_qlm_is_ref_clock(qlm, 156)) {
+               if (speed == 1250)
+                       qlm_spd = 0x4;
+               else if (speed == 2500)
+                       qlm_spd = 0x7;
+               else if (speed == 3125)
+                       qlm_spd = 0xe;
+               else if (speed == 3750)
+                       qlm_spd = 0xd;
+               else if (speed == 5000)
+                       qlm_spd = 0xb;
+               else if (speed == 6250)
+                       qlm_spd = 0xc;
+               else
+                       qlm_spd = 0xf;
+       } else if (cvmx_qlm_is_ref_clock(qlm, 161)) {
+               if (speed == 6316)
+                       qlm_spd = 0xc;
+       }
+       return qlm_spd;
+}
+
+static void __set_qlm_pcie_mode_61xx(int pcie_port, int root_complex)
+{
+       int rc = root_complex ? 1 : 0;
+       int ep = root_complex ? 0 : 1;
+       cvmx_ciu_soft_prst1_t soft_prst1;
+       cvmx_ciu_soft_prst_t soft_prst;
+       cvmx_mio_rst_ctlx_t rst_ctl;
+
+       if (pcie_port) {
+               soft_prst1.u64 = csr_rd(CVMX_CIU_SOFT_PRST1);
+               soft_prst1.s.soft_prst = 1;
+               csr_wr(CVMX_CIU_SOFT_PRST1, soft_prst1.u64);
+       } else {
+               soft_prst.u64 = csr_rd(CVMX_CIU_SOFT_PRST);
+               soft_prst.s.soft_prst = 1;
+               csr_wr(CVMX_CIU_SOFT_PRST, soft_prst.u64);
+       }
+
+       rst_ctl.u64 = csr_rd(CVMX_MIO_RST_CTLX(pcie_port));
+
+       rst_ctl.s.prst_link = rc;
+       rst_ctl.s.rst_link = ep;
+       rst_ctl.s.prtmode = rc;
+       rst_ctl.s.rst_drv = rc;
+       rst_ctl.s.rst_rcv = 0;
+       rst_ctl.s.rst_chip = ep;
+       csr_wr(CVMX_MIO_RST_CTLX(pcie_port), rst_ctl.u64);
+
+       if (root_complex == 0) {
+               if (pcie_port) {
+                       soft_prst1.u64 = csr_rd(CVMX_CIU_SOFT_PRST1);
+                       soft_prst1.s.soft_prst = 0;
+                       csr_wr(CVMX_CIU_SOFT_PRST1, soft_prst1.u64);
+               } else {
+                       soft_prst.u64 = csr_rd(CVMX_CIU_SOFT_PRST);
+                       soft_prst.s.soft_prst = 0;
+                       csr_wr(CVMX_CIU_SOFT_PRST, soft_prst.u64);
+               }
+       }
+}
+
+/**
+ * Configure qlm speed and mode. MIO_QLMX_CFG[speed,mode] are not set
+ * for CN61XX.
+ *
+ * @param qlm     The QLM to configure
+ * @param speed   The speed the QLM needs to be configured in Mhz.
+ * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
+ *                  QLM 0: 0 = PCIe0 1X4, 1 = Reserved, 2 = SGMII1, 3 = XAUI1
+ *                  QLM 1: 0 = PCIe1 1x2, 1 = PCIe(0/1) 2x1, 2 - 3 = Reserved
+ *                  QLM 2: 0 - 1 = Reserved, 2 = SGMII0, 3 = XAUI0
+ * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP
+ *               mode.
+ * @param pcie2x1 Only used when QLM1 is in PCIE2x1 mode.  The QLM_SPD has a
+ *               different value on how PEMx needs to be configured:
+ *                   0x0 - both PEM0 & PEM1 are in gen1 mode.
+ *                   0x1 - PEM0 in gen2 and PEM1 in gen1 mode.
+ *                   0x2 - PEM0 in gen1 and PEM1 in gen2 mode.
+ *                   0x3 - both PEM0 & PEM1 are in gen2 mode.
+ *               SPEED value is ignored in this mode. QLM_SPD is set based on
+ *               pcie2x1 value in this mode.
+ *
+ * @return       Return 0 on success or -1.
+ */
+static int octeon_configure_qlm_cn61xx(int qlm, int speed, int mode, int rc, int pcie2x1)
+{
+       cvmx_mio_qlmx_cfg_t qlm_cfg;
+
+       /* The QLM speed varies for SGMII/XAUI and PCIe mode. And depends on
+        * reference clock.
+        */
+       if (!OCTEON_IS_MODEL(OCTEON_CN61XX))
+               return -1;
+
+       if (qlm < 3) {
+               qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
+       } else {
+               debug("WARNING: Invalid QLM(%d) passed\n", qlm);
+               return -1;
+       }
+
+       switch (qlm) {
+               /* SGMII/XAUI mode */
+       case 2: {
+               if (mode < 2) {
+                       qlm_cfg.s.qlm_spd = 0xf;
+                       break;
+               }
+               qlm_cfg.s.qlm_spd = __get_qlm_spd(qlm, speed);
+               qlm_cfg.s.qlm_cfg = mode;
+               break;
+       }
+       case 1: {
+               if (mode == 1) { /* 2x1 mode */
+                       cvmx_mio_qlmx_cfg_t qlm0;
+
+                       /* When QLM0 is configured as PCIe(QLM_CFG=0x0)
+                        * and enabled (QLM_SPD != 0xf), QLM1 cannot be
+                        * configured as PCIe 2x1 mode (QLM_CFG=0x1)
+                        * and enabled (QLM_SPD != 0xf).
+                        */
+                       qlm0.u64 = csr_rd(CVMX_MIO_QLMX_CFG(0));
+                       if (qlm0.s.qlm_spd != 0xf && qlm0.s.qlm_cfg == 0) {
+                               debug("Invalid mode(%d) for QLM(%d) as QLM1 is PCIe mode\n",
+                                     mode, qlm);
+                               qlm_cfg.s.qlm_spd = 0xf;
+                               break;
+                       }
+
+                       /* Set QLM_SPD based on reference clock and mode */
+                       if (cvmx_qlm_is_ref_clock(qlm, 100)) {
+                               if (pcie2x1 == 0x3)
+                                       qlm_cfg.s.qlm_spd = 0x0;
+                               else if (pcie2x1 == 0x1)
+                                       qlm_cfg.s.qlm_spd = 0x2;
+                               else if (pcie2x1 == 0x2)
+                                       qlm_cfg.s.qlm_spd = 0x1;
+                               else if (pcie2x1 == 0x0)
+                                       qlm_cfg.s.qlm_spd = 0x3;
+                               else
+                                       qlm_cfg.s.qlm_spd = 0xf;
+                       } else if (cvmx_qlm_is_ref_clock(qlm, 125)) {
+                               if (pcie2x1 == 0x3)
+                                       qlm_cfg.s.qlm_spd = 0x4;
+                               else if (pcie2x1 == 0x1)
+                                       qlm_cfg.s.qlm_spd = 0x6;
+                               else if (pcie2x1 == 0x2)
+                                       qlm_cfg.s.qlm_spd = 0x9;
+                               else if (pcie2x1 == 0x0)
+                                       qlm_cfg.s.qlm_spd = 0x7;
+                               else
+                                       qlm_cfg.s.qlm_spd = 0xf;
+                       }
+                       qlm_cfg.s.qlm_cfg = mode;
+                       csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
+
+                       /* Set PCIe mode bits */
+                       __set_qlm_pcie_mode_61xx(0, rc);
+                       __set_qlm_pcie_mode_61xx(1, rc);
+                       return 0;
+               } else if (mode > 1) {
+                       debug("Invalid mode(%d) for QLM(%d).\n", mode, qlm);
+                       qlm_cfg.s.qlm_spd = 0xf;
+                       break;
+               }
+
+               /* Set speed and mode for PCIe 1x2 mode. */
+               if (cvmx_qlm_is_ref_clock(qlm, 100)) {
+                       if (speed == 5000)
+                               qlm_cfg.s.qlm_spd = 0x1;
+                       else if (speed == 2500)
+                               qlm_cfg.s.qlm_spd = 0x2;
+                       else
+                               qlm_cfg.s.qlm_spd = 0xf;
+               } else if (cvmx_qlm_is_ref_clock(qlm, 125)) {
+                       if (speed == 5000)
+                               qlm_cfg.s.qlm_spd = 0x4;
+                       else if (speed == 2500)
+                               qlm_cfg.s.qlm_spd = 0x6;
+                       else
+                               qlm_cfg.s.qlm_spd = 0xf;
+               } else {
+                       qlm_cfg.s.qlm_spd = 0xf;
+               }
+
+               qlm_cfg.s.qlm_cfg = mode;
+               csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
+
+               /* Set PCIe mode bits */
+               __set_qlm_pcie_mode_61xx(1, rc);
+               return 0;
+       }
+       case 0: {
+               /* QLM_CFG = 0x1 - Reserved */
+               if (mode == 1) {
+                       qlm_cfg.s.qlm_spd = 0xf;
+                       break;
+               }
+               /* QLM_CFG = 0x0 - PCIe 1x4(PEM0) */
+               if (mode == 0 && speed != 5000 && speed != 2500) {
+                       qlm_cfg.s.qlm_spd = 0xf;
+                       break;
+               }
+
+               /* Set speed and mode */
+               qlm_cfg.s.qlm_spd = __get_qlm_spd(qlm, speed);
+               qlm_cfg.s.qlm_cfg = mode;
+               csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
+
+               /* Set PCIe mode bits */
+               if (mode == 0)
+                       __set_qlm_pcie_mode_61xx(0, rc);
+
+               return 0;
+       }
+       default:
+               debug("WARNING: Invalid QLM(%d) passed\n", qlm);
+               qlm_cfg.s.qlm_spd = 0xf;
+       }
+       csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
+       return 0;
+}
+
+/* qlm      : DLM to configure
+ * baud_mhz : speed of the DLM
+ * ref_clk_sel  :  reference clock speed selection where:
+ *                     0:      100MHz
+ *                     1:      125MHz
+ *                     2:      156.25MHz
+ *
+ * ref_clk_input:  reference clock input where:
+ *                     0:      DLMC_REF_CLK0_[P,N]
+ *                     1:      DLMC_REF_CLK1_[P,N]
+ *                     2:      DLM0_REF_CLK_[P,N] (only valid for QLM 0)
+ * is_sff7000_rxaui : boolean to indicate whether qlm is RXAUI on SFF7000
+ */
+static int __dlm_setup_pll_cn70xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input,
+                                 int is_sff7000_rxaui)
+{
+       cvmx_gserx_dlmx_test_powerdown_t dlmx_test_powerdown;
+       cvmx_gserx_dlmx_ref_ssp_en_t dlmx_ref_ssp_en;
+       cvmx_gserx_dlmx_mpll_en_t dlmx_mpll_en;
+       cvmx_gserx_dlmx_phy_reset_t dlmx_phy_reset;
+       cvmx_gserx_dlmx_tx_amplitude_t tx_amplitude;
+       cvmx_gserx_dlmx_tx_preemph_t tx_preemph;
+       cvmx_gserx_dlmx_rx_eq_t rx_eq;
+       cvmx_gserx_dlmx_ref_clkdiv2_t ref_clkdiv2;
+       cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
+       int gmx_ref_clk = 100;
+
+       debug("%s(%d, %d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input,
+             is_sff7000_rxaui);
+       if (ref_clk_sel == 1)
+               gmx_ref_clk = 125;
+       else if (ref_clk_sel == 2)
+               gmx_ref_clk = 156;
+
+       if (qlm != 0 && ref_clk_input == 2) {
+               printf("%s: Error: can only use reference clock inputs 0 or 1 for DLM %d\n",
+                      __func__, qlm);
+               return -1;
+       }
+
+       /* Hardware defaults are invalid */
+       tx_amplitude.u64 = csr_rd(CVMX_GSERX_DLMX_TX_AMPLITUDE(qlm, 0));
+       if (is_sff7000_rxaui) {
+               tx_amplitude.s.tx0_amplitude = 100;
+               tx_amplitude.s.tx1_amplitude = 100;
+       } else {
+               tx_amplitude.s.tx0_amplitude = 65;
+               tx_amplitude.s.tx1_amplitude = 65;
+       }
+
+       csr_wr(CVMX_GSERX_DLMX_TX_AMPLITUDE(qlm, 0), tx_amplitude.u64);
+
+       tx_preemph.u64 = csr_rd(CVMX_GSERX_DLMX_TX_PREEMPH(qlm, 0));
+
+       if (is_sff7000_rxaui) {
+               tx_preemph.s.tx0_preemph = 0;
+               tx_preemph.s.tx1_preemph = 0;
+       } else {
+               tx_preemph.s.tx0_preemph = 22;
+               tx_preemph.s.tx1_preemph = 22;
+       }
+       csr_wr(CVMX_GSERX_DLMX_TX_PREEMPH(qlm, 0), tx_preemph.u64);
+
+       rx_eq.u64 = csr_rd(CVMX_GSERX_DLMX_RX_EQ(qlm, 0));
+       rx_eq.s.rx0_eq = 0;
+       rx_eq.s.rx1_eq = 0;
+       csr_wr(CVMX_GSERX_DLMX_RX_EQ(qlm, 0), rx_eq.u64);
+
+       /* 1. Write GSER0_DLM0_REF_USE_PAD[REF_USE_PAD] = 1 (to select
+        *    reference-clock input)
+        *    The documentation for this register in the HRM is useless since
+        *    it says it selects between two different clocks that are not
+        *    documented anywhere.  What it really does is select between
+        *    DLM0_REF_CLK_[P,N] if 1 and DLMC_REF_CLK[0,1]_[P,N] if 0.
+        *
+        *    This register must be 0 for DLMs 1 and 2 and can only be 1 for
+        *    DLM 0.
+        */
+       csr_wr(CVMX_GSERX_DLMX_REF_USE_PAD(0, 0), ((ref_clk_input == 2) && (qlm == 0)) ? 1 : 0);
+
+       /* Reference clock was already chosen before we got here */
+
+       /* 2. Write GSER0_DLM0_REFCLK_SEL[REFCLK_SEL] if required for
+        *    reference-clock selection.
+        *
+        *    If GSERX_DLMX_REF_USE_PAD is 1 then this register is ignored.
+        */
+       csr_wr(CVMX_GSERX_DLMX_REFCLK_SEL(0, 0), ref_clk_input & 1);
+
+       /* Reference clock was already chosen before we got here */
+
+       /* 3. If required, write GSER0_DLM0_REF_CLKDIV2[REF_CLKDIV2] (must be
+        *    set if reference clock > 100 MHz)
+        */
+       /* Apply workaround for Errata (G-20669) MPLL may not come up. */
+       ref_clkdiv2.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
+       if (gmx_ref_clk == 100)
+               ref_clkdiv2.s.ref_clkdiv2 = 0;
+       else
+               ref_clkdiv2.s.ref_clkdiv2 = 1;
+       csr_wr(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0), ref_clkdiv2.u64);
+
+       /* 1. Ensure GSER(0)_DLM(0..2)_PHY_RESET[PHY_RESET] is set. */
+       dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
+       dlmx_phy_reset.s.phy_reset = 1;
+       csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
+
+       /* 2. If SGMII or QSGMII or RXAUI (i.e. if DLM0) set
+        *    GSER(0)_DLM(0)_MPLL_EN[MPLL_EN] to one.
+        */
+       /* 7. Set GSER0_DLM0_MPLL_EN[MPLL_EN] = 1 */
+       dlmx_mpll_en.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_EN(0, 0));
+       dlmx_mpll_en.s.mpll_en = 1;
+       csr_wr(CVMX_GSERX_DLMX_MPLL_EN(0, 0), dlmx_mpll_en.u64);
+
+       /* 3. Set GSER(0)_DLM(0..2)_MPLL_MULTIPLIER[MPLL_MULTIPLIER]
+        *    to the value in the preceding table, which is different
+        *    than the desired setting prescribed by the HRM.
+        */
+       mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
+       if (gmx_ref_clk == 100)
+               mpll_multiplier.s.mpll_multiplier = 35;
+       else if (gmx_ref_clk == 125)
+               mpll_multiplier.s.mpll_multiplier = 56;
+       else
+               mpll_multiplier.s.mpll_multiplier = 45;
+       debug("%s: Setting mpll multiplier to %u for DLM%d, baud %d, clock rate %uMHz\n",
+             __func__, mpll_multiplier.s.mpll_multiplier, qlm, baud_mhz, gmx_ref_clk);
+
+       csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
+
+       /* 5. Clear GSER0_DLM0_TEST_POWERDOWN[TEST_POWERDOWN] */
+       dlmx_test_powerdown.u64 = csr_rd(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0));
+       dlmx_test_powerdown.s.test_powerdown = 0;
+       csr_wr(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0), dlmx_test_powerdown.u64);
+
+       /* 6. Set GSER0_DLM0_REF_SSP_EN[REF_SSP_EN] = 1 */
+       dlmx_ref_ssp_en.u64 = csr_rd(CVMX_GSERX_DLMX_REF_SSP_EN(qlm, 0));
+       dlmx_ref_ssp_en.s.ref_ssp_en = 1;
+       csr_wr(CVMX_GSERX_DLMX_REF_SSP_EN(0, 0), dlmx_ref_ssp_en.u64);
+
+       /* 8. Clear GSER0_DLM0_PHY_RESET[PHY_RESET] = 0 */
+       dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
+       dlmx_phy_reset.s.phy_reset = 0;
+       csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
+
+       /* 5. If PCIe or SATA (i.e. if DLM1 or DLM2), set both MPLL_EN
+        * and MPLL_EN_OVRD to one in GSER(0)_PHY(1..2)_OVRD_IN_LO.
+        */
+
+       /* 6. Decrease MPLL_MULTIPLIER by one continually until it
+        * reaches the desired long-term setting, ensuring that each
+        * MPLL_MULTIPLIER value is constant for at least 1 msec before
+        * changing to the next value.  The desired long-term setting is
+        * as indicated in HRM tables 21-1, 21-2, and 21-3.  This is not
+        * required with the HRM sequence.
+        */
+       mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
+       __cvmx_qlm_set_mult(qlm, baud_mhz, mpll_multiplier.s.mpll_multiplier);
+
+       /* 9. Poll until the MPLL locks. Wait for
+        *    GSER0_DLM0_MPLL_STATUS[MPLL_STATUS] = 1
+        */
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_MPLL_STATUS(qlm, 0),
+                                 cvmx_gserx_dlmx_mpll_status_t, mpll_status, ==, 1, 10000)) {
+               printf("PLL for DLM%d failed to lock\n", qlm);
+               return -1;
+       }
+       return 0;
+}
+
+static int __dlm0_setup_tx_cn70xx(int speed, int ref_clk_sel)
+{
+       int need0, need1;
+       cvmx_gmxx_inf_mode_t mode0, mode1;
+       cvmx_gserx_dlmx_tx_rate_t rate;
+       cvmx_gserx_dlmx_tx_en_t en;
+       cvmx_gserx_dlmx_tx_cm_en_t cm_en;
+       cvmx_gserx_dlmx_tx_data_en_t data_en;
+       cvmx_gserx_dlmx_tx_reset_t tx_reset;
+
+       debug("%s(%d, %d)\n", __func__, speed, ref_clk_sel);
+       mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
+       mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
+
+       /* Which lanes do we need? */
+       need0 = (mode0.s.mode != CVMX_GMX_INF_MODE_DISABLED);
+       need1 = (mode1.s.mode != CVMX_GMX_INF_MODE_DISABLED) ||
+               (mode0.s.mode == CVMX_GMX_INF_MODE_RXAUI);
+
+       /* 1. Write GSER0_DLM0_TX_RATE[TXn_RATE] (Set according to required
+        *    data rate (see Table 21-1).
+        */
+       rate.u64 = csr_rd(CVMX_GSERX_DLMX_TX_RATE(0, 0));
+       debug("%s: speed: %d\n", __func__, speed);
+       switch (speed) {
+       case 1250:
+       case 2500:
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.tx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
+                       rate.s.tx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       case 3125:
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.tx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
+                       rate.s.tx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       case 5000: /* QSGMII only */
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
+                       rate.s.tx0_rate = 0;
+                       rate.s.tx1_rate = 0;
+                       break;
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.tx0_rate = 0;
+                       rate.s.tx1_rate = 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       case 6250:
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.tx0_rate = 0;
+                       rate.s.tx1_rate = 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       default:
+               printf("%s: Invalid rate %d\n", __func__, speed);
+               return -1;
+       }
+       debug("%s: tx 0 rate: %d, tx 1 rate: %d\n", __func__, rate.s.tx0_rate, rate.s.tx1_rate);
+       csr_wr(CVMX_GSERX_DLMX_TX_RATE(0, 0), rate.u64);
+
+       /* 2. Set GSER0_DLM0_TX_EN[TXn_EN] = 1 */
+       en.u64 = csr_rd(CVMX_GSERX_DLMX_TX_EN(0, 0));
+       en.s.tx0_en = need0;
+       en.s.tx1_en = need1;
+       csr_wr(CVMX_GSERX_DLMX_TX_EN(0, 0), en.u64);
+
+       /* 3 set GSER0_DLM0_TX_CM_EN[TXn_CM_EN] = 1 */
+       cm_en.u64 = csr_rd(CVMX_GSERX_DLMX_TX_CM_EN(0, 0));
+       cm_en.s.tx0_cm_en = need0;
+       cm_en.s.tx1_cm_en = need1;
+       csr_wr(CVMX_GSERX_DLMX_TX_CM_EN(0, 0), cm_en.u64);
+
+       /* 4. Set GSER0_DLM0_TX_DATA_EN[TXn_DATA_EN] = 1 */
+       data_en.u64 = csr_rd(CVMX_GSERX_DLMX_TX_DATA_EN(0, 0));
+       data_en.s.tx0_data_en = need0;
+       data_en.s.tx1_data_en = need1;
+       csr_wr(CVMX_GSERX_DLMX_TX_DATA_EN(0, 0), data_en.u64);
+
+       /* 5. Clear GSER0_DLM0_TX_RESET[TXn_DATA_EN] = 0 */
+       tx_reset.u64 = csr_rd(CVMX_GSERX_DLMX_TX_RESET(0, 0));
+       tx_reset.s.tx0_reset = !need0;
+       tx_reset.s.tx1_reset = !need1;
+       csr_wr(CVMX_GSERX_DLMX_TX_RESET(0, 0), tx_reset.u64);
+
+       /* 6. Poll GSER0_DLM0_TX_STATUS[TXn_STATUS, TXn_CM_STATUS] until both
+        *    are set to 1. This prevents GMX from transmitting until the DLM
+        *    is ready.
+        */
+       if (need0) {
+               if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
+                                         cvmx_gserx_dlmx_tx_status_t, tx0_status, ==, 1, 10000)) {
+                       printf("DLM0 TX0 status fail\n");
+                       return -1;
+               }
+               if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
+                                         cvmx_gserx_dlmx_tx_status_t, tx0_cm_status, ==, 1,
+                                         10000)) {
+                       printf("DLM0 TX0 CM status fail\n");
+                       return -1;
+               }
+       }
+       if (need1) {
+               if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
+                                         cvmx_gserx_dlmx_tx_status_t, tx1_status, ==, 1, 10000)) {
+                       printf("DLM0 TX1 status fail\n");
+                       return -1;
+               }
+               if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
+                                         cvmx_gserx_dlmx_tx_status_t, tx1_cm_status, ==, 1,
+                                         10000)) {
+                       printf("DLM0 TX1 CM status fail\n");
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+static int __dlm0_setup_rx_cn70xx(int speed, int ref_clk_sel)
+{
+       int need0, need1;
+       cvmx_gmxx_inf_mode_t mode0, mode1;
+       cvmx_gserx_dlmx_rx_rate_t rate;
+       cvmx_gserx_dlmx_rx_pll_en_t pll_en;
+       cvmx_gserx_dlmx_rx_data_en_t data_en;
+       cvmx_gserx_dlmx_rx_reset_t rx_reset;
+
+       debug("%s(%d, %d)\n", __func__, speed, ref_clk_sel);
+       mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
+       mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
+
+       /* Which lanes do we need? */
+       need0 = (mode0.s.mode != CVMX_GMX_INF_MODE_DISABLED);
+       need1 = (mode1.s.mode != CVMX_GMX_INF_MODE_DISABLED) ||
+               (mode0.s.mode == CVMX_GMX_INF_MODE_RXAUI);
+
+       /* 1. Write GSER0_DLM0_RX_RATE[RXn_RATE] (must match the
+        * GER0_DLM0_TX_RATE[TXn_RATE] setting).
+        */
+       rate.u64 = csr_rd(CVMX_GSERX_DLMX_RX_RATE(0, 0));
+       switch (speed) {
+       case 1250:
+       case 2500:
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.rx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
+                       rate.s.rx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       case 3125:
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.rx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
+                       rate.s.rx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       case 5000: /* QSGMII only */
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.rx0_rate = 0;
+                       rate.s.rx1_rate = 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       case 6250:
+               switch (ref_clk_sel) {
+               case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
+               case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
+                       rate.s.rx0_rate = 0;
+                       rate.s.rx1_rate = 0;
+                       break;
+               default:
+                       printf("Invalid reference clock select %d\n", ref_clk_sel);
+                       return -1;
+               }
+               break;
+       default:
+               printf("%s: Invalid rate %d\n", __func__, speed);
+               return -1;
+       }
+       debug("%s: rx 0 rate: %d, rx 1 rate: %d\n", __func__, rate.s.rx0_rate, rate.s.rx1_rate);
+       csr_wr(CVMX_GSERX_DLMX_RX_RATE(0, 0), rate.u64);
+
+       /* 2. Set GSER0_DLM0_RX_PLL_EN[RXn_PLL_EN] = 1 */
+       pll_en.u64 = csr_rd(CVMX_GSERX_DLMX_RX_PLL_EN(0, 0));
+       pll_en.s.rx0_pll_en = need0;
+       pll_en.s.rx1_pll_en = need1;
+       csr_wr(CVMX_GSERX_DLMX_RX_PLL_EN(0, 0), pll_en.u64);
+
+       /* 3. Set GSER0_DLM0_RX_DATA_EN[RXn_DATA_EN] = 1 */
+       data_en.u64 = csr_rd(CVMX_GSERX_DLMX_RX_DATA_EN(0, 0));
+       data_en.s.rx0_data_en = need0;
+       data_en.s.rx1_data_en = need1;
+       csr_wr(CVMX_GSERX_DLMX_RX_DATA_EN(0, 0), data_en.u64);
+
+       /* 4. Clear GSER0_DLM0_RX_RESET[RXn_DATA_EN] = 0. Now the GMX can be
+        * enabled: set GMX(0..1)_INF_MODE[EN] = 1
+        */
+       rx_reset.u64 = csr_rd(CVMX_GSERX_DLMX_RX_RESET(0, 0));
+       rx_reset.s.rx0_reset = !need0;
+       rx_reset.s.rx1_reset = !need1;
+       csr_wr(CVMX_GSERX_DLMX_RX_RESET(0, 0), rx_reset.u64);
+
+       return 0;
+}
+
+static int a_clk;
+
+static int __dlm2_sata_uctl_init_cn70xx(void)
+{
+       cvmx_sata_uctl_ctl_t uctl_ctl;
+       const int MAX_A_CLK = 333000000; /* Max of 333Mhz */
+       int divisor, a_clkdiv;
+
+       /* Wait for all voltages to reach a stable stable. Ensure the
+        * reference clock is up and stable.
+        */
+
+       /* 2. Wait for IOI reset to deassert. */
+
+       /* 3. Optionally program the GPIO CSRs for SATA features.
+        *    a. For cold-presence detect:
+        *       i. Select a GPIO for the input and program GPIO_SATA_CTL[sel]
+        *          for port0 and port1.
+        *       ii. Select a GPIO for the output and program
+        *           GPIO_BIT_CFG*[OUTPUT_SEL] for port0 and port1.
+        *    b. For mechanical-presence detect, select a GPIO for the input
+        *       and program GPIO_SATA_CTL[SEL] for port0/port1.
+        *    c. For LED activity, select a GPIO for the output and program
+        *       GPIO_BIT_CFG*[OUTPUT_SEL] for port0/port1.
+        */
+
+       /* 4. Assert all resets:
+        *    a. UAHC reset: SATA_UCTL_CTL[UAHC_RST] = 1
+        *    a. UCTL reset: SATA_UCTL_CTL[UCTL_RST] = 1
+        */
+
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+       uctl_ctl.s.sata_uahc_rst = 1;
+       uctl_ctl.s.sata_uctl_rst = 1;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       /* 5. Configure the ACLK:
+        *    a. Reset the clock dividers: SATA_UCTL_CTL[A_CLKDIV_RST] = 1.
+        *    b. Select the ACLK frequency (400 MHz maximum)
+        *       i. SATA_UCTL_CTL[A_CLKDIV] = desired value,
+        *       ii. SATA_UCTL_CTL[A_CLKDIV_EN] = 1 to enable the ACLK,
+        *    c. Deassert the ACLK clock divider reset:
+        *       SATA_UCTL_CTL[A_CLKDIV_RST] = 0
+        */
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+       uctl_ctl.s.a_clkdiv_rst = 1;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+
+       divisor = (gd->bus_clk + MAX_A_CLK - 1) / MAX_A_CLK;
+       if (divisor <= 4) {
+               a_clkdiv = divisor - 1;
+       } else if (divisor <= 6) {
+               a_clkdiv = 4;
+               divisor = 6;
+       } else if (divisor <= 8) {
+               a_clkdiv = 5;
+               divisor = 8;
+       } else if (divisor <= 16) {
+               a_clkdiv = 6;
+               divisor = 16;
+       } else if (divisor <= 24) {
+               a_clkdiv = 7;
+               divisor = 24;
+       } else {
+               printf("Unable to determine SATA clock divisor\n");
+               return -1;
+       }
+
+       /* Calculate the final clock rate */
+       a_clk = gd->bus_clk / divisor;
+
+       uctl_ctl.s.a_clkdiv_sel = a_clkdiv;
+       uctl_ctl.s.a_clk_en = 1;
+       uctl_ctl.s.a_clk_byp_sel = 0;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+       uctl_ctl.s.a_clkdiv_rst = 0;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       udelay(1);
+
+       return 0;
+}
+
+static int __sata_dlm_init_cn70xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
+{
+       cvmx_gserx_sata_cfg_t sata_cfg;
+       cvmx_gserx_sata_lane_rst_t sata_lane_rst;
+       cvmx_gserx_dlmx_phy_reset_t dlmx_phy_reset;
+       cvmx_gserx_dlmx_test_powerdown_t dlmx_test_powerdown;
+       cvmx_gserx_sata_ref_ssp_en_t ref_ssp_en;
+       cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
+       cvmx_gserx_dlmx_ref_clkdiv2_t ref_clkdiv2;
+       cvmx_sata_uctl_shim_cfg_t shim_cfg;
+       cvmx_gserx_phyx_ovrd_in_lo_t ovrd_in;
+       cvmx_sata_uctl_ctl_t uctl_ctl;
+       int sata_ref_clk;
+
+       debug("%s(%d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input);
+
+       switch (ref_clk_sel) {
+       case 0:
+               sata_ref_clk = 100;
+               break;
+       case 1:
+               sata_ref_clk = 125;
+               break;
+       case 2:
+               sata_ref_clk = 156;
+               break;
+       default:
+               printf("%s: Invalid reference clock select %d for qlm %d\n", __func__,
+                      ref_clk_sel, qlm);
+               return -1;
+       }
+
+       /* 5. Set GSERX0_SATA_CFG[SATA_EN] = 1 to configure DLM2 multiplexing.
+        */
+       sata_cfg.u64 = csr_rd(CVMX_GSERX_SATA_CFG(0));
+       sata_cfg.s.sata_en = 1;
+       csr_wr(CVMX_GSERX_SATA_CFG(0), sata_cfg.u64);
+
+       /* 1. Write GSER(0)_DLM2_REFCLK_SEL[REFCLK_SEL] if required for
+        *    reference-clock selection.
+        */
+       if (ref_clk_input < 2) {
+               csr_wr(CVMX_GSERX_DLMX_REFCLK_SEL(qlm, 0), ref_clk_input);
+               csr_wr(CVMX_GSERX_DLMX_REF_USE_PAD(qlm, 0), 0);
+       } else {
+               csr_wr(CVMX_GSERX_DLMX_REF_USE_PAD(qlm, 0), 1);
+       }
+
+       ref_ssp_en.u64 = csr_rd(CVMX_GSERX_SATA_REF_SSP_EN(0));
+       ref_ssp_en.s.ref_ssp_en = 1;
+       csr_wr(CVMX_GSERX_SATA_REF_SSP_EN(0), ref_ssp_en.u64);
+
+       /* Apply workaround for Errata (G-20669) MPLL may not come up. */
+
+       /* Set REF_CLKDIV2 based on the Ref Clock */
+       ref_clkdiv2.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
+       if (sata_ref_clk == 100)
+               ref_clkdiv2.s.ref_clkdiv2 = 0;
+       else
+               ref_clkdiv2.s.ref_clkdiv2 = 1;
+       csr_wr(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0), ref_clkdiv2.u64);
+
+       /* 1. Ensure GSER(0)_DLM(0..2)_PHY_RESET[PHY_RESET] is set. */
+       dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
+       dlmx_phy_reset.s.phy_reset = 1;
+       csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
+
+       /* 2. If SGMII or QSGMII or RXAUI (i.e. if DLM0) set
+        *    GSER(0)_DLM(0)_MPLL_EN[MPLL_EN] to one.
+        */
+
+       /* 3. Set GSER(0)_DLM(0..2)_MPLL_MULTIPLIER[MPLL_MULTIPLIER]
+        *    to the value in the preceding table, which is different
+        *    than the desired setting prescribed by the HRM.
+        */
+
+       mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
+       if (sata_ref_clk == 100)
+               mpll_multiplier.s.mpll_multiplier = 35;
+       else
+               mpll_multiplier.s.mpll_multiplier = 56;
+       csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
+
+       /* 3. Clear GSER0_DLM2_TEST_POWERDOWN[TEST_POWERDOWN] = 0 */
+       dlmx_test_powerdown.u64 = csr_rd(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0));
+       dlmx_test_powerdown.s.test_powerdown = 0;
+       csr_wr(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0), dlmx_test_powerdown.u64);
+
+       /* 4. Clear either/both lane0 and lane1 resets:
+        *    GSER0_SATA_LANE_RST[L0_RST, L1_RST] = 0.
+        */
+       sata_lane_rst.u64 = csr_rd(CVMX_GSERX_SATA_LANE_RST(0));
+       sata_lane_rst.s.l0_rst = 0;
+       sata_lane_rst.s.l1_rst = 0;
+       csr_wr(CVMX_GSERX_SATA_LANE_RST(0), sata_lane_rst.u64);
+
+       udelay(1);
+
+       /* 5. Clear GSER0_DLM2_PHY_RESET */
+       dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
+       dlmx_phy_reset.s.phy_reset = 0;
+       csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
+
+       /* 6. If PCIe or SATA (i.e. if DLM1 or DLM2), set both MPLL_EN
+        * and MPLL_EN_OVRD to one in GSER(0)_PHY(1..2)_OVRD_IN_LO.
+        */
+       ovrd_in.u64 = csr_rd(CVMX_GSERX_PHYX_OVRD_IN_LO(qlm, 0));
+       ovrd_in.s.mpll_en = 1;
+       ovrd_in.s.mpll_en_ovrd = 1;
+       csr_wr(CVMX_GSERX_PHYX_OVRD_IN_LO(qlm, 0), ovrd_in.u64);
+
+       /* 7. Decrease MPLL_MULTIPLIER by one continually until it reaches
+        *   the desired long-term setting, ensuring that each MPLL_MULTIPLIER
+        *   value is constant for at least 1 msec before changing to the next
+        *   value. The desired long-term setting is as indicated in HRM tables
+        *   21-1, 21-2, and 21-3. This is not required with the HRM
+        *   sequence.
+        */
+       mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
+       if (sata_ref_clk == 100)
+               mpll_multiplier.s.mpll_multiplier = 0x1e;
+       else
+               mpll_multiplier.s.mpll_multiplier = 0x30;
+       csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
+
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_MPLL_STATUS(qlm, 0),
+                                 cvmx_gserx_dlmx_mpll_status_t, mpll_status, ==, 1, 10000)) {
+               printf("ERROR: SATA MPLL failed to set\n");
+               return -1;
+       }
+
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_RX_STATUS(qlm, 0), cvmx_gserx_dlmx_rx_status_t,
+                                 rx0_status, ==, 1, 10000)) {
+               printf("ERROR: SATA RX0_STATUS failed to set\n");
+               return -1;
+       }
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_RX_STATUS(qlm, 0), cvmx_gserx_dlmx_rx_status_t,
+                                 rx1_status, ==, 1, 10000)) {
+               printf("ERROR: SATA RX1_STATUS failed to set\n");
+               return -1;
+       }
+
+       /* 8. Deassert UCTL and UAHC resets:
+        *    a. SATA_UCTL_CTL[UCTL_RST] = 0
+        *    b. SATA_UCTL_CTL[UAHC_RST] = 0
+        *    c. Wait 10 ACLK cycles before accessing any ACLK-only registers.
+        */
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+       uctl_ctl.s.sata_uctl_rst = 0;
+       uctl_ctl.s.sata_uahc_rst = 0;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       udelay(1);
+
+       /* 9. Enable conditional SCLK of UCTL by writing
+        *    SATA_UCTL_CTL[CSCLK_EN] = 1
+        */
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+       uctl_ctl.s.csclk_en = 1;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       /* 10. Initialize UAHC as described in the AHCI Specification (UAHC_*
+        *     registers
+        */
+
+       /* set-up endian mode */
+       shim_cfg.u64 = csr_rd(CVMX_SATA_UCTL_SHIM_CFG);
+       shim_cfg.s.dma_endian_mode = 1;
+       shim_cfg.s.csr_endian_mode = 3;
+       csr_wr(CVMX_SATA_UCTL_SHIM_CFG, shim_cfg.u64);
+
+       return 0;
+}
+
+/**
+ * Initializes DLM 4 for SATA
+ *
+ * @param qlm          Must be 4.
+ * @param baud_mhz     Baud rate for SATA
+ * @param ref_clk_sel  Selects the speed of the reference clock where:
+ *                     0 = 100MHz, 1 = 125MHz and 2 = 156.25MHz
+ * @param ref_clk_input        Reference clock input where 0 = external QLM clock,
+ *                     1 = qlmc_ref_clk0 and 2 = qlmc_ref_clk1
+ */
+static int __sata_dlm_init_cn73xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
+{
+       cvmx_sata_uctl_shim_cfg_t shim_cfg;
+       cvmx_gserx_refclk_sel_t refclk_sel;
+       cvmx_gserx_phy_ctl_t phy_ctl;
+       cvmx_gserx_rx_pwr_ctrl_p2_t pwr_ctrl_p2;
+       cvmx_gserx_lanex_misc_cfg_0_t misc_cfg_0;
+       cvmx_gserx_sata_lane_rst_t lane_rst;
+       cvmx_gserx_pll_px_mode_0_t pmode_0;
+       cvmx_gserx_pll_px_mode_1_t pmode_1;
+       cvmx_gserx_lane_px_mode_0_t lane_pmode_0;
+       cvmx_gserx_lane_px_mode_1_t lane_pmode_1;
+       cvmx_gserx_cfg_t gserx_cfg;
+       cvmx_sata_uctl_ctl_t uctl_ctl;
+       int l;
+       int i;
+
+       /*
+        * 1. Configure the SATA
+        */
+
+       /*
+        * 2. Configure the QLM Reference clock
+        *    Set GSERX_REFCLK_SEL.COM_CLK_SEL to source reference clock
+        *    from the external clock mux.
+        *      GSERX_REFCLK_SEL.USE_COM1 to select qlmc_refclkn/p_1 or
+        *      leave clear to select qlmc_refclkn/p_0
+        */
+       refclk_sel.u64 = 0;
+       if (ref_clk_input == 0) { /* External ref clock */
+               refclk_sel.s.com_clk_sel = 0;
+               refclk_sel.s.use_com1 = 0;
+       } else if (ref_clk_input == 1) { /* Common reference clock 0 */
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 0;
+       } else { /* Common reference clock 1 */
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 1;
+       }
+
+       if (ref_clk_sel != 0) {
+               printf("Wrong reference clock selected for QLM4\n");
+               return -1;
+       }
+
+       csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+
+       /* Reset the QLM after changing the reference clock */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 1;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       udelay(1);
+
+       /*
+        * 3. Configure the QLM for SATA mode set GSERX_CFG.SATA
+        */
+       gserx_cfg.u64 = 0;
+       gserx_cfg.s.sata = 1;
+       csr_wr(CVMX_GSERX_CFG(qlm), gserx_cfg.u64);
+
+       /*
+        * 12. Clear the appropriate lane resets
+        *     clear GSERX_SATA_LANE_RST.LX_RST  where X is the lane number 0-1.
+        */
+       lane_rst.u64 = csr_rd(CVMX_GSERX_SATA_LANE_RST(qlm));
+       lane_rst.s.l0_rst = 0;
+       lane_rst.s.l1_rst = 0;
+       csr_wr(CVMX_GSERX_SATA_LANE_RST(qlm), lane_rst.u64);
+       csr_rd(CVMX_GSERX_SATA_LANE_RST(qlm));
+
+       udelay(1);
+
+       /*
+        * 4. Take the PHY out of reset
+        *    Write GSERX_PHY_CTL.PHY_RESET to a zero
+        */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 0;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       /* Wait for reset to complete and the PLL to lock */
+       /* PCIe mode doesn't become ready until the PEM block attempts to bring
+        * the interface up. Skip this check for PCIe
+        */
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
+                                 rst_rdy, ==, 1, 10000)) {
+               printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
+               return -1;
+       }
+
+       /* Workaround for errata GSER-30310: SATA HDD Not Ready due to
+        * PHY SDLL/LDLL lockup at 3GHz
+        */
+       for (i = 0; i < 2; i++) {
+               cvmx_gserx_slicex_pcie1_mode_t pcie1;
+               cvmx_gserx_slicex_pcie2_mode_t pcie2;
+               cvmx_gserx_slicex_pcie3_mode_t pcie3;
+
+               pcie1.u64 = csr_rd(CVMX_GSERX_SLICEX_PCIE1_MODE(i, qlm));
+               pcie1.s.rx_pi_bwsel = 1;
+               pcie1.s.rx_ldll_bwsel = 1;
+               pcie1.s.rx_sdll_bwsel = 1;
+               csr_wr(CVMX_GSERX_SLICEX_PCIE1_MODE(i, qlm), pcie1.u64);
+
+               pcie2.u64 = csr_rd(CVMX_GSERX_SLICEX_PCIE2_MODE(i, qlm));
+               pcie2.s.rx_pi_bwsel = 1;
+               pcie2.s.rx_ldll_bwsel = 1;
+               pcie2.s.rx_sdll_bwsel = 1;
+               csr_wr(CVMX_GSERX_SLICEX_PCIE2_MODE(i, qlm), pcie2.u64);
+
+               pcie3.u64 = csr_rd(CVMX_GSERX_SLICEX_PCIE3_MODE(i, qlm));
+               pcie3.s.rx_pi_bwsel = 1;
+               pcie3.s.rx_ldll_bwsel = 1;
+               pcie3.s.rx_sdll_bwsel = 1;
+               csr_wr(CVMX_GSERX_SLICEX_PCIE3_MODE(i, qlm), pcie3.u64);
+       }
+
+       /*
+        * 7. Change P2 termination
+        *    Clear GSERX_RX_PWR_CTRL_P2.P2_RX_SUBBLK_PD[0] (Termination)
+        */
+       pwr_ctrl_p2.u64 = csr_rd(CVMX_GSERX_RX_PWR_CTRL_P2(qlm));
+       pwr_ctrl_p2.s.p2_rx_subblk_pd &= 0x1e;
+       csr_wr(CVMX_GSERX_RX_PWR_CTRL_P2(qlm), pwr_ctrl_p2.u64);
+
+       /*
+        * 8. Modify the Electrical IDLE Detect on delay
+        *    Change GSERX_LANE(0..3)_MISC_CFG_0.EIE_DET_STL_ON_TIME to a 0x4
+        */
+       for (i = 0; i < 2; i++) {
+               misc_cfg_0.u64 = csr_rd(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm));
+               misc_cfg_0.s.eie_det_stl_on_time = 4;
+               csr_wr(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm), misc_cfg_0.u64);
+       }
+
+       /*
+        * 9. Modify the PLL and Lane Protocol Mode registers to configure
+        *    the PHY for SATA.
+        *    (Configure all 3 PLLs, doesn't matter what speed it is configured)
+        */
+
+       /* Errata (GSER-26724) SATA never indicates GSER QLM_STAT[RST_RDY]
+        * We program PLL_PX_MODE_0 last due to this errata
+        */
+       for (l = 0; l < 3; l++) {
+               pmode_1.u64 = csr_rd(CVMX_GSERX_PLL_PX_MODE_1(l, qlm));
+               lane_pmode_0.u64 = csr_rd(CVMX_GSERX_LANE_PX_MODE_0(l, qlm));
+               lane_pmode_1.u64 = csr_rd(CVMX_GSERX_LANE_PX_MODE_1(l, qlm));
+
+               pmode_1.s.pll_cpadj = 0x2;
+               pmode_1.s.pll_opr = 0x0;
+               pmode_1.s.pll_div = 0x1e;
+               pmode_1.s.pll_pcie3en = 0x0;
+               pmode_1.s.pll_16p5en = 0x0;
+
+               lane_pmode_0.s.ctle = 0x0;
+               lane_pmode_0.s.pcie = 0x0;
+               lane_pmode_0.s.tx_ldiv = 0x0;
+               lane_pmode_0.s.srate = 0;
+               lane_pmode_0.s.tx_mode = 0x3;
+               lane_pmode_0.s.rx_mode = 0x3;
+
+               lane_pmode_1.s.vma_mm = 1;
+               lane_pmode_1.s.vma_fine_cfg_sel = 0;
+               lane_pmode_1.s.cdr_fgain = 0xa;
+               lane_pmode_1.s.ph_acc_adj = 0x15;
+
+               if (l == R_2_5G_REFCLK100)
+                       lane_pmode_0.s.rx_ldiv = 0x2;
+               else if (l == R_5G_REFCLK100)
+                       lane_pmode_0.s.rx_ldiv = 0x1;
+               else
+                       lane_pmode_0.s.rx_ldiv = 0x0;
+
+               csr_wr(CVMX_GSERX_PLL_PX_MODE_1(l, qlm), pmode_1.u64);
+               csr_wr(CVMX_GSERX_LANE_PX_MODE_0(l, qlm), lane_pmode_0.u64);
+               csr_wr(CVMX_GSERX_LANE_PX_MODE_1(l, qlm), lane_pmode_1.u64);
+       }
+
+       for (l = 0; l < 3; l++) {
+               pmode_0.u64 = csr_rd(CVMX_GSERX_PLL_PX_MODE_0(l, qlm));
+               pmode_0.s.pll_icp = 0x1;
+               pmode_0.s.pll_rloop = 0x3;
+               pmode_0.s.pll_pcs_div = 0x5;
+               csr_wr(CVMX_GSERX_PLL_PX_MODE_0(l, qlm), pmode_0.u64);
+       }
+
+       for (i = 0; i < 2; i++) {
+               cvmx_gserx_slicex_rx_sdll_ctrl_t rx_sdll;
+
+               rx_sdll.u64 = csr_rd(CVMX_GSERX_SLICEX_RX_SDLL_CTRL(i, qlm));
+               rx_sdll.s.pcs_sds_oob_clk_ctrl = 2;
+               rx_sdll.s.pcs_sds_rx_sdll_tune = 0;
+               rx_sdll.s.pcs_sds_rx_sdll_swsel = 0;
+               csr_wr(CVMX_GSERX_SLICEX_RX_SDLL_CTRL(i, qlm), rx_sdll.u64);
+       }
+
+       for (i = 0; i < 2; i++) {
+               cvmx_gserx_lanex_misc_cfg_0_t misc_cfg;
+
+               misc_cfg.u64 = csr_rd(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm));
+               misc_cfg.s.use_pma_polarity = 0;
+               misc_cfg.s.cfg_pcs_loopback = 0;
+               misc_cfg.s.pcs_tx_mode_ovrrd_en = 0;
+               misc_cfg.s.pcs_rx_mode_ovrrd_en = 0;
+               misc_cfg.s.cfg_eie_det_cnt = 0;
+               misc_cfg.s.eie_det_stl_on_time = 4;
+               misc_cfg.s.eie_det_stl_off_time = 0;
+               misc_cfg.s.tx_bit_order = 1;
+               misc_cfg.s.rx_bit_order = 1;
+               csr_wr(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm), misc_cfg.u64);
+       }
+
+       /* Wait for reset to complete and the PLL to lock */
+       /* PCIe mode doesn't become ready until the PEM block attempts to bring
+        * the interface up. Skip this check for PCIe
+        */
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
+                                 rst_rdy, ==, 1, 10000)) {
+               printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
+               return -1;
+       }
+
+       /* Poll GSERX_SATA_STATUS for P0_RDY = 1 */
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_SATA_STATUS(qlm), cvmx_gserx_sata_status_t,
+                                 p0_rdy, ==, 1, 10000)) {
+               printf("QLM4: Timeout waiting for GSERX_SATA_STATUS[p0_rdy]\n");
+               return -1;
+       }
+
+       /* Poll GSERX_SATA_STATUS for P1_RDY = 1 */
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_SATA_STATUS(qlm), cvmx_gserx_sata_status_t,
+                                 p1_rdy, ==, 1, 10000)) {
+               printf("QLM4: Timeout waiting for GSERX_SATA_STATUS[p1_rdy]\n");
+               return -1;
+       }
+
+       udelay(2000);
+
+       /* 6. Deassert UCTL and UAHC resets:
+        *    a. SATA_UCTL_CTL[UCTL_RST] = 0
+        *    b. SATA_UCTL_CTL[UAHC_RST] = 0
+        *    c. Wait 10 ACLK cycles before accessing any ACLK-only registers.
+        */
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+       uctl_ctl.s.sata_uctl_rst = 0;
+       uctl_ctl.s.sata_uahc_rst = 0;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       udelay(1);
+
+       /* 7. Enable conditional SCLK of UCTL by writing
+        *    SATA_UCTL_CTL[CSCLK_EN] = 1
+        */
+       uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+       uctl_ctl.s.csclk_en = 1;
+       csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+       /* set-up endian mode */
+       shim_cfg.u64 = csr_rd(CVMX_SATA_UCTL_SHIM_CFG);
+       shim_cfg.s.dma_endian_mode = 1;
+       shim_cfg.s.csr_endian_mode = 3;
+       csr_wr(CVMX_SATA_UCTL_SHIM_CFG, shim_cfg.u64);
+
+       return 0;
+}
+
+static int __dlm2_sata_uahc_init_cn70xx(int baud_mhz)
+{
+       cvmx_sata_uahc_gbl_cap_t gbl_cap;
+       cvmx_sata_uahc_px_sctl_t sctl;
+       cvmx_sata_uahc_gbl_pi_t pi;
+       cvmx_sata_uahc_px_cmd_t cmd;
+       cvmx_sata_uahc_px_sctl_t sctl0, sctl1;
+       cvmx_sata_uahc_px_ssts_t ssts;
+       cvmx_sata_uahc_px_tfd_t tfd;
+       cvmx_sata_uahc_gbl_timer1ms_t gbl_timer1ms;
+       u64 done;
+       int result = -1;
+       int retry_count = 0;
+       int spd;
+
+       /* From the synopsis data book, SATA_UAHC_GBL_TIMER1MS is the
+        * AMBA clock in MHz * 1000, which is a_clk(Hz) / 1000
+        */
+       gbl_timer1ms.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_TIMER1MS);
+       gbl_timer1ms.s.timv = a_clk / 1000;
+       csr_wr32(CVMX_SATA_UAHC_GBL_TIMER1MS, gbl_timer1ms.u32);
+       gbl_timer1ms.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_TIMER1MS);
+
+       /* Set-u global capabilities reg (GBL_CAP) */
+       gbl_cap.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_CAP);
+       debug("%s: SATA_UAHC_GBL_CAP before: 0x%x\n", __func__, gbl_cap.u32);
+       gbl_cap.s.sss = 1;
+       gbl_cap.s.smps = 1;
+       csr_wr32(CVMX_SATA_UAHC_GBL_CAP, gbl_cap.u32);
+       gbl_cap.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_CAP);
+       debug("%s: SATA_UAHC_GBL_CAP after: 0x%x\n", __func__, gbl_cap.u32);
+
+       /* Set-up global hba control reg (interrupt enables) */
+       /* Set-up port SATA control registers (speed limitation) */
+       if (baud_mhz == 1500)
+               spd = 1;
+       else if (baud_mhz == 3000)
+               spd = 2;
+       else
+               spd = 3;
+
+       sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
+       debug("%s: SATA_UAHC_P0_SCTL before: 0x%x\n", __func__, sctl.u32);
+       sctl.s.spd = spd;
+       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl.u32);
+       sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
+       debug("%s: SATA_UAHC_P0_SCTL after: 0x%x\n", __func__, sctl.u32);
+       sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
+       debug("%s: SATA_UAHC_P1_SCTL before: 0x%x\n", __func__, sctl.u32);
+       sctl.s.spd = spd;
+       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl.u32);
+       sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
+       debug("%s: SATA_UAHC_P1_SCTL after: 0x%x\n", __func__, sctl.u32);
+
+       /* Set-up ports implemented reg. */
+       pi.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_PI);
+       debug("%s: SATA_UAHC_GBL_PI before: 0x%x\n", __func__, pi.u32);
+       pi.s.pi = 3;
+       csr_wr32(CVMX_SATA_UAHC_GBL_PI, pi.u32);
+       pi.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_PI);
+       debug("%s: SATA_UAHC_GBL_PI after: 0x%x\n", __func__, pi.u32);
+
+retry0:
+       /* Clear port SERR and IS registers */
+       csr_wr32(CVMX_SATA_UAHC_PX_SERR(0), csr_rd32(CVMX_SATA_UAHC_PX_SERR(0)));
+       csr_wr32(CVMX_SATA_UAHC_PX_IS(0), csr_rd32(CVMX_SATA_UAHC_PX_IS(0)));
+
+       /* Set spin-up, power on, FIS RX enable, start, active */
+       cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(0));
+       debug("%s: SATA_UAHC_P0_CMD before: 0x%x\n", __func__, cmd.u32);
+       cmd.s.fre = 1;
+       cmd.s.sud = 1;
+       cmd.s.pod = 1;
+       cmd.s.st = 1;
+       cmd.s.icc = 1;
+       cmd.s.fbscp = 1; /* Enable FIS-based switching */
+       csr_wr32(CVMX_SATA_UAHC_PX_CMD(0), cmd.u32);
+       cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(0));
+       debug("%s: SATA_UAHC_P0_CMD after: 0x%x\n", __func__, cmd.u32);
+
+       sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
+       sctl0.s.det = 1;
+       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl0.u32);
+
+       /* check status */
+       done = get_timer(0);
+       while (1) {
+               ssts.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SSTS(0));
+
+               if (ssts.s.ipm == 1 && ssts.s.det == 3) {
+                       result = 0;
+                       break;
+               } else if (get_timer(done) > 100) {
+                       result = -1;
+                       break;
+               }
+
+               udelay(100);
+       }
+
+       if (result != -1) {
+               /* Clear the PxSERR Register, by writing '1s' to each
+                * implemented bit location
+                */
+               csr_wr32(CVMX_SATA_UAHC_PX_SERR(0), -1);
+
+               /*
+                * Wait for indication that SATA drive is ready. This is
+                * determined via an examination of PxTFD.STS. If PxTFD.STS.BSY
+                * PxTFD.STS.DRQ, and PxTFD.STS.ERR are all '0', prior to the
+                * maximum allowed time as specified in the ATA/ATAPI-7
+                * specification, the device is ready.
+                */
+               /*
+                * Wait for the device to be ready. BSY(7), DRQ(3), and ERR(0)
+                * must be clear
+                */
+               done = get_timer(0);
+               while (1) {
+                       tfd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_TFD(0));
+                       if ((tfd.s.sts & 0x89) == 0) {
+                               result = 0;
+                               break;
+                       } else if (get_timer(done) > 500) {
+                               if (retry_count < 3) {
+                                       sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
+                                       sctl0.s.det = 1; /* Perform interface reset */
+                                       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl0.u32);
+                                       udelay(1000); /* 1ms dicated by AHCI 1.3 spec */
+                                       sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
+                                       sctl0.s.det = 0; /* Perform interface reset */
+                                       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl0.u32);
+                                       retry_count++;
+                                       goto retry0;
+                               }
+                               result = -1;
+                               break;
+                       }
+
+                       udelay(100);
+               }
+       }
+
+       if (result == -1)
+               printf("SATA0: not available\n");
+       else
+               printf("SATA0: available\n");
+
+       sctl1.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
+       sctl1.s.det = 1;
+       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl1.u32);
+
+       result = -1;
+       retry_count = 0;
+
+retry1:
+       /* Clear port SERR and IS registers */
+       csr_wr32(CVMX_SATA_UAHC_PX_SERR(1), csr_rd32(CVMX_SATA_UAHC_PX_SERR(1)));
+       csr_wr32(CVMX_SATA_UAHC_PX_IS(1), csr_rd32(CVMX_SATA_UAHC_PX_IS(1)));
+
+       /* Set spin-up, power on, FIS RX enable, start, active */
+       cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(1));
+       debug("%s: SATA_UAHC_P1_CMD before: 0x%x\n", __func__, cmd.u32);
+       cmd.s.fre = 1;
+       cmd.s.sud = 1;
+       cmd.s.pod = 1;
+       cmd.s.st = 1;
+       cmd.s.icc = 1;
+       cmd.s.fbscp = 1; /* Enable FIS-based switching */
+       csr_wr32(CVMX_SATA_UAHC_PX_CMD(1), cmd.u32);
+       cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(1));
+       debug("%s: SATA_UAHC_P1_CMD after: 0x%x\n", __func__, cmd.u32);
+
+       /* check status */
+       done = get_timer(0);
+       while (1) {
+               ssts.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SSTS(1));
+
+               if (ssts.s.ipm == 1 && ssts.s.det == 3) {
+                       result = 0;
+                       break;
+               } else if (get_timer(done) > 1000) {
+                       result = -1;
+                       break;
+               }
+
+               udelay(100);
+       }
+
+       if (result != -1) {
+               /* Clear the PxSERR Register, by writing '1s' to each
+                * implemented bit location
+                */
+               csr_wr32(CVMX_SATA_UAHC_PX_SERR(1), csr_rd32(CVMX_SATA_UAHC_PX_SERR(1)));
+
+               /*
+                * Wait for indication that SATA drive is ready. This is
+                * determined via an examination of PxTFD.STS. If PxTFD.STS.BSY
+                * PxTFD.STS.DRQ, and PxTFD.STS.ERR are all '0', prior to the
+                * maximum allowed time as specified in the ATA/ATAPI-7
+                * specification, the device is ready.
+                */
+               /*
+                * Wait for the device to be ready. BSY(7), DRQ(3), and ERR(0)
+                * must be clear
+                */
+               done = get_timer(0);
+               while (1) {
+                       tfd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_TFD(1));
+                       if ((tfd.s.sts & 0x89) == 0) {
+                               result = 0;
+                               break;
+                       } else if (get_timer(done) > 500) {
+                               if (retry_count < 3) {
+                                       sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
+                                       sctl0.s.det = 1; /* Perform interface reset */
+                                       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl0.u32);
+                                       udelay(1000); /* 1ms dicated by AHCI 1.3 spec */
+                                       sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
+                                       sctl0.s.det = 0; /* Perform interface reset */
+                                       csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl0.u32);
+                                       retry_count++;
+                                       goto retry1;
+                               }
+                               result = -1;
+                               break;
+                       }
+
+                       udelay(100);
+               }
+       }
+
+       if (result == -1)
+               printf("SATA1: not available\n");
+       else
+               printf("SATA1: available\n");
+
+       return 0;
+}
+
+static int __sata_bist_cn70xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
+{
+       cvmx_sata_uctl_bist_status_t bist_status;
+       cvmx_sata_uctl_ctl_t uctl_ctl;
+       cvmx_sata_uctl_shim_cfg_t shim_cfg;
+       u64 done;
+       int result = -1;
+
+       debug("%s(%d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input);
+       bist_status.u64 = csr_rd(CVMX_SATA_UCTL_BIST_STATUS);
+
+       {
+               if (__dlm2_sata_uctl_init_cn70xx()) {
+                       printf("ERROR: Failed to initialize SATA UCTL CSRs\n");
+                       return -1;
+               }
+               if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+                       result = __sata_dlm_init_cn73xx(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
+               else
+                       result = __sata_dlm_init_cn70xx(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
+               if (result) {
+                       printf("ERROR: Failed to initialize SATA GSER CSRs\n");
+                       return -1;
+               }
+
+               uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
+               uctl_ctl.s.start_bist = 1;
+               csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
+
+               /* Set-up for a 1 sec timer. */
+               done = get_timer(0);
+               while (1) {
+                       bist_status.u64 = csr_rd(CVMX_SATA_UCTL_BIST_STATUS);
+                       if ((bist_status.s.uctl_xm_r_bist_ndone |
+                            bist_status.s.uctl_xm_w_bist_ndone |
+                            bist_status.s.uahc_p0_rxram_bist_ndone |
+                            bist_status.s.uahc_p1_rxram_bist_ndone |
+                            bist_status.s.uahc_p0_txram_bist_ndone |
+                            bist_status.s.uahc_p1_txram_bist_ndone) == 0) {
+                               result = 0;
+                               break;
+                       } else if (get_timer(done) > 1000) {
+                               result = -1;
+                               break;
+                       }
+
+                       udelay(100);
+               }
+               if (result == -1) {
+                       printf("ERROR: SATA_UCTL_BIST_STATUS = 0x%llx\n",
+                              (unsigned long long)bist_status.u64);
+                       return -1;
+               }
+
+               debug("%s: Initializing UAHC\n", __func__);
+               if (__dlm2_sata_uahc_init_cn70xx(baud_mhz)) {
+                       printf("ERROR: Failed to initialize SATA UAHC CSRs\n");
+                       return -1;
+               }
+       }
+
+       /* Change CSR_ENDIAN_MODE to big endian to use Open Source AHCI SATA
+        * driver
+        */
+       shim_cfg.u64 = csr_rd(CVMX_SATA_UCTL_SHIM_CFG);
+       shim_cfg.s.csr_endian_mode = 1;
+       csr_wr(CVMX_SATA_UCTL_SHIM_CFG, shim_cfg.u64);
+
+       return 0;
+}
+
+static int __setup_sata(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
+{
+       debug("%s(%d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input);
+       return __sata_bist_cn70xx(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
+}
+
+static int __dlmx_setup_pcie_cn70xx(int qlm, enum cvmx_qlm_mode mode, int gen2, int rc,
+                                   int ref_clk_sel, int ref_clk_input)
+{
+       cvmx_gserx_dlmx_phy_reset_t dlmx_phy_reset;
+       cvmx_gserx_dlmx_test_powerdown_t dlmx_test_powerdown;
+       cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
+       cvmx_gserx_dlmx_ref_clkdiv2_t ref_clkdiv2;
+       static const u8 ref_clk_mult[2] = { 35, 56 }; /* 100 & 125 MHz ref clock supported. */
+
+       debug("%s(%d, %d, %d, %d, %d, %d)\n", __func__, qlm, mode, gen2, rc, ref_clk_sel,
+             ref_clk_input);
+       if (rc == 0) {
+               debug("Skipping initializing PCIe dlm %d in endpoint mode\n", qlm);
+               return 0;
+       }
+
+       if (qlm > 0 && ref_clk_input > 1) {
+               printf("%s: Error: ref_clk_input can only be 0 or 1 for QLM %d\n",
+                      __func__, qlm);
+               return -1;
+       }
+
+       if (ref_clk_sel > OCTEON_QLM_REF_CLK_125MHZ) {
+               printf("%s: Error: ref_clk_sel can only be 100 or 125 MHZ.\n", __func__);
+               return -1;
+       }
+
+       /* 1. Write GSER0_DLM(1..2)_REFCLK_SEL[REFCLK_SEL] if required for
+        *    reference-clock selection
+        */
+
+       csr_wr(CVMX_GSERX_DLMX_REFCLK_SEL(qlm, 0), ref_clk_input);
+
+       /* 2. If required, write GSER0_DLM(1..2)_REF_CLKDIV2[REF_CLKDIV2] = 1
+        *    (must be set if reference clock >= 100 MHz)
+        */
+
+       /* 4. Configure the PCIE PIPE:
+        *  a. Write GSER0_PCIE_PIPE_PORT_SEL[PIPE_PORT_SEL] to configure the
+        *     PCIE PIPE.
+        *      0x0 = disables all pipes
+        *      0x1 = enables pipe0 only (PEM0 4-lane)
+        *      0x2 = enables pipes 0 and 1 (PEM0 and PEM1 2-lanes each)
+        *      0x3 = enables pipes 0, 1, 2, and 3 (PEM0, PEM1, and PEM3 are
+        *            one-lane each)
+        *  b. Configure GSER0_PCIE_PIPE_PORT_SEL[CFG_PEM1_DLM2]. If PEM1 is
+        *     to be configured, this bit must reflect which DLM it is logically
+        *     tied to. This bit sets multiplexing logic in GSER, and it is used
+        *     by the RST logic to determine when the MAC can come out of reset.
+        *      0 = PEM1 is tied to DLM1 (for 3 x 1 PCIe mode).
+        *      1 = PEM1 is tied to DLM2 (for all other PCIe modes).
+        */
+       if (qlm == 1) {
+               cvmx_gserx_pcie_pipe_port_sel_t pipe_port;
+
+               pipe_port.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_PORT_SEL(0));
+               pipe_port.s.cfg_pem1_dlm2 = (mode == CVMX_QLM_MODE_PCIE_1X1) ? 1 : 0;
+               pipe_port.s.pipe_port_sel =
+                               (mode == CVMX_QLM_MODE_PCIE) ? 1 : /* PEM0 only */
+                               (mode == CVMX_QLM_MODE_PCIE_1X2) ? 2 : /* PEM0-1 */
+                               (mode == CVMX_QLM_MODE_PCIE_1X1) ? 3 : /* PEM0-2 */
+                               (mode == CVMX_QLM_MODE_PCIE_2X1) ? 3 : /* PEM0-1 */
+                               0; /* PCIe disabled */
+               csr_wr(CVMX_GSERX_PCIE_PIPE_PORT_SEL(0), pipe_port.u64);
+       }
+
+       /* Apply workaround for Errata (G-20669) MPLL may not come up. */
+
+       /* Set REF_CLKDIV2 based on the Ref Clock */
+       ref_clkdiv2.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
+       ref_clkdiv2.s.ref_clkdiv2 = ref_clk_sel > 0;
+       csr_wr(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0), ref_clkdiv2.u64);
+
+       /* 1. Ensure GSER(0)_DLM(0..2)_PHY_RESET[PHY_RESET] is set. */
+       dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
+       dlmx_phy_reset.s.phy_reset = 1;
+       csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
+
+       /* 2. If SGMII or QSGMII or RXAUI (i.e. if DLM0) set
+        *    GSER(0)_DLM(0)_MPLL_EN[MPLL_EN] to one.
+        */
+
+       /* 3. Set GSER(0)_DLM(0..2)_MPLL_MULTIPLIER[MPLL_MULTIPLIER]
+        *    to the value in the preceding table, which is different
+        *    than the desired setting prescribed by the HRM.
+        */
+       mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
+       mpll_multiplier.s.mpll_multiplier = ref_clk_mult[ref_clk_sel];
+       debug("%s: Setting MPLL multiplier to %d\n", __func__,
+             (int)mpll_multiplier.s.mpll_multiplier);
+       csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
+       /* 5. Clear GSER0_DLM(1..2)_TEST_POWERDOWN. Configurations that only
+        *    use DLM1 need not clear GSER0_DLM2_TEST_POWERDOWN
+        */
+       dlmx_test_powerdown.u64 = csr_rd(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0));
+       dlmx_test_powerdown.s.test_powerdown = 0;
+       csr_wr(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0), dlmx_test_powerdown.u64);
+
+       /* 6. Clear GSER0_DLM(1..2)_PHY_RESET. Configurations that use only
+        *    need DLM1 need not clear GSER0_DLM2_PHY_RESET
+        */
+       dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
+       dlmx_phy_reset.s.phy_reset = 0;
+       csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
+
+       /* 6. Decrease MPLL_MULTIPLIER by one continually until it reaches
+        *    the desired long-term setting, ensuring that each MPLL_MULTIPLIER
+        *   value is constant for at least 1 msec before changing to the next
+        *   value. The desired long-term setting is as indicated in HRM tables
+        *   21-1, 21-2, and 21-3. This is not required with the HRM
+        *   sequence.
+        */
+       /* This is set when initializing PCIe after soft reset is asserted. */
+
+       /* 7. Write the GSER0_PCIE_PIPE_RST register to take the appropriate
+        *    PIPE out of reset. There is a PIPEn_RST bit for each PIPE. Clear
+        *    the appropriate bits based on the configuration (reset is
+        *     active high).
+        */
+       if (qlm == 1) {
+               cvmx_pemx_cfg_t pemx_cfg;
+               cvmx_pemx_on_t pemx_on;
+               cvmx_gserx_pcie_pipe_rst_t pipe_rst;
+               cvmx_rst_ctlx_t rst_ctl;
+
+               switch (mode) {
+               case CVMX_QLM_MODE_PCIE:     /* PEM0 on DLM1 & DLM2 */
+               case CVMX_QLM_MODE_PCIE_1X2: /* PEM0 on DLM1 */
+               case CVMX_QLM_MODE_PCIE_1X1: /* PEM0 on DLM1 using lane 0 */
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+                       pemx_cfg.cn70xx.hostmd = rc;
+                       if (mode == CVMX_QLM_MODE_PCIE_1X1) {
+                               pemx_cfg.cn70xx.md =
+                                       gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
+                       } else if (mode == CVMX_QLM_MODE_PCIE) {
+                               pemx_cfg.cn70xx.md =
+                                       gen2 ? CVMX_PEM_MD_GEN2_4LANE : CVMX_PEM_MD_GEN1_4LANE;
+                       } else {
+                               pemx_cfg.cn70xx.md =
+                                       gen2 ? CVMX_PEM_MD_GEN2_2LANE : CVMX_PEM_MD_GEN1_2LANE;
+                       }
+                       csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
+
+                       rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(0));
+                       rst_ctl.s.rst_drv = 1;
+                       csr_wr(CVMX_RST_CTLX(0), rst_ctl.u64);
+
+                       /* PEM0 is on DLM1&2 which is pipe0 */
+                       pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
+                       pipe_rst.s.pipe0_rst = 0;
+                       csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
+
+                       pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
+                       pemx_on.s.pemon = 1;
+                       csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
+                       break;
+               case CVMX_QLM_MODE_PCIE_2X1: /* PEM0 and PEM1 on DLM1 */
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+                       pemx_cfg.cn70xx.hostmd = rc;
+                       pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
+                       csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
+
+                       rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(0));
+                       rst_ctl.s.rst_drv = 1;
+                       csr_wr(CVMX_RST_CTLX(0), rst_ctl.u64);
+
+                       /* PEM0 is on DLM1 which is pipe0 */
+                       pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
+                       pipe_rst.s.pipe0_rst = 0;
+                       csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
+
+                       pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
+                       pemx_on.s.pemon = 1;
+                       csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
+
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
+                       pemx_cfg.cn70xx.hostmd = 1;
+                       pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
+                       csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
+                       rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(1));
+                       rst_ctl.s.rst_drv = 1;
+                       csr_wr(CVMX_RST_CTLX(1), rst_ctl.u64);
+                       /* PEM1 is on DLM2 which is pipe1 */
+                       pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
+                       pipe_rst.s.pipe1_rst = 0;
+                       csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
+                       pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
+                       pemx_on.s.pemon = 1;
+                       csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
+                       break;
+               default:
+                       break;
+               }
+       } else {
+               cvmx_pemx_cfg_t pemx_cfg;
+               cvmx_pemx_on_t pemx_on;
+               cvmx_gserx_pcie_pipe_rst_t pipe_rst;
+               cvmx_rst_ctlx_t rst_ctl;
+
+               switch (mode) {
+               case CVMX_QLM_MODE_PCIE_1X2: /* PEM1 on DLM2 */
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
+                       pemx_cfg.cn70xx.hostmd = 1;
+                       pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_2LANE : CVMX_PEM_MD_GEN1_2LANE;
+                       csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
+
+                       rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(1));
+                       rst_ctl.s.rst_drv = 1;
+                       csr_wr(CVMX_RST_CTLX(1), rst_ctl.u64);
+
+                       /* PEM1 is on DLM1 lane 0, which is pipe1 */
+                       pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
+                       pipe_rst.s.pipe1_rst = 0;
+                       csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
+
+                       pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
+                       pemx_on.s.pemon = 1;
+                       csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
+                       break;
+               case CVMX_QLM_MODE_PCIE_2X1: /* PEM1 and PEM2 on DLM2 */
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
+                       pemx_cfg.cn70xx.hostmd = 1;
+                       pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
+                       csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
+
+                       rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(1));
+                       rst_ctl.s.rst_drv = 1;
+                       csr_wr(CVMX_RST_CTLX(1), rst_ctl.u64);
+
+                       /* PEM1 is on DLM2 lane 0, which is pipe2 */
+                       pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
+                       pipe_rst.s.pipe2_rst = 0;
+                       csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
+
+                       pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
+                       pemx_on.s.pemon = 1;
+                       csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
+
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
+                       pemx_cfg.cn70xx.hostmd = 1;
+                       pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
+                       csr_wr(CVMX_PEMX_CFG(2), pemx_cfg.u64);
+
+                       rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(2));
+                       rst_ctl.s.rst_drv = 1;
+                       csr_wr(CVMX_RST_CTLX(2), rst_ctl.u64);
+
+                       /* PEM2 is on DLM2 lane 1, which is pipe3 */
+                       pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
+                       pipe_rst.s.pipe3_rst = 0;
+                       csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
+
+                       pemx_on.u64 = csr_rd(CVMX_PEMX_ON(2));
+                       pemx_on.s.pemon = 1;
+                       csr_wr(CVMX_PEMX_ON(2), pemx_on.u64);
+                       break;
+               default:
+                       break;
+               }
+       }
+       return 0;
+}
+
+/**
+ * Configure dlm speed and mode for cn70xx.
+ *
+ * @param qlm     The DLM to configure
+ * @param speed   The speed the DLM needs to be configured in Mhz.
+ * @param mode    The DLM to be configured as SGMII/XAUI/PCIe.
+ *                  DLM 0: has 2 interfaces which can be configured as
+ *                         SGMII/QSGMII/RXAUI. Need to configure both at the
+ *                         same time. These are valid option
+ *                             CVMX_QLM_MODE_QSGMII,
+ *                             CVMX_QLM_MODE_SGMII_SGMII,
+ *                             CVMX_QLM_MODE_SGMII_DISABLED,
+ *                             CVMX_QLM_MODE_DISABLED_SGMII,
+ *                             CVMX_QLM_MODE_SGMII_QSGMII,
+ *                             CVMX_QLM_MODE_QSGMII_QSGMII,
+ *                             CVMX_QLM_MODE_QSGMII_DISABLED,
+ *                             CVMX_QLM_MODE_DISABLED_QSGMII,
+ *                             CVMX_QLM_MODE_QSGMII_SGMII,
+ *                             CVMX_QLM_MODE_RXAUI_1X2
+ *
+ *                  DLM 1: PEM0/1 in PCIE_1x4/PCIE_2x1/PCIE_1X1
+ *                  DLM 2: PEM0/1/2 in PCIE_1x4/PCIE_1x2/PCIE_2x1/PCIE_1x1
+ * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
+ * @param gen2    Only used for PCIe, gen2 = 1, in GEN2 mode else in GEN1 mode.
+ *
+ * @param ref_clk_input  The reference-clock input to use to configure QLM
+ * @param ref_clk_sel    The reference-clock selection to use to configure QLM
+ *
+ * @return       Return 0 on success or -1.
+ */
+static int octeon_configure_qlm_cn70xx(int qlm, int speed, int mode, int rc, int gen2,
+                                      int ref_clk_sel, int ref_clk_input)
+{
+       debug("%s(%d, %d, %d, %d, %d, %d, %d)\n", __func__, qlm, speed, mode, rc, gen2, ref_clk_sel,
+             ref_clk_input);
+       switch (qlm) {
+       case 0: {
+               int is_sff7000_rxaui = 0;
+               cvmx_gmxx_inf_mode_t inf_mode0, inf_mode1;
+
+               inf_mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
+               inf_mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
+               if (inf_mode0.s.en || inf_mode1.s.en) {
+                       debug("DLM0 already configured\n");
+                       return -1;
+               }
+
+               switch (mode) {
+               case CVMX_QLM_MODE_SGMII_SGMII:
+                       debug("  Mode SGMII SGMII\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_SGMII;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_SGMII;
+                       break;
+               case CVMX_QLM_MODE_SGMII_QSGMII:
+                       debug("  Mode SGMII QSGMII\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_SGMII;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_QSGMII;
+                       break;
+               case CVMX_QLM_MODE_SGMII_DISABLED:
+                       debug("  Mode SGMII Disabled\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_SGMII;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
+                       break;
+               case CVMX_QLM_MODE_DISABLED_SGMII:
+                       debug("Mode Disabled SGMII\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_DISABLED;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_SGMII;
+                       break;
+               case CVMX_QLM_MODE_QSGMII_SGMII:
+                       debug("  Mode QSGMII SGMII\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_QSGMII;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_SGMII;
+                       break;
+               case CVMX_QLM_MODE_QSGMII_QSGMII:
+                       debug("  Mode QSGMII QSGMII\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_QSGMII;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_QSGMII;
+                       break;
+               case CVMX_QLM_MODE_QSGMII_DISABLED:
+                       debug("  Mode QSGMII Disabled\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_QSGMII;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
+                       break;
+               case CVMX_QLM_MODE_DISABLED_QSGMII:
+                       debug("Mode Disabled QSGMII\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_DISABLED;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_QSGMII;
+                       break;
+               case CVMX_QLM_MODE_RXAUI:
+                       debug("  Mode RXAUI\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_RXAUI;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
+
+                       break;
+               default:
+                       debug("  Mode Disabled Disabled\n");
+                       inf_mode0.s.mode = CVMX_GMX_INF_MODE_DISABLED;
+                       inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
+                       break;
+               }
+               csr_wr(CVMX_GMXX_INF_MODE(0), inf_mode0.u64);
+               csr_wr(CVMX_GMXX_INF_MODE(1), inf_mode1.u64);
+
+               /* Bringup the PLL */
+               if (__dlm_setup_pll_cn70xx(qlm, speed, ref_clk_sel, ref_clk_input,
+                                          is_sff7000_rxaui))
+                       return -1;
+
+               /* TX Lanes */
+               if (__dlm0_setup_tx_cn70xx(speed, ref_clk_sel))
+                       return -1;
+
+               /* RX Lanes */
+               if (__dlm0_setup_rx_cn70xx(speed, ref_clk_sel))
+                       return -1;
+
+               /* Enable the interface */
+               inf_mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
+               if (inf_mode0.s.mode != CVMX_GMX_INF_MODE_DISABLED)
+                       inf_mode0.s.en = 1;
+               csr_wr(CVMX_GMXX_INF_MODE(0), inf_mode0.u64);
+               inf_mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
+               if (inf_mode1.s.mode != CVMX_GMX_INF_MODE_DISABLED)
+                       inf_mode1.s.en = 1;
+               csr_wr(CVMX_GMXX_INF_MODE(1), inf_mode1.u64);
+               break;
+       }
+       case 1:
+               switch (mode) {
+               case CVMX_QLM_MODE_PCIE: /* PEM0 on DLM1 & DLM2 */
+                       debug("  Mode PCIe\n");
+                       if (__dlmx_setup_pcie_cn70xx(1, mode, gen2, rc, ref_clk_sel, ref_clk_input))
+                               return -1;
+                       if (__dlmx_setup_pcie_cn70xx(2, mode, gen2, rc, ref_clk_sel, ref_clk_input))
+                               return -1;
+                       break;
+               case CVMX_QLM_MODE_PCIE_1X2: /* PEM0 on DLM1 */
+               case CVMX_QLM_MODE_PCIE_2X1: /* PEM0 & PEM1 on DLM1 */
+               case CVMX_QLM_MODE_PCIE_1X1: /* PEM0 on DLM1, only 1 lane */
+                       debug("  Mode PCIe 1x2, 2x1 or 1x1\n");
+                       if (__dlmx_setup_pcie_cn70xx(qlm, mode, gen2, rc, ref_clk_sel,
+                                                    ref_clk_input))
+                               return -1;
+                       break;
+               case CVMX_QLM_MODE_DISABLED:
+                       debug("  Mode disabled\n");
+                       break;
+               default:
+                       debug("DLM1 illegal mode specified\n");
+                       return -1;
+               }
+               break;
+       case 2:
+               switch (mode) {
+               case CVMX_QLM_MODE_SATA_2X1:
+                       debug("%s: qlm 2, mode is SATA 2x1\n", __func__);
+                       /* DLM2 is SATA, PCIE2 is disabled */
+                       if (__setup_sata(qlm, speed, ref_clk_sel, ref_clk_input))
+                               return -1;
+                       break;
+               case CVMX_QLM_MODE_PCIE:
+                       debug("  Mode PCIe\n");
+                       /* DLM2 is PCIE0, PCIE1-2 are disabled. */
+                       /* Do nothing, its initialized in DLM1 */
+                       break;
+               case CVMX_QLM_MODE_PCIE_1X2: /* PEM1 on DLM2 */
+               case CVMX_QLM_MODE_PCIE_2X1: /* PEM1 & PEM2 on DLM2 */
+                       debug("  Mode PCIe 1x2 or 2x1\n");
+                       if (__dlmx_setup_pcie_cn70xx(qlm, mode, gen2, rc, ref_clk_sel,
+                                                    ref_clk_input))
+                               return -1;
+                       break;
+               case CVMX_QLM_MODE_DISABLED:
+                       debug("  Mode Disabled\n");
+                       break;
+               default:
+                       debug("DLM2 illegal mode specified\n");
+                       return -1;
+               }
+       default:
+               return -1;
+       }
+
+       return 0;
+}
+
+/**
+ * Disables DFE for the specified QLM lane(s).
+ * This function should only be called for low-loss channels.
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param lane     Lane to configure, or -1 all lanes
+ * @param baud_mhz The speed the QLM needs to be configured in Mhz.
+ * @param mode     The QLM to be configured as SGMII/XAUI/PCIe.
+ */
+void octeon_qlm_dfe_disable(int node, int qlm, int lane, int baud_mhz, int mode)
+{
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+       int l;
+       cvmx_gserx_lanex_rx_loop_ctrl_t loop_ctrl;
+       cvmx_gserx_lanex_rx_valbbd_ctrl_0_t ctrl_0;
+       cvmx_gserx_lanex_rx_valbbd_ctrl_1_t ctrl_1;
+       cvmx_gserx_lanex_rx_valbbd_ctrl_2_t ctrl_2;
+       cvmx_gserx_lane_vma_fine_ctrl_2_t lane_vma_fine_ctrl_2;
+
+       /* Interfaces below 5Gbaud are already manually tuned. */
+       if (baud_mhz < 5000)
+               return;
+
+       /* Don't run on PCIe links, SATA or KR.  These interfaces use training */
+       switch (mode) {
+       case CVMX_QLM_MODE_10G_KR_1X2:
+       case CVMX_QLM_MODE_10G_KR:
+       case CVMX_QLM_MODE_40G_KR4:
+               return;
+       case CVMX_QLM_MODE_PCIE_1X1:
+       case CVMX_QLM_MODE_PCIE_2X1:
+       case CVMX_QLM_MODE_PCIE_1X2:
+       case CVMX_QLM_MODE_PCIE:
+       case CVMX_QLM_MODE_PCIE_1X8:
+               return;
+       case CVMX_QLM_MODE_SATA_2X1:
+               return;
+       default:
+               break;
+       }
+
+       /* Updating pre_ctle minimum to 0. This works best for short channels */
+       lane_vma_fine_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm));
+       lane_vma_fine_ctrl_2.s.rx_prectle_gain_min_fine = 0;
+       csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm), lane_vma_fine_ctrl_2.u64);
+
+       for (l = 0; l < num_lanes; l++) {
+               if (lane != -1 && lane != l)
+                       continue;
+
+               /* 1. Write GSERX_LANEx_RX_LOOP_CTRL = 0x0270
+                * (var "loop_ctrl" with bits 8 & 1 cleared).
+                * bit<1> dfe_en_byp = 1'b0
+                */
+               loop_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm));
+               loop_ctrl.s.cfg_rx_lctrl = loop_ctrl.s.cfg_rx_lctrl & 0x3fd;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm), loop_ctrl.u64);
+
+               /* 2. Write GSERX_LANEx_RX_VALBBD_CTRL_1 = 0x0000
+                * (var "ctrl1" with all bits cleared)
+                * bits<14:11> CFG_RX_DFE_C3_MVAL = 4'b0000
+                * bit<10> CFG_RX_DFE_C3_MSGN = 1'b0
+                * bits<9:6> CFG_RX_DFE_C2_MVAL = 4'b0000
+                * bit<5> CFG_RX_DFE_C2_MSGN = 1'b0
+                * bits<4:0> CFG_RX_DFE_C1_MVAL = 5'b00000
+                */
+               ctrl_1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_1(l, qlm));
+               ctrl_1.s.dfe_c3_mval = 0;
+               ctrl_1.s.dfe_c3_msgn = 0;
+               ctrl_1.s.dfe_c2_mval = 0;
+               ctrl_1.s.dfe_c2_msgn = 0;
+               ctrl_1.s.dfe_c2_mval = 0;
+               ctrl_1.s.dfe_c1_mval = 0;
+               ctrl_1.s.dfe_c1_msgn = 0;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_1(l, qlm), ctrl_1.u64);
+
+               /* 3. Write GSERX_LANEx_RX_VALBBD_CTRL_0 = 0x2400
+                * (var "ctrl0" with following bits set/cleared)
+                * bits<11:10> CFG_RX_DFE_GAIN = 0x1
+                * bits<9:6> CFG_RX_DFE_C5_MVAL = 4'b0000
+                * bit<5> CFG_RX_DFE_C5_MSGN = 1'b0
+                * bits<4:1> CFG_RX_DFE_C4_MVAL = 4'b0000
+                * bit<0> CFG_RX_DFE_C4_MSGN = 1'b0
+                */
+               ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm));
+               ctrl_0.s.dfe_gain = 0x1;
+               ctrl_0.s.dfe_c5_mval = 0;
+               ctrl_0.s.dfe_c5_msgn = 0;
+               ctrl_0.s.dfe_c4_mval = 0;
+               ctrl_0.s.dfe_c4_msgn = 0;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm), ctrl_0.u64);
+
+               /* 4. Write GSER(0..13)_LANE(0..3)_RX_VALBBD_CTRL_2 = 0x003F
+                * //enable DFE tap overrides
+                * bit<5> dfe_ovrd_en = 1
+                * bit<4> dfe_c5_ovrd_val = 1
+                * bit<3> dfe_c4_ovrd_val = 1
+                * bit<2> dfe_c3_ovrd_val = 1
+                * bit<1> dfe_c2_ovrd_val = 1
+                * bit<0> dfe_c1_ovrd_val = 1
+                */
+               ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_2(l, qlm));
+               ctrl_2.s.dfe_ovrd_en = 0x1;
+               ctrl_2.s.dfe_c5_ovrd_val = 0x1;
+               ctrl_2.s.dfe_c4_ovrd_val = 0x1;
+               ctrl_2.s.dfe_c3_ovrd_val = 0x1;
+               ctrl_2.s.dfe_c2_ovrd_val = 0x1;
+               ctrl_2.s.dfe_c1_ovrd_val = 0x1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_2(l, qlm), ctrl_2.u64);
+       }
+}
+
+/**
+ * Disables DFE, uses fixed CTLE Peak value and AGC settings
+ * for the specified QLM lane(s).
+ * This function should only be called for low-loss channels.
+ * This function prevents Rx equalization from happening on all lanes in a QLM
+ * This function should be called for all lanes being used in the QLM.
+ *
+ * @param  node           Node to configure
+ * @param  qlm            QLM to configure
+ * @param  lane           Lane to configure, or -1 all lanes
+ * @param  baud_mhz       The speed the QLM needs to be configured in Mhz.
+ * @param  mode           The QLM to be configured as SGMII/XAUI/PCIe.
+ * @param  ctle_zero      Equalizer Peaking control
+ * @param  agc_pre_ctle   Pre-CTLE gain
+ * @param  agc_post_ctle  Post-CTLE gain
+ * @return Zero on success, negative on failure
+ */
+
+int octeon_qlm_dfe_disable_ctle_agc(int node, int qlm, int lane, int baud_mhz, int mode,
+                                   int ctle_zero, int agc_pre_ctle, int agc_post_ctle)
+{
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+       int l;
+       cvmx_gserx_lanex_rx_loop_ctrl_t loop_ctrl;
+       cvmx_gserx_lanex_rx_valbbd_ctrl_0_t ctrl_0;
+       cvmx_gserx_lanex_pwr_ctrl_t lanex_pwr_ctrl;
+       cvmx_gserx_lane_mode_t lmode;
+       cvmx_gserx_lane_px_mode_1_t px_mode_1;
+       cvmx_gserx_lanex_rx_cfg_5_t rx_cfg_5;
+       cvmx_gserx_lanex_rx_cfg_2_t rx_cfg_2;
+       cvmx_gserx_lanex_rx_ctle_ctrl_t ctle_ctrl;
+
+       /* Check tuning constraints */
+       if (ctle_zero < 0 || ctle_zero > 15) {
+               printf("Error: N%d.QLM%d: Invalid CTLE_ZERO(%d).  Must be between -1 and 15.\n",
+                      node, qlm, ctle_zero);
+               return -1;
+       }
+       if (agc_pre_ctle < 0 || agc_pre_ctle > 15) {
+               printf("Error: N%d.QLM%d: Invalid AGC_Pre_CTLE(%d)\n",
+                      node, qlm, agc_pre_ctle);
+               return -1;
+       }
+
+       if (agc_post_ctle < 0 || agc_post_ctle > 15) {
+               printf("Error: N%d.QLM%d: Invalid AGC_Post_CTLE(%d)\n",
+                      node, qlm, agc_post_ctle);
+               return -1;
+       }
+
+       /* Interfaces below 5Gbaud are already manually tuned. */
+       if (baud_mhz < 5000)
+               return 0;
+
+       /* Don't run on PCIe links, SATA or KR.  These interfaces use training */
+       switch (mode) {
+       case CVMX_QLM_MODE_10G_KR_1X2:
+       case CVMX_QLM_MODE_10G_KR:
+       case CVMX_QLM_MODE_40G_KR4:
+               return 0;
+       case CVMX_QLM_MODE_PCIE_1X1:
+       case CVMX_QLM_MODE_PCIE_2X1:
+       case CVMX_QLM_MODE_PCIE_1X2:
+       case CVMX_QLM_MODE_PCIE:
+       case CVMX_QLM_MODE_PCIE_1X8:
+               return 0;
+       case CVMX_QLM_MODE_SATA_2X1:
+               return 0;
+       default:
+               break;
+       }
+
+       lmode.u64 = csr_rd_node(node, CVMX_GSERX_LANE_MODE(qlm));
+
+       /* 1. Enable VMA manual mode for the QLM's lane mode */
+       px_mode_1.u64 = csr_rd_node(node, CVMX_GSERX_LANE_PX_MODE_1(lmode.s.lmode, qlm));
+       px_mode_1.s.vma_mm = 1;
+       csr_wr_node(node, CVMX_GSERX_LANE_PX_MODE_1(lmode.s.lmode, qlm), px_mode_1.u64);
+
+       /* 2. Disable DFE */
+       octeon_qlm_dfe_disable(node, qlm, lane, baud_mhz, mode);
+
+       for (l = 0; l < num_lanes; l++) {
+               if (lane != -1 && lane != l)
+                       continue;
+
+               /* 3. Write GSERX_LANEx_RX_VALBBD_CTRL_0.CFG_RX_AGC_GAIN = 0x2 */
+               ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm));
+               ctrl_0.s.agc_gain = 0x2;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm), ctrl_0.u64);
+
+               /* 4. Write GSERX_LANEx_RX_LOOP_CTRL
+                * bit<8> lctrl_men = 1'b1
+                * bit<0> cdr_en_byp = 1'b1
+                */
+               loop_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm));
+               loop_ctrl.s.cfg_rx_lctrl = loop_ctrl.s.cfg_rx_lctrl | 0x101;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm), loop_ctrl.u64);
+
+               /* 5. Write GSERX_LANEx_PWR_CTRL = 0x0040 (var "lanex_pwr_ctrl" with
+                * following bits set)
+                * bit<6> RX_LCTRL_OVRRD_EN = 1'b1
+                * all other bits cleared.
+                */
+               lanex_pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(l, qlm));
+               lanex_pwr_ctrl.s.rx_lctrl_ovrrd_en = 1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(l, qlm), lanex_pwr_ctrl.u64);
+
+               /* --Setting AGC in manual mode and configuring CTLE-- */
+               rx_cfg_5.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CFG_5(l, qlm));
+               rx_cfg_5.s.rx_agc_men_ovrrd_val = 1;
+               rx_cfg_5.s.rx_agc_men_ovrrd_en = 1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_CFG_5(l, qlm), rx_cfg_5.u64);
+
+               ctle_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CTLE_CTRL(l, qlm));
+               ctle_ctrl.s.pcs_sds_rx_ctle_zero = ctle_zero;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_CTLE_CTRL(l, qlm), ctle_ctrl.u64);
+
+               rx_cfg_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CFG_2(l, qlm));
+               rx_cfg_2.s.rx_sds_rx_agc_mval = (agc_pre_ctle << 4) | agc_post_ctle;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_CFG_2(l, qlm), rx_cfg_2.u64);
+       }
+       return 0;
+}
+
+/**
+ * Some QLM speeds need to override the default tuning parameters
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param baud_mhz Desired speed in MHz
+ * @param lane     Lane the apply the tuning parameters
+ * @param tx_swing Voltage swing.  The higher the value the lower the voltage,
+ *                the default value is 7.
+ * @param tx_pre   pre-cursor pre-emphasis
+ * @param tx_post  post-cursor pre-emphasis.
+ * @param tx_gain   Transmit gain. Range 0-7
+ * @param tx_vboost Transmit voltage boost. Range 0-1
+ */
+void octeon_qlm_tune_per_lane_v3(int node, int qlm, int baud_mhz, int lane, int tx_swing,
+                                int tx_pre, int tx_post, int tx_gain, int tx_vboost)
+{
+       cvmx_gserx_cfg_t gserx_cfg;
+       cvmx_gserx_lanex_tx_cfg_0_t tx_cfg0;
+       cvmx_gserx_lanex_tx_pre_emphasis_t pre_emphasis;
+       cvmx_gserx_lanex_tx_cfg_1_t tx_cfg1;
+       cvmx_gserx_lanex_tx_cfg_3_t tx_cfg3;
+       cvmx_bgxx_spux_br_pmd_control_t pmd_control;
+       cvmx_gserx_lanex_pcs_ctlifc_0_t pcs_ctlifc_0;
+       cvmx_gserx_lanex_pcs_ctlifc_2_t pcs_ctlifc_2;
+       int bgx, lmac;
+
+       /* Do not apply QLM tuning to PCIe and KR interfaces. */
+       gserx_cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
+       if (gserx_cfg.s.pcie)
+               return;
+
+       /* Apply the QLM tuning only to cn73xx and cn78xx models only */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               bgx = (qlm < 2) ? qlm : (qlm - 2);
+       else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               bgx = (qlm < 4) ? (qlm - 2) : 2;
+       else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               bgx = 0;
+       else
+               return;
+
+       if ((OCTEON_IS_MODEL(OCTEON_CN73XX) && qlm == 6) ||
+           (OCTEON_IS_MODEL(OCTEON_CNF75XX) && qlm == 5))
+               lmac = 2;
+       else
+               lmac = lane;
+
+       /* No need to tune 10G-KR and 40G-KR interfaces */
+       pmd_control.u64 = csr_rd_node(node, CVMX_BGXX_SPUX_BR_PMD_CONTROL(lmac, bgx));
+       if (pmd_control.s.train_en)
+               return;
+
+       if (tx_pre != -1 && tx_post == -1)
+               tx_post = 0;
+
+       if (tx_post != -1 && tx_pre == -1)
+               tx_pre = 0;
+
+       /* Check tuning constraints */
+       if (tx_swing < -1 || tx_swing > 25) {
+               printf("ERROR: N%d:QLM%d: Lane %d: Invalid TX_SWING(%d). TX_SWING must be <= 25.\n",
+                      node, qlm, lane, tx_swing);
+               return;
+       }
+
+       if (tx_pre < -1 || tx_pre > 10) {
+               printf("ERROR: N%d:QLM%d: Lane %d: Invalid TX_PRE(%d). TX_PRE must be <= 10.\n",
+                      node, qlm, lane, tx_swing);
+               return;
+       }
+
+       if (tx_post < -1 || tx_post > 31) {
+               printf("ERROR: N%d:QLM%d: Lane %d: Invalid TX_POST(%d). TX_POST must be <= 15.\n",
+                      node, qlm, lane, tx_swing);
+               return;
+       }
+
+       if (tx_pre >= 0 && tx_post >= 0 && tx_swing >= 0 &&
+           tx_pre + tx_post - tx_swing > 2) {
+               printf("ERROR: N%d.QLM%d: Lane %d: TX_PRE(%d) + TX_POST(%d) - TX_SWING(%d) must be <= 2\n",
+                      node, qlm, lane, tx_pre, tx_post, tx_swing);
+               return;
+       }
+
+       if (tx_pre >= 0 && tx_post >= 0 && tx_swing >= 0 &&
+           tx_pre + tx_post + tx_swing > 35) {
+               printf("ERROR: N%d.QLM%d: Lane %d: TX_PRE(%d) + TX_POST(%d) + TX_SWING(%d) must be <= 35\n",
+                      node, qlm, lane, tx_pre, tx_post, tx_swing);
+               return;
+       }
+
+       if (tx_gain < -1 || tx_gain > 7) {
+               printf("ERROR: N%d.QLM%d: Lane %d: Invalid TX_GAIN(%d). TX_GAIN must be between 0 and 7\n",
+                      node, qlm, lane, tx_gain);
+               return;
+       }
+
+       if (tx_vboost < -1 || tx_vboost > 1) {
+               printf("ERROR: N%d.QLM%d: Lane %d: Invalid TX_VBOOST(%d).  TX_VBOOST must be 0 or 1.\n",
+                      node, qlm, lane, tx_vboost);
+               return;
+       }
+
+       debug("N%d.QLM%d: Lane %d: TX_SWING=%d, TX_PRE=%d, TX_POST=%d, TX_GAIN=%d, TX_VBOOST=%d\n",
+             node, qlm, lane, tx_swing, tx_pre, tx_post, tx_gain, tx_vboost);
+
+       /* Complete the Tx swing and Tx equilization programming */
+       /* 1) Enable Tx swing and Tx emphasis overrides */
+       tx_cfg1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_1(lane, qlm));
+       tx_cfg1.s.tx_swing_ovrrd_en = (tx_swing != -1);
+       tx_cfg1.s.tx_premptap_ovrrd_val = (tx_pre != -1) && (tx_post != -1);
+       tx_cfg1.s.tx_vboost_en_ovrrd_en = (tx_vboost != -1); /* Vboost override */
+       ;
+       csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_1(lane, qlm), tx_cfg1.u64);
+       /* 2) Program the Tx swing and Tx emphasis Pre-cursor and Post-cursor values */
+       /* CFG_TX_PREMPTAP[8:4] = Lane X's TX post-cursor value (C+1) */
+       /* CFG_TX_PREMPTAP[3:0] = Lane X's TX pre-cursor value (C-1) */
+       if (tx_swing != -1) {
+               tx_cfg0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_0(lane, qlm));
+               tx_cfg0.s.cfg_tx_swing = tx_swing;
+               csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_0(lane, qlm), tx_cfg0.u64);
+       }
+
+       if ((tx_pre != -1) && (tx_post != -1)) {
+               pre_emphasis.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_PRE_EMPHASIS(lane, qlm));
+               pre_emphasis.s.cfg_tx_premptap = (tx_post << 4) | tx_pre;
+               csr_wr_node(node, CVMX_GSERX_LANEX_TX_PRE_EMPHASIS(lane, qlm), pre_emphasis.u64);
+       }
+
+       /* Apply TX gain settings */
+       if (tx_gain != -1) {
+               tx_cfg3.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm));
+               tx_cfg3.s.pcs_sds_tx_gain = tx_gain;
+               csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm), tx_cfg3.u64);
+       }
+
+       /* Apply TX vboot settings */
+       if (tx_vboost != -1) {
+               tx_cfg3.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm));
+               tx_cfg3.s.cfg_tx_vboost_en = tx_vboost;
+               csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm), tx_cfg3.u64);
+       }
+
+       /* 3) Program override for the Tx coefficient request */
+       pcs_ctlifc_0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(lane, qlm));
+       if (((tx_pre != -1) && (tx_post != -1)) || (tx_swing != -1))
+               pcs_ctlifc_0.s.cfg_tx_coeff_req_ovrrd_val = 0x1;
+       if (tx_vboost != -1)
+               pcs_ctlifc_0.s.cfg_tx_vboost_en_ovrrd_val = 1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(lane, qlm), pcs_ctlifc_0.u64);
+
+       /* 4) Enable the Tx coefficient request override enable */
+       pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       if (((tx_pre != -1) && (tx_post != -1)) || (tx_swing != -1))
+               pcs_ctlifc_2.s.cfg_tx_coeff_req_ovrrd_en = 0x1;
+       if (tx_vboost != -1)
+               pcs_ctlifc_2.s.cfg_tx_vboost_en_ovrrd_en = 1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
+
+       /* 5) Issue a Control Interface Configuration Override request to start the Tx equalizer */
+       pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       pcs_ctlifc_2.s.ctlifc_ovrrd_req = 0x1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
+
+       /* 6) Wait 1 ms for the request to complete */
+       udelay(1000);
+
+       /* Steps 7 & 8 required for subsequent Tx swing and Tx equilization adjustment */
+       /* 7) Disable the Tx coefficient request override enable */
+       pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       pcs_ctlifc_2.s.cfg_tx_coeff_req_ovrrd_en = 0;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
+       /* 8) Issue a Control Interface Configuration Override request */
+       pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+       pcs_ctlifc_2.s.ctlifc_ovrrd_req = 0x1;
+       csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
+}
+
+/**
+ * Some QLM speeds need to override the default tuning parameters
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param baud_mhz Desired speed in MHz
+ * @param tx_swing Voltage swing.  The higher the value the lower the voltage,
+ *                the default value is 7.
+ * @param tx_premptap bits [0:3] pre-cursor pre-emphasis, bits[4:8] post-cursor
+ *                   pre-emphasis.
+ * @param tx_gain   Transmit gain. Range 0-7
+ * @param tx_vboost Transmit voltage boost. Range 0-1
+ *
+ */
+void octeon_qlm_tune_v3(int node, int qlm, int baud_mhz, int tx_swing, int tx_premptap, int tx_gain,
+                       int tx_vboost)
+{
+       int lane;
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+
+       for (lane = 0; lane < num_lanes; lane++) {
+               int tx_pre = (tx_premptap == -1) ? -1 : tx_premptap & 0xf;
+               int tx_post = (tx_premptap == -1) ? -1 : (tx_premptap >> 4) & 0x1f;
+
+               octeon_qlm_tune_per_lane_v3(node, qlm, baud_mhz, lane, tx_swing, tx_pre, tx_post,
+                                           tx_gain, tx_vboost);
+       }
+}
+
+/**
+ * Some QLMs need to override the default pre-ctle for low loss channels.
+ *
+ * @param node     Node to configure
+ * @param qlm      QLM to configure
+ * @param pre_ctle pre-ctle settings for low loss channels
+ */
+void octeon_qlm_set_channel_v3(int node, int qlm, int pre_ctle)
+{
+       cvmx_gserx_lane_vma_fine_ctrl_2_t lane_vma_fine_ctrl_2;
+
+       lane_vma_fine_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm));
+       lane_vma_fine_ctrl_2.s.rx_prectle_gain_min_fine = pre_ctle;
+       csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm), lane_vma_fine_ctrl_2.u64);
+}
+
+static void __qlm_init_errata_20844(int node, int qlm)
+{
+       int lane;
+
+       /* Only applies to CN78XX pass 1.x */
+       if (!OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0))
+               return;
+
+       /* Errata GSER-20844: Electrical Idle logic can coast
+        * 1) After the link first comes up write the following
+        * register on each lane to prevent the application logic
+        * from stomping on the Coast inputs. This is a one time write,
+        * or if you prefer you could put it in the link up loop and
+        * write it every time the link comes up.
+        * 1a) Then write GSER(0..13)_LANE(0..3)_PCS_CTLIFC_2
+        * Set CTLIFC_OVRRD_REQ (later)
+        * Set CFG_RX_CDR_COAST_REQ_OVRRD_EN
+        * Its not clear if #1 and #1a can be combined, lets try it
+        * this way first.
+        */
+       for (lane = 0; lane < 4; lane++) {
+               cvmx_gserx_lanex_rx_misc_ovrrd_t misc_ovrrd;
+               cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc_2;
+
+               ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+               ctlifc_2.s.cfg_rx_cdr_coast_req_ovrrd_en = 1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), ctlifc_2.u64);
+
+               misc_ovrrd.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm));
+               misc_ovrrd.s.cfg_rx_eie_det_ovrrd_en = 1;
+               misc_ovrrd.s.cfg_rx_eie_det_ovrrd_val = 0;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm), misc_ovrrd.u64);
+
+               udelay(1);
+
+               misc_ovrrd.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm));
+               misc_ovrrd.s.cfg_rx_eie_det_ovrrd_en = 1;
+               misc_ovrrd.s.cfg_rx_eie_det_ovrrd_val = 1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm), misc_ovrrd.u64);
+               ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
+               ctlifc_2.s.ctlifc_ovrrd_req = 1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), ctlifc_2.u64);
+       }
+}
+
+/** CN78xx reference clock register settings */
+struct refclk_settings_cn78xx {
+       bool valid; /** Reference clock speed supported */
+       union cvmx_gserx_pll_px_mode_0 mode_0;
+       union cvmx_gserx_pll_px_mode_1 mode_1;
+       union cvmx_gserx_lane_px_mode_0 pmode_0;
+       union cvmx_gserx_lane_px_mode_1 pmode_1;
+};
+
+/** Default reference clock for various modes */
+static const u8 def_ref_clk_cn78xx[R_NUM_LANE_MODES] = { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 };
+
+/**
+ * This data structure stores the reference clock for each mode for each QLM.
+ *
+ * It is indexed first by the node number, then the QLM number and then the
+ * lane mode.  It is initialized to the default values.
+ */
+static u8 ref_clk_cn78xx[CVMX_MAX_NODES][8][R_NUM_LANE_MODES] = {
+       { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } },
+       { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } },
+       { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } },
+       { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
+         { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } }
+};
+
+/**
+ * This data structure contains the register values for the cn78xx PLLs
+ * It is indexed first by the reference clock and second by the mode.
+ * Note that not all combinations are supported.
+ */
+static const struct refclk_settings_cn78xx refclk_settings_cn78xx[R_NUM_LANE_MODES][4] = {
+       {   /* 0        R_2_5G_REFCLK100 */
+       { /* 100MHz reference clock */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x19 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 125MHz reference clock */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x1,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 156.25MHz reference clock */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x10 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       {
+                 /* 161.1328125MHz reference clock */
+                 .valid = false,
+         } },
+       {
+               /* 1    R_5G_REFCLK100 */
+               { /* 100MHz reference clock */
+                 .valid = true,
+                 .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+                 .mode_1.s = { .pll_16p5en = 0x0,
+                               .pll_cpadj = 0x2,
+                               .pll_pcie3en = 0x0,
+                               .pll_opr = 0x0,
+                               .pll_div = 0x19 },
+                 .pmode_0.s = { .ctle = 0x0,
+                                .pcie = 0x1,
+                                .tx_ldiv = 0x0,
+                                .rx_ldiv = 0x0,
+                                .srate = 0x0,
+                                .tx_mode = 0x3,
+                                .rx_mode = 0x3 },
+                 .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                                .vma_mm = 0x0,
+                                .cdr_fgain = 0xa,
+                                .ph_acc_adj = 0x14 } },
+               { /* 125MHz reference clock */
+                 .valid = true,
+                 .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+                 .mode_1.s = { .pll_16p5en = 0x0,
+                               .pll_cpadj = 0x1,
+                               .pll_pcie3en = 0x0,
+                               .pll_opr = 0x0,
+                               .pll_div = 0x14 },
+                 .pmode_0.s = { .ctle = 0x0,
+                                .pcie = 0x1,
+                                .tx_ldiv = 0x0,
+                                .rx_ldiv = 0x0,
+                                .srate = 0x0,
+                                .tx_mode = 0x3,
+                                .rx_mode = 0x3 },
+                 .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                                .vma_mm = 0x0,
+                                .cdr_fgain = 0xa,
+                                .ph_acc_adj = 0x14 } },
+               { /* 156.25MHz reference clock */
+                 .valid = true,
+                 .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+                 .mode_1.s = { .pll_16p5en = 0x0,
+                               .pll_cpadj = 0x2,
+                               .pll_pcie3en = 0x0,
+                               .pll_opr = 0x0,
+                               .pll_div = 0x10 },
+                 .pmode_0.s = { .ctle = 0x0,
+                                .pcie = 0x1,
+                                .tx_ldiv = 0x0,
+                                .rx_ldiv = 0x0,
+                                .srate = 0x0,
+                                .tx_mode = 0x3,
+                                .rx_mode = 0x3 },
+                 .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                                .vma_mm = 0x0,
+                                .cdr_fgain = 0xa,
+                                .ph_acc_adj = 0x14 } },
+               {
+                       /* 161.1328125MHz reference clock */
+                       .valid = false,
+               },
+       },
+       {   /* 2        R_8G_REFCLK100 */
+       { /* 100MHz reference clock */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x1,
+                         .pll_opr = 0x1,
+                         .pll_div = 0x28 },
+           .pmode_0.s = { .ctle = 0x3,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xb,
+                          .ph_acc_adj = 0x23 } },
+       { /* 125MHz reference clock */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x2, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x1,
+                         .pll_pcie3en = 0x1,
+                         .pll_opr = 0x1,
+                         .pll_div = 0x20 },
+           .pmode_0.s = { .ctle = 0x3,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xb,
+                          .ph_acc_adj = 0x23 } },
+       { /* 156.25MHz reference clock not supported */
+           .valid = false } },
+       {
+               /* 3    R_125G_REFCLK15625_KX */
+               { /* 100MHz reference */
+                 .valid = true,
+                 .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
+                 .mode_1.s = { .pll_16p5en = 0x1,
+                               .pll_cpadj = 0x2,
+                               .pll_pcie3en = 0x0,
+                               .pll_opr = 0x0,
+                               .pll_div = 0x19 },
+                 .pmode_0.s = { .ctle = 0x0,
+                                .pcie = 0x0,
+                                .tx_ldiv = 0x2,
+                                .rx_ldiv = 0x2,
+                                .srate = 0x0,
+                                .tx_mode = 0x3,
+                                .rx_mode = 0x3 },
+                 .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                                .vma_mm = 0x1,
+                                .cdr_fgain = 0xc,
+                                .ph_acc_adj = 0x1e } },
+               { /* 125MHz reference */
+                 .valid = true,
+                 .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
+                 .mode_1.s = { .pll_16p5en = 0x1,
+                               .pll_cpadj = 0x2,
+                               .pll_pcie3en = 0x0,
+                               .pll_opr = 0x0,
+                               .pll_div = 0x14 },
+                 .pmode_0.s = { .ctle = 0x0,
+                                .pcie = 0x0,
+                                .tx_ldiv = 0x2,
+                                .rx_ldiv = 0x2,
+                                .srate = 0x0,
+                                .tx_mode = 0x3,
+                                .rx_mode = 0x3 },
+                 .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                                .vma_mm = 0x1,
+                                .cdr_fgain = 0xc,
+                                .ph_acc_adj = 0x1e } },
+               { /* 156.25MHz reference */
+                 .valid = true,
+                 .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
+                 .mode_1.s = { .pll_16p5en = 0x1,
+                               .pll_cpadj = 0x3,
+                               .pll_pcie3en = 0x0,
+                               .pll_opr = 0x0,
+                               .pll_div = 0x10 },
+                 .pmode_0.s = { .ctle = 0x0,
+                                .pcie = 0x0,
+                                .tx_ldiv = 0x2,
+                                .rx_ldiv = 0x2,
+                                .srate = 0x0,
+                                .tx_mode = 0x3,
+                                .rx_mode = 0x3 },
+                 .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                                .vma_mm = 0x1,
+                                .cdr_fgain = 0xc,
+                                .ph_acc_adj = 0x1e } },
+               {
+                       /* 161.1328125MHz reference clock */
+                       .valid = false,
+               },
+       },
+       {   /* 4        R_3125G_REFCLK15625_XAUI */
+       { /* 100MHz reference */
+           .valid = false },
+       { /* 125MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x14 },
+           .mode_1.s = { .pll_16p5en = 0x1,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x19 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } },
+       { /* 156.25MHz reference, default */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x14 },
+           .mode_1.s = { .pll_16p5en = 0x1,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } },
+       {
+                 /* 161.1328125MHz reference clock */
+                 .valid = false,
+         } },
+       {   /* 5        R_103125G_REFCLK15625_KR */
+       { /* 100MHz reference */
+           .valid = false },
+       { /* 125MHz reference */
+           .valid = false },
+       { /* 156.25MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x1,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x1,
+                         .pll_div = 0x21 },
+           .pmode_0.s = { .ctle = 0x3,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x1,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0xf } },
+       { /* 161.1328125 reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x1,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x1,
+                         .pll_div = 0x20 },
+           .pmode_0.s = { .ctle = 0x3,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x1,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0xf } } },
+       {   /* 6        R_125G_REFCLK15625_SGMII */
+       { /* 100MHz reference clock */
+           .valid = 1,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
+           .mode_1.s = { .pll_16p5en = 0x1,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x19 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x2,
+                          .rx_ldiv = 0x2,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } },
+       { /* 125MHz reference clock */
+           .valid = 1,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
+           .mode_1.s = { .pll_16p5en = 0x1,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x2,
+                          .rx_ldiv = 0x2,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } },
+       { /* 156.25MHz reference clock */
+           .valid = 1,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
+           .mode_1.s = { .pll_16p5en = 0x1,
+                         .pll_cpadj = 0x3,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x10 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x2,
+                          .rx_ldiv = 0x2,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } } },
+       {   /* 7        R_5G_REFCLK15625_QSGMII */
+       { /* 100MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0, .pll_cpadj = 0x2, .pll_pcie3en = 0x0,
+                         .pll_div = 0x19 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } },
+       { /* 125MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0, .pll_cpadj = 0x1, .pll_pcie3en = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } },
+       { /* 156.25MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0, .pll_cpadj = 0x2, .pll_pcie3en = 0x0,
+                         .pll_div = 0x10 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xc,
+                          .ph_acc_adj = 0x1e } },
+       {
+                 /* 161.1328125MHz reference clock */
+                 .valid = false,
+         } },
+       {   /* 8        R_625G_REFCLK15625_RXAUI */
+       { /* 100MHz reference */
+           .valid = false },
+       { /* 125MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x19 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 156.25MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 161.1328125 reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } } },
+       {   /* 9        R_2_5G_REFCLK125 */
+       { /* 100MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x19 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 125MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x1,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 156,25MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x10 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x1,
+                          .rx_ldiv = 0x1,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x1,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       {
+                 /* 161.1328125MHz reference clock */
+                 .valid = false,
+         } },
+       {   /* 0xa      R_5G_REFCLK125 */
+       { /* 100MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x19 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 125MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x1,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x14 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       { /* 156.25MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x0,
+                         .pll_opr = 0x0,
+                         .pll_div = 0x10 },
+           .pmode_0.s = { .ctle = 0x0,
+                          .pcie = 0x1,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xa,
+                          .ph_acc_adj = 0x14 } },
+       {
+                 /* 161.1328125MHz reference clock */
+                 .valid = false,
+         } },
+       {   /* 0xb      R_8G_REFCLK125 */
+       { /* 100MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x2,
+                         .pll_pcie3en = 0x1,
+                         .pll_opr = 0x1,
+                         .pll_div = 0x28 },
+           .pmode_0.s = { .ctle = 0x3,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xb,
+                          .ph_acc_adj = 0x23 } },
+       { /* 125MHz reference */
+           .valid = true,
+           .mode_0.s = { .pll_icp = 0x2, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
+           .mode_1.s = { .pll_16p5en = 0x0,
+                         .pll_cpadj = 0x1,
+                         .pll_pcie3en = 0x1,
+                         .pll_opr = 0x1,
+                         .pll_div = 0x20 },
+           .pmode_0.s = { .ctle = 0x3,
+                          .pcie = 0x0,
+                          .tx_ldiv = 0x0,
+                          .rx_ldiv = 0x0,
+                          .srate = 0x0,
+                          .tx_mode = 0x3,
+                          .rx_mode = 0x3 },
+           .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
+                          .vma_mm = 0x0,
+                          .cdr_fgain = 0xb,
+                          .ph_acc_adj = 0x23 } },
+       { /* 156.25MHz reference */
+           .valid = false },
+       {
+                 /* 161.1328125MHz reference clock */
+                 .valid = false,
+         } }
+};
+
+/**
+ * Set a non-standard reference clock for a node, qlm and lane mode.
+ *
+ * @INTERNAL
+ *
+ * @param node         node number the reference clock is used with
+ * @param qlm          qlm number the reference clock is hooked up to
+ * @param lane_mode    current lane mode selected for the QLM
+ * @param ref_clk_sel  0 = 100MHz, 1 = 125MHz, 2 = 156.25MHz,
+ *                     3 = 161.1328125MHz
+ *
+ * @return 0 for success or -1 if the reference clock selector is not supported
+ *
+ * NOTE: This must be called before __qlm_setup_pll_cn78xx.
+ */
+static int __set_qlm_ref_clk_cn78xx(int node, int qlm, int lane_mode, int ref_clk_sel)
+{
+       if (ref_clk_sel > 3 || ref_clk_sel < 0 ||
+           !refclk_settings_cn78xx[lane_mode][ref_clk_sel].valid) {
+               debug("%s: Invalid reference clock %d for lane mode %d for node %d, QLM %d\n",
+                     __func__, ref_clk_sel, lane_mode, node, qlm);
+               return -1;
+       }
+       debug("%s(%d, %d, 0x%x, %d)\n", __func__, node, qlm, lane_mode, ref_clk_sel);
+       ref_clk_cn78xx[node][qlm][lane_mode] = ref_clk_sel;
+       return 0;
+}
+
+/**
+ * KR - Inverted Tx Coefficient Direction Change.  Changing Pre & Post Tap inc/dec direction
+ *
+ *
+ * @INTERNAL
+ *
+ * @param node Node number to configure
+ * @param qlm  QLM number to configure
+ */
+static void __qlm_kr_inc_dec_gser26636(int node, int qlm)
+{
+       cvmx_gserx_rx_txdir_ctrl_1_t rx_txdir_ctrl;
+
+       /* Apply workaround for Errata GSER-26636,
+        * KR training coefficient update inverted
+        */
+       rx_txdir_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm));
+       rx_txdir_ctrl.s.rx_precorr_chg_dir = 1;
+       rx_txdir_ctrl.s.rx_tap1_chg_dir = 1;
+       csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm), rx_txdir_ctrl.u64);
+}
+
+/**
+ * Updating the RX EQ settings to support wider temperature range
+ * @INTERNAL
+ *
+ * @param node Node number to configure
+ * @param qlm  QLM number to configure
+ */
+static void __qlm_rx_eq_temp_gser27140(int node, int qlm)
+{
+       int lane;
+       int num_lanes = cvmx_qlm_get_lanes(qlm);
+       cvmx_gserx_lanex_rx_valbbd_ctrl_0_t rx_valbbd_ctrl_0;
+       cvmx_gserx_lane_vma_fine_ctrl_2_t lane_vma_fine_ctrl_2;
+       cvmx_gserx_lane_vma_fine_ctrl_0_t lane_vma_fine_ctrl_0;
+       cvmx_gserx_rx_txdir_ctrl_1_t rx_txdir_ctrl_1;
+       cvmx_gserx_eq_wait_time_t eq_wait_time;
+       cvmx_gserx_rx_txdir_ctrl_2_t rx_txdir_ctrl_2;
+       cvmx_gserx_rx_txdir_ctrl_0_t rx_txdir_ctrl_0;
+
+       for (lane = 0; lane < num_lanes; lane++) {
+               rx_valbbd_ctrl_0.u64 =
+                       csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(lane, qlm));
+               rx_valbbd_ctrl_0.s.agc_gain = 3;
+               rx_valbbd_ctrl_0.s.dfe_gain = 2;
+               csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(lane, qlm),
+                           rx_valbbd_ctrl_0.u64);
+       }
+
+       /* do_pre_ctle_limits_work_around: */
+       lane_vma_fine_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm));
+       //lane_vma_fine_ctrl_2.s.rx_prectle_peak_max_fine = 11;
+       lane_vma_fine_ctrl_2.s.rx_prectle_gain_max_fine = 11;
+       //lane_vma_fine_ctrl_2.s.rx_prectle_peak_min_fine = 6;
+       lane_vma_fine_ctrl_2.s.rx_prectle_gain_min_fine = 6;
+       csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm), lane_vma_fine_ctrl_2.u64);
+
+       /* do_inc_dec_thres_work_around: */
+       rx_txdir_ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_0(qlm));
+       rx_txdir_ctrl_0.s.rx_boost_hi_thrs = 11;
+       rx_txdir_ctrl_0.s.rx_boost_lo_thrs = 4;
+       rx_txdir_ctrl_0.s.rx_boost_hi_val = 15;
+       csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_0(qlm), rx_txdir_ctrl_0.u64);
+
+       /* do_sdll_iq_work_around: */
+       lane_vma_fine_ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_0(qlm));
+       lane_vma_fine_ctrl_0.s.rx_sdll_iq_max_fine = 14;
+       lane_vma_fine_ctrl_0.s.rx_sdll_iq_min_fine = 8;
+       lane_vma_fine_ctrl_0.s.rx_sdll_iq_step_fine = 2;
+
+       /* do_vma_window_work_around_2: */
+       lane_vma_fine_ctrl_0.s.vma_window_wait_fine = 5;
+       lane_vma_fine_ctrl_0.s.lms_wait_time_fine = 5;
+
+       csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_0(qlm), lane_vma_fine_ctrl_0.u64);
+
+       /* Set dfe_tap_1_lo_thres_val: */
+       rx_txdir_ctrl_1.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm));
+       rx_txdir_ctrl_1.s.rx_tap1_lo_thrs = 8;
+       rx_txdir_ctrl_1.s.rx_tap1_hi_thrs = 0x17;
+       csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm), rx_txdir_ctrl_1.u64);
+
+       /* do_rxeq_wait_cnt_work_around: */
+       eq_wait_time.u64 = csr_rd_node(node, CVMX_GSERX_EQ_WAIT_TIME(qlm));
+       eq_wait_time.s.rxeq_wait_cnt = 6;
+       csr_wr_node(node, CVMX_GSERX_EQ_WAIT_TIME(qlm), eq_wait_time.u64);
+
+       /* do_write_rx_txdir_precorr_thresholds: */
+       rx_txdir_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_2(qlm));
+       rx_txdir_ctrl_2.s.rx_precorr_hi_thrs = 0xc0;
+       rx_txdir_ctrl_2.s.rx_precorr_lo_thrs = 0x40;
+       csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_2(qlm), rx_txdir_ctrl_2.u64);
+}
+
+/* Errata GSER-26150: 10G PHY PLL Temperature Failure
+ * This workaround must be completed after the final deassertion of
+ * GSERx_PHY_CTL[PHY_RESET]
+ */
+static int __qlm_errata_gser_26150(int node, int qlm, int is_pcie)
+{
+       int num_lanes = 4;
+       int i;
+       cvmx_gserx_glbl_pll_cfg_3_t pll_cfg_3;
+       cvmx_gserx_glbl_misc_config_1_t misc_config_1;
+
+       /* PCIe only requires the LC-VCO parameters to be updated */
+       if (is_pcie) {
+               /* Update PLL parameters */
+               /* Step 1: Set GSER()_GLBL_PLL_CFG_3[PLL_VCTRL_SEL_LCVCO_VAL] = 0x2, and
+                * GSER()_GLBL_PLL_CFG_3[PCS_SDS_PLL_VCO_AMP] = 0
+                */
+               pll_cfg_3.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm));
+               pll_cfg_3.s.pcs_sds_pll_vco_amp = 0;
+               pll_cfg_3.s.pll_vctrl_sel_lcvco_val = 2;
+               csr_wr_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm), pll_cfg_3.u64);
+
+               /* Step 2: Set GSER()_GLBL_MISC_CONFIG_1[PCS_SDS_TRIM_CHP_REG] = 0x2. */
+               misc_config_1.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm));
+               misc_config_1.s.pcs_sds_trim_chp_reg = 2;
+               csr_wr_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm), misc_config_1.u64);
+               return 0;
+       }
+
+       /* Applying this errata twice causes problems */
+       pll_cfg_3.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm));
+       if (pll_cfg_3.s.pll_vctrl_sel_lcvco_val == 0x2)
+               return 0;
+
+       /* (GSER-26150) 10 Gb temperature excursions can cause lock failure */
+       /* Change the calibration point of the VCO at start up to shift some
+        * available range of the VCO from -deltaT direction to the +deltaT
+        * ramp direction allowing a greater range of VCO temperatures before
+        * experiencing the failure.
+        */
+
+       /* Check for DLMs on CN73XX and CNF75XX */
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX) && (qlm == 5 || qlm == 6))
+               num_lanes = 2;
+
+       /* Put PHY in P2 Power-down state  Need to Power down all lanes in a
+        * QLM/DLM to force PHY to P2 state
+        */
+       for (i = 0; i < num_lanes; i++) {
+               cvmx_gserx_lanex_pcs_ctlifc_0_t ctlifc0;
+               cvmx_gserx_lanex_pcs_ctlifc_1_t ctlifc1;
+               cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc2;
+
+               /* Step 1: Set Set GSER()_LANE(lane_n)_PCS_CTLIFC_0[CFG_TX_PSTATE_REQ_OVERRD_VAL]
+                * = 0x3
+                * Select P2 power state for Tx lane
+                */
+               ctlifc0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm));
+               ctlifc0.s.cfg_tx_pstate_req_ovrrd_val = 0x3;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm), ctlifc0.u64);
+               /* Step 2: Set GSER()_LANE(lane_n)_PCS_CTLIFC_1[CFG_RX_PSTATE_REQ_OVERRD_VAL]
+                * = 0x3
+                * Select P2 power state for Rx lane
+                */
+               ctlifc1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm));
+               ctlifc1.s.cfg_rx_pstate_req_ovrrd_val = 0x3;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm), ctlifc1.u64);
+               /* Step 3: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_TX_PSTATE_REQ_OVRRD_EN] = 1
+                * Enable Tx power state override and Set
+                * GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_RX_PSTATE_REQ_OVRRD_EN] = 1
+                * Enable Rx power state override
+                */
+               ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
+               ctlifc2.s.cfg_tx_pstate_req_ovrrd_en = 0x1;
+               ctlifc2.s.cfg_rx_pstate_req_ovrrd_en = 0x1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
+               /* Step 4: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CTLIFC_OVRRD_REQ] = 1
+                * Start the CTLIFC override state machine
+                */
+               ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
+               ctlifc2.s.ctlifc_ovrrd_req = 0x1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
+       }
+
+       /* Update PLL parameters */
+       /* Step 5: Set GSER()_GLBL_PLL_CFG_3[PLL_VCTRL_SEL_LCVCO_VAL] = 0x2, and
+        * GSER()_GLBL_PLL_CFG_3[PCS_SDS_PLL_VCO_AMP] = 0
+        */
+       pll_cfg_3.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm));
+       pll_cfg_3.s.pcs_sds_pll_vco_amp = 0;
+       pll_cfg_3.s.pll_vctrl_sel_lcvco_val = 2;
+       csr_wr_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm), pll_cfg_3.u64);
+
+       /* Step 6: Set GSER()_GLBL_MISC_CONFIG_1[PCS_SDS_TRIM_CHP_REG] = 0x2. */
+       misc_config_1.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm));
+       misc_config_1.s.pcs_sds_trim_chp_reg = 2;
+       csr_wr_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm), misc_config_1.u64);
+
+       /* Wake up PHY and transition to P0 Power-up state to bring-up the lanes,
+        * need to wake up all PHY lanes
+        */
+       for (i = 0; i < num_lanes; i++) {
+               cvmx_gserx_lanex_pcs_ctlifc_0_t ctlifc0;
+               cvmx_gserx_lanex_pcs_ctlifc_1_t ctlifc1;
+               cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc2;
+               /* Step 7: Set GSER()_LANE(lane_n)_PCS_CTLIFC_0[CFG_TX_PSTATE_REQ_OVERRD_VAL] = 0x0
+                * Select P0 power state for Tx lane
+                */
+               ctlifc0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm));
+               ctlifc0.s.cfg_tx_pstate_req_ovrrd_val = 0x0;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm), ctlifc0.u64);
+               /* Step 8: Set GSER()_LANE(lane_n)_PCS_CTLIFC_1[CFG_RX_PSTATE_REQ_OVERRD_VAL] = 0x0
+                * Select P0 power state for Rx lane
+                */
+               ctlifc1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm));
+               ctlifc1.s.cfg_rx_pstate_req_ovrrd_val = 0x0;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm), ctlifc1.u64);
+               /* Step 9: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_TX_PSTATE_REQ_OVRRD_EN] = 1
+                * Enable Tx power state override and Set
+                * GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_RX_PSTATE_REQ_OVRRD_EN] = 1
+                * Enable Rx power state override
+                */
+               ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
+               ctlifc2.s.cfg_tx_pstate_req_ovrrd_en = 0x1;
+               ctlifc2.s.cfg_rx_pstate_req_ovrrd_en = 0x1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
+               /* Step 10: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CTLIFC_OVRRD_REQ] = 1
+                * Start the CTLIFC override state machine
+                */
+               ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
+               ctlifc2.s.ctlifc_ovrrd_req = 0x1;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
+       }
+
+       /* Step 11: Wait 10 msec */
+       mdelay(10);
+
+       /* Release Lane Tx/Rx Power state override enables. */
+       for (i = 0; i < num_lanes; i++) {
+               cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc2;
+
+               ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
+               ctlifc2.s.cfg_tx_pstate_req_ovrrd_en = 0x0;
+               ctlifc2.s.cfg_rx_pstate_req_ovrrd_en = 0x0;
+               csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
+       }
+
+       /* Step 12:  Poll GSER()_PLL_STAT.[PLL_LOCK] = 1
+        * Poll and check that PLL is locked
+        */
+       if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_PLL_STAT(qlm), cvmx_gserx_pll_stat_t,
+                                      pll_lock, ==, 1, 10000)) {
+               printf("%d:QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n", node, qlm);
+               return -1;
+       }
+
+       /* Step 13:  Poll GSER()_QLM_STAT.[RST_RDY] = 1
+        * Poll and check that QLM/DLM is Ready
+        */
+       if (is_pcie == 0 &&
+           CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
+                                      rst_rdy, ==, 1, 10000)) {
+               printf("%d:QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", node, qlm);
+               return -1;
+       }
+
+       return 0;
+}
+
+/**
+ * Configure all of the PLLs for a particular node and qlm
+ * @INTERNAL
+ *
+ * @param node Node number to configure
+ * @param qlm  QLM number to configure
+ */
+static void __qlm_setup_pll_cn78xx(int node, int qlm)
+{
+       cvmx_gserx_pll_px_mode_0_t mode_0;
+       cvmx_gserx_pll_px_mode_1_t mode_1;
+       cvmx_gserx_lane_px_mode_0_t pmode_0;
+       cvmx_gserx_lane_px_mode_1_t pmode_1;
+       int lane_mode;
+       int ref_clk;
+       const struct refclk_settings_cn78xx *clk_settings;
+
+       for (lane_mode = 0; lane_mode < R_NUM_LANE_MODES; lane_mode++) {
+               mode_0.u64 = csr_rd_node(node, CVMX_GSERX_PLL_PX_MODE_0(lane_mode, qlm));
+               mode_1.u64 = csr_rd_node(node, CVMX_GSERX_PLL_PX_MODE_1(lane_mode, qlm));
+               pmode_0.u64 = 0;
+               pmode_1.u64 = 0;
+               ref_clk = ref_clk_cn78xx[node][qlm][lane_mode];
+               clk_settings = &refclk_settings_cn78xx[lane_mode][ref_clk];
+               debug("%s(%d, %d): lane_mode: 0x%x, ref_clk: %d\n", __func__, node, qlm, lane_mode,
+                     ref_clk);
+
+               if (!clk_settings->valid) {
+                       printf("%s: Error: reference clock %d is not supported for lane mode %d on qlm %d\n",
+                              __func__, ref_clk, lane_mode, qlm);
+                       continue;
+               }
+
+               mode_0.s.pll_icp = clk_settings->mode_0.s.pll_icp;
+               mode_0.s.pll_rloop = clk_settings->mode_0.s.pll_rloop;
+               mode_0.s.pll_pcs_div = clk_settings->mode_0.s.pll_pcs_div;
+
+               mode_1.s.pll_16p5en = clk_settings->mode_1.s.pll_16p5en;
+               mode_1.s.pll_cpadj = clk_settings->mode_1.s.pll_cpadj;
+               mode_1.s.pll_pcie3en = clk_settings->mode_1.s.pll_pcie3en;
+               mode_1.s.pll_opr = clk_settings->mode_1.s.pll_opr;
+               mode_1.s.pll_div = clk_settings->mode_1.s.pll_div;
+
+               pmode_0.u64 = clk_settings->pmode_0.u64;
+
+               pmode_1.u64 = clk_settings->pmode_1.u64;
+
+               csr_wr_node(node, CVMX_GSERX_PLL_PX_MODE_1(lane_mode, qlm), mode_1.u64);
+               csr_wr_node(node, CVMX_GSERX_LANE_PX_MODE_0(lane_mode, qlm), pmode_0.u64);
+               csr_wr_node(node, CVMX_GSERX_LANE_PX_MODE_1(lane_mode, qlm), pmode_1.u64);
+               csr_wr_node(node, CVMX_GSERX_PLL_PX_MODE_0(lane_mode, qlm), mode_0.u64);
+       }
+}
+
+/**
+ * Get the lane mode for the specified node and QLM.
+ *
+ * @param ref_clk_sel  The reference-clock selection to use to configure QLM
+ *                      0 = REF_100MHZ
+ *                      1 = REF_125MHZ
+ *                      2 = REF_156MHZ
+ * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
+ * @param[out] alt_pll_settings        If non-NULL this will be set if non-default PLL
+ *                             settings are required for the mode.
+ *
+ * @return lane mode to use or -1 on error
+ *
+ * NOTE: In some modes
+ */
+static int __get_lane_mode_for_speed_and_ref_clk(int ref_clk_sel, int baud_mhz,
+                                                bool *alt_pll_settings)
+{
+       if (alt_pll_settings)
+               *alt_pll_settings = false;
+       switch (baud_mhz) {
+       case 98304:
+       case 49152:
+       case 24576:
+       case 12288:
+               if (ref_clk_sel != 3) {
+                       printf("Error: Invalid ref clock\n");
+                       return -1;
+               }
+               return 0x5;
+       case 6144:
+       case 3072:
+               if (ref_clk_sel != 3) {
+                       printf("Error: Invalid ref clock\n");
+                       return -1;
+               }
+               return 0x8;
+       case 1250:
+               if (alt_pll_settings)
+                       *alt_pll_settings = (ref_clk_sel != 2);
+               return R_125G_REFCLK15625_SGMII;
+       case 2500:
+               if (ref_clk_sel == 0)
+                       return R_2_5G_REFCLK100;
+
+               if (alt_pll_settings)
+                       *alt_pll_settings = (ref_clk_sel != 1);
+               return R_2_5G_REFCLK125;
+       case 3125:
+               if (ref_clk_sel == 2) {
+                       return R_3125G_REFCLK15625_XAUI;
+               } else if (ref_clk_sel == 1) {
+                       if (alt_pll_settings)
+                               *alt_pll_settings = true;
+                       return R_3125G_REFCLK15625_XAUI;
+               }
+
+               printf("Error: Invalid speed\n");
+               return -1;
+       case 5000:
+               if (ref_clk_sel == 0) {
+                       return R_5G_REFCLK100;
+               } else if (ref_clk_sel == 1) {
+                       if (alt_pll_settings)
+                               *alt_pll_settings = (ref_clk_sel != 1);
+                       return R_5G_REFCLK125;
+               } else {
+                       return R_5G_REFCLK15625_QSGMII;
+               }
+       case 6250:
+               if (ref_clk_sel != 0) {
+                       if (alt_pll_settings)
+                               *alt_pll_settings = (ref_clk_sel != 2);
+                       return R_625G_REFCLK15625_RXAUI;
+               }
+
+               printf("Error: Invalid speed\n");
+               return -1;
+       case 6316:
+               if (ref_clk_sel != 3) {
+                       printf("Error: Invalid speed\n");
+               } else {
+                       *alt_pll_settings = true;
+                       return R_625G_REFCLK15625_RXAUI;
+               }
+       case 8000:
+               if (ref_clk_sel == 0)
+                       return R_8G_REFCLK100;
+               else if (ref_clk_sel == 1)
+                       return R_8G_REFCLK125;
+
+               printf("Error: Invalid speed\n");
+               return -1;
+       case 103125:
+               if (ref_clk_sel == 3 && alt_pll_settings)
+                       *alt_pll_settings = true;
+
+               if (ref_clk_sel == 2 || ref_clk_sel == 3)
+                       return R_103125G_REFCLK15625_KR;
+
+       default:
+               printf("Error: Invalid speed\n");
+               return -1;
+       }
+
+       return -1;
+}
+
+/*
+ * Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
+ * during speed change. Change SLI_WINDOW_CTL[time] to 525us
+ */
+static void __set_sli_window_ctl_errata_31375(int node)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX) ||
+           OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
+               cvmx_sli_window_ctl_t window_ctl;
+
+               window_ctl.u64 = csr_rd_node(node, CVMX_PEXP_SLI_WINDOW_CTL);
+               /* Configure SLI_WINDOW_CTL only once */
+               if (window_ctl.s.time != 8191)
+                       return;
+
+               window_ctl.s.time = gd->bus_clk * 525ull / 1000000;
+               csr_wr_node(node, CVMX_PEXP_SLI_WINDOW_CTL, window_ctl.u64);
+       }
+}
+
+static void __cvmx_qlm_pcie_errata_ep_cn78xx(int node, int pem)
+{
+       cvmx_pciercx_cfg031_t cfg031;
+       cvmx_pciercx_cfg032_t cfg032;
+       cvmx_pciercx_cfg040_t cfg040;
+       cvmx_pemx_cfg_t pemx_cfg;
+       cvmx_pemx_on_t pemx_on;
+       int low_qlm, high_qlm;
+       int qlm, lane;
+       u64 start_cycle;
+
+       pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(pem));
+
+       /* Errata (GSER-21178) PCIe gen3 doesn't work, continued */
+
+       /* Wait for the link to come up as Gen1 */
+       printf("PCIe%d: Waiting for EP out of reset\n", pem);
+       while (pemx_on.s.pemoor == 0) {
+               udelay(1000);
+               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(pem));
+       }
+
+       /* Enable gen3 speed selection */
+       printf("PCIe%d: Enabling Gen3 for EP\n", pem);
+       /* Force Gen1 for initial link bringup. We'll fix it later */
+       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
+       pemx_cfg.s.md = 2;
+       csr_wr_node(node, CVMX_PEMX_CFG(pem), pemx_cfg.u64);
+       cfg031.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG031(pem));
+       cfg031.s.mls = 2;
+       cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG031(pem), cfg031.u32);
+       cfg040.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG040(pem));
+       cfg040.s.tls = 3;
+       cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG040(pem), cfg040.u32);
+
+       /* Wait up to 10ms for the link speed change to complete */
+       start_cycle = get_timer(0);
+       do {
+               if (get_timer(start_cycle) > 10)
+                       return;
+
+               mdelay(1);
+               cfg032.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG032(pem));
+       } while (cfg032.s.ls != 3);
+
+       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
+       low_qlm = pem; /* FIXME */
+       high_qlm = (pemx_cfg.cn78xx.lanes8) ? low_qlm + 1 : low_qlm;
+
+       /* Toggle cfg_rx_dll_locken_ovrrd_en and rx_resetn_ovrrd_en across
+        * all QM lanes in use
+        */
+       for (qlm = low_qlm; qlm <= high_qlm; qlm++) {
+               for (lane = 0; lane < 4; lane++) {
+                       cvmx_gserx_lanex_rx_misc_ovrrd_t misc_ovrrd;
+                       cvmx_gserx_lanex_pwr_ctrl_t pwr_ctrl;
+
+                       misc_ovrrd.u64 =
+                               csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem));
+                       misc_ovrrd.s.cfg_rx_dll_locken_ovrrd_en = 1;
+                       csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem),
+                                   misc_ovrrd.u64);
+                       pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem));
+                       pwr_ctrl.s.rx_resetn_ovrrd_en = 1;
+                       csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem), pwr_ctrl.u64);
+               }
+       }
+       for (qlm = low_qlm; qlm <= high_qlm; qlm++) {
+               for (lane = 0; lane < 4; lane++) {
+                       cvmx_gserx_lanex_rx_misc_ovrrd_t misc_ovrrd;
+                       cvmx_gserx_lanex_pwr_ctrl_t pwr_ctrl;
+
+                       misc_ovrrd.u64 =
+                               csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem));
+                       misc_ovrrd.s.cfg_rx_dll_locken_ovrrd_en = 0;
+                       csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem),
+                                   misc_ovrrd.u64);
+                       pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem));
+                       pwr_ctrl.s.rx_resetn_ovrrd_en = 0;
+                       csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem), pwr_ctrl.u64);
+               }
+       }
+
+       //printf("PCIe%d: Waiting for EP link up at Gen3\n", pem);
+       if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_PEMX_ON(pem), cvmx_pemx_on_t, pemoor, ==, 1,
+                                      1000000)) {
+               printf("PCIe%d: Timeout waiting for EP link up at Gen3\n", pem);
+               return;
+       }
+}
+
+static void __cvmx_qlm_pcie_errata_cn78xx(int node, int qlm)
+{
+       int pem, i, q;
+       int is_8lanes;
+       int is_high_lanes;
+       int low_qlm, high_qlm, is_host;
+       int need_ep_monitor;
+       cvmx_pemx_cfg_t pem_cfg, pem3_cfg;
+       cvmx_gserx_slice_cfg_t slice_cfg;
+       cvmx_gserx_rx_pwr_ctrl_p1_t pwr_ctrl_p1;
+       cvmx_rst_soft_prstx_t soft_prst;
+
+       /* Only applies to CN78XX pass 1.x */
+       if (!OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+               return;
+
+       /* Determine the PEM for this QLM, whether we're in 8 lane mode,
+        * and whether these are the top lanes of the 8
+        */
+       switch (qlm) {
+       case 0: /* First 4 lanes of PEM0 */
+               pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
+               pem = 0;
+               is_8lanes = pem_cfg.cn78xx.lanes8;
+               is_high_lanes = 0;
+               break;
+       case 1: /* Either last 4 lanes of PEM0, or PEM1 */
+               pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
+               pem = (pem_cfg.cn78xx.lanes8) ? 0 : 1;
+               is_8lanes = pem_cfg.cn78xx.lanes8;
+               is_high_lanes = is_8lanes;
+               break;
+       case 2: /* First 4 lanes of PEM2 */
+               pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
+               pem = 2;
+               is_8lanes = pem_cfg.cn78xx.lanes8;
+               is_high_lanes = 0;
+               break;
+       case 3: /* Either last 4 lanes of PEM2, or PEM3 */
+               pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
+               pem3_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
+               pem = (pem_cfg.cn78xx.lanes8) ? 2 : 3;
+               is_8lanes = (pem == 2) ? pem_cfg.cn78xx.lanes8 : pem3_cfg.cn78xx.lanes8;
+               is_high_lanes = (pem == 2) && is_8lanes;
+               break;
+       case 4: /* Last 4 lanes of PEM3 */
+               pem = 3;
+               is_8lanes = 1;
+               is_high_lanes = 1;
+               break;
+       default:
+               return;
+       }
+
+       /* These workaround must be applied once per PEM. Since we're called per
+        * QLM, wait for the 2nd half of 8 lane setups before doing the workaround
+        */
+       if (is_8lanes && !is_high_lanes)
+               return;
+
+       pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
+       is_host = pem_cfg.cn78xx.hostmd;
+       low_qlm = (is_8lanes) ? qlm - 1 : qlm;
+       high_qlm = qlm;
+       qlm = -1;
+
+       if (!is_host) {
+               /* Read the current slice config value. If its at the value we will
+                * program then skip doing the workaround. We're probably doing a
+                * hot reset and the workaround is already applied
+                */
+               slice_cfg.u64 = csr_rd_node(node, CVMX_GSERX_SLICE_CFG(low_qlm));
+               if (slice_cfg.s.tx_rx_detect_lvl_enc == 7 && OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0))
+                       return;
+       }
+
+       if (is_host && OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
+               /* (GSER-XXXX) GSER PHY needs to be reset at initialization */
+               cvmx_gserx_phy_ctl_t phy_ctl;
+
+               for (q = low_qlm; q <= high_qlm; q++) {
+                       phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(q));
+                       phy_ctl.s.phy_reset = 1;
+                       csr_wr_node(node, CVMX_GSERX_PHY_CTL(q), phy_ctl.u64);
+               }
+               udelay(5);
+
+               for (q = low_qlm; q <= high_qlm; q++) {
+                       phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(q));
+                       phy_ctl.s.phy_reset = 0;
+                       csr_wr_node(node, CVMX_GSERX_PHY_CTL(q), phy_ctl.u64);
+               }
+               udelay(5);
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
+               /* (GSER-20936) GSER has wrong PCIe RX detect reset value */
+               for (q = low_qlm; q <= high_qlm; q++) {
+                       slice_cfg.u64 = csr_rd_node(node, CVMX_GSERX_SLICE_CFG(q));
+                       slice_cfg.s.tx_rx_detect_lvl_enc = 7;
+                       csr_wr_node(node, CVMX_GSERX_SLICE_CFG(q), slice_cfg.u64);
+               }
+
+               /* Clear the bit in GSERX_RX_PWR_CTRL_P1[p1_rx_subblk_pd]
+                * that coresponds to "Lane DLL"
+                */
+               for (q = low_qlm; q <= high_qlm; q++) {
+                       pwr_ctrl_p1.u64 = csr_rd_node(node, CVMX_GSERX_RX_PWR_CTRL_P1(q));
+                       pwr_ctrl_p1.s.p1_rx_subblk_pd &= ~4;
+                       csr_wr_node(node, CVMX_GSERX_RX_PWR_CTRL_P1(q), pwr_ctrl_p1.u64);
+               }
+
+               /* Errata (GSER-20888) GSER incorrect synchronizers hurts PCIe
+                * Override TX Power State machine TX reset control signal
+                */
+               for (q = low_qlm; q <= high_qlm; q++) {
+                       for (i = 0; i < 4; i++) {
+                               cvmx_gserx_lanex_tx_cfg_0_t tx_cfg;
+                               cvmx_gserx_lanex_pwr_ctrl_t pwr_ctrl;
+
+                               tx_cfg.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_0(i, q));
+                               tx_cfg.s.tx_resetn_ovrrd_val = 1;
+                               csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_0(i, q), tx_cfg.u64);
+                               pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(i, q));
+                               pwr_ctrl.s.tx_p2s_resetn_ovrrd_en = 1;
+                               csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(i, q), pwr_ctrl.u64);
+                       }
+               }
+       }
+
+       if (!is_host) {
+               cvmx_pciercx_cfg089_t cfg089;
+               cvmx_pciercx_cfg090_t cfg090;
+               cvmx_pciercx_cfg091_t cfg091;
+               cvmx_pciercx_cfg092_t cfg092;
+               cvmx_pciercx_cfg548_t cfg548;
+               cvmx_pciercx_cfg554_t cfg554;
+
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
+                       /* Errata (GSER-21178) PCIe gen3 doesn't work */
+                       /* The starting equalization hints are incorrect on CN78XX pass 1.x. Fix
+                        * them for the 8 possible lanes. It doesn't hurt to program them even
+                        * for lanes not in use
+                        */
+                       cfg089.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG089(pem));
+                       cfg089.s.l1urph = 2;
+                       cfg089.s.l1utp = 7;
+                       cfg089.s.l0urph = 2;
+                       cfg089.s.l0utp = 7;
+                       cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG089(pem), cfg089.u32);
+                       cfg090.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG090(pem));
+                       cfg090.s.l3urph = 2;
+                       cfg090.s.l3utp = 7;
+                       cfg090.s.l2urph = 2;
+                       cfg090.s.l2utp = 7;
+                       cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG090(pem), cfg090.u32);
+                       cfg091.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG091(pem));
+                       cfg091.s.l5urph = 2;
+                       cfg091.s.l5utp = 7;
+                       cfg091.s.l4urph = 2;
+                       cfg091.s.l4utp = 7;
+                       cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG091(pem), cfg091.u32);
+                       cfg092.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG092(pem));
+                       cfg092.s.l7urph = 2;
+                       cfg092.s.l7utp = 7;
+                       cfg092.s.l6urph = 2;
+                       cfg092.s.l6utp = 7;
+                       cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG092(pem), cfg092.u32);
+                       /* FIXME: Disable phase 2 and phase 3 equalization */
+                       cfg548.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG548(pem));
+                       cfg548.s.ep2p3d = 1;
+                       cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG548(pem), cfg548.u32);
+               }
+               /* Errata (GSER-21331) GEN3 Equalization may fail */
+               /* Disable preset #10 and disable the 2ms timeout */
+               cfg554.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG554(pem));
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0))
+                       cfg554.s.p23td = 1;
+               cfg554.s.prv = 0x3ff;
+               cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG554(pem), cfg554.u32);
+
+               if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
+                       need_ep_monitor = (pem_cfg.s.md == 2);
+                       if (need_ep_monitor) {
+                               cvmx_pciercx_cfg031_t cfg031;
+                               cvmx_pciercx_cfg040_t cfg040;
+
+                               /* Force Gen1 for initial link bringup. We'll
+                                * fix it later
+                                */
+                               pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
+                               pem_cfg.s.md = 0;
+                               csr_wr_node(node, CVMX_PEMX_CFG(pem), pem_cfg.u64);
+                               cfg031.u32 = cvmx_pcie_cfgx_read_node(node, pem,
+                                                                     CVMX_PCIERCX_CFG031(pem));
+                               cfg031.s.mls = 0;
+                               cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG031(pem),
+                                                         cfg031.u32);
+                               cfg040.u32 = cvmx_pcie_cfgx_read_node(node, pem,
+                                                                     CVMX_PCIERCX_CFG040(pem));
+                               cfg040.s.tls = 1;
+                               cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG040(pem),
+                                                         cfg040.u32);
+                               __cvmx_qlm_pcie_errata_ep_cn78xx(node, pem);
+                       }
+                       return;
+               }
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
+               /* De-assert the SOFT_RST bit for this QLM (PEM), causing the PCIe
+                * workarounds code above to take effect.
+                */
+               soft_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(pem));
+               soft_prst.s.soft_prst = 0;
+               csr_wr_node(node, CVMX_RST_SOFT_PRSTX(pem), soft_prst.u64);
+               udelay(1);
+
+               /* Assert the SOFT_RST bit for this QLM (PEM), putting the PCIe back into
+                * reset state with disturbing the workarounds.
+                */
+               soft_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(pem));
+               soft_prst.s.soft_prst = 1;
+               csr_wr_node(node, CVMX_RST_SOFT_PRSTX(pem), soft_prst.u64);
+       }
+       udelay(1);
+}
+
+/**
+ * Setup the PEM to either driver or receive reset from PRST based on RC or EP
+ *
+ * @param node   Node to use in a Numa setup
+ * @param pem    Which PEM to setuo
+ * @param is_endpoint
+ *               Non zero if PEM is a EP
+ */
+static void __setup_pem_reset(int node, int pem, int is_endpoint)
+{
+       cvmx_rst_ctlx_t rst_ctl;
+
+       /* Make sure is_endpoint is either 0 or 1 */
+       is_endpoint = (is_endpoint != 0);
+       rst_ctl.u64 = csr_rd_node(node, CVMX_RST_CTLX(pem));
+       rst_ctl.s.prst_link = 0;          /* Link down causes soft reset */
+       rst_ctl.s.rst_link = is_endpoint; /* EP PERST causes a soft reset */
+       rst_ctl.s.rst_drv = !is_endpoint; /* Drive if RC */
+       rst_ctl.s.rst_rcv = is_endpoint;  /* Only read PERST in EP mode */
+       rst_ctl.s.rst_chip = 0;           /* PERST doesn't pull CHIP_RESET */
+       csr_wr_node(node, CVMX_RST_CTLX(pem), rst_ctl.u64);
+}
+
+/**
+ * Configure QLM speed and mode for cn78xx.
+ *
+ * @param node    Node to configure the QLM
+ * @param qlm     The QLM to configure
+ * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
+ * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
+ * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
+ * @param gen3    Only used for PCIe
+ *                     gen3 = 2 GEN3 mode
+ *                     gen3 = 1 GEN2 mode
+ *                     gen3 = 0 GEN1 mode
+ *
+ * @param ref_clk_sel    The reference-clock selection to use to configure QLM
+ *                      0 = REF_100MHZ
+ *                      1 = REF_125MHZ
+ *                      2 = REF_156MHZ
+ *                      3 = REF_161MHZ
+ * @param ref_clk_input  The reference-clock input to use to configure QLM
+ *
+ * @return       Return 0 on success or -1.
+ */
+int octeon_configure_qlm_cn78xx(int node, int qlm, int baud_mhz, int mode, int rc, int gen3,
+                               int ref_clk_sel, int ref_clk_input)
+{
+       cvmx_gserx_phy_ctl_t phy_ctl;
+       cvmx_gserx_lane_mode_t lmode;
+       cvmx_gserx_cfg_t cfg;
+       cvmx_gserx_refclk_sel_t refclk_sel;
+
+       int is_pcie = 0;
+       int is_ilk = 0;
+       int is_bgx = 0;
+       int lane_mode = 0;
+       int lmac_type = 0;
+       bool alt_pll = false;
+       int num_ports = 0;
+       int lane_to_sds = 0;
+
+       debug("%s(node: %d, qlm: %d, baud_mhz: %d, mode: %d, rc: %d, gen3: %d, ref_clk_sel: %d, ref_clk_input: %d\n",
+             __func__, node, qlm, baud_mhz, mode, rc, gen3, ref_clk_sel, ref_clk_input);
+       if (OCTEON_IS_MODEL(OCTEON_CN76XX) && qlm > 4) {
+               debug("%s: qlm %d not present on CN76XX\n", __func__, qlm);
+               return -1;
+       }
+
+       /* Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
+        * during speed change. Change SLI_WINDOW_CTL[time] to 525us
+        */
+       __set_sli_window_ctl_errata_31375(node);
+
+       cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
+       /* If PEM is in EP, no need to do anything */
+
+       if (cfg.s.pcie && rc == 0) {
+               debug("%s: node %d, qlm %d is in PCIe endpoint mode, returning\n",
+                     __func__, node, qlm);
+               return 0;
+       }
+
+       /* Set the reference clock to use */
+       refclk_sel.u64 = 0;
+       if (ref_clk_input == 0) { /* External ref clock */
+               refclk_sel.s.com_clk_sel = 0;
+               refclk_sel.s.use_com1 = 0;
+       } else if (ref_clk_input == 1) {
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 0;
+       } else {
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 1;
+       }
+
+       csr_wr_node(node, CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+
+       /* Reset the QLM after changing the reference clock */
+       phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 1;
+       phy_ctl.s.phy_pd = 1;
+       csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       udelay(1000);
+
+       /* Always restore the reference clocks for a QLM */
+       memcpy(ref_clk_cn78xx[node][qlm], def_ref_clk_cn78xx, sizeof(def_ref_clk_cn78xx));
+       switch (mode) {
+       case CVMX_QLM_MODE_PCIE:
+       case CVMX_QLM_MODE_PCIE_1X8: {
+               cvmx_pemx_cfg_t pemx_cfg;
+               cvmx_pemx_on_t pemx_on;
+
+               is_pcie = 1;
+
+               if (ref_clk_sel == 0) {
+                       refclk_sel.u64 = csr_rd_node(node, CVMX_GSERX_REFCLK_SEL(qlm));
+                       refclk_sel.s.pcie_refclk125 = 0;
+                       csr_wr_node(node, CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+                       if (gen3 == 0) /* Gen1 mode */
+                               lane_mode = R_2_5G_REFCLK100;
+                       else if (gen3 == 1) /* Gen2 mode */
+                               lane_mode = R_5G_REFCLK100;
+                       else
+                               lane_mode = R_8G_REFCLK100;
+               } else if (ref_clk_sel == 1) {
+                       refclk_sel.u64 = csr_rd_node(node, CVMX_GSERX_REFCLK_SEL(qlm));
+                       refclk_sel.s.pcie_refclk125 = 1;
+                       csr_wr_node(node, CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+                       if (gen3 == 0) /* Gen1 mode */
+                               lane_mode = R_2_5G_REFCLK125;
+                       else if (gen3 == 1) /* Gen2 mode */
+                               lane_mode = R_5G_REFCLK125;
+                       else
+                               lane_mode = R_8G_REFCLK125;
+               } else {
+                       printf("Invalid reference clock for PCIe on QLM%d\n", qlm);
+                       return -1;
+               }
+
+               switch (qlm) {
+               case 0: /* Either x4 or x8 based on PEM0 */
+               {
+                       cvmx_rst_soft_prstx_t rst_prst;
+
+                       rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(0));
+                       rst_prst.s.soft_prst = rc;
+                       csr_wr_node(node, CVMX_RST_SOFT_PRSTX(0), rst_prst.u64);
+                       __setup_pem_reset(node, 0, !rc);
+
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
+                       pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
+                       pemx_cfg.cn78xx.hostmd = rc;
+                       pemx_cfg.cn78xx.md = gen3;
+                       csr_wr_node(node, CVMX_PEMX_CFG(0), pemx_cfg.u64);
+                       /* x8 mode waits for QLM1 setup before turning on the PEM */
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(0));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(0), pemx_on.u64);
+                       }
+                       break;
+               }
+               case 1: /* Either PEM0 x8 or PEM1 x4 */
+               {
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               cvmx_rst_soft_prstx_t rst_prst;
+                               cvmx_pemx_cfg_t pemx_cfg;
+
+                               rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(1));
+                               rst_prst.s.soft_prst = rc;
+                               csr_wr_node(node, CVMX_RST_SOFT_PRSTX(1), rst_prst.u64);
+                               __setup_pem_reset(node, 1, !rc);
+
+                               pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(1));
+                               pemx_cfg.cn78xx.lanes8 = 0;
+                               pemx_cfg.cn78xx.hostmd = rc;
+                               pemx_cfg.cn78xx.md = gen3;
+                               csr_wr_node(node, CVMX_PEMX_CFG(1), pemx_cfg.u64);
+
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(1));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(1), pemx_on.u64);
+                       } else {
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(0));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(0), pemx_on.u64);
+                       }
+                       break;
+               }
+               case 2: /* Either PEM2 x4 or PEM2 x8 */
+               {
+                       cvmx_rst_soft_prstx_t rst_prst;
+
+                       rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(2));
+                       rst_prst.s.soft_prst = rc;
+                       csr_wr_node(node, CVMX_RST_SOFT_PRSTX(2), rst_prst.u64);
+                       __setup_pem_reset(node, 2, !rc);
+
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
+                       pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
+                       pemx_cfg.cn78xx.hostmd = rc;
+                       pemx_cfg.cn78xx.md = gen3;
+                       csr_wr_node(node, CVMX_PEMX_CFG(2), pemx_cfg.u64);
+                       /* x8 mode waits for QLM3 setup before turning on the PEM */
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(2));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(2), pemx_on.u64);
+                       }
+                       break;
+               }
+               case 3: /* Either PEM2 x8 or PEM3 x4 */
+               {
+                       pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* Last 4 lanes of PEM2 */
+                               /* PEMX_CFG already setup */
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(2));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(2), pemx_on.u64);
+                       }
+                       /* Check if PEM3 uses QLM3 and in x4 lane mode */
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               cvmx_rst_soft_prstx_t rst_prst;
+
+                               rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(3));
+                               rst_prst.s.soft_prst = rc;
+                               csr_wr_node(node, CVMX_RST_SOFT_PRSTX(3), rst_prst.u64);
+                               __setup_pem_reset(node, 3, !rc);
+
+                               pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
+                               pemx_cfg.cn78xx.lanes8 = 0;
+                               pemx_cfg.cn78xx.hostmd = rc;
+                               pemx_cfg.cn78xx.md = gen3;
+                               csr_wr_node(node, CVMX_PEMX_CFG(3), pemx_cfg.u64);
+
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(3));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(3), pemx_on.u64);
+                       }
+                       break;
+               }
+               case 4: /* Either PEM3 x4 or PEM3 x8 */
+               {
+                       if (mode == CVMX_QLM_MODE_PCIE_1X8) {
+                               /* Last 4 lanes of PEM3 */
+                               /* PEMX_CFG already setup */
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(3));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(3), pemx_on.u64);
+                       } else {
+                               /* 4 lanes of PEM3 */
+                               cvmx_pemx_qlm_t pemx_qlm;
+                               cvmx_rst_soft_prstx_t rst_prst;
+
+                               rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(3));
+                               rst_prst.s.soft_prst = rc;
+                               csr_wr_node(node, CVMX_RST_SOFT_PRSTX(3), rst_prst.u64);
+                               __setup_pem_reset(node, 3, !rc);
+
+                               pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
+                               pemx_cfg.cn78xx.lanes8 = 0;
+                               pemx_cfg.cn78xx.hostmd = rc;
+                               pemx_cfg.cn78xx.md = gen3;
+                               csr_wr_node(node, CVMX_PEMX_CFG(3), pemx_cfg.u64);
+                               /* PEM3 is on QLM4 */
+                               pemx_qlm.u64 = csr_rd_node(node, CVMX_PEMX_QLM(3));
+                               pemx_qlm.cn78xx.pem3qlm = 1;
+                               csr_wr_node(node, CVMX_PEMX_QLM(3), pemx_qlm.u64);
+                               pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(3));
+                               pemx_on.s.pemon = 1;
+                               csr_wr_node(node, CVMX_PEMX_ON(3), pemx_on.u64);
+                       }
+                       break;
+               }
+               default:
+                       break;
+               }
+               break;
+       }
+       case CVMX_QLM_MODE_ILK:
+               is_ilk = 1;
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
+               if (lane_mode == -1)
+                       return -1;
+               /* FIXME: Set lane_mode for other speeds */
+               break;
+       case CVMX_QLM_MODE_SGMII:
+               is_bgx = 1;
+               lmac_type = 0;
+               lane_to_sds = 1;
+               num_ports = 4;
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
+               debug("%s: SGMII lane mode: %d, alternate PLL: %s\n", __func__, lane_mode,
+                     alt_pll ? "true" : "false");
+               if (lane_mode == -1)
+                       return -1;
+               break;
+       case CVMX_QLM_MODE_XAUI:
+               is_bgx = 5;
+               lmac_type = 1;
+               lane_to_sds = 0xe4;
+               num_ports = 1;
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
+               debug("%s: XAUI lane mode: %d\n", __func__, lane_mode);
+               if (lane_mode == -1)
+                       return -1;
+               break;
+       case CVMX_QLM_MODE_RXAUI:
+               is_bgx = 3;
+               lmac_type = 2;
+               lane_to_sds = 0;
+               num_ports = 2;
+               debug("%s: RXAUI lane mode: %d\n", __func__, lane_mode);
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
+               if (lane_mode == -1)
+                       return -1;
+               break;
+       case CVMX_QLM_MODE_XFI: /* 10GR_4X1 */
+       case CVMX_QLM_MODE_10G_KR:
+               is_bgx = 1;
+               lmac_type = 3;
+               lane_to_sds = 1;
+               num_ports = 4;
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
+               debug("%s: XFI/10G_KR lane mode: %d\n", __func__, lane_mode);
+               if (lane_mode == -1)
+                       return -1;
+               break;
+       case CVMX_QLM_MODE_XLAUI: /* 40GR4_1X4 */
+       case CVMX_QLM_MODE_40G_KR4:
+               is_bgx = 5;
+               lmac_type = 4;
+               lane_to_sds = 0xe4;
+               num_ports = 1;
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
+               debug("%s: XLAUI/40G_KR4 lane mode: %d\n", __func__, lane_mode);
+               if (lane_mode == -1)
+                       return -1;
+               break;
+       case CVMX_QLM_MODE_DISABLED:
+               /* Power down the QLM */
+               phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
+               phy_ctl.s.phy_pd = 1;
+               phy_ctl.s.phy_reset = 1;
+               csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+               /* Disable all modes */
+               csr_wr_node(node, CVMX_GSERX_CFG(qlm), 0);
+               /* Do nothing */
+               return 0;
+       default:
+               break;
+       }
+
+       if (alt_pll) {
+               debug("%s: alternate PLL settings used for node %d, qlm %d, lane mode %d, reference clock %d\n",
+                     __func__, node, qlm, lane_mode, ref_clk_sel);
+               if (__set_qlm_ref_clk_cn78xx(node, qlm, lane_mode, ref_clk_sel)) {
+                       printf("%s: Error: reference clock %d is not supported for node %d, qlm %d\n",
+                              __func__, ref_clk_sel, node, qlm);
+                       return -1;
+               }
+       }
+
+       /* Power up PHY, but keep it in reset */
+       phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_pd = 0;
+       phy_ctl.s.phy_reset = 1;
+       csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       /* Errata GSER-20788: GSER(0..13)_CFG[BGX_QUAD]=1 is broken. Force the
+        * BGX_QUAD bit to be clear for CN78XX pass 1.x
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
+               is_bgx &= 3;
+
+       /* Set GSER for the interface mode */
+       cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
+       cfg.s.ila = is_ilk;
+       cfg.s.bgx = is_bgx & 1;
+       cfg.s.bgx_quad = (is_bgx >> 2) & 1;
+       cfg.s.bgx_dual = (is_bgx >> 1) & 1;
+       cfg.s.pcie = is_pcie;
+       csr_wr_node(node, CVMX_GSERX_CFG(qlm), cfg.u64);
+
+       /* Lane mode */
+       lmode.u64 = csr_rd_node(node, CVMX_GSERX_LANE_MODE(qlm));
+       lmode.s.lmode = lane_mode;
+       csr_wr_node(node, CVMX_GSERX_LANE_MODE(qlm), lmode.u64);
+
+       /* BGX0-1 can connect to QLM0-1 or QLM 2-3. Program the select bit if we're
+        * one of these QLMs and we're using BGX
+        */
+       if (qlm < 4 && is_bgx) {
+               int bgx = qlm & 1;
+               int use_upper = (qlm >> 1) & 1;
+               cvmx_bgxx_cmr_global_config_t global_cfg;
+
+               global_cfg.u64 = csr_rd_node(node, CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx));
+               global_cfg.s.pmux_sds_sel = use_upper;
+               csr_wr_node(node, CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx), global_cfg.u64);
+       }
+
+       /* Bring phy out of reset */
+       phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 0;
+       csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+       csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
+
+       /*
+        * Wait 250 ns until the management interface is ready to accept
+        * read/write commands.
+        */
+       udelay(1);
+
+       if (is_bgx) {
+               int bgx = (qlm < 2) ? qlm : qlm - 2;
+               cvmx_bgxx_cmrx_config_t cmr_config;
+               int index;
+
+               for (index = 0; index < num_ports; index++) {
+                       cmr_config.u64 = csr_rd_node(node, CVMX_BGXX_CMRX_CONFIG(index, bgx));
+                       cmr_config.s.enable = 0;
+                       cmr_config.s.data_pkt_tx_en = 0;
+                       cmr_config.s.data_pkt_rx_en = 0;
+                       cmr_config.s.lmac_type = lmac_type;
+                       cmr_config.s.lane_to_sds = ((lane_to_sds == 1) ?
+                                                   index : ((lane_to_sds == 0) ?
+                                                            (index ? 0xe : 4) :
+                                                            lane_to_sds));
+                       csr_wr_node(node, CVMX_BGXX_CMRX_CONFIG(index, bgx), cmr_config.u64);
+               }
+               csr_wr_node(node, CVMX_BGXX_CMR_TX_LMACS(bgx), num_ports);
+               csr_wr_node(node, CVMX_BGXX_CMR_RX_LMACS(bgx), num_ports);
+
+               /* Enable/disable training for 10G_KR/40G_KR4/XFI/XLAUI modes */
+               for (index = 0; index < num_ports; index++) {
+                       cvmx_bgxx_spux_br_pmd_control_t spu_pmd_control;
+
+                       spu_pmd_control.u64 =
+                               csr_rd_node(node, CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
+
+                       if (mode == CVMX_QLM_MODE_10G_KR || mode == CVMX_QLM_MODE_40G_KR4)
+                               spu_pmd_control.s.train_en = 1;
+                       else if (mode == CVMX_QLM_MODE_XFI || mode == CVMX_QLM_MODE_XLAUI)
+                               spu_pmd_control.s.train_en = 0;
+
+                       csr_wr_node(node, CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx),
+                                   spu_pmd_control.u64);
+               }
+       }
+
+       /* Configure the gser pll */
+       if (!is_pcie)
+               __qlm_setup_pll_cn78xx(node, qlm);
+
+       /* Wait for reset to complete and the PLL to lock */
+       if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_PLL_STAT(qlm),
+                                      cvmx_gserx_pll_stat_t,
+                                      pll_lock, ==, 1, 10000)) {
+               printf("%d:QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n",
+                      node, qlm);
+               return -1;
+       }
+
+       /* Perform PCIe errata workaround */
+       if (is_pcie)
+               __cvmx_qlm_pcie_errata_cn78xx(node, qlm);
+       else
+               __qlm_init_errata_20844(node, qlm);
+
+       /* Wait for reset to complete and the PLL to lock */
+       /* PCIe mode doesn't become ready until the PEM block attempts to bring
+        * the interface up. Skip this check for PCIe
+        */
+       if (!is_pcie && CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_QLM_STAT(qlm),
+                                                  cvmx_gserx_qlm_stat_t, rst_rdy,
+                                                  ==, 1, 10000)) {
+               printf("%d:QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n",
+                      node, qlm);
+               return -1;
+       }
+
+       /* Errata GSER-26150: 10G PHY PLL Temperature Failure */
+       /* This workaround must be completed after the final deassertion of
+        * GSERx_PHY_CTL[PHY_RESET].
+        * Apply the workaround to 10.3125Gbps and 8Gbps only.
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) &&
+           (baud_mhz == 103125 || (is_pcie && gen3 == 2)))
+               __qlm_errata_gser_26150(0, qlm, is_pcie);
+
+       /* Errata GSER-26636: 10G-KR/40G-KR - Inverted Tx Coefficient Direction
+        * Change. Applied to all 10G standards (required for KR) but also
+        * applied to other standards in case software training is used
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) && baud_mhz == 103125)
+               __qlm_kr_inc_dec_gser26636(node, qlm);
+
+       /* Errata GSER-25992: RX EQ Default Settings Update (CTLE Bias) */
+       /* This workaround will only be applied to Pass 1.x */
+       /* It will also only be applied if the SERDES data-rate is 10G */
+       /* or if PCIe Gen3 (gen3=2 is PCIe Gen3) */
+       if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) &&
+           (baud_mhz == 103125 || (is_pcie && gen3 == 2)))
+               cvmx_qlm_gser_errata_25992(node, qlm);
+
+       /* Errata GSER-27140: Updating the RX EQ settings due to temperature
+        * drift sensitivities
+        */
+       /* This workaround will also only be applied if the SERDES data-rate is 10G */
+       if (baud_mhz == 103125)
+               __qlm_rx_eq_temp_gser27140(node, qlm);
+
+       /* Reduce the voltage amplitude coming from Marvell PHY and also change
+        * DFE threshold settings for RXAUI interface
+        */
+       if (is_bgx && mode == CVMX_QLM_MODE_RXAUI) {
+               int l;
+
+               for (l = 0; l < 4; l++) {
+                       cvmx_gserx_lanex_rx_cfg_4_t cfg4;
+                       cvmx_gserx_lanex_tx_cfg_0_t cfg0;
+                       /* Change the Q/QB error sampler 0 threshold from 0xD to 0xF */
+                       cfg4.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CFG_4(l, qlm));
+                       cfg4.s.cfg_rx_errdet_ctrl = 0xcf6f;
+                       csr_wr_node(node, CVMX_GSERX_LANEX_RX_CFG_4(l, qlm), cfg4.u64);
+                       /* Reduce the voltage swing to roughly 460mV */
+                       cfg0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_0(l, qlm));
+                       cfg0.s.cfg_tx_swing = 0x12;
+                       csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_0(l, qlm), cfg0.u64);
+               }
+       }
+
+       return 0;
+}
+
+static int __is_qlm_valid_bgx_cn73xx(int qlm)
+{
+       if (qlm == 2 || qlm == 3 || qlm == 5 || qlm == 6)
+               return 0;
+       return 1;
+}
+
+/**
+ * Configure QLM/DLM speed and mode for cn73xx.
+ *
+ * @param qlm     The QLM to configure
+ * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
+ * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
+ * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
+ * @param gen3    Only used for PCIe
+ *                     gen3 = 2 GEN3 mode
+ *                     gen3 = 1 GEN2 mode
+ *                     gen3 = 0 GEN1 mode
+ *
+ * @param ref_clk_sel   The reference-clock selection to use to configure QLM
+ *                     0 = REF_100MHZ
+ *                     1 = REF_125MHZ
+ *                     2 = REF_156MHZ
+ *                     3 = REF_161MHZ
+ *
+ * @param ref_clk_input  The reference-clock input to use to configure QLM
+ *                      0 = QLM/DLM reference clock input
+ *                      1 = common reference clock input 0
+ *                      2 = common reference clock input 1
+ *
+ * @return       Return 0 on success or -1.
+ */
+static int octeon_configure_qlm_cn73xx(int qlm, int baud_mhz, int mode, int rc, int gen3,
+                                      int ref_clk_sel, int ref_clk_input)
+{
+       cvmx_gserx_phy_ctl_t phy_ctl;
+       cvmx_gserx_lane_mode_t lmode;
+       cvmx_gserx_cfg_t cfg;
+       cvmx_gserx_refclk_sel_t refclk_sel;
+       int is_pcie = 0;
+       int is_bgx = 0;
+       int lane_mode = 0;
+       short lmac_type[4] = { 0 };
+       short sds_lane[4] = { 0 };
+       bool alt_pll = false;
+       int enable_training = 0;
+       int additional_lmacs = 0;
+
+       debug("%s(qlm: %d, baud_mhz: %d, mode: %d, rc: %d, gen3: %d, ref_clk_sel: %d, ref_clk_input: %d\n",
+             __func__, qlm, baud_mhz, mode, rc, gen3, ref_clk_sel, ref_clk_input);
+
+       /* Don't configure QLM4 if it is not in SATA mode */
+       if (qlm == 4) {
+               if (mode == CVMX_QLM_MODE_SATA_2X1)
+                       return __setup_sata(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
+
+               printf("Invalid mode for QLM4\n");
+               return 0;
+       }
+
+       cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+
+       /* Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
+        * during speed change. Change SLI_WINDOW_CTL[time] to 525us
+        */
+       __set_sli_window_ctl_errata_31375(0);
+       /* If PEM is in EP, no need to do anything */
+       if (cfg.s.pcie && rc == 0 &&
+           (mode == CVMX_QLM_MODE_PCIE || mode == CVMX_QLM_MODE_PCIE_1X8 ||
+            mode == CVMX_QLM_MODE_PCIE_1X2)) {
+               debug("%s: qlm %d is in PCIe endpoint mode, returning\n", __func__, qlm);
+               return 0;
+       }
+
+       /* Set the reference clock to use */
+       refclk_sel.u64 = 0;
+       if (ref_clk_input == 0) { /* External ref clock */
+               refclk_sel.s.com_clk_sel = 0;
+               refclk_sel.s.use_com1 = 0;
+       } else if (ref_clk_input == 1) {
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 0;
+       } else {
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 1;
+       }
+
+       csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+
+       /* Reset the QLM after changing the reference clock */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 1;
+       phy_ctl.s.phy_pd = 1;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       udelay(1000);
+
+       /* Check if QLM is a valid BGX interface */
+       if (mode != CVMX_QLM_MODE_PCIE && mode != CVMX_QLM_MODE_PCIE_1X2 &&
+           mode != CVMX_QLM_MODE_PCIE_1X8) {
+               if (__is_qlm_valid_bgx_cn73xx(qlm))
+                       return -1;
+       }
+
+       switch (mode) {
+       case CVMX_QLM_MODE_PCIE:
+       case CVMX_QLM_MODE_PCIE_1X2:
+       case CVMX_QLM_MODE_PCIE_1X8: {
+               cvmx_pemx_cfg_t pemx_cfg;
+               cvmx_pemx_on_t pemx_on;
+               cvmx_pemx_qlm_t pemx_qlm;
+               cvmx_rst_soft_prstx_t rst_prst;
+               int port = 0;
+
+               is_pcie = 1;
+
+               if (qlm < 5 && mode == CVMX_QLM_MODE_PCIE_1X2) {
+                       printf("Invalid PCIe mode(%d) for QLM%d\n", mode, qlm);
+                       return -1;
+               }
+
+               if (ref_clk_sel == 0) {
+                       refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
+                       refclk_sel.s.pcie_refclk125 = 0;
+                       csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+                       if (gen3 == 0) /* Gen1 mode */
+                               lane_mode = R_2_5G_REFCLK100;
+                       else if (gen3 == 1) /* Gen2 mode */
+                               lane_mode = R_5G_REFCLK100;
+                       else
+                               lane_mode = R_8G_REFCLK100;
+               } else if (ref_clk_sel == 1) {
+                       refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
+                       refclk_sel.s.pcie_refclk125 = 1;
+                       csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+                       if (gen3 == 0) /* Gen1 mode */
+                               lane_mode = R_2_5G_REFCLK125;
+                       else if (gen3 == 1) /* Gen2 mode */
+                               lane_mode = R_5G_REFCLK125;
+                       else
+                               lane_mode = R_8G_REFCLK125;
+               } else {
+                       printf("Invalid reference clock for PCIe on QLM%d\n", qlm);
+                       return -1;
+               }
+
+               switch (qlm) {
+               case 0: /* Either x4 or x8 based on PEM0 */
+                       rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(0));
+                       rst_prst.s.soft_prst = rc;
+                       csr_wr(CVMX_RST_SOFT_PRSTX(0), rst_prst.u64);
+                       __setup_pem_reset(0, 0, !rc);
+
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+                       pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
+                       pemx_cfg.cn78xx.hostmd = rc;
+                       pemx_cfg.cn78xx.md = gen3;
+                       csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
+                       /* x8 mode waits for QLM1 setup before turning on the PEM */
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
+                       }
+                       break;
+               case 1: /* Either PEM0 x8 or PEM1 x4 */
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(1));
+                               rst_prst.s.soft_prst = rc;
+                               csr_wr(CVMX_RST_SOFT_PRSTX(1), rst_prst.u64);
+                               __setup_pem_reset(0, 1, !rc);
+
+                               pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
+                               pemx_cfg.cn78xx.lanes8 = 0;
+                               pemx_cfg.cn78xx.hostmd = rc;
+                               pemx_cfg.cn78xx.md = gen3;
+                               csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
+
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
+                       } else { /* x8 mode */
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
+                       }
+                       break;
+               case 2: /* Either PEM2 x4 or PEM2 x8 or BGX0 */
+               {
+                       pemx_qlm.u64 = csr_rd(CVMX_PEMX_QLM(2));
+                       pemx_qlm.cn73xx.pemdlmsel = 0;
+                       csr_wr(CVMX_PEMX_QLM(2), pemx_qlm.u64);
+
+                       rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(2));
+                       rst_prst.s.soft_prst = rc;
+                       csr_wr(CVMX_RST_SOFT_PRSTX(2), rst_prst.u64);
+                       __setup_pem_reset(0, 2, !rc);
+
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
+                       pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
+                       pemx_cfg.cn78xx.hostmd = rc;
+                       pemx_cfg.cn78xx.md = gen3;
+                       csr_wr(CVMX_PEMX_CFG(2), pemx_cfg.u64);
+                       /* x8 mode waits for QLM3 setup before turning on the PEM */
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(2));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(2), pemx_on.u64);
+                       }
+                       break;
+               }
+               case 3: /* Either PEM2 x8 or PEM3 x4 or BGX1 */
+                       /* PEM2/PEM3 are configured to use QLM2/3 */
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
+                       if (pemx_cfg.cn78xx.lanes8) {
+                               /* Last 4 lanes of PEM2 */
+                               /* PEMX_CFG already setup */
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(2));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(2), pemx_on.u64);
+                       }
+                       /* Check if PEM3 uses QLM3 and in x4 lane mode */
+                       if (mode == CVMX_QLM_MODE_PCIE) {
+                               pemx_qlm.u64 = csr_rd(CVMX_PEMX_QLM(3));
+                               pemx_qlm.cn73xx.pemdlmsel = 0;
+                               csr_wr(CVMX_PEMX_QLM(3), pemx_qlm.u64);
+
+                               rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(3));
+                               rst_prst.s.soft_prst = rc;
+                               csr_wr(CVMX_RST_SOFT_PRSTX(3), rst_prst.u64);
+                               __setup_pem_reset(0, 3, !rc);
+
+                               pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(3));
+                               pemx_cfg.cn78xx.lanes8 = 0;
+                               pemx_cfg.cn78xx.hostmd = rc;
+                               pemx_cfg.cn78xx.md = gen3;
+                               csr_wr(CVMX_PEMX_CFG(3), pemx_cfg.u64);
+
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(3));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(3), pemx_on.u64);
+                       }
+                       break;
+               case 5: /* PEM2/PEM3 x2 or BGX2 */
+               case 6:
+                       port = (qlm == 5) ? 2 : 3;
+                       if (mode == CVMX_QLM_MODE_PCIE_1X2) {
+                               /* PEM2/PEM3 are configured to use DLM5/6 */
+                               pemx_qlm.u64 = csr_rd(CVMX_PEMX_QLM(port));
+                               pemx_qlm.cn73xx.pemdlmsel = 1;
+                               csr_wr(CVMX_PEMX_QLM(port), pemx_qlm.u64);
+                               /* 2 lanes of PEM3 */
+                               rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(port));
+                               rst_prst.s.soft_prst = rc;
+                               csr_wr(CVMX_RST_SOFT_PRSTX(port), rst_prst.u64);
+                               __setup_pem_reset(0, port, !rc);
+
+                               pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(port));
+                               pemx_cfg.cn78xx.lanes8 = 0;
+                               pemx_cfg.cn78xx.hostmd = rc;
+                               pemx_cfg.cn78xx.md = gen3;
+                               csr_wr(CVMX_PEMX_CFG(port), pemx_cfg.u64);
+
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(port));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(port), pemx_on.u64);
+                       }
+                       break;
+               default:
+                       break;
+               }
+               break;
+       }
+       case CVMX_QLM_MODE_SGMII:
+               is_bgx = 1;
+               lmac_type[0] = 0;
+               lmac_type[1] = 0;
+               lmac_type[2] = 0;
+               lmac_type[3] = 0;
+               sds_lane[0] = 0;
+               sds_lane[1] = 1;
+               sds_lane[2] = 2;
+               sds_lane[3] = 3;
+               break;
+       case CVMX_QLM_MODE_SGMII_2X1:
+               if (qlm == 5) {
+                       is_bgx = 1;
+                       lmac_type[0] = 0;
+                       lmac_type[1] = 0;
+                       lmac_type[2] = -1;
+                       lmac_type[3] = -1;
+                       sds_lane[0] = 0;
+                       sds_lane[1] = 1;
+               } else if (qlm == 6) {
+                       is_bgx = 1;
+                       lmac_type[0] = -1;
+                       lmac_type[1] = -1;
+                       lmac_type[2] = 0;
+                       lmac_type[3] = 0;
+                       sds_lane[2] = 2;
+                       sds_lane[3] = 3;
+                       additional_lmacs = 2;
+               }
+               break;
+       case CVMX_QLM_MODE_XAUI:
+               is_bgx = 5;
+               lmac_type[0] = 1;
+               lmac_type[1] = -1;
+               lmac_type[2] = -1;
+               lmac_type[3] = -1;
+               sds_lane[0] = 0xe4;
+               break;
+       case CVMX_QLM_MODE_RXAUI:
+               is_bgx = 3;
+               lmac_type[0] = 2;
+               lmac_type[1] = 2;
+               lmac_type[2] = -1;
+               lmac_type[3] = -1;
+               sds_lane[0] = 0x4;
+               sds_lane[1] = 0xe;
+               break;
+       case CVMX_QLM_MODE_RXAUI_1X2:
+               if (qlm == 5) {
+                       is_bgx = 3;
+                       lmac_type[0] = 2;
+                       lmac_type[1] = -1;
+                       lmac_type[2] = -1;
+                       lmac_type[3] = -1;
+                       sds_lane[0] = 0x4;
+               }
+               if (qlm == 6) {
+                       is_bgx = 3;
+                       lmac_type[0] = -1;
+                       lmac_type[1] = -1;
+                       lmac_type[2] = 2;
+                       lmac_type[3] = -1;
+                       sds_lane[2] = 0xe;
+                       additional_lmacs = 2;
+               }
+               break;
+       case CVMX_QLM_MODE_10G_KR:
+               enable_training = 1;
+       case CVMX_QLM_MODE_XFI: /* 10GR_4X1 */
+               is_bgx = 1;
+               lmac_type[0] = 3;
+               lmac_type[1] = 3;
+               lmac_type[2] = 3;
+               lmac_type[3] = 3;
+               sds_lane[0] = 0;
+               sds_lane[1] = 1;
+               sds_lane[2] = 2;
+               sds_lane[3] = 3;
+               break;
+       case CVMX_QLM_MODE_10G_KR_1X2:
+               enable_training = 1;
+       case CVMX_QLM_MODE_XFI_1X2:
+               if (qlm == 5) {
+                       is_bgx = 1;
+                       lmac_type[0] = 3;
+                       lmac_type[1] = 3;
+                       lmac_type[2] = -1;
+                       lmac_type[3] = -1;
+                       sds_lane[0] = 0;
+                       sds_lane[1] = 1;
+               } else if (qlm == 6) {
+                       is_bgx = 1;
+                       lmac_type[0] = -1;
+                       lmac_type[1] = -1;
+                       lmac_type[2] = 3;
+                       lmac_type[3] = 3;
+                       sds_lane[2] = 2;
+                       sds_lane[3] = 3;
+                       additional_lmacs = 2;
+               }
+               break;
+       case CVMX_QLM_MODE_40G_KR4:
+               enable_training = 1;
+       case CVMX_QLM_MODE_XLAUI: /* 40GR4_1X4 */
+               is_bgx = 5;
+               lmac_type[0] = 4;
+               lmac_type[1] = -1;
+               lmac_type[2] = -1;
+               lmac_type[3] = -1;
+               sds_lane[0] = 0xe4;
+               break;
+       case CVMX_QLM_MODE_RGMII_SGMII:
+               is_bgx = 1;
+               lmac_type[0] = 5;
+               lmac_type[1] = 0;
+               lmac_type[2] = 0;
+               lmac_type[3] = 0;
+               sds_lane[0] = 0;
+               sds_lane[1] = 1;
+               sds_lane[2] = 2;
+               sds_lane[3] = 3;
+               break;
+       case CVMX_QLM_MODE_RGMII_SGMII_1X1:
+               if (qlm == 5) {
+                       is_bgx = 1;
+                       lmac_type[0] = 5;
+                       lmac_type[1] = 0;
+                       lmac_type[2] = -1;
+                       lmac_type[3] = -1;
+                       sds_lane[0] = 0;
+                       sds_lane[1] = 1;
+               }
+               break;
+       case CVMX_QLM_MODE_RGMII_SGMII_2X1:
+               if (qlm == 6) {
+                       is_bgx = 1;
+                       lmac_type[0] = 5;
+                       lmac_type[1] = -1;
+                       lmac_type[2] = 0;
+                       lmac_type[3] = 0;
+                       sds_lane[0] = 0;
+                       sds_lane[2] = 0;
+                       sds_lane[3] = 1;
+               }
+               break;
+       case CVMX_QLM_MODE_RGMII_10G_KR:
+               enable_training = 1;
+       case CVMX_QLM_MODE_RGMII_XFI:
+               is_bgx = 1;
+               lmac_type[0] = 5;
+               lmac_type[1] = 3;
+               lmac_type[2] = 3;
+               lmac_type[3] = 3;
+               sds_lane[0] = 0;
+               sds_lane[1] = 1;
+               sds_lane[2] = 2;
+               sds_lane[3] = 3;
+               break;
+       case CVMX_QLM_MODE_RGMII_10G_KR_1X1:
+               enable_training = 1;
+       case CVMX_QLM_MODE_RGMII_XFI_1X1:
+               if (qlm == 5) {
+                       is_bgx = 3;
+                       lmac_type[0] = 5;
+                       lmac_type[1] = 3;
+                       lmac_type[2] = -1;
+                       lmac_type[3] = -1;
+                       sds_lane[0] = 0;
+                       sds_lane[1] = 1;
+               }
+               break;
+       case CVMX_QLM_MODE_RGMII_40G_KR4:
+               enable_training = 1;
+       case CVMX_QLM_MODE_RGMII_XLAUI:
+               is_bgx = 5;
+               lmac_type[0] = 5;
+               lmac_type[1] = 4;
+               lmac_type[2] = -1;
+               lmac_type[3] = -1;
+               sds_lane[0] = 0x0;
+               sds_lane[1] = 0xe4;
+               break;
+       case CVMX_QLM_MODE_RGMII_RXAUI:
+               is_bgx = 3;
+               lmac_type[0] = 5;
+               lmac_type[1] = 2;
+               lmac_type[2] = 2;
+               lmac_type[3] = -1;
+               sds_lane[0] = 0x0;
+               sds_lane[1] = 0x4;
+               sds_lane[2] = 0xe;
+               break;
+       case CVMX_QLM_MODE_RGMII_XAUI:
+               is_bgx = 5;
+               lmac_type[0] = 5;
+               lmac_type[1] = 1;
+               lmac_type[2] = -1;
+               lmac_type[3] = -1;
+               sds_lane[0] = 0;
+               sds_lane[1] = 0xe4;
+               break;
+       default:
+               break;
+       }
+
+       if (is_pcie == 0)
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
+       debug("%s: %d lane mode: %d, alternate PLL: %s\n", __func__, mode, lane_mode,
+             alt_pll ? "true" : "false");
+       if (lane_mode == -1)
+               return -1;
+
+       if (alt_pll) {
+               debug("%s: alternate PLL settings used for qlm %d, lane mode %d, reference clock %d\n",
+                     __func__, qlm, lane_mode, ref_clk_sel);
+               if (__set_qlm_ref_clk_cn78xx(0, qlm, lane_mode, ref_clk_sel)) {
+                       printf("%s: Error: reference clock %d is not supported for qlm %d, lane mode: 0x%x\n",
+                              __func__, ref_clk_sel, qlm, lane_mode);
+                       return -1;
+               }
+       }
+
+       /* Power up PHY, but keep it in reset */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_pd = 0;
+       phy_ctl.s.phy_reset = 1;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       /* Set GSER for the interface mode */
+       cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+       cfg.s.bgx = is_bgx & 1;
+       cfg.s.bgx_quad = (is_bgx >> 2) & 1;
+       cfg.s.bgx_dual = (is_bgx >> 1) & 1;
+       cfg.s.pcie = is_pcie;
+       csr_wr(CVMX_GSERX_CFG(qlm), cfg.u64);
+
+       /* Lane mode */
+       lmode.u64 = csr_rd(CVMX_GSERX_LANE_MODE(qlm));
+       lmode.s.lmode = lane_mode;
+       csr_wr(CVMX_GSERX_LANE_MODE(qlm), lmode.u64);
+
+       /* Program lmac_type to figure out the type of BGX interface configured */
+       if (is_bgx) {
+               int bgx = (qlm < 4) ? qlm - 2 : 2;
+               cvmx_bgxx_cmrx_config_t cmr_config;
+               cvmx_bgxx_cmr_rx_lmacs_t rx_lmacs;
+               cvmx_bgxx_spux_br_pmd_control_t spu_pmd_control;
+               int index, total_lmacs = 0;
+
+               for (index = 0; index < 4; index++) {
+                       cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, bgx));
+                       cmr_config.s.enable = 0;
+                       cmr_config.s.data_pkt_rx_en = 0;
+                       cmr_config.s.data_pkt_tx_en = 0;
+                       if (lmac_type[index] != -1) {
+                               cmr_config.s.lmac_type = lmac_type[index];
+                               cmr_config.s.lane_to_sds = sds_lane[index];
+                               total_lmacs++;
+                               /* RXAUI takes up 2 lmacs */
+                               if (lmac_type[index] == 2)
+                                       total_lmacs += 1;
+                       }
+                       csr_wr(CVMX_BGXX_CMRX_CONFIG(index, bgx), cmr_config.u64);
+
+                       /* Errata (TBD) RGMII doesn't turn on clock if its by
+                        * itself. Force them on
+                        */
+                       if (lmac_type[index] == 5) {
+                               cvmx_bgxx_cmr_global_config_t global_config;
+
+                               global_config.u64 = csr_rd(CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx));
+                               global_config.s.bgx_clk_enable = 1;
+                               csr_wr(CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx), global_config.u64);
+                       }
+
+                       /* Enable training for 10G_KR/40G_KR4 modes */
+                       if (enable_training == 1 &&
+                           (lmac_type[index] == 3 || lmac_type[index] == 4)) {
+                               spu_pmd_control.u64 =
+                                       csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
+                               spu_pmd_control.s.train_en = 1;
+                               csr_wr(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx),
+                                      spu_pmd_control.u64);
+                       }
+               }
+
+               /* Update the total number of lmacs */
+               rx_lmacs.u64 = csr_rd(CVMX_BGXX_CMR_RX_LMACS(bgx));
+               rx_lmacs.s.lmacs = total_lmacs + additional_lmacs;
+               csr_wr(CVMX_BGXX_CMR_RX_LMACS(bgx), rx_lmacs.u64);
+               csr_wr(CVMX_BGXX_CMR_TX_LMACS(bgx), rx_lmacs.u64);
+       }
+
+       /* Bring phy out of reset */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 0;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       /*
+        * Wait 1us until the management interface is ready to accept
+        * read/write commands.
+        */
+       udelay(1);
+
+       /* Wait for reset to complete and the PLL to lock */
+       /* PCIe mode doesn't become ready until the PEM block attempts to bring
+        * the interface up. Skip this check for PCIe
+        */
+       if (!is_pcie && CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm),
+                                             cvmx_gserx_qlm_stat_t,
+                                             rst_rdy, ==, 1, 10000)) {
+               printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
+               return -1;
+       }
+
+       /* Configure the gser pll */
+       if (!is_pcie)
+               __qlm_setup_pll_cn78xx(0, qlm);
+
+       /* Wait for reset to complete and the PLL to lock */
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_PLL_STAT(qlm), cvmx_gserx_pll_stat_t,
+                                 pll_lock, ==, 1, 10000)) {
+               printf("QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n", qlm);
+               return -1;
+       }
+
+       /* Errata GSER-26150: 10G PHY PLL Temperature Failure */
+       /* This workaround must be completed after the final deassertion of
+        * GSERx_PHY_CTL[PHY_RESET].
+        * Apply the workaround to 10.3125Gbps and 8Gbps only.
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_0) &&
+           (baud_mhz == 103125 || (is_pcie && gen3 == 2)))
+               __qlm_errata_gser_26150(0, qlm, is_pcie);
+
+       /* Errata GSER-26636: 10G-KR/40G-KR - Inverted Tx Coefficient Direction
+        * Change. Applied to all 10G standards (required for KR) but also
+        * applied to other standards in case software training is used
+        */
+       if (baud_mhz == 103125)
+               __qlm_kr_inc_dec_gser26636(0, qlm);
+
+       /* Errata GSER-25992: RX EQ Default Settings Update (CTLE Bias) */
+       /* This workaround will only be applied to Pass 1.x */
+       /* It will also only be applied if the SERDES data-rate is 10G */
+       /* or if PCIe Gen3 (gen3=2 is PCIe Gen3) */
+       if (baud_mhz == 103125 || (is_pcie && gen3 == 2))
+               cvmx_qlm_gser_errata_25992(0, qlm);
+
+       /* Errata GSER-27140: Updating the RX EQ settings due to temperature
+        * drift sensitivities
+        */
+       /* This workaround will also only be applied if the SERDES data-rate is 10G */
+       if (baud_mhz == 103125)
+               __qlm_rx_eq_temp_gser27140(0, qlm);
+
+       /* Reduce the voltage amplitude coming from Marvell PHY and also change
+        * DFE threshold settings for RXAUI interface
+        */
+       if (is_bgx) {
+               int l;
+
+               for (l = 0; l < 4; l++) {
+                       cvmx_gserx_lanex_rx_cfg_4_t cfg4;
+                       cvmx_gserx_lanex_tx_cfg_0_t cfg0;
+
+                       if (lmac_type[l] == 2) {
+                               /* Change the Q/QB error sampler 0 threshold from 0xD to 0xF */
+                               cfg4.u64 = csr_rd(CVMX_GSERX_LANEX_RX_CFG_4(l, qlm));
+                               cfg4.s.cfg_rx_errdet_ctrl = 0xcf6f;
+                               csr_wr(CVMX_GSERX_LANEX_RX_CFG_4(l, qlm), cfg4.u64);
+                               /* Reduce the voltage swing to roughly 460mV */
+                               cfg0.u64 = csr_rd(CVMX_GSERX_LANEX_TX_CFG_0(l, qlm));
+                               cfg0.s.cfg_tx_swing = 0x12;
+                               csr_wr(CVMX_GSERX_LANEX_TX_CFG_0(l, qlm), cfg0.u64);
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int __rmac_pll_config(int baud_mhz, int qlm, int mode)
+{
+       cvmx_gserx_pll_px_mode_0_t pmode0;
+       cvmx_gserx_pll_px_mode_1_t pmode1;
+       cvmx_gserx_lane_px_mode_0_t lmode0;
+       cvmx_gserx_lane_px_mode_1_t lmode1;
+       cvmx_gserx_lane_mode_t lmode;
+
+       switch (baud_mhz) {
+       case 98304:
+               pmode0.u64 = 0x1a0a;
+               pmode1.u64 = 0x3228;
+               lmode0.u64 = 0x600f;
+               lmode1.u64 = 0xa80f;
+               break;
+       case 49152:
+               if (mode == CVMX_QLM_MODE_SDL) {
+                       pmode0.u64 = 0x3605;
+                       pmode1.u64 = 0x0814;
+                       lmode0.u64 = 0x000f;
+                       lmode1.u64 = 0x6814;
+               } else {
+                       pmode0.u64 = 0x1a0a;
+                       pmode1.u64 = 0x3228;
+                       lmode0.u64 = 0x650f;
+                       lmode1.u64 = 0xe80f;
+               }
+               break;
+       case 24576:
+               pmode0.u64 = 0x1a0a;
+               pmode1.u64 = 0x3228;
+               lmode0.u64 = 0x6a0f;
+               lmode1.u64 = 0xe80f;
+               break;
+       case 12288:
+               pmode0.u64 = 0x1a0a;
+               pmode1.u64 = 0x3228;
+               lmode0.u64 = 0x6f0f;
+               lmode1.u64 = 0xe80f;
+               break;
+       case 6144:
+               pmode0.u64 = 0x160a;
+               pmode1.u64 = 0x1019;
+               lmode0.u64 = 0x000f;
+               lmode1.u64 = 0x2814;
+               break;
+       case 3072:
+               pmode0.u64 = 0x160a;
+               pmode1.u64 = 0x1019;
+               lmode0.u64 = 0x050f;
+               lmode1.u64 = 0x6814;
+               break;
+       default:
+               printf("Invalid speed for CPRI/SDL configuration\n");
+               return -1;
+       }
+
+       lmode.u64 = csr_rd(CVMX_GSERX_LANE_MODE(qlm));
+       csr_wr(CVMX_GSERX_PLL_PX_MODE_0(lmode.s.lmode, qlm), pmode0.u64);
+       csr_wr(CVMX_GSERX_PLL_PX_MODE_1(lmode.s.lmode, qlm), pmode1.u64);
+       csr_wr(CVMX_GSERX_LANE_PX_MODE_0(lmode.s.lmode, qlm), lmode0.u64);
+       csr_wr(CVMX_GSERX_LANE_PX_MODE_1(lmode.s.lmode, qlm), lmode1.u64);
+       return 0;
+}
+
+/**
+ * Configure QLM/DLM speed and mode for cnf75xx.
+ *
+ * @param qlm     The QLM to configure
+ * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
+ * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
+ * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
+ * @param gen3    Only used for PCIe
+ *                     gen3 = 2 GEN3 mode
+ *                     gen3 = 1 GEN2 mode
+ *                     gen3 = 0 GEN1 mode
+ *
+ * @param ref_clk_sel    The reference-clock selection to use to configure QLM
+ *                      0 = REF_100MHZ
+ *                      1 = REF_125MHZ
+ *                      2 = REF_156MHZ
+ *                      3 = REF_122MHZ
+ * @param ref_clk_input  The reference-clock input to use to configure QLM
+ *
+ * @return       Return 0 on success or -1.
+ */
+static int octeon_configure_qlm_cnf75xx(int qlm, int baud_mhz, int mode, int rc, int gen3,
+                                       int ref_clk_sel, int ref_clk_input)
+{
+       cvmx_gserx_phy_ctl_t phy_ctl;
+       cvmx_gserx_lane_mode_t lmode;
+       cvmx_gserx_cfg_t cfg;
+       cvmx_gserx_refclk_sel_t refclk_sel;
+       int is_pcie = 0;
+       int is_bgx = 0;
+       int is_srio = 0;
+       int is_rmac = 0;
+       int is_rmac_pipe = 0;
+       int lane_mode = 0;
+       short lmac_type[4] = { 0 };
+       short sds_lane[4] = { 0 };
+       bool alt_pll = false;
+       int enable_training = 0;
+       int additional_lmacs = 0;
+       int port = (qlm == 3) ? 1 : 0;
+       cvmx_sriox_status_reg_t status_reg;
+
+       debug("%s(qlm: %d, baud_mhz: %d, mode: %d, rc: %d, gen3: %d, ref_clk_sel: %d, ref_clk_input: %d\n",
+             __func__, qlm, baud_mhz, mode, rc, gen3, ref_clk_sel, ref_clk_input);
+       if (qlm > 8) {
+               printf("Invalid qlm%d passed\n", qlm);
+               return -1;
+       }
+
+       /* Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
+        *  during speed change. Change SLI_WINDOW_CTL[time] to 525us
+        */
+       __set_sli_window_ctl_errata_31375(0);
+
+       cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+
+       /* If PEM is in EP, no need to do anything */
+       if (cfg.s.pcie && rc == 0) {
+               debug("%s: qlm %d is in PCIe endpoint mode, returning\n", __func__, qlm);
+               return 0;
+       }
+
+       if (cfg.s.srio && rc == 0) {
+               debug("%s: qlm %d is in SRIO endpoint mode, returning\n", __func__, qlm);
+               return 0;
+       }
+
+       /* Set the reference clock to use */
+       refclk_sel.u64 = 0;
+       if (ref_clk_input == 0) { /* External ref clock */
+               refclk_sel.s.com_clk_sel = 0;
+               refclk_sel.s.use_com1 = 0;
+       } else if (ref_clk_input == 1) {
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 0;
+       } else {
+               refclk_sel.s.com_clk_sel = 1;
+               refclk_sel.s.use_com1 = 1;
+       }
+
+       csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+
+       /* Reset the QLM after changing the reference clock */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 1;
+       phy_ctl.s.phy_pd = 1;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       udelay(1000);
+
+       switch (mode) {
+       case CVMX_QLM_MODE_PCIE:
+       case CVMX_QLM_MODE_PCIE_1X2:
+       case CVMX_QLM_MODE_PCIE_2X1: {
+               cvmx_pemx_cfg_t pemx_cfg;
+               cvmx_pemx_on_t pemx_on;
+               cvmx_rst_soft_prstx_t rst_prst;
+
+               is_pcie = 1;
+
+               if (qlm > 1) {
+                       printf("Invalid PCIe mode for QLM%d\n", qlm);
+                       return -1;
+               }
+
+               if (ref_clk_sel == 0) {
+                       refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
+                       refclk_sel.s.pcie_refclk125 = 0;
+                       csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+                       if (gen3 == 0) /* Gen1 mode */
+                               lane_mode = R_2_5G_REFCLK100;
+                       else if (gen3 == 1) /* Gen2 mode */
+                               lane_mode = R_5G_REFCLK100;
+                       else
+                               lane_mode = R_8G_REFCLK100;
+               } else if (ref_clk_sel == 1) {
+                       refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
+                       refclk_sel.s.pcie_refclk125 = 1;
+                       csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
+                       if (gen3 == 0) /* Gen1 mode */
+                               lane_mode = R_2_5G_REFCLK125;
+                       else if (gen3 == 1) /* Gen2 mode */
+                               lane_mode = R_5G_REFCLK125;
+                       else
+                               lane_mode = R_8G_REFCLK125;
+               } else {
+                       printf("Invalid reference clock for PCIe on QLM%d\n", qlm);
+                       return -1;
+               }
+
+               switch (qlm) {
+               case 0: /* Either x4 or x2 based on PEM0 */
+                       rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(0));
+                       rst_prst.s.soft_prst = rc;
+                       csr_wr(CVMX_RST_SOFT_PRSTX(0), rst_prst.u64);
+                       __setup_pem_reset(0, 0, !rc);
+
+                       pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
+                       pemx_cfg.cnf75xx.hostmd = rc;
+                       pemx_cfg.cnf75xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE);
+                       pemx_cfg.cnf75xx.md = gen3;
+                       csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
+                       /* x4 mode waits for QLM1 setup before turning on the PEM */
+                       if (mode == CVMX_QLM_MODE_PCIE_1X2 || mode == CVMX_QLM_MODE_PCIE_2X1) {
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
+                       }
+                       break;
+               case 1: /* Either PEM0 x4 or PEM1 x2 */
+                       if (mode == CVMX_QLM_MODE_PCIE_1X2 || mode == CVMX_QLM_MODE_PCIE_2X1) {
+                               rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(1));
+                               rst_prst.s.soft_prst = rc;
+                               csr_wr(CVMX_RST_SOFT_PRSTX(1), rst_prst.u64);
+                               __setup_pem_reset(0, 1, !rc);
+
+                               pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
+                               pemx_cfg.cnf75xx.hostmd = rc;
+                               pemx_cfg.cnf75xx.md = gen3;
+                               csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
+
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
+                       } else {
+                               pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
+                               pemx_on.s.pemon = 1;
+                               csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
+                       }
+                       break;
+               default:
+                       break;
+               }
+               break;
+       }
+       case CVMX_QLM_MODE_SRIO_1X4:
+       case CVMX_QLM_MODE_SRIO_2X2:
+       case CVMX_QLM_MODE_SRIO_4X1: {
+               int spd = 0xf;
+
+               if (cvmx_fuse_read(1601)) {
+                       debug("SRIO is not supported on cnf73xx model\n");
+                       return -1;
+               }
+
+               switch (baud_mhz) {
+               case 1250:
+                       switch (ref_clk_sel) {
+                       case 0: /* 100 MHz ref clock */
+                               spd = 0x3;
+                               break;
+                       case 1: /* 125 MHz ref clock */
+                               spd = 0xa;
+                               break;
+                       case 2: /* 156.25 MHz ref clock */
+                               spd = 0x4;
+                               break;
+                       default:
+                               spd = 0xf; /* Disabled */
+                               break;
+                       }
+                       break;
+               case 2500:
+                       switch (ref_clk_sel) {
+                       case 0: /* 100 MHz ref clock */
+                               spd = 0x2;
+                               break;
+                       case 1: /* 125 MHz ref clock */
+                               spd = 0x9;
+                               break;
+                       case 2: /* 156.25 MHz ref clock */
+                               spd = 0x7;
+                               break;
+                       default:
+                               spd = 0xf; /* Disabled */
+                               break;
+                       }
+                       break;
+               case 3125:
+                       switch (ref_clk_sel) {
+                       case 1: /* 125 MHz ref clock */
+                               spd = 0x8;
+                               break;
+                       case 2: /* 156.25 MHz ref clock */
+                               spd = 0xe;
+                               break;
+                       default:
+                               spd = 0xf; /* Disabled */
+                               break;
+                       }
+                       break;
+               case 5000:
+                       switch (ref_clk_sel) {
+                       case 0: /* 100 MHz ref clock */
+                               spd = 0x0;
+                               break;
+                       case 1: /* 125 MHz ref clock */
+                               spd = 0x6;
+                               break;
+                       case 2: /* 156.25 MHz ref clock */
+                               spd = 0xb;
+                               break;
+                       default:
+                               spd = 0xf; /* Disabled */
+                               break;
+                       }
+                       break;
+               default:
+                       spd = 0xf;
+                       break;
+               }
+
+               if (spd == 0xf) {
+                       printf("ERROR: Invalid SRIO speed (%d) configured for QLM%d\n", baud_mhz,
+                              qlm);
+                       return -1;
+               }
+
+               status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(port));
+               status_reg.s.spd = spd;
+               csr_wr(CVMX_SRIOX_STATUS_REG(port), status_reg.u64);
+               is_srio = 1;
+               break;
+       }
+
+       case CVMX_QLM_MODE_SGMII_2X1:
+               if (qlm == 4) {
+                       is_bgx = 1;
+                       lmac_type[0] = 0;
+                       lmac_type[1] = 0;
+                       lmac_type[2] = -1;
+                       lmac_type[3] = -1;
+                       sds_lane[0] = 0;
+                       sds_lane[1] = 1;
+               } else if (qlm == 5) {
+                       is_bgx = 1;
+                       lmac_type[0] = -1;
+                       lmac_type[1] = -1;
+                       lmac_type[2] = 0;
+                       lmac_type[3] = 0;
+                       sds_lane[2] = 2;
+                       sds_lane[3] = 3;
+                       additional_lmacs = 2;
+               }
+               break;
+       case CVMX_QLM_MODE_10G_KR_1X2:
+               enable_training = 1;
+       case CVMX_QLM_MODE_XFI_1X2:
+               if (qlm == 5) {
+                       is_bgx = 1;
+                       lmac_type[0] = -1;
+                       lmac_type[1] = -1;
+                       lmac_type[2] = 3;
+                       lmac_type[3] = 3;
+                       sds_lane[2] = 2;
+                       sds_lane[3] = 3;
+                       additional_lmacs = 2;
+               }
+               break;
+       case CVMX_QLM_MODE_CPRI: /* CPRI / JESD204B */
+               is_rmac = 1;
+               break;
+       case CVMX_QLM_MODE_SDL: /* Serdes Lite (SDL) */
+               is_rmac = 1;
+               is_rmac_pipe = 1;
+               lane_mode = 1;
+               break;
+       default:
+               break;
+       }
+
+       if (is_rmac_pipe == 0 && is_pcie == 0) {
+               lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz,
+                                                                 &alt_pll);
+       }
+
+       debug("%s: %d lane mode: %d, alternate PLL: %s\n", __func__, mode, lane_mode,
+             alt_pll ? "true" : "false");
+       if (lane_mode == -1)
+               return -1;
+
+       if (alt_pll) {
+               debug("%s: alternate PLL settings used for qlm %d, lane mode %d, reference clock %d\n",
+                     __func__, qlm, lane_mode, ref_clk_sel);
+               if (__set_qlm_ref_clk_cn78xx(0, qlm, lane_mode, ref_clk_sel)) {
+                       printf("%s: Error: reference clock %d is not supported for qlm %d\n",
+                              __func__, ref_clk_sel, qlm);
+                       return -1;
+               }
+       }
+
+       /* Power up PHY, but keep it in reset */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_pd = 0;
+       phy_ctl.s.phy_reset = 1;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       /* Set GSER for the interface mode */
+       cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
+       cfg.s.bgx = is_bgx & 1;
+       cfg.s.bgx_quad = (is_bgx >> 2) & 1;
+       cfg.s.bgx_dual = (is_bgx >> 1) & 1;
+       cfg.s.pcie = is_pcie;
+       cfg.s.srio = is_srio;
+       cfg.s.rmac = is_rmac;
+       cfg.s.rmac_pipe = is_rmac_pipe;
+       csr_wr(CVMX_GSERX_CFG(qlm), cfg.u64);
+
+       /* Lane mode */
+       lmode.u64 = csr_rd(CVMX_GSERX_LANE_MODE(qlm));
+       lmode.s.lmode = lane_mode;
+       csr_wr(CVMX_GSERX_LANE_MODE(qlm), lmode.u64);
+
+       /* Because of the Errata where quad mode does not work, program
+        * lmac_type to figure out the type of BGX interface configured
+        */
+       if (is_bgx) {
+               int bgx = 0;
+               cvmx_bgxx_cmrx_config_t cmr_config;
+               cvmx_bgxx_cmr_rx_lmacs_t rx_lmacs;
+               cvmx_bgxx_spux_br_pmd_control_t spu_pmd_control;
+               int index, total_lmacs = 0;
+
+               for (index = 0; index < 4; index++) {
+                       cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, bgx));
+                       cmr_config.s.enable = 0;
+                       cmr_config.s.data_pkt_rx_en = 0;
+                       cmr_config.s.data_pkt_tx_en = 0;
+                       if (lmac_type[index] != -1) {
+                               cmr_config.s.lmac_type = lmac_type[index];
+                               cmr_config.s.lane_to_sds = sds_lane[index];
+                               total_lmacs++;
+                       }
+                       csr_wr(CVMX_BGXX_CMRX_CONFIG(index, bgx), cmr_config.u64);
+
+                       /* Enable training for 10G_KR/40G_KR4 modes */
+                       if (enable_training == 1 &&
+                           (lmac_type[index] == 3 || lmac_type[index] == 4)) {
+                               spu_pmd_control.u64 =
+                                       csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
+                               spu_pmd_control.s.train_en = 1;
+                               csr_wr(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx),
+                                      spu_pmd_control.u64);
+                       }
+               }
+
+               /* Update the total number of lmacs */
+               rx_lmacs.u64 = csr_rd(CVMX_BGXX_CMR_RX_LMACS(bgx));
+               rx_lmacs.s.lmacs = total_lmacs + additional_lmacs;
+               csr_wr(CVMX_BGXX_CMR_RX_LMACS(bgx), rx_lmacs.u64);
+               csr_wr(CVMX_BGXX_CMR_TX_LMACS(bgx), rx_lmacs.u64);
+       }
+
+       /* Bring phy out of reset */
+       phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
+       phy_ctl.s.phy_reset = 0;
+       csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
+
+       /*
+        * Wait 1us until the management interface is ready to accept
+        * read/write commands.
+        */
+       udelay(1);
+
+       if (is_srio) {
+               status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(port));
+               status_reg.s.srio = 1;
+               csr_wr(CVMX_SRIOX_STATUS_REG(port), status_reg.u64);
+               return 0;
+       }
+
+       /* Wait for reset to complete and the PLL to lock */
+       /* PCIe mode doesn't become ready until the PEM block attempts to bring
+        * the interface up. Skip this check for PCIe
+        */
+       if (!is_pcie && CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
+                                             rst_rdy, ==, 1, 10000)) {
+               printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
+               return -1;
+       }
+
+       /* Configure the gser pll */
+       if (is_rmac)
+               __rmac_pll_config(baud_mhz, qlm, mode);
+       else if (!(is_pcie || is_srio))
+               __qlm_setup_pll_cn78xx(0, qlm);
+
+       /* Wait for reset to complete and the PLL to lock */
+       if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_PLL_STAT(qlm), cvmx_gserx_pll_stat_t,
+                                 pll_lock, ==, 1, 10000)) {
+               printf("QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n", qlm);
+               return -1;
+       }
+
+       /* Errata GSER-27140: Updating the RX EQ settings due to temperature
+        * drift sensitivities
+        */
+       /* This workaround will also only be applied if the SERDES data-rate is 10G */
+       if (baud_mhz == 103125)
+               __qlm_rx_eq_temp_gser27140(0, qlm);
+
+       return 0;
+}
+
+/**
+ * Configure qlm/dlm speed and mode.
+ * @param qlm     The QLM or DLM to configure
+ * @param speed   The speed the QLM needs to be configured in Mhz.
+ * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
+ * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP
+ *               mode.
+ * @param pcie_mode Only used when qlm/dlm are in pcie mode.
+ * @param ref_clk_sel Reference clock to use for 70XX where:
+ *                     0: 100MHz
+ *                     1: 125MHz
+ *                     2: 156.25MHz
+ *                     3: 122MHz (Used by RMAC)
+ * @param ref_clk_input        This selects which reference clock input to use.  For
+ *                     cn70xx:
+ *                             0: DLMC_REF_CLK0
+ *                             1: DLMC_REF_CLK1
+ *                             2: DLM0_REF_CLK
+ *                     cn61xx: (not used)
+ *                     cn78xx/cn76xx/cn73xx:
+ *                             0: Internal clock (QLM[0-7]_REF_CLK)
+ *                             1: QLMC_REF_CLK0
+ *                             2: QLMC_REF_CLK1
+ *
+ * @return       Return 0 on success or -1.
+ */
+int octeon_configure_qlm(int qlm, int speed, int mode, int rc, int pcie_mode, int ref_clk_sel,
+                        int ref_clk_input)
+{
+       int node = 0; // ToDo: corrently only node 0 is supported
+
+       debug("%s(%d, %d, %d, %d, %d, %d, %d)\n", __func__, qlm, speed, mode, rc, pcie_mode,
+             ref_clk_sel, ref_clk_input);
+       if (OCTEON_IS_MODEL(OCTEON_CN61XX) || OCTEON_IS_MODEL(OCTEON_CNF71XX))
+               return octeon_configure_qlm_cn61xx(qlm, speed, mode, rc, pcie_mode);
+       else if (OCTEON_IS_MODEL(OCTEON_CN70XX))
+               return octeon_configure_qlm_cn70xx(qlm, speed, mode, rc, pcie_mode, ref_clk_sel,
+                                                  ref_clk_input);
+       else if (OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return octeon_configure_qlm_cn78xx(node, qlm, speed, mode, rc, pcie_mode,
+                                                  ref_clk_sel, ref_clk_input);
+       else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
+               return octeon_configure_qlm_cn73xx(qlm, speed, mode, rc, pcie_mode, ref_clk_sel,
+                                                  ref_clk_input);
+       else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
+               return octeon_configure_qlm_cnf75xx(qlm, speed, mode, rc, pcie_mode, ref_clk_sel,
+                                                   ref_clk_input);
+       else
+               return -1;
+}
+
+void octeon_init_qlm(int node)
+{
+       int qlm;
+       cvmx_gserx_phy_ctl_t phy_ctl;
+       cvmx_gserx_cfg_t cfg;
+       int baud_mhz;
+       int pem;
+
+       if (!OCTEON_IS_MODEL(OCTEON_CN78XX))
+               return;
+
+       for (qlm = 0; qlm < 8; qlm++) {
+               phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
+               if (phy_ctl.s.phy_reset == 0) {
+                       cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
+                       if (cfg.s.pcie)
+                               __cvmx_qlm_pcie_errata_cn78xx(node, qlm);
+                       else
+                               __qlm_init_errata_20844(node, qlm);
+
+                       baud_mhz = cvmx_qlm_get_gbaud_mhz_node(node, qlm);
+                       if (baud_mhz == 6250 || baud_mhz == 6316)
+                               octeon_qlm_tune_v3(node, qlm, baud_mhz, 0xa, 0xa0, -1, -1);
+                       else if (baud_mhz == 103125)
+                               octeon_qlm_tune_v3(node, qlm, baud_mhz, 0xd, 0xd0, -1, -1);
+               }
+       }
+
+       /* Setup how each PEM drives the PERST lines */
+       for (pem = 0; pem < 4; pem++) {
+               cvmx_rst_ctlx_t rst_ctl;
+
+               rst_ctl.u64 = csr_rd_node(node, CVMX_RST_CTLX(pem));
+               __setup_pem_reset(node, pem, !rst_ctl.s.host_mode);
+       }
+}
index 611b18f..9aac5f0 100644 (file)
@@ -3,20 +3,32 @@
  * Copyright (C) 2020 Stefan Roese <sr@denx.de>
  */
 
-#include <common.h>
 #include <dm.h>
+#include <fdt_support.h>
 #include <ram.h>
+#include <asm/gpio.h>
 
 #include <mach/octeon_ddr.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/octeon_fdt.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-cfg.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-bgxx-defs.h>
 
 #include "board_ddr.h"
 
+#define MAX_MIX_ENV_VARS       4
+
 #define EBB7304_DEF_DRAM_FREQ  800
 
 static struct ddr_conf board_ddr_conf[] = {
-        OCTEON_EBB7304_DDR_CONFIGURATION
+       OCTEON_EBB7304_DDR_CONFIGURATION
 };
 
+static int no_phy[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
 struct ddr_conf *octeon_ddr_conf_table_get(int *count, int *def_ddr_freq)
 {
        *count = ARRAY_SIZE(board_ddr_conf);
@@ -24,3 +36,719 @@ struct ddr_conf *octeon_ddr_conf_table_get(int *count, int *def_ddr_freq)
 
        return board_ddr_conf;
 }
+
+/*
+ * parse_env_var:      Parse the environment variable ("bgx_for_mix%d") to
+ *                     extract the lmac it is set to.
+ *
+ *  index:             Index of environment variable to parse.
+ *                     environment variable.
+ *  env_bgx:           Updated with the bgx of the lmac in the environment
+ *                     variable.
+ *  env_lmac:          Updated with the index of lmac in the environment
+ *                     variable.
+ *
+ *  returns:           Zero on success, error otherwise.
+ */
+static int parse_env_var(int index, int *env_bgx, int *env_lmac)
+{
+       char env_var[20];
+       ulong xipd_port;
+
+       sprintf(env_var, "bgx_for_mix%d", index);
+       xipd_port = env_get_ulong(env_var, 0, 0xffff);
+       if (xipd_port != 0xffff) {
+               int xiface;
+               struct cvmx_xiface xi;
+               struct cvmx_xport xp;
+
+               /*
+                * The environemt variable is set to the xipd port. Convert the
+                * xipd port to numa node, bgx, and lmac.
+                */
+               xiface = cvmx_helper_get_interface_num(xipd_port);
+               xi = cvmx_helper_xiface_to_node_interface(xiface);
+               xp = cvmx_helper_ipd_port_to_xport(xipd_port);
+               *env_bgx = xi.interface;
+               *env_lmac = cvmx_helper_get_interface_index_num(xp.port);
+               return 0;
+       }
+
+       return -1;
+}
+
+/*
+ * get_lmac_fdt_node:  Search the device tree for the node corresponding to
+ *                     a given bgx lmac.
+ *
+ *  fdt:               Pointer to flat device tree
+ *  search_node:       Numa node of the lmac to search for.
+ *  search_bgx:                Bgx of the lmac to search for.
+ *  search_lmac:       Lmac index to search for.
+ *  compat:            Compatible string to search for.
+
+ *  returns:           The device tree node of the lmac if found,
+ *                     or -1 otherwise.
+ */
+static int get_lmac_fdt_node(const void *fdt, int search_node, int search_bgx, int search_lmac,
+                            const char *compat)
+{
+       int node;
+       const fdt32_t *reg;
+       u64 addr;
+       int fdt_node = -1;
+       int fdt_bgx = -1;
+       int fdt_lmac = -1;
+       int len;
+       int parent;
+
+       /* Iterate through all bgx ports */
+       node = -1;
+       while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
+                                                    compat)) >= 0) {
+               /* Get the node and bgx from the physical address */
+               parent = fdt_parent_offset(fdt, node);
+               reg = fdt_getprop(fdt, parent, "reg", &len);
+               if (parent < 0 || !reg)
+                       continue;
+
+               addr = fdt_translate_address((void *)fdt, parent, reg);
+               fdt_node = (addr >> 36) & 0x7;
+               fdt_bgx = (addr >> 24) & 0xf;
+
+               /* Get the lmac index from the reg property */
+               reg = fdt_getprop(fdt, node, "reg", &len);
+               if (reg)
+                       fdt_lmac = *reg;
+
+               /* Check for a match */
+               if (search_node == fdt_node && search_bgx == fdt_bgx &&
+                   search_lmac == fdt_lmac)
+                       return node;
+       }
+
+       return -1;
+}
+
+/*
+ * get_mix_fdt_node:   Search the device tree for the node corresponding to
+ *                     a given mix.
+ *
+ *  fdt:               Pointer to flat device tree
+ *  search_node:       Mix numa node to search for.
+ *  search_index:      Mix index to search for.
+ *
+ *  returns:           The device tree node of the lmac if found,
+ *                     or -1 otherwise.
+ */
+static int get_mix_fdt_node(const void *fdt, int search_node, int search_index)
+{
+       int node;
+
+       /* Iterate through all the mix fdt nodes */
+       node = -1;
+       while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
+                                                    "cavium,octeon-7890-mix")) >= 0) {
+               int parent;
+               int len;
+               const char *name;
+               int mix_numa_node;
+               const fdt32_t *reg;
+               int mix_index = -1;
+               u64 addr;
+
+               /* Get the numa node of the mix from the parent node name */
+               parent = fdt_parent_offset(fdt, node);
+               if (parent < 0 ||
+                   ((name = fdt_get_name(fdt, parent, &len)) == NULL) ||
+                   ((name = strchr(name, '@')) == NULL))
+                       continue;
+
+               name++;
+               mix_numa_node = simple_strtol(name, NULL, 0) ? 1 : 0;
+
+               /* Get the mix index from the reg property */
+               reg = fdt_getprop(fdt, node, "reg", &len);
+               if (reg) {
+                       addr = fdt_translate_address((void *)fdt, parent, reg);
+                       mix_index = (addr >> 11) & 1;
+               }
+
+               /* Check for a match */
+               if (mix_numa_node == search_node && mix_index == search_index)
+                       return node;
+       }
+
+       return -1;
+}
+
+/*
+ * fdt_fix_mix:                Fix the mix nodes in the device tree. Only the mix nodes
+ *                     configured by the user will be preserved. All other mix
+ *                     nodes will be trimmed.
+ *
+ *  fdt:               Pointer to flat device tree
+ *
+ *  returns:           Zero on success, error otherwise.
+ */
+static int fdt_fix_mix(const void *fdt)
+{
+       int node;
+       int next_node;
+       int len;
+       int i;
+
+       /* Parse all the mix port environment variables */
+       for (i = 0; i < MAX_MIX_ENV_VARS; i++) {
+               int env_node = 0;
+               int env_bgx = -1;
+               int env_lmac = -1;
+               int lmac_fdt_node = -1;
+               int mix_fdt_node = -1;
+               int lmac_phandle;
+               char *compat;
+
+               /* Get the lmac for this environment variable */
+               if (parse_env_var(i, &env_bgx, &env_lmac))
+                       continue;
+
+               /* Get the fdt node for this lmac and add a phandle to it */
+               compat = "cavium,octeon-7890-bgx-port";
+               lmac_fdt_node = get_lmac_fdt_node(fdt, env_node, env_bgx,
+                                                 env_lmac, compat);
+               if (lmac_fdt_node < 0) {
+                       /* Must check for the xcv compatible string too */
+                       compat = "cavium,octeon-7360-xcv";
+                       lmac_fdt_node = get_lmac_fdt_node(fdt, env_node,
+                                                         env_bgx, env_lmac,
+                                                         compat);
+                       if (lmac_fdt_node < 0) {
+                               printf("WARNING: Failed to get lmac fdt node for %d%d%d\n",
+                                      env_node, env_bgx, env_lmac);
+                               continue;
+                       }
+               }
+
+               lmac_phandle = fdt_alloc_phandle((void *)fdt);
+               fdt_set_phandle((void *)fdt, lmac_fdt_node, lmac_phandle);
+
+               /* Get the fdt mix node corresponding to this lmac */
+               mix_fdt_node = get_mix_fdt_node(fdt, env_node, env_lmac);
+               if (mix_fdt_node < 0)
+                       continue;
+
+               /* Point the mix to the lmac */
+               fdt_getprop(fdt, mix_fdt_node, "cavium,mac-handle", &len);
+               fdt_setprop_inplace((void *)fdt, mix_fdt_node,
+                                   "cavium,mac-handle", &lmac_phandle, len);
+       }
+
+       /* Trim unused mix'es from the device tree */
+       for (node = fdt_next_node(fdt, -1, NULL); node >= 0; node = next_node) {
+               const char *compat;
+               const fdt32_t *reg;
+
+               next_node = fdt_next_node(fdt, node, NULL);
+
+               compat = fdt_getprop(fdt, node, "compatible", &len);
+               if (compat) {
+                       if (strcmp(compat, "cavium,octeon-7890-mix"))
+                               continue;
+
+                       reg = fdt_getprop(fdt, node, "cavium,mac-handle", &len);
+                       if (reg) {
+                               if (*reg == 0xffff)
+                                       fdt_nop_node((void *)fdt, node);
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static void kill_fdt_phy(void *fdt, int offset, void *arg)
+{
+       int len, phy_offset;
+       const fdt32_t *php;
+       u32 phandle;
+
+       php = fdt_getprop(fdt, offset, "phy-handle", &len);
+       if (php && len == sizeof(*php)) {
+               phandle = fdt32_to_cpu(*php);
+               fdt_nop_property(fdt, offset, "phy-handle");
+               phy_offset = fdt_node_offset_by_phandle(fdt, phandle);
+               if (phy_offset > 0)
+                       fdt_nop_node(fdt, phy_offset);
+       }
+}
+
+void __fixup_xcv(void)
+{
+       unsigned long bgx = env_get_ulong("bgx_for_rgmii", 10,
+                                         (unsigned long)-1);
+       char fdt_key[16];
+       int i;
+
+       debug("%s: BGX %d\n", __func__, (int)bgx);
+
+       for (i = 0; i < 3; i++) {
+               snprintf(fdt_key, sizeof(fdt_key),
+                        bgx == i ? "%d,xcv" : "%d,not-xcv", i);
+               debug("%s: trimming bgx %lu with key %s\n",
+                     __func__, bgx, fdt_key);
+
+               octeon_fdt_patch_rename((void *)gd->fdt_blob, fdt_key,
+                                       "cavium,xcv-trim", true, NULL, NULL);
+       }
+}
+
+/* QLM0 - QLM6 */
+void __fixup_fdt(void)
+{
+       int qlm;
+       int speed = 0;
+
+       for (qlm = 0; qlm < 7; qlm++) {
+               enum cvmx_qlm_mode mode;
+               char fdt_key[16];
+               const char *type_str = "none";
+
+               mode = cvmx_qlm_get_mode(qlm);
+               switch (mode) {
+               case CVMX_QLM_MODE_SGMII:
+               case CVMX_QLM_MODE_RGMII_SGMII:
+               case CVMX_QLM_MODE_RGMII_SGMII_1X1:
+                       type_str = "sgmii";
+                       break;
+               case CVMX_QLM_MODE_XAUI:
+               case CVMX_QLM_MODE_RGMII_XAUI:
+                       speed = (cvmx_qlm_get_gbaud_mhz(qlm) * 8 / 10) * 4;
+                       if (speed == 10000)
+                               type_str = "xaui";
+                       else
+                               type_str = "dxaui";
+                       break;
+               case CVMX_QLM_MODE_RXAUI:
+               case CVMX_QLM_MODE_RGMII_RXAUI:
+                       type_str = "rxaui";
+                       break;
+               case CVMX_QLM_MODE_XLAUI:
+               case CVMX_QLM_MODE_RGMII_XLAUI:
+                       type_str = "xlaui";
+                       break;
+               case CVMX_QLM_MODE_XFI:
+               case CVMX_QLM_MODE_RGMII_XFI:
+               case CVMX_QLM_MODE_RGMII_XFI_1X1:
+                       type_str = "xfi";
+                       break;
+               case CVMX_QLM_MODE_10G_KR:
+               case CVMX_QLM_MODE_RGMII_10G_KR:
+                       type_str = "10G_KR";
+                       break;
+               case CVMX_QLM_MODE_40G_KR4:
+               case CVMX_QLM_MODE_RGMII_40G_KR4:
+                       type_str = "40G_KR4";
+                       break;
+               case CVMX_QLM_MODE_SATA_2X1:
+                       type_str = "sata";
+                       break;
+               case CVMX_QLM_MODE_SGMII_2X1:
+               case CVMX_QLM_MODE_XFI_1X2:
+               case CVMX_QLM_MODE_10G_KR_1X2:
+               case CVMX_QLM_MODE_RXAUI_1X2:
+               case CVMX_QLM_MODE_MIXED: // special for DLM5 & DLM6
+               {
+                       cvmx_bgxx_cmrx_config_t cmr_config;
+                       cvmx_bgxx_spux_br_pmd_control_t pmd_control;
+                       int mux = cvmx_qlm_mux_interface(2);
+
+                       if (mux == 2) { // only dlm6
+                               cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(2, 2));
+                               pmd_control.u64 =
+                                       csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(2, 2));
+                       } else {
+                               if (qlm == 5) {
+                                       cmr_config.u64 =
+                                               csr_rd(CVMX_BGXX_CMRX_CONFIG(0, 2));
+                                       pmd_control.u64 =
+                                               csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(0, 2));
+                               } else {
+                                       cmr_config.u64 =
+                                               csr_rd(CVMX_BGXX_CMRX_CONFIG(2, 2));
+                                       pmd_control.u64 =
+                                               csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(2, 2));
+                               }
+                       }
+                       switch (cmr_config.s.lmac_type) {
+                       case 0:
+                               type_str = "sgmii";
+                               break;
+                       case 1:
+                               type_str = "xaui";
+                               break;
+                       case 2:
+                               type_str = "rxaui";
+                               break;
+                       case 3:
+                               if (pmd_control.s.train_en)
+                                       type_str = "10G_KR";
+                               else
+                                       type_str = "xfi";
+                               break;
+                       case 4:
+                               if (pmd_control.s.train_en)
+                                       type_str = "40G_KR4";
+                               else
+                                       type_str = "xlaui";
+                               break;
+                       default:
+                               type_str = "none";
+                               break;
+                       }
+                       break;
+               }
+               default:
+                       type_str = "none";
+                       break;
+               }
+               sprintf(fdt_key, "%d,%s", qlm, type_str);
+               debug("Patching qlm %d for %s for mode %d%s\n", qlm, fdt_key, mode,
+                     no_phy[qlm] ? ", removing PHY" : "");
+               octeon_fdt_patch_rename((void *)gd->fdt_blob, fdt_key, NULL, true,
+                                       no_phy[qlm] ? kill_fdt_phy : NULL, NULL);
+       }
+}
+
+int board_fix_fdt(void)
+{
+       __fixup_fdt();
+       __fixup_xcv();
+
+       /* Fix the mix ports */
+       fdt_fix_mix(gd->fdt_blob);
+
+       return 0;
+}
+
+/*
+ * Here is the description of the parameters that are passed to QLM
+ * configuration:
+ *
+ *     param0 : The QLM to configure
+ *     param1 : Speed to configure the QLM at
+ *     param2 : Mode the QLM to configure
+ *     param3 : 1 = RC, 0 = EP
+ *     param4 : 0 = GEN1, 1 = GEN2, 2 = GEN3
+ *     param5 : ref clock select, 0 = 100Mhz, 1 = 125MHz, 2 = 156MHz
+ *     param6 : ref clock input to use:
+ *              0 - external reference (QLMx_REF_CLK)
+ *              1 = common clock 0 (QLMC_REF_CLK0)
+ *              2 = common_clock 1 (QLMC_REF_CLK1)
+ */
+static void board_configure_qlms(void)
+{
+       int speed[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+       int mode[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
+       int pcie_rc[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+       int pcie_gen[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+       int ref_clock_sel[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+       int ref_clock_input[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+       struct gpio_desc desc;
+       int rbgx, rqlm;
+       char env_var[16];
+       int qlm;
+       int ret;
+
+       /* RGMII PHY reset GPIO */
+       ret = dm_gpio_lookup_name("gpio-controllerA27", &desc);
+       if (ret)
+               debug("gpio ret=%d\n", ret);
+       ret = dm_gpio_request(&desc, "rgmii_phy_reset");
+       if (ret)
+               debug("gpio_request ret=%d\n", ret);
+       ret = dm_gpio_set_dir_flags(&desc, GPIOD_IS_OUT);
+       if (ret)
+               debug("gpio dir ret=%d\n", ret);
+
+       /* Put RGMII PHY in reset */
+       dm_gpio_set_value(&desc, 0);
+
+       octeon_init_qlm(0);
+
+       rbgx = env_get_ulong("bgx_for_rgmii", 10, (unsigned long)-1);
+       switch (rbgx) {
+       case 0:
+               rqlm = 2;
+               break;
+       case 1:
+               rqlm = 3;
+               break;
+       case 2:
+               rqlm = 5;
+               break;
+       default:
+               rqlm = -1;
+               break;
+       }
+
+       for (qlm = 0; qlm < 7; qlm++) {
+               const char *mode_str;
+               char spd_env[16];
+
+               mode[qlm] = CVMX_QLM_MODE_DISABLED;
+               sprintf(env_var, "qlm%d_mode", qlm);
+               mode_str = env_get(env_var);
+               if (!mode_str)
+                       continue;
+
+               if (qlm == 4 && mode[4] != -1 &&
+                   mode[4] != CVMX_QLM_MODE_SATA_2X1) {
+                       printf("Error: DLM 4 can only be configured for SATA\n");
+                       continue;
+               }
+
+               if (strstr(mode_str, ",no_phy"))
+                       no_phy[qlm] = 1;
+
+               if (!strncmp(mode_str, "sgmii", 5)) {
+                       bool rgmii = false;
+
+                       speed[qlm] = 1250;
+                       if (rqlm == qlm && qlm < 5) {
+                               mode[qlm] = CVMX_QLM_MODE_RGMII_SGMII;
+                               rgmii = true;
+                       } else if (qlm == 6 || qlm == 5) {
+                               if (rqlm == qlm && qlm == 5) {
+                                       mode[qlm] = CVMX_QLM_MODE_RGMII_SGMII_1X1;
+                                       rgmii = true;
+                               } else if (rqlm == 5 && qlm == 6 &&
+                                          mode[5] != CVMX_QLM_MODE_RGMII_SGMII_1X1) {
+                                       mode[qlm] = CVMX_QLM_MODE_RGMII_SGMII_2X1;
+                                       rgmii = true;
+                               } else {
+                                       mode[qlm] = CVMX_QLM_MODE_SGMII_2X1;
+                               }
+                       } else {
+                               mode[qlm] = CVMX_QLM_MODE_SGMII;
+                       }
+                       ref_clock_sel[qlm] = 2;
+
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+
+                       if (no_phy[qlm]) {
+                               int i;
+                               int start = 0, stop = 2;
+
+                               rbgx = 0;
+                               switch (qlm) {
+                               case 3:
+                                       rbgx = 1;
+                               case 2:
+                                       for (i = 0; i < 4; i++) {
+                                               printf("Ignoring PHY for interface: %d, port: %d\n",
+                                                      rbgx, i);
+                                               cvmx_helper_set_port_force_link_up(rbgx, i, true);
+                                       }
+                                       break;
+                               case 6:
+                                       start = 2;
+                                       stop = 4;
+                               case 5:
+                                       for (i = start; i < stop; i++) {
+                                               printf("Ignoring PHY for interface: %d, port: %d\n",
+                                                      2, i);
+                                               cvmx_helper_set_port_force_link_up(2, i, true);
+                                       }
+                                       break;
+                               default:
+                                       printf("SGMII not supported for QLM/DLM %d\n",
+                                              qlm);
+                                       break;
+                               }
+                       }
+                       printf("QLM %d: SGMII%s\n",
+                              qlm, rgmii ? ", RGMII" : "");
+               } else if (!strncmp(mode_str, "xaui", 4)) {
+                       speed[qlm] = 3125;
+                       mode[qlm] = CVMX_QLM_MODE_XAUI;
+                       ref_clock_sel[qlm] = 2;
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+                       printf("QLM %d: XAUI\n", qlm);
+               } else if (!strncmp(mode_str, "dxaui", 5)) {
+                       speed[qlm] = 6250;
+                       mode[qlm] = CVMX_QLM_MODE_XAUI;
+                       ref_clock_sel[qlm] = 2;
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+                       printf("QLM %d: DXAUI\n", qlm);
+               } else if (!strncmp(mode_str, "rxaui", 5)) {
+                       bool rgmii = false;
+
+                       speed[qlm] = 6250;
+                       if (qlm == 5 || qlm == 6) {
+                               if (rqlm == qlm && qlm == 5) {
+                                       mode[qlm] = CVMX_QLM_MODE_RGMII_RXAUI;
+                                       rgmii = true;
+                               } else {
+                                       mode[qlm] = CVMX_QLM_MODE_RXAUI_1X2;
+                               }
+                       } else {
+                               mode[qlm] = CVMX_QLM_MODE_RXAUI;
+                       }
+                       ref_clock_sel[qlm] = 2;
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+                       printf("QLM %d: RXAUI%s\n",
+                              qlm, rgmii ? ", rgmii" : "");
+               } else if (!strncmp(mode_str, "xlaui", 5)) {
+                       speed[qlm] = 103125;
+                       mode[qlm] = CVMX_QLM_MODE_XLAUI;
+                       ref_clock_sel[qlm] = 2;
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+                       sprintf(spd_env, "qlm%d_speed", qlm);
+                       if (env_get(spd_env)) {
+                               int spd = env_get_ulong(spd_env, 0, 8);
+
+                               if (spd)
+                                       speed[qlm] = spd;
+                               else
+                                       speed[qlm] = 103125;
+                       }
+                       printf("QLM %d: XLAUI\n", qlm);
+               } else if (!strncmp(mode_str, "xfi", 3)) {
+                       bool rgmii = false;
+
+                       speed[qlm] = 103125;
+                       if (rqlm == qlm) {
+                               mode[qlm] = CVMX_QLM_MODE_RGMII_XFI;
+                               rgmii = true;
+                       } else if (qlm == 5 || qlm == 6) {
+                               mode[qlm] = CVMX_QLM_MODE_XFI_1X2;
+                       } else {
+                               mode[qlm] = CVMX_QLM_MODE_XFI;
+                       }
+                       ref_clock_sel[qlm] = 2;
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+                       printf("QLM %d: XFI%s\n", qlm, rgmii ? ", RGMII" : "");
+               } else if (!strncmp(mode_str, "10G_KR", 6)) {
+                       speed[qlm] = 103125;
+                       if (rqlm == qlm && qlm == 5)
+                               mode[qlm] = CVMX_QLM_MODE_RGMII_10G_KR;
+                       else if (qlm == 5 || qlm == 6)
+                               mode[qlm] = CVMX_QLM_MODE_10G_KR_1X2;
+                       else
+                               mode[qlm] = CVMX_QLM_MODE_10G_KR;
+                       ref_clock_sel[qlm] = 2;
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+                       printf("QLM %d: 10G_KR\n", qlm);
+               } else if (!strncmp(mode_str, "40G_KR4", 7)) {
+                       speed[qlm] = 103125;
+                       mode[qlm] = CVMX_QLM_MODE_40G_KR4;
+                       ref_clock_sel[qlm] = 2;
+                       if (qlm == 5 || qlm == 6)
+                               ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+                       printf("QLM %d: 40G_KR4\n", qlm);
+               } else if (!strcmp(mode_str, "pcie")) {
+                       char *pmode;
+                       int lanes = 0;
+
+                       sprintf(env_var, "pcie%d_mode", qlm);
+                       pmode = env_get(env_var);
+                       if (pmode && !strcmp(pmode, "ep"))
+                               pcie_rc[qlm] = 0;
+                       else
+                               pcie_rc[qlm] = 1;
+                       sprintf(env_var, "pcie%d_gen", qlm);
+                       pcie_gen[qlm] = env_get_ulong(env_var, 0, 3);
+                       sprintf(env_var, "pcie%d_lanes", qlm);
+                       lanes = env_get_ulong(env_var, 0, 8);
+                       if (lanes == 8) {
+                               mode[qlm] = CVMX_QLM_MODE_PCIE_1X8;
+                       } else if (qlm == 5 || qlm == 6) {
+                               if (lanes != 2) {
+                                       printf("QLM%d: Invalid lanes selected, defaulting to 2 lanes\n",
+                                              qlm);
+                               }
+                               mode[qlm] = CVMX_QLM_MODE_PCIE_1X2;
+                               ref_clock_input[qlm] = 1; // use QLMC_REF_CLK0
+                       } else {
+                               mode[qlm] = CVMX_QLM_MODE_PCIE;
+                       }
+                       ref_clock_sel[qlm] = 0;
+                       printf("QLM %d: PCIe gen%d %s, x%d lanes\n",
+                              qlm, pcie_gen[qlm] + 1,
+                              pcie_rc[qlm] ? "root complex" : "endpoint",
+                              lanes);
+               } else if (!strcmp(mode_str, "sata")) {
+                       mode[qlm] = CVMX_QLM_MODE_SATA_2X1;
+                       ref_clock_sel[qlm] = 0;
+                       ref_clock_input[qlm] = 1;
+                       sprintf(spd_env, "qlm%d_speed", qlm);
+                       if (env_get(spd_env)) {
+                               int spd = env_get_ulong(spd_env, 0, 8);
+
+                               if (spd == 1500 || spd == 3000 || spd == 3000)
+                                       speed[qlm] = spd;
+                               else
+                                       speed[qlm] = 6000;
+                       } else {
+                               speed[qlm] = 6000;
+                       }
+               } else {
+                       printf("QLM %d: disabled\n", qlm);
+               }
+       }
+
+       for (qlm = 0; qlm < 7; qlm++) {
+               int rc;
+
+               if (mode[qlm] == -1)
+                       continue;
+
+               debug("Configuring qlm%d with speed(%d), mode(%d), RC(%d), Gen(%d), REF_CLK(%d), CLK_SOURCE(%d)\n",
+                     qlm, speed[qlm], mode[qlm], pcie_rc[qlm],
+                     pcie_gen[qlm] + 1,
+                     ref_clock_sel[qlm], ref_clock_input[qlm]);
+               rc = octeon_configure_qlm(qlm, speed[qlm], mode[qlm],
+                                         pcie_rc[qlm], pcie_gen[qlm],
+                                         ref_clock_sel[qlm],
+                                         ref_clock_input[qlm]);
+
+               if (speed[qlm] == 6250) {
+                       if (mode[qlm] == CVMX_QLM_MODE_RXAUI) {
+                               octeon_qlm_tune_v3(0, qlm, speed[qlm], 0x12,
+                                                  0xa0, -1, -1);
+                       } else {
+                               octeon_qlm_tune_v3(0, qlm, speed[qlm], 0xa,
+                                                  0xa0, -1, -1);
+                       }
+               } else if (speed[qlm] == 103125) {
+                       octeon_qlm_tune_v3(0, qlm, speed[qlm], 0xd, 0xd0,
+                                          -1, -1);
+               }
+
+               if (qlm == 4 && rc != 0)
+                       /*
+                        * There is a bug with SATA with 73xx.  Until it's
+                        * fixed we need to strip it from the device tree.
+                        */
+                       octeon_fdt_patch_rename((void *)gd->fdt_blob, "4,none",
+                                               NULL, true, NULL, NULL);
+       }
+
+       dm_gpio_set_value(&desc, 0); /* Put RGMII PHY in reset */
+       mdelay(10);
+       dm_gpio_set_value(&desc, 1); /* Take RGMII PHY out of reset */
+}
+
+int board_late_init(void)
+{
+       board_configure_qlms();
+
+       return 0;
+}
diff --git a/board/Marvell/octeon_nic23/Kconfig b/board/Marvell/octeon_nic23/Kconfig
new file mode 100644 (file)
index 0000000..3c42e8a
--- /dev/null
@@ -0,0 +1,19 @@
+if TARGET_OCTEON_NIC23
+
+config SYS_BOARD
+       string
+       default "octeon_nic23"
+
+config SYS_VENDOR
+       string
+       default "Marvell"
+
+config SYS_CONFIG_NAME
+       string
+       default "octeon_nic23"
+
+config DEFAULT_DEVICE_TREE
+       string
+       default "mrvl,octeon-nic23"
+
+endif
diff --git a/board/Marvell/octeon_nic23/MAINTAINERS b/board/Marvell/octeon_nic23/MAINTAINERS
new file mode 100644 (file)
index 0000000..cd5148d
--- /dev/null
@@ -0,0 +1,7 @@
+OCTEON_NIC23 BOARD
+M:     Aaron Williams <awilliams@marvell.com>
+S:     Maintained
+F:     board/Marvell/octeon_nic23/*
+F:     configs/octeon_nic23_defconfig
+F:     include/configs/octeon_nic23.h
+F:     arch/mips/dts/mrvl,octeon-nic23.dts
diff --git a/board/Marvell/octeon_nic23/Makefile b/board/Marvell/octeon_nic23/Makefile
new file mode 100644 (file)
index 0000000..a79b94e
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Copyright (C) 2021 Stefan Roese <sr@denx.de>
+# Copyright (C) 2019-2020 Marvell International Ltd.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := board.o
diff --git a/board/Marvell/octeon_nic23/board.c b/board/Marvell/octeon_nic23/board.c
new file mode 100644 (file)
index 0000000..9f5eb2e
--- /dev/null
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2021 Stefan Roese <sr@denx.de>
+ */
+
+#include <dm.h>
+#include <ram.h>
+
+#include <mach/octeon_ddr.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/octeon_fdt.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-cfg.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-bgxx-defs.h>
+
+#include "board_ddr.h"
+
+#define NIC23_DEF_DRAM_FREQ            800
+
+static u8 octeon_nic23_cfg0_spd_values[512] = {
+       OCTEON_NIC23_CFG0_SPD_VALUES
+};
+
+static struct ddr_conf board_ddr_conf[] = {
+        OCTEON_NIC23_DDR_CONFIGURATION
+};
+
+struct ddr_conf *octeon_ddr_conf_table_get(int *count, int *def_ddr_freq)
+{
+       *count = ARRAY_SIZE(board_ddr_conf);
+       *def_ddr_freq = NIC23_DEF_DRAM_FREQ;
+
+       return board_ddr_conf;
+}
+
+int board_fix_fdt(void *fdt)
+{
+       u32 range_data[5 * 8];
+       bool rev4;
+       int node;
+       int rc;
+
+       /*
+        * ToDo:
+        * Read rev4 info from EEPROM or where the original U-Boot does
+        * and don't hard-code it here.
+        */
+       rev4 = true;
+
+       debug("%s() rev4: %s\n", __func__, rev4 ? "true" : "false");
+       /* Patch the PHY configuration based on board revision */
+       rc = octeon_fdt_patch_rename(fdt,
+                                    rev4 ? "4,nor-flash" : "4,no-nor-flash",
+                                    "cavium,board-trim", false, NULL, NULL);
+       if (!rev4) {
+               /* Modify the ranges for CS 0 */
+               node = fdt_node_offset_by_compatible(fdt, -1,
+                                                    "cavium,octeon-3860-bootbus");
+               if (node < 0) {
+                       printf("%s: Error: cannot find boot bus in device tree!\n",
+                              __func__);
+                       return -1;
+               }
+
+               rc = fdtdec_get_int_array(fdt, node, "ranges",
+                                         range_data, 5 * 8);
+               if (rc) {
+                       printf("%s: Error reading ranges from boot bus FDT\n",
+                              __func__);
+                       return -1;
+               }
+               range_data[2] = cpu_to_fdt32(0x10000);
+               range_data[3] = 0;
+               range_data[4] = 0;
+               rc = fdt_setprop(fdt, node, "ranges", range_data,
+                                sizeof(range_data));
+               if (rc) {
+                       printf("%s: Error updating boot bus ranges in fdt\n",
+                              __func__);
+               }
+       }
+       return rc;
+}
+
+void board_configure_qlms(void)
+{
+       octeon_configure_qlm(4, 3000, CVMX_QLM_MODE_SATA_2X1, 0, 0, 0, 0);
+       octeon_configure_qlm(5, 103125, CVMX_QLM_MODE_XFI_1X2, 0, 0, 2, 0);
+       /* Apply amplitude tuning to 10G interface */
+       octeon_qlm_tune_v3(0, 4, 3000, -1, -1, 7, -1);
+       octeon_qlm_tune_v3(0, 5, 103125, 0x19, 0x0, -1, -1);
+       octeon_qlm_set_channel_v3(0, 5, 0);
+       octeon_qlm_dfe_disable(0, 5, -1, 103125, CVMX_QLM_MODE_XFI_1X2);
+       debug("QLM 4 reference clock: %d\n"
+             "DLM 5 reference clock: %d\n",
+             cvmx_qlm_measure_clock(4), cvmx_qlm_measure_clock(5));
+}
+
+int board_late_init(void)
+{
+       board_configure_qlms();
+
+       return 0;
+}
diff --git a/board/Marvell/octeon_nic23/board_ddr.h b/board/Marvell/octeon_nic23/board_ddr.h
new file mode 100644 (file)
index 0000000..eac877f
--- /dev/null
@@ -0,0 +1,269 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#ifndef __BOARD_DDR_H__
+#define __BOARD_DDR_H__
+
+#define OCTEON_NIC23_DRAM_SOCKET_CONFIGURATION0                        \
+       { {0x0, 0x0}, {octeon_nic23_cfg0_spd_values, NULL} }
+
+#define NIC23_MTA8ATF51264AZ2G3_SPD_VALUES                     \
+       0x23, 0x10, 0x0c, 0x02, 0x84, 0x19, 0x00, 0x08,         \
+       0x00, 0x00, 0x00, 0x03, 0x01, 0x0b, 0x80, 0x00,         \
+       0x00, 0x00, 0x08, 0x0c, 0xf4, 0x1b, 0x00, 0x00,         \
+       0x6c, 0x6c, 0x6c, 0x11, 0x08, 0x74, 0x20, 0x08,         \
+       0x00, 0x05, 0x70, 0x03, 0x00, 0xa8, 0x1e, 0x2b,         \
+       0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x0c, 0x2c, 0x15, 0x35,         \
+       0x15, 0x35, 0x0b, 0x2c, 0x15, 0x35, 0x0b, 0x35,         \
+       0x0b, 0x2c, 0x0b, 0x35, 0x15, 0x36, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xb5, 0xce,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x30, 0x0e,         \
+       0x11, 0x11, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x2e,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x80, 0x2c, 0x0f, 0x14, 0x50, 0x0e, 0x08, 0x18,         \
+       0xc8, 0x31, 0x38, 0x41, 0x53, 0x46, 0x31, 0x47,         \
+       0x37, 0x32, 0x41, 0x5a, 0x2d, 0x32, 0x47, 0x31,         \
+       0x41, 0x31, 0x20, 0x20, 0x20, 0x31, 0x80, 0x2c,         \
+       0x41, 0x44, 0x50, 0x41, 0x45, 0x4e, 0x43, 0x39,         \
+       0x30, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         \
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+#define OCTEON_NIC23_CFG0_SPD_VALUES   NIC23_MTA8ATF51264AZ2G3_SPD_VALUES
+
+#define OCTEON_NIC23_BOARD_EEPROM_TWSI_ADDR    0x56
+
+#define OCTEON_NIC23_MODEREG_PARAMS1_1RANK_1SLOT               \
+{                                                              \
+               .cn78xx = {                                     \
+                       .pasr_00        = 0,                    \
+                       .asr_00         = 0,                    \
+                       .srt_00         = 0,                    \
+                       .rtt_wr_00      = ddr4_rttwr_80ohm & 3, \
+                       .rtt_wr_00_ext  = (ddr4_rttwr_80ohm >> 2) & 1, \
+                       .dic_00         = ddr4_dic_34ohm,       \
+                       .rtt_nom_00     = 0,                    \
+                       .pasr_01        = 0,                    \
+                       .asr_01         = 0,                    \
+                       .srt_01         = 0,                    \
+                       .rtt_wr_01      = 0,                    \
+                       .dic_01         = ddr4_dic_34ohm,       \
+                       .rtt_nom_01     = 0,                    \
+                       .pasr_10        = 0,                    \
+                       .asr_10         = 0,                    \
+                       .srt_10         = 0,                    \
+                       .rtt_wr_10      = 0,                    \
+                       .dic_10         = ddr4_dic_34ohm,       \
+                       .rtt_nom_10     = 0,                    \
+                       .pasr_11        = 0,                    \
+                       .asr_11         = 0,                    \
+                       .srt_11         = 0,                    \
+                       .rtt_wr_11      = 0,                    \
+                       .dic_11         = ddr4_dic_34ohm,       \
+                       .rtt_nom_11     = 0,                    \
+               }                                               \
+       }
+
+#define OCTEON_NIC23_MODEREG_PARAMS1_1RANK_2SLOT               \
+{                                                              \
+               .cn78xx = {                                     \
+                       .pasr_00        = 0,                    \
+                       .asr_00         = 0,                    \
+                       .srt_00         = 0,                    \
+                       .rtt_wr_00      = ddr4_rttwr_80ohm & 3, \
+                       .rtt_wr_00_ext  = (ddr4_rttwr_80ohm >> 2) & 1, \
+                       .dic_00         = ddr4_dic_34ohm,       \
+                       .rtt_nom_00     = 0,                    \
+                       .pasr_01        = 0,                    \
+                       .asr_01         = 0,                    \
+                       .srt_01         = 0,                    \
+                       .rtt_wr_01      = 0,                    \
+                       .dic_01         = ddr4_dic_34ohm,       \
+                       .rtt_nom_01     = 0,                    \
+                       .pasr_10        = 0,                    \
+                       .asr_10         = 0,                    \
+                       .srt_10         = 0,                    \
+                       .rtt_wr_10      = ddr4_rttwr_80ohm & 3, \
+                       .rtt_wr_10_ext  = (ddr4_rttwr_80ohm >> 2) & 1, \
+                       .dic_10         = ddr4_dic_34ohm,       \
+                       .rtt_nom_10     = 0,                    \
+                       .pasr_11        = 0,                    \
+                       .asr_11         = 0,                    \
+                       .srt_11         = 0,                    \
+                       .rtt_wr_11      = 0,                    \
+                       .dic_11         = ddr4_dic_34ohm,       \
+                       .rtt_nom_11     = 0                     \
+               }                                               \
+}
+
+#define OCTEON_NIC23_MODEREG_PARAMS2_1RANK_1SLOT       \
+{                                                      \
+       .cn78xx = {                                     \
+               .rtt_park_00    = ddr4_rttpark_60ohm,   \
+               .vref_value_00  = 0x22,                 \
+               .vref_range_00  = 0,                    \
+               .rtt_park_01    = 0,                    \
+               .vref_value_01  = 0,                    \
+               .vref_range_01  = 0,                    \
+               .rtt_park_10    = 0,                    \
+               .vref_value_10  = 0,                    \
+               .vref_range_10  = 0,                    \
+               .rtt_park_11    = 0,                    \
+               .vref_value_11  = 0,                    \
+               .vref_range_11  = 0                     \
+       }                                               \
+}
+
+#define  OCTEON_NIC23_MODEREG_PARAMS2_1RANK_2SLOT      \
+{                                                      \
+       .cn78xx = {                                     \
+               .rtt_park_00    = ddr4_rttpark_48ohm,   \
+               .vref_value_00  = 0x1f,                 \
+               .vref_range_00  = 0,                    \
+               .rtt_park_01    = 0,                    \
+               .vref_value_01  = 0,                    \
+               .vref_range_01  = 0,                    \
+               .rtt_park_10    = ddr4_rttpark_48ohm,   \
+               .vref_value_10  = 0x1f,                 \
+               .vref_range_10  = 0,                    \
+               .rtt_park_11    = 0,                    \
+               .vref_value_11  = 0,                    \
+               .vref_range_11  = 0                     \
+       }                                               \
+}
+
+#define OCTEON_NIC23_CN73XX_DRAM_ODT_1RANK_CONFIGURATION               \
+       /*   1 */                                                       \
+       {                                                               \
+               ddr4_dqx_driver_34_ohm,                                 \
+               0x00000000ULL,                                          \
+               OCTEON_NIC23_MODEREG_PARAMS1_1RANK_1SLOT,               \
+               OCTEON_NIC23_MODEREG_PARAMS2_1RANK_1SLOT,               \
+               ddr4_rodt_ctl_48_ohm,                                   \
+               0x00000000ULL,                                          \
+               0                                                       \
+       },                                                              \
+       /*   2 */                                                       \
+       {                                                               \
+               ddr4_dqx_driver_34_ohm,                                 \
+               0x00000000ULL,                                          \
+               OCTEON_NIC23_MODEREG_PARAMS1_1RANK_2SLOT,               \
+               OCTEON_NIC23_MODEREG_PARAMS2_1RANK_2SLOT,               \
+               ddr4_rodt_ctl_80_ohm,                                   \
+               0x00000000ULL,                                          \
+               0                                                       \
+       }
+
+/*
+ * Construct a static initializer for the ddr_configuration_t variable that
+ * holds (almost) all of the information required for DDR initialization.
+ */
+
+/*
+ * The parameters below make up the custom_lmc_config data structure.
+ * This structure is used to customize the way that the LMC DRAM
+ * Controller is configured for a particular board design.
+ *
+ * Refer to the file lib_octeon_board_table_entry.h for a description
+ * of the custom board settings.  It is usually kept in the following
+ * location... arch/mips/include/asm/arch-octeon/
+ *
+ */
+
+#define OCTEON_NIC23_DDR_CONFIGURATION                                 \
+/* Interface 0 */                                                      \
+{                                                                      \
+       .custom_lmc_config = {                                          \
+               .min_rtt_nom_idx        = 2,                            \
+               .max_rtt_nom_idx        = 5,                            \
+               .min_rodt_ctl           = 2,                            \
+               .max_rodt_ctl           = 4,                            \
+               .ck_ctl                 = ddr4_driver_34_ohm,           \
+               .cmd_ctl                = ddr4_driver_34_ohm,           \
+               .ctl_ctl                = ddr4_driver_34_ohm,           \
+               .min_cas_latency        = 7,                            \
+               .offset_en              = 1,                            \
+               .offset_udimm           = 2,                            \
+               .offset_rdimm           = 2,                            \
+               .ddr_rtt_nom_auto       = 0,                            \
+               .ddr_rodt_ctl_auto      = 0,                            \
+               .rlevel_compute         = 0,                            \
+               .ddr2t_udimm            = 1,                            \
+               .ddr2t_rdimm            = 1,                            \
+               .maximum_adjacent_rlevel_delay_increment = 2,           \
+               .fprch2                 = 2,                            \
+               .dll_write_offset       = NULL,                         \
+               .dll_read_offset        = NULL,                         \
+               .disable_sequential_delay_check = 1,                    \
+               .parity                 = 0                             \
+       },                                                              \
+       .dimm_config_table = {                                          \
+               OCTEON_NIC23_DRAM_SOCKET_CONFIGURATION0,                \
+               DIMM_CONFIG_TERMINATOR                                  \
+       },                                                              \
+       .unbuffered = {                                                 \
+               .ddr_board_delay = 0,                                   \
+               .lmc_delay_clk = 0,                                     \
+               .lmc_delay_cmd = 0,                                     \
+               .lmc_delay_dq = 0                                       \
+       },                                                              \
+       .registered = {                                                 \
+               .ddr_board_delay = 0,                                   \
+               .lmc_delay_clk = 0,                                     \
+               .lmc_delay_cmd = 0,                                     \
+               .lmc_delay_dq = 0                                       \
+       },                                                              \
+       .odt_1rank_config = {                                           \
+               OCTEON_NIC23_CN73XX_DRAM_ODT_1RANK_CONFIGURATION        \
+       },                                                              \
+},
+
+#endif /* __BOARD_DDR_H__ */
index ae93b49..f614e95 100644 (file)
@@ -9,8 +9,11 @@ CONFIG_DEBUG_UART_CLOCK=1200000000
 CONFIG_ARCH_OCTEON=y
 # CONFIG_MIPS_CACHE_SETUP is not set
 # CONFIG_MIPS_CACHE_DISABLE is not set
+CONFIG_MIPS_RELOCATION_TABLE_SIZE=0xc000
 CONFIG_DEBUG_UART=y
+CONFIG_OF_BOARD_FIXUP=y
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_BOARD_LATE_INIT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_I2C=y
@@ -21,6 +24,7 @@ CONFIG_CMD_PCI=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_RTC=y
 CONFIG_CMD_TIME=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
@@ -48,14 +52,17 @@ CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH_ATMEL=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
-# CONFIG_NETDEVICES is not set
+CONFIG_E1000=y
 CONFIG_PCI=y
 CONFIG_DM_PCI=y
+CONFIG_PCIE_OCTEON=y
 CONFIG_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_RAM=y
 CONFIG_RAM_OCTEON=y
 CONFIG_RAM_OCTEON_DDR4=y
+CONFIG_DM_RTC=y
+CONFIG_RTC_DS1307=y
 CONFIG_DEBUG_UART_SHIFT=3
 CONFIG_DEBUG_UART_ANNOUNCE=y
 CONFIG_SYS_NS16550=y
diff --git a/configs/octeon_nic23_defconfig b/configs/octeon_nic23_defconfig
new file mode 100644 (file)
index 0000000..f36af43
--- /dev/null
@@ -0,0 +1,70 @@
+CONFIG_MIPS=y
+CONFIG_SYS_TEXT_BASE=0xffffffff80000000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
+CONFIG_NR_DRAM_BANKS=2
+CONFIG_ENV_SIZE=0x2000
+CONFIG_ENV_OFFSET=0xe000
+CONFIG_ENV_SECT_SIZE=0x100
+CONFIG_DEBUG_UART_BASE=0x8001180000000800
+CONFIG_DEBUG_UART_CLOCK=800000000
+CONFIG_ARCH_OCTEON=y
+CONFIG_TARGET_OCTEON_NIC23=y
+# CONFIG_MIPS_CACHE_SETUP is not set
+# CONFIG_MIPS_CACHE_DISABLE is not set
+CONFIG_DEBUG_UART=y
+CONFIG_AHCI=y
+CONFIG_OF_BOARD_FIXUP=y
+CONFIG_SYS_CONSOLE_ENV_OVERWRITE=y
+# CONFIG_SYS_DEVICE_NULLDEV is not set
+CONFIG_ARCH_MISC_INIT=y
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_HUSH_PARSER=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_MTD=y
+CONFIG_CMD_PART=y
+CONFIG_CMD_PCI=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_EFI_PARTITION=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_ENV_ADDR=0xe000
+CONFIG_SATA=y
+CONFIG_AHCI_MVEBU=y
+CONFIG_CLK=y
+# CONFIG_INPUT is not set
+CONFIG_MISC=y
+CONFIG_MMC=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_OCTEONTX=y
+CONFIG_MTD=y
+CONFIG_DM_MTD=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+# CONFIG_NETDEVICES is not set
+CONFIG_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_RAM=y
+CONFIG_RAM_OCTEON=y
+CONFIG_RAM_OCTEON_DDR4=y
+CONFIG_SCSI=y
+CONFIG_DEBUG_UART_SHIFT=3
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_SYS_NS16550=y
+CONFIG_OCTEON_SERIAL_BOOTCMD=y
+CONFIG_OCTEON_SERIAL_PCIE_CONSOLE=y
+CONFIG_SPI=y
+CONFIG_OCTEON_SPI=y
+CONFIG_SYSRESET=y
+CONFIG_SYSRESET_OCTEON=y
+CONFIG_HEXDUMP=y
index 9ff4b87..b5a2798 100644 (file)
@@ -116,7 +116,7 @@ config SUNXI_AHCI
 
 config AHCI_MVEBU
        bool "Marvell EBU AHCI SATA support"
-       depends on ARCH_MVEBU
+       depends on ARCH_MVEBU || ARCH_OCTEON
        depends on AHCI
        select SCSI_AHCI
        select DM_SCSI
index 98b2882..57c4e15 100644 (file)
@@ -500,6 +500,7 @@ static int ahci_fill_sg(struct ahci_uc_priv *uc_priv, u8 port,
 {
        struct ahci_ioports *pp = &(uc_priv->port[port]);
        struct ahci_sg *ahci_sg = pp->cmd_tbl_sg;
+       phys_addr_t pa = virt_to_phys(buf);
        u32 sg_count;
        int i;
 
@@ -510,9 +511,6 @@ static int ahci_fill_sg(struct ahci_uc_priv *uc_priv, u8 port,
        }
 
        for (i = 0; i < sg_count; i++) {
-               /* We assume virt=phys */
-               phys_addr_t pa = (unsigned long)buf + i * MAX_DATA_BYTE_COUNT;
-
                ahci_sg->addr = cpu_to_le32(lower_32_bits(pa));
                ahci_sg->addr_hi = cpu_to_le32(upper_32_bits(pa));
                if (ahci_sg->addr_hi && !(uc_priv->cap & AHCI_CAP_S64A)) {
@@ -520,25 +518,26 @@ static int ahci_fill_sg(struct ahci_uc_priv *uc_priv, u8 port,
                        return -1;
                }
                ahci_sg->flags_size = cpu_to_le32(0x3fffff &
-                                         (buf_len < MAX_DATA_BYTE_COUNT
-                                          ? (buf_len - 1)
-                                          (MAX_DATA_BYTE_COUNT - 1)));
+                                         (buf_len < MAX_DATA_BYTE_COUNT ?
+                                          (buf_len - 1) :
+                                          (MAX_DATA_BYTE_COUNT - 1)));
                ahci_sg++;
                buf_len -= MAX_DATA_BYTE_COUNT;
+               pa += MAX_DATA_BYTE_COUNT;
        }
 
        return sg_count;
 }
 
-
 static void ahci_fill_cmd_slot(struct ahci_ioports *pp, u32 opts)
 {
+       phys_addr_t pa = virt_to_phys((void *)pp->cmd_tbl);
+
        pp->cmd_slot->opts = cpu_to_le32(opts);
        pp->cmd_slot->status = 0;
-       pp->cmd_slot->tbl_addr = cpu_to_le32((u32)pp->cmd_tbl & 0xffffffff);
+       pp->cmd_slot->tbl_addr = cpu_to_le32(lower_32_bits(pa));
 #ifdef CONFIG_PHYS_64BIT
-       pp->cmd_slot->tbl_addr_hi =
-           cpu_to_le32((u32)(((pp->cmd_tbl) >> 16) >> 16));
+       pp->cmd_slot->tbl_addr_hi = cpu_to_le32(upper_32_bits(pa));
 #endif
 }
 
@@ -674,12 +673,12 @@ static int ahci_device_data_io(struct ahci_uc_priv *uc_priv, u8 port, u8 *fis,
 
        ahci_dcache_invalidate_range((unsigned long)buf,
                                     (unsigned long)buf_len);
-       debug("%s: %d byte transferred.\n", __func__, pp->cmd_slot->status);
+       debug("%s: %d byte transferred.\n", __func__,
+             le32_to_cpu(pp->cmd_slot->status));
 
        return 0;
 }
 
-
 static char *ata_id_strcpy(u16 *target, u16 *src, int len)
 {
        int i;
index 7d82d2e..f05150d 100644 (file)
@@ -39,7 +39,7 @@ static int mvebu_ahci_probe(struct udevice *dev)
         */
        board_ahci_enable();
 
-       ahci_probe_scsi(dev, dev_read_addr(dev));
+       ahci_probe_scsi(dev, (ulong)dev_remap_addr(dev));
 
        return 0;
 }
@@ -48,6 +48,7 @@ static const struct udevice_id mvebu_ahci_ids[] = {
        { .compatible = "marvell,armada-380-ahci" },
        { .compatible = "marvell,armada-3700-ahci" },
        { .compatible = "marvell,armada-8k-ahci" },
+       { .compatible = "cavium,octeon-7130-ahci" },
        { }
 };
 
index a6cdda8..5a1b38b 100644 (file)
@@ -554,7 +554,7 @@ static int parse_phy_pins(struct udevice *dev)
         * The GPIO pinmux value is an integration choice, so depends on the
         * SoC, not the EMAC variant.
         */
-       if (IS_ENABLED(CONFIG_MACH_SUN8I_H3))
+       if (IS_ENABLED(CONFIG_MACH_SUNXI_H3_H5))
                iomux = SUN8I_IOMUX_H3;
        else if (IS_ENABLED(CONFIG_MACH_SUN8I_R40))
                iomux = SUN8I_IOMUX_R40;
@@ -562,8 +562,12 @@ static int parse_phy_pins(struct udevice *dev)
                iomux = SUN8I_IOMUX_H6;
        else if (IS_ENABLED(CONFIG_MACH_SUN50I_H616))
                iomux = SUN8I_IOMUX_H616;
-       else
+       else if (IS_ENABLED(CONFIG_MACH_SUN8I_A83T))
+               iomux = SUN8I_IOMUX;
+       else if (IS_ENABLED(CONFIG_MACH_SUN50I))
                iomux = SUN8I_IOMUX;
+       else
+               BUILD_BUG_ON_MSG(1, "missing pinmux value for Ethernet pins");
 
        for (i = 0; ; i++) {
                int pin;
index cdcdd8f..d5b6018 100644 (file)
@@ -158,6 +158,12 @@ config PCI_OCTEONTX
          These controllers provide PCI configuration access to all on-board
          peripherals so it should only be disabled for testing purposes
 
+config PCIE_OCTEON
+       bool "MIPS Octeon PCIe support"
+       depends on ARCH_OCTEON
+       help
+         Enable support for the MIPS Octeon SoC family PCIe controllers.
+
 config PCI_XILINX
        bool "Xilinx AXI Bridge for PCI Express"
        depends on DM_PCI
index 96d6182..1f74178 100644 (file)
@@ -53,3 +53,4 @@ obj-$(CONFIG_PCIE_DW_ROCKCHIP) += pcie_dw_rockchip.o
 obj-$(CONFIG_PCIE_DW_MESON) += pcie_dw_meson.o
 obj-$(CONFIG_PCI_BRCMSTB) += pcie_brcmstb.o
 obj-$(CONFIG_PCI_OCTEONTX) += pci_octeontx.o
+obj-$(CONFIG_PCIE_OCTEON) += pcie_octeon.o
diff --git a/drivers/pci/pcie_octeon.c b/drivers/pci/pcie_octeon.c
new file mode 100644 (file)
index 0000000..3b28bd8
--- /dev/null
@@ -0,0 +1,159 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Stefan Roese <sr@denx.de>
+ */
+
+#include <dm.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <log.h>
+#include <pci.h>
+#include <linux/delay.h>
+
+#include <mach/octeon-model.h>
+#include <mach/octeon_pci.h>
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-pcie.h>
+#include <mach/cvmx-pemx-defs.h>
+
+struct octeon_pcie {
+       void *base;
+       int first_busno;
+       u32 port;
+       struct udevice *dev;
+       int pcie_port;
+};
+
+static bool octeon_bdf_invalid(pci_dev_t bdf, int first_busno)
+{
+       /*
+        * In PCIe only a single device (0) can exist on the local bus.
+        * Beyound the local bus, there might be a switch and everything
+        * is possible.
+        */
+       if ((PCI_BUS(bdf) == first_busno) && (PCI_DEV(bdf) > 0))
+               return true;
+
+       return false;
+}
+
+static int pcie_octeon_write_config(struct udevice *bus, pci_dev_t bdf,
+                                   uint offset, ulong value,
+                                   enum pci_size_t size)
+{
+       struct octeon_pcie *pcie = dev_get_priv(bus);
+       struct pci_controller *hose = dev_get_uclass_priv(bus);
+       int busno;
+       int port;
+
+       debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d) ",
+             PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
+       debug("(addr,size,val)=(0x%04x, %d, 0x%08lx)\n", offset, size, value);
+
+       port = pcie->pcie_port;
+       busno = PCI_BUS(bdf) - hose->first_busno + 1;
+
+       switch (size) {
+       case PCI_SIZE_8:
+               cvmx_pcie_config_write8(port, busno, PCI_DEV(bdf),
+                                       PCI_FUNC(bdf), offset, value);
+               break;
+       case PCI_SIZE_16:
+               cvmx_pcie_config_write16(port, busno, PCI_DEV(bdf),
+                                        PCI_FUNC(bdf), offset, value);
+               break;
+       case PCI_SIZE_32:
+               cvmx_pcie_config_write32(port, busno, PCI_DEV(bdf),
+                                        PCI_FUNC(bdf), offset, value);
+               break;
+       default:
+               printf("Invalid size\n");
+       };
+
+       return 0;
+}
+
+static int pcie_octeon_read_config(const struct udevice *bus, pci_dev_t bdf,
+                                  uint offset, ulong *valuep,
+                                  enum pci_size_t size)
+{
+       struct octeon_pcie *pcie = dev_get_priv(bus);
+       struct pci_controller *hose = dev_get_uclass_priv(bus);
+       int busno;
+       int port;
+
+       port = pcie->pcie_port;
+       busno = PCI_BUS(bdf) - hose->first_busno + 1;
+       if (octeon_bdf_invalid(bdf, pcie->first_busno)) {
+               *valuep = pci_get_ff(size);
+               return 0;
+       }
+
+       switch (size) {
+       case PCI_SIZE_8:
+               *valuep = cvmx_pcie_config_read8(port, busno, PCI_DEV(bdf),
+                                                PCI_FUNC(bdf), offset);
+               break;
+       case PCI_SIZE_16:
+               *valuep = cvmx_pcie_config_read16(port, busno, PCI_DEV(bdf),
+                                                 PCI_FUNC(bdf), offset);
+               break;
+       case PCI_SIZE_32:
+               *valuep = cvmx_pcie_config_read32(port, busno, PCI_DEV(bdf),
+                                                 PCI_FUNC(bdf), offset);
+               break;
+       default:
+               printf("Invalid size\n");
+       };
+
+       debug("%02x.%02x.%02x: u%d %x -> %lx\n",
+             PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf), size, offset, *valuep);
+
+       return 0;
+}
+
+static int pcie_octeon_probe(struct udevice *dev)
+{
+       struct octeon_pcie *pcie = dev_get_priv(dev);
+       int node = cvmx_get_node_num();
+       int pcie_port;
+       int ret = 0;
+
+       /* Get port number, lane number and memory target / attr */
+       if (ofnode_read_u32(dev_ofnode(dev), "marvell,pcie-port",
+                           &pcie->port)) {
+               ret = -ENODEV;
+               goto err;
+       }
+
+       pcie->first_busno = dev_seq(dev);
+       pcie_port = ((node << 4) | pcie->port);
+       ret = cvmx_pcie_rc_initialize(pcie_port);
+       if (ret != 0)
+               return ret;
+
+       return 0;
+
+err:
+       return ret;
+}
+
+static const struct dm_pci_ops pcie_octeon_ops = {
+       .read_config = pcie_octeon_read_config,
+       .write_config = pcie_octeon_write_config,
+};
+
+static const struct udevice_id pcie_octeon_ids[] = {
+       { .compatible = "marvell,pcie-host-octeon" },
+       { }
+};
+
+U_BOOT_DRIVER(pcie_octeon) = {
+       .name           = "pcie_octeon",
+       .id             = UCLASS_PCI,
+       .of_match       = pcie_octeon_ids,
+       .ops            = &pcie_octeon_ops,
+       .probe          = pcie_octeon_probe,
+       .priv_auto      = sizeof(struct octeon_pcie),
+       .flags          = DM_FLAG_PRE_RELOC,
+};
index 327cdc5..349abc1 100644 (file)
 
 /* Random number generator stuff */
 
-#define CVMX_RNM_CTL_STATUS    0x0001180040000000
 #define CVMX_OCT_DID_RNG       8ULL
 
-static u64 cvmx_build_io_address(u64 major_did, u64 sub_did)
-{
-       return ((0x1ull << 48) | (major_did << 43) | (sub_did << 40));
-}
-
 static u64 cvmx_rng_get_random64(void)
 {
        return csr_rd(cvmx_build_io_address(CVMX_OCT_DID_RNG, 0));
@@ -285,10 +279,10 @@ static int test_dram_byte64(struct ddr_priv *priv, int lmc, u64 p,
        int node = 0;
 
        // Force full cacheline write-backs to boost traffic
-       l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+       l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
        saved_dissblkdty = l2c_ctl.cn78xx.dissblkdty;
        l2c_ctl.cn78xx.dissblkdty = 1;
-       l2c_wr(priv, CVMX_L2C_CTL, l2c_ctl.u64);
+       l2c_wr(priv, CVMX_L2C_CTL_REL, l2c_ctl.u64);
 
        if (octeon_is_cpuid(OCTEON_CN73XX) || octeon_is_cpuid(OCTEON_CNF75XX))
                kbitno = 18;
@@ -489,9 +483,9 @@ static int test_dram_byte64(struct ddr_priv *priv, int lmc, u64 p,
        }
 
        // Restore original setting that could enable partial cacheline writes
-       l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+       l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
        l2c_ctl.cn78xx.dissblkdty = saved_dissblkdty;
-       l2c_wr(priv, CVMX_L2C_CTL, l2c_ctl.u64);
+       l2c_wr(priv, CVMX_L2C_CTL_REL, l2c_ctl.u64);
 
        return errors;
 }
@@ -6315,17 +6309,17 @@ static void lmc_final(struct ddr_priv *priv)
        lmc_rd(priv, CVMX_LMCX_INT(if_num));
 
        for (tad = 0; tad < num_tads; tad++) {
-               l2c_wr(priv, CVMX_L2C_TADX_INT(tad),
-                      l2c_rd(priv, CVMX_L2C_TADX_INT(tad)));
+               l2c_wr(priv, CVMX_L2C_TADX_INT_REL(tad),
+                      l2c_rd(priv, CVMX_L2C_TADX_INT_REL(tad)));
                debug("%-45s : (%d) 0x%08llx\n", "CVMX_L2C_TAD_INT", tad,
-                     l2c_rd(priv, CVMX_L2C_TADX_INT(tad)));
+                     l2c_rd(priv, CVMX_L2C_TADX_INT_REL(tad)));
        }
 
        for (mci = 0; mci < num_mcis; mci++) {
-               l2c_wr(priv, CVMX_L2C_MCIX_INT(mci),
-                      l2c_rd(priv, CVMX_L2C_MCIX_INT(mci)));
+               l2c_wr(priv, CVMX_L2C_MCIX_INT_REL(mci),
+                      l2c_rd(priv, CVMX_L2C_MCIX_INT_REL(mci)));
                debug("%-45s : (%d) 0x%08llx\n", "L2C_MCI_INT", mci,
-                     l2c_rd(priv, CVMX_L2C_MCIX_INT(mci)));
+                     l2c_rd(priv, CVMX_L2C_MCIX_INT_REL(mci)));
        }
 
        debug("%-45s : 0x%08llx\n", "LMC_INT",
@@ -9827,7 +9821,7 @@ static void cvmx_dram_address_extract_info(struct ddr_priv *priv, u64 address,
                address -= ADDRESS_HOLE;
 
        /* Determine the LMC controllers */
-       l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+       l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
 
        /* xbits depends on number of LMCs */
        xbits = cvmx_dram_get_num_lmc(priv) >> 1;       // 4->2, 2->1, 1->0
index 1f75dc1..e7b61d3 100644 (file)
@@ -145,7 +145,7 @@ static void cvmx_l2c_set_big_size(struct ddr_priv *priv, u64 mem_size, int mode)
                big_ctl.u64 = 0;
                big_ctl.s.maxdram = bits - 9;
                big_ctl.cn61xx.disable = mode;
-               l2c_wr(priv, CVMX_L2C_BIG_CTL, big_ctl.u64);
+               l2c_wr(priv, CVMX_L2C_BIG_CTL_REL, big_ctl.u64);
        }
 }
 
@@ -2274,15 +2274,15 @@ static int octeon_ddr_initialize(struct ddr_priv *priv, u32 cpu_hertz,
                printf("Disabling L2 ECC based on disable_l2_ecc environment variable\n");
                union cvmx_l2c_ctl l2c_val;
 
-               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
                l2c_val.s.disecc = 1;
-               l2c_wr(priv, CVMX_L2C_CTL, l2c_val.u64);
+               l2c_wr(priv, CVMX_L2C_CTL_REL, l2c_val.u64);
        } else {
                union cvmx_l2c_ctl l2c_val;
 
-               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
                l2c_val.s.disecc = 0;
-               l2c_wr(priv, CVMX_L2C_CTL, l2c_val.u64);
+               l2c_wr(priv, CVMX_L2C_CTL_REL, l2c_val.u64);
        }
 
        /*
@@ -2295,17 +2295,17 @@ static int octeon_ddr_initialize(struct ddr_priv *priv, u32 cpu_hertz,
 
                puts("L2 index aliasing disabled.\n");
 
-               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
                l2c_val.s.disidxalias = 1;
-               l2c_wr(priv, CVMX_L2C_CTL, l2c_val.u64);
+               l2c_wr(priv, CVMX_L2C_CTL_REL, l2c_val.u64);
        } else {
                union cvmx_l2c_ctl l2c_val;
 
                /* Enable L2C index aliasing */
 
-               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+               l2c_val.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
                l2c_val.s.disidxalias = 0;
-               l2c_wr(priv, CVMX_L2C_CTL, l2c_val.u64);
+               l2c_wr(priv, CVMX_L2C_CTL_REL, l2c_val.u64);
        }
 
        if (OCTEON_IS_OCTEON3()) {
@@ -2321,7 +2321,7 @@ static int octeon_ddr_initialize(struct ddr_priv *priv, u32 cpu_hertz,
                u64 rdf_cnt;
                char *s;
 
-               l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL);
+               l2c_ctl.u64 = l2c_rd(priv, CVMX_L2C_CTL_REL);
 
                /*
                 * It is more convenient to compute the ratio using clock
@@ -2338,7 +2338,7 @@ static int octeon_ddr_initialize(struct ddr_priv *priv, u32 cpu_hertz,
                debug("%-45s : %d, cpu_hertz:%d, ddr_hertz:%d\n",
                      "EARLY FILL COUNT  ", l2c_ctl.cn78xx.rdf_cnt, cpu_hertz,
                      ddr_hertz);
-               l2c_wr(priv, CVMX_L2C_CTL, l2c_ctl.u64);
+               l2c_wr(priv, CVMX_L2C_CTL_REL, l2c_ctl.u64);
        }
 
        /* Check for lower DIMM socket populated */
index 7389484..ce69750 100644 (file)
@@ -9,6 +9,7 @@
 #include <bootstage.h>
 #include <dm.h>
 #include <env.h>
+#include <libata.h>
 #include <log.h>
 #include <part.h>
 #include <pci.h>
@@ -594,6 +595,11 @@ static int do_scsi_scan_one(struct udevice *dev, int id, int lun, bool verbose)
        memcpy(&bdesc->vendor, &bd.vendor, sizeof(bd.vendor));
        memcpy(&bdesc->product, &bd.product, sizeof(bd.product));
        memcpy(&bdesc->revision, &bd.revision,  sizeof(bd.revision));
+       if (IS_ENABLED(CONFIG_SYS_BIG_ENDIAN)) {
+               ata_swap_buf_le16((u16 *)&bdesc->vendor, sizeof(bd.vendor) / 2);
+               ata_swap_buf_le16((u16 *)&bdesc->product, sizeof(bd.product) / 2);
+               ata_swap_buf_le16((u16 *)&bdesc->revision, sizeof(bd.revision) / 2);
+       }
 
        if (verbose) {
                printf("  Device %d: ", bdesc->devnum);
index af83e96..6d1c453 100644 (file)
@@ -788,6 +788,30 @@ config MSM_SERIAL
          for example APQ8016 and MSM8916.
          Single baudrate is supported in current implementation (115200).
 
+config OCTEON_SERIAL_BOOTCMD
+       bool "MIPS Octeon PCI remote bootcmd input"
+       depends on ARCH_OCTEON
+       depends on DM_SERIAL
+       select SYS_IS_IN_ENV
+       select CONSOLE_MUX
+       help
+        This driver supports remote input over the PCIe bus from a host
+        to U-Boot for entering commands.  It is utilized by the host
+        commands 'oct-remote-load' and 'oct-remote-bootcmd'.
+
+config OCTEON_SERIAL_PCIE_CONSOLE
+       bool "MIPS Octeon PCIe remote console"
+       depends on ARCH_OCTEON
+       depends on (DM_SERIAL && DM_STDIO)
+       select SYS_STDIO_DEREGISTER
+       select SYS_CONSOLE_IS_IN_ENV
+       select CONSOLE_MUX
+       help
+         This driver supports remote console over the PCIe bus when the
+         Octeon is running in PCIe target mode. The host program
+         'oct-remote-console' can be used to connect to this console.
+         The console number will likely be 0 or 1.
+
 config OMAP_SERIAL
        bool "Support for OMAP specific UART"
        depends on DM_SERIAL
index 92bcb30..6c0fdca 100644 (file)
@@ -66,6 +66,8 @@ obj-$(CONFIG_MSM_SERIAL) += serial_msm.o
 obj-$(CONFIG_MVEBU_A3700_UART) += serial_mvebu_a3700.o
 obj-$(CONFIG_MPC8XX_CONS) += serial_mpc8xx.o
 obj-$(CONFIG_NULLDEV_SERIAL) += serial_nulldev.o
+obj-$(CONFIG_OCTEON_SERIAL_BOOTCMD) += serial_octeon_bootcmd.o
+obj-$(CONFIG_OCTEON_SERIAL_PCIE_CONSOLE) += serial_octeon_pcie_console.o
 obj-$(CONFIG_OWL_SERIAL) += serial_owl.o
 obj-$(CONFIG_OMAP_SERIAL) += serial_omap.o
 obj-$(CONFIG_MTK_SERIAL) += serial_mtk.o
diff --git a/drivers/serial/serial_octeon_bootcmd.c b/drivers/serial/serial_octeon_bootcmd.c
new file mode 100644 (file)
index 0000000..4bcff77
--- /dev/null
@@ -0,0 +1,182 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Marvell International Ltd.
+ * Copyright (C) 2021 Stefan Roese <sr@denx.de>
+ */
+
+#include <dm.h>
+#include <dm/uclass.h>
+#include <errno.h>
+#include <input.h>
+#include <iomux.h>
+#include <log.h>
+#include <serial.h>
+#include <stdio_dev.h>
+#include <string.h>
+#include <watchdog.h>
+#include <linux/delay.h>
+#include <asm/addrspace.h>
+#include <asm/io.h>
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-bootmem.h>
+
+#define DRIVER_NAME                            "pci-bootcmd"
+
+/*
+ * Important:
+ * This address cannot be changed as the PCI console tool relies on exactly
+ * this value!
+ */
+#define BOOTLOADER_PCI_READ_BUFFER_BASE                0x6c000
+#define BOOTLOADER_PCI_READ_BUFFER_SIZE                256
+#define BOOTLOADER_PCI_WRITE_BUFFER_SIZE       256
+
+#define BOOTLOADER_PCI_READ_BUFFER_STR_LEN     \
+       (BOOTLOADER_PCI_READ_BUFFER_SIZE - 8)
+#define BOOTLOADER_PCI_WRITE_BUFFER_STR_LEN    \
+       (BOOTLOADER_PCI_WRITE_BUFFER_SIZE - 8)
+
+#define BOOTLOADER_PCI_READ_BUFFER_OWNER_ADDR  \
+       (BOOTLOADER_PCI_READ_BUFFER_BASE + 0)
+#define BOOTLOADER_PCI_READ_BUFFER_LEN_ADDR    \
+       (BOOTLOADER_PCI_READ_BUFFER_BASE + 4)
+#define BOOTLOADER_PCI_READ_BUFFER_DATA_ADDR   \
+       (BOOTLOADER_PCI_READ_BUFFER_BASE + 8)
+
+enum octeon_pci_io_buf_owner {
+       /* Must be zero, set when memory cleared */
+       OCTEON_PCI_IO_BUF_OWNER_INVALID = 0,
+       OCTEON_PCI_IO_BUF_OWNER_OCTEON = 1,
+       OCTEON_PCI_IO_BUF_OWNER_HOST = 2,
+};
+
+/* Structure for bootloader PCI IO buffers */
+struct octeon_pci_io_buf {
+       u32 owner;
+       u32 len;
+       char data[0];
+};
+
+struct octeon_bootcmd_priv {
+       bool started;
+       int copy_offset;
+       bool eol;
+       bool unlocked;
+       struct octeon_pci_io_buf *buf;
+};
+
+static int octeon_bootcmd_pending(struct udevice *dev, bool input)
+{
+       struct octeon_bootcmd_priv *priv = dev_get_priv(dev);
+
+       if (!input)
+               return 0;
+
+       if (priv->eol)
+               return 1;
+
+       CVMX_SYNC;
+       if (priv->buf->owner != OCTEON_PCI_IO_BUF_OWNER_OCTEON)
+               return 0;
+
+       if (priv->buf->len > priv->copy_offset &&
+           (priv->buf->data[priv->copy_offset] != '\0'))
+               return 1;
+
+       return 0;
+}
+
+static int octeon_bootcmd_getc(struct udevice *dev)
+{
+       struct octeon_bootcmd_priv *priv = dev_get_priv(dev);
+       char c;
+
+       /* There's no EOL for boot commands so we fake it. */
+       if (priv->eol) {
+               priv->eol = false;
+               return '\n';
+       }
+
+       while (!octeon_bootcmd_pending(dev, true)) {
+               WATCHDOG_RESET();
+               /*
+                * ToDo:
+                * The original code calls octeon_board_poll() here. We may
+                * need to implement something similar here.
+                */
+               udelay(100);
+       }
+
+       c = priv->buf->data[priv->copy_offset];
+       priv->buf->data[priv->copy_offset++] = '\0';
+
+       if (priv->copy_offset >= min_t(int, CONFIG_SYS_CBSIZE - 1,
+                                      BOOTLOADER_PCI_READ_BUFFER_STR_LEN - 1) ||
+           (priv->buf->data[priv->copy_offset] == '\0')) {
+               priv->copy_offset = 0;
+               priv->buf->len = 0;
+               priv->buf->owner = OCTEON_PCI_IO_BUF_OWNER_HOST;
+               priv->eol = true;
+               CVMX_SYNC;
+       }
+
+       return c;
+}
+
+static const struct dm_serial_ops octeon_bootcmd_ops = {
+       .getc = octeon_bootcmd_getc,
+       .pending = octeon_bootcmd_pending,
+};
+
+static int octeon_bootcmd_probe(struct udevice *dev)
+{
+       struct octeon_bootcmd_priv *priv = dev_get_priv(dev);
+
+       priv->buf = (void *)CKSEG0ADDR(BOOTLOADER_PCI_READ_BUFFER_BASE);
+       memset(priv->buf, 0, BOOTLOADER_PCI_READ_BUFFER_SIZE);
+       priv->eol = false;
+
+       /*
+        * When the bootcmd console is first started it is started as locked to
+        * block any calls sending a command until U-Boot is ready to accept
+        * commands.  Just before the main loop starts to accept commands the
+        * bootcmd console is unlocked.
+        */
+       if (priv->unlocked)
+               priv->buf->owner = OCTEON_PCI_IO_BUF_OWNER_HOST;
+       else
+               priv->buf->owner = OCTEON_PCI_IO_BUF_OWNER_OCTEON;
+
+       debug("%s called, buffer ptr: 0x%p, owner: %s\n", __func__,
+             priv->buf,
+             priv->buf->owner == OCTEON_PCI_IO_BUF_OWNER_HOST ?
+             "host" : "octeon");
+       debug("&priv->copy_offset: 0x%p\n", &priv->copy_offset);
+       CVMX_SYNC;
+
+       /*
+        * Perhaps reinvestige this: In the original code, "unlocked" etc
+        * is set in the octeon_pci_bootcmd_unlock() function called very
+        * late.
+        */
+       priv->buf->owner = OCTEON_PCI_IO_BUF_OWNER_HOST;
+       priv->unlocked = true;
+       priv->started = true;
+       CVMX_SYNC;
+
+       return 0;
+}
+
+static const struct udevice_id octeon_bootcmd_serial_id[] = {
+       { .compatible = "marvell,pci-bootcmd", },
+       { },
+};
+
+U_BOOT_DRIVER(octeon_bootcmd) = {
+       .name = DRIVER_NAME,
+       .id = UCLASS_SERIAL,
+       .ops = &octeon_bootcmd_ops,
+       .of_match = of_match_ptr(octeon_bootcmd_serial_id),
+       .probe = octeon_bootcmd_probe,
+       .priv_auto = sizeof(struct octeon_bootcmd_priv),
+};
diff --git a/drivers/serial/serial_octeon_pcie_console.c b/drivers/serial/serial_octeon_pcie_console.c
new file mode 100644 (file)
index 0000000..c76e787
--- /dev/null
@@ -0,0 +1,365 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Marvell International Ltd.
+ * Copyright (C) 2021 Stefan Roese <sr@denx.de>
+ */
+
+#include <dm.h>
+#include <dm/uclass.h>
+#include <errno.h>
+#include <input.h>
+#include <iomux.h>
+#include <log.h>
+#include <serial.h>
+#include <stdio_dev.h>
+#include <string.h>
+#include <watchdog.h>
+#include <linux/delay.h>
+#include <asm/io.h>
+#include <mach/cvmx-regs.h>
+#include <mach/cvmx-bootmem.h>
+
+#define DRIVER_NAME                            "pci-console"
+#define OCTEONTX_PCIE_CONSOLE_NAME_LEN         16
+
+/* Current versions */
+#define OCTEON_PCIE_CONSOLE_MAJOR_VERSION      1
+#define OCTEON_PCIE_CONSOLE_MINOR_VERSION      0
+
+#define OCTEON_PCIE_CONSOLE_BLOCK_NAME         "__pci_console"
+
+/*
+ * Structure that defines a single console.
+ * Note: when read_index == write_index, the buffer is empty.
+ * The actual usable size of each console is console_buf_size -1;
+ */
+struct octeon_pcie_console {
+       u64 input_base_addr;
+       u32 input_read_index;
+       u32 input_write_index;
+       u64 output_base_addr;
+       u32 output_read_index;
+       u32 output_write_index;
+       u32 lock;
+       u32 buf_size;
+};
+
+/*
+ * This is the main container structure that contains all the information
+ * about all PCI consoles. The address of this structure is passed to various
+ * routines that operation on PCI consoles.
+ */
+struct octeon_pcie_console_desc {
+       u32 major_version;
+       u32 minor_version;
+       u32 lock;
+       u32 flags;
+       u32 num_consoles;
+       u32 pad;
+       /* must be 64 bit aligned here... */
+       /* Array of addresses of octeon_pcie_console_t structures */
+       u64 console_addr_array[0];
+       /* Implicit storage for console_addr_array */
+};
+
+struct octeon_pcie_console_priv {
+       struct octeon_pcie_console *console;
+       int console_num;
+       bool console_active;
+};
+
+/* Flag definitions for read/write functions */
+enum {
+       /*
+        * If set, read/write functions won't block waiting for space or data.
+        * For reads, 0 bytes may be read, and for writes not all of the
+        * supplied data may be written.
+        */
+       OCT_PCI_CON_FLAG_NONBLOCK = 1 << 0,
+};
+
+static int buffer_free_bytes(u32 buffer_size, u32 wr_idx, u32 rd_idx)
+{
+       if (rd_idx >= buffer_size || wr_idx >= buffer_size)
+               return -1;
+
+       return ((buffer_size - 1) - (wr_idx - rd_idx)) % buffer_size;
+}
+
+static int buffer_avail_bytes(u32 buffer_size, u32 wr_idx, u32 rd_idx)
+{
+       if (rd_idx >= buffer_size || wr_idx >= buffer_size)
+               return -1;
+
+       return buffer_size - 1 - buffer_free_bytes(buffer_size, wr_idx, rd_idx);
+}
+
+static int buffer_read_avail(struct udevice *dev, unsigned int console_num)
+{
+       struct octeon_pcie_console_priv *priv = dev_get_priv(dev);
+       struct octeon_pcie_console *cons_ptr = priv->console;
+       int avail;
+
+       avail = buffer_avail_bytes(cons_ptr->buf_size,
+                                  cons_ptr->input_write_index,
+                                  cons_ptr->input_read_index);
+       if (avail >= 0)
+               return avail;
+
+       return 0;
+}
+
+static int octeon_pcie_console_read(struct udevice *dev,
+                                   unsigned int console_num, char *buffer,
+                                   int buffer_size, u32 flags)
+{
+       struct octeon_pcie_console_priv *priv = dev_get_priv(dev);
+       struct octeon_pcie_console *cons_ptr = priv->console;
+       int avail;
+       char *buf_ptr;
+       int bytes_read;
+       int read_size;
+
+       buf_ptr = (char *)cvmx_phys_to_ptr(cons_ptr->input_base_addr);
+
+       avail = buffer_avail_bytes(cons_ptr->buf_size,
+                                  cons_ptr->input_write_index,
+                                  cons_ptr->input_read_index);
+       if (avail < 0)
+               return avail;
+
+       if (!(flags & OCT_PCI_CON_FLAG_NONBLOCK)) {
+               /* Wait for some data to be available */
+               while (0 == (avail = buffer_avail_bytes(cons_ptr->buf_size,
+                                                       cons_ptr->input_write_index,
+                                                       cons_ptr->input_read_index))) {
+                       mdelay(10);
+                       WATCHDOG_RESET();
+               }
+       }
+
+       bytes_read = 0;
+
+       /* Don't overflow the buffer passed to us */
+       read_size = min_t(int, avail, buffer_size);
+
+       /* Limit ourselves to what we can input in a contiguous block */
+       if (cons_ptr->input_read_index + read_size >= cons_ptr->buf_size)
+               read_size = cons_ptr->buf_size - cons_ptr->input_read_index;
+
+       memcpy(buffer, buf_ptr + cons_ptr->input_read_index, read_size);
+       cons_ptr->input_read_index =
+               (cons_ptr->input_read_index + read_size) % cons_ptr->buf_size;
+       bytes_read += read_size;
+
+       /* Mark the PCIe console to be active from now on */
+       if (bytes_read)
+               priv->console_active = true;
+
+       return bytes_read;
+}
+
+static int octeon_pcie_console_write(struct udevice *dev,
+                                    unsigned int console_num,
+                                    const char *buffer,
+                                    int bytes_to_write, u32 flags)
+{
+       struct octeon_pcie_console_priv *priv = dev_get_priv(dev);
+       struct octeon_pcie_console *cons_ptr = priv->console;
+       int avail;
+       char *buf_ptr;
+       int bytes_written;
+
+       buf_ptr = (char *)cvmx_phys_to_ptr(cons_ptr->output_base_addr);
+       bytes_written = 0;
+       while (bytes_to_write > 0) {
+               avail = buffer_free_bytes(cons_ptr->buf_size,
+                                         cons_ptr->output_write_index,
+                                         cons_ptr->output_read_index);
+
+               if (avail > 0) {
+                       int write_size = min_t(int, avail, bytes_to_write);
+
+                       /*
+                        * Limit ourselves to what we can output in a contiguous
+                        * block
+                        */
+                       if (cons_ptr->output_write_index + write_size >=
+                           cons_ptr->buf_size) {
+                               write_size = cons_ptr->buf_size -
+                                            cons_ptr->output_write_index;
+                       }
+
+                       memcpy(buf_ptr + cons_ptr->output_write_index,
+                              buffer + bytes_written, write_size);
+                       /*
+                        * Make sure data is visible before changing write
+                        * index
+                        */
+                       CVMX_SYNCW;
+                       cons_ptr->output_write_index =
+                               (cons_ptr->output_write_index + write_size) %
+                               cons_ptr->buf_size;
+                       bytes_to_write -= write_size;
+                       bytes_written += write_size;
+               } else if (avail == 0) {
+                       /*
+                        * Check to see if we should wait for room, or return
+                        * after a partial write
+                        */
+                       if (flags & OCT_PCI_CON_FLAG_NONBLOCK)
+                               goto done;
+
+                       WATCHDOG_RESET();
+                       mdelay(10);     /* Delay if we are spinning */
+               } else {
+                       bytes_written = -1;
+                       goto done;
+               }
+       }
+
+done:
+       return bytes_written;
+}
+
+static struct octeon_pcie_console_desc *octeon_pcie_console_init(int num_consoles,
+                                                                int buffer_size)
+{
+       struct octeon_pcie_console_desc *cons_desc_ptr;
+       struct octeon_pcie_console *cons_ptr;
+       s64 addr;
+       u64 avail_addr;
+       int alloc_size;
+       int i;
+
+       /* Compute size required for pci console structure */
+       alloc_size = num_consoles *
+               (buffer_size * 2 + sizeof(struct octeon_pcie_console) +
+                sizeof(u64)) + sizeof(struct octeon_pcie_console_desc);
+
+       /*
+        * Allocate memory for the consoles.  This must be in the range
+        * addresssible by the bootloader.
+        * Try to do so in a manner which minimizes fragmentation.  We try to
+        * put it at the top of DDR0 or bottom of DDR2 first, and only do
+        * generic allocation if those fail
+        */
+       addr = cvmx_bootmem_phy_named_block_alloc(alloc_size,
+                                                 OCTEON_DDR0_SIZE - alloc_size - 128,
+                                                 OCTEON_DDR0_SIZE, 128,
+                                                 OCTEON_PCIE_CONSOLE_BLOCK_NAME,
+                                                 CVMX_BOOTMEM_FLAG_END_ALLOC);
+       if (addr < 0) {
+               addr = cvmx_bootmem_phy_named_block_alloc(alloc_size, 0,
+                                                         0x1fffffff, 128,
+                                                         OCTEON_PCIE_CONSOLE_BLOCK_NAME,
+                                                         CVMX_BOOTMEM_FLAG_END_ALLOC);
+       }
+       if (addr < 0)
+               return 0;
+
+       cons_desc_ptr = cvmx_phys_to_ptr(addr);
+
+       /* Clear entire alloc'ed memory */
+       memset(cons_desc_ptr, 0, alloc_size);
+
+       /* Initialize as locked until we are done */
+       cons_desc_ptr->lock = 1;
+       CVMX_SYNCW;
+       cons_desc_ptr->num_consoles = num_consoles;
+       cons_desc_ptr->flags = 0;
+       cons_desc_ptr->major_version = OCTEON_PCIE_CONSOLE_MAJOR_VERSION;
+       cons_desc_ptr->minor_version = OCTEON_PCIE_CONSOLE_MINOR_VERSION;
+
+       avail_addr = addr + sizeof(struct octeon_pcie_console_desc) +
+               num_consoles * sizeof(u64);
+
+       for (i = 0; i < num_consoles; i++) {
+               cons_desc_ptr->console_addr_array[i] = avail_addr;
+               cons_ptr = (void *)cons_desc_ptr->console_addr_array[i];
+               avail_addr += sizeof(struct octeon_pcie_console);
+               cons_ptr->input_base_addr = avail_addr;
+               avail_addr += buffer_size;
+               cons_ptr->output_base_addr = avail_addr;
+               avail_addr += buffer_size;
+               cons_ptr->buf_size = buffer_size;
+       }
+       CVMX_SYNCW;
+       cons_desc_ptr->lock = 0;
+
+       return cvmx_phys_to_ptr(addr);
+}
+
+static int octeon_pcie_console_getc(struct udevice *dev)
+{
+       char c;
+
+       octeon_pcie_console_read(dev, 0, &c, 1, 0);
+       return c;
+}
+
+static int octeon_pcie_console_putc(struct udevice *dev, const char c)
+{
+       struct octeon_pcie_console_priv *priv = dev_get_priv(dev);
+
+       if (priv->console_active)
+               octeon_pcie_console_write(dev, 0, (char *)&c, 1, 0);
+
+       return 0;
+}
+
+static int octeon_pcie_console_pending(struct udevice *dev, bool input)
+{
+       if (input) {
+               udelay(100);
+               return buffer_read_avail(dev, 0) > 0;
+       }
+
+       return 0;
+}
+
+static const struct dm_serial_ops octeon_pcie_console_ops = {
+       .getc = octeon_pcie_console_getc,
+       .putc = octeon_pcie_console_putc,
+       .pending = octeon_pcie_console_pending,
+};
+
+static int octeon_pcie_console_probe(struct udevice *dev)
+{
+       struct octeon_pcie_console_priv *priv = dev_get_priv(dev);
+       struct octeon_pcie_console_desc *cons_desc;
+       int console_count;
+       int console_size;
+       int console_num;
+
+       /*
+        * Currently only 1 console is supported. Perhaps we need to add
+        * a console nexus if more than one needs to be supported.
+        */
+       console_count = 1;
+       console_size = 1024;
+       console_num = 0;
+
+       cons_desc = octeon_pcie_console_init(console_count, console_size);
+       priv->console =
+               cvmx_phys_to_ptr(cons_desc->console_addr_array[console_num]);
+
+       debug("PCI console init succeeded, %d consoles, %d bytes each\n",
+             console_count, console_size);
+
+       return 0;
+}
+
+static const struct udevice_id octeon_pcie_console_serial_id[] = {
+       { .compatible = "marvell,pci-console", },
+       { },
+};
+
+U_BOOT_DRIVER(octeon_pcie_console) = {
+       .name = DRIVER_NAME,
+       .id = UCLASS_SERIAL,
+       .ops = &octeon_pcie_console_ops,
+       .of_match = of_match_ptr(octeon_pcie_console_serial_id),
+       .probe = octeon_pcie_console_probe,
+       .priv_auto = sizeof(struct octeon_pcie_console_priv),
+};
diff --git a/include/configs/octeon_nic23.h b/include/configs/octeon_nic23.h
new file mode 100644 (file)
index 0000000..0a7b4d8
--- /dev/null
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019-2020
+ * Marvell <www.marvell.com>
+ */
+
+#ifndef __CONFIG_H__
+#define __CONFIG_H__
+
+/*
+ * SATA/SCSI/AHCI configuration
+ */
+/* AHCI support Definitions */
+/** Enable 48-bit SATA addressing */
+#define CONFIG_LBA48
+/** Enable 64-bit addressing */
+#define CONFIG_SYS_64BIT_LBA
+
+#include "octeon_common.h"
+
+#endif /* __CONFIG_H__ */
index 4fa5f69..d7337b5 100644 (file)
 #ifndef _DT_BINDINGS_CLK_SUN8I_R40_H_
 #define _DT_BINDINGS_CLK_SUN8I_R40_H_
 
+#define CLK_PLL_VIDEO0         7
+
+#define CLK_PLL_VIDEO1         16
+
 #define CLK_CPU                        24
 
 #define CLK_BUS_MIPI_DSI       29
 #define CLK_AVS                        152
 #define CLK_HDMI               153
 #define CLK_HDMI_SLOW          154
-
+#define CLK_MBUS               155
 #define CLK_DSI_DPHY           156
 #define CLK_TVE0               157
 #define CLK_TVE1               158
index 1ea1b70..35b6f69 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
 /*
  * This header provides constants for the ARM GIC.
  */
@@ -7,14 +8,14 @@
 
 #include <dt-bindings/interrupt-controller/irq.h>
 
-/* interrupt specific cell 0 */
+/* interrupt specifier cell 0 */
 
 #define GIC_SPI 0
 #define GIC_PPI 1
 
 /*
  * Interrupt specifier cell 2.
- * The flaggs in irq.h are valid, plus those below.
+ * The flags in irq.h are valid, plus those below.
  */
 #define GIC_CPU_MASK_RAW(x) ((x) << 8)
 #define GIC_CPU_MASK_SIMPLE(num) GIC_CPU_MASK_RAW((1 << (num)) - 1)
index b5e6b00..bc7babb 100644 (file)
@@ -1,10 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
 /*
  * This header provides constants for most thermal bindings.
  *
  * Copyright (C) 2013 Texas Instruments
  *     Eduardo Valentin <eduardo.valentin@ti.com>
- *
- * GPLv2 only
  */
 
 #ifndef _DT_BINDINGS_THERMAL_THERMAL_H